4P by GN⁺ 15일전 | ★ favorite | 댓글 1개
  • 아름답고 표현력이 풍부한 Ruby 기반 통합 AI 라이브러리
  • AI 제공업체마다 클라이언트 라이브러리, 응답 형식, 스트리밍 처리 방식이 모두 다르고, 여러 AI 모델을 사용하려면 호환되지 않는 API와 복잡한 종속성을 처리해야 함
  • RubyLLM은 이러한 문제를 해결해주는 통합 API를 제공

주요 기능

  • 대화: OpenAI, Anthropic, Gemini, DeepSeek 모델 지원
  • 비전 및 오디오: 이미지 및 오디오 이해
  • PDF 분석: 문서 요약 및 분석
  • 이미지 생성: DALL-E 등 다양한 모델 지원
  • 임베딩 생성: 벡터 검색 및 의미 분석
  • 툴 제공: Ruby 코드와 AI 연동 가능
  • Rails 통합: ActiveRecord로 채팅 기록 저장 가능
  • 스트리밍: 실시간 응답 처리 지원

RubyLLM의 장점

# 간단하게 질문하기  
chat = RubyLLM.chat  
chat.ask "루비를 배우기 가장 좋은 방법은?"  
  
# 이미지 분석  
chat.ask "이 이미지에 무엇이 보이나요?", with: { image: "ruby_conf.jpg" }  
  
# 오디오 분석  
chat.ask "이 회의에서 무슨 이야기가 나왔나요?", with: { audio: "meeting.wav" }  
  
# 문서 요약  
chat.ask "이 계약서를 요약해 주세요", with: { pdf: "contract.pdf" }  
  
# 이미지 생성  
RubyLLM.paint "산 위의 노을을 수채화 스타일로 그려줘"  
  
# 벡터 임베딩 생성  
RubyLLM.embed "Ruby는 우아하고 표현력이 뛰어남"  
  
# AI가 코드 사용 가능  
class Weather < RubyLLM::Tool  
  description "특정 위치의 현재 날씨 제공"  
  param :latitude, desc: "위도 (예: 52.5200)"  
  param :longitude, desc: "경도 (예: 13.4050)"  
  
  def execute(latitude:, longitude:)  
    url = "https://api.open-meteo.com/v1/forecast/…;  
  
    response = Faraday.get(url)  
    JSON.parse(response.body)  
  rescue => e  
    { error: e.message }  
  end  
end  
  
chat.with_tool(Weather).ask "베를린의 날씨는 어때? (52.5200, 13.4050)"  

설치 방법

# Gemfile에 추가  
gem 'ruby_llm'  
  
# 설치  
bundle install  
  
# 또는 직접 설치  
gem install ruby_llm  

API 키 설정

RubyLLM.configure do |config|  
  config.openai_api_key = ENV['OPENAI_API_KEY']  
  config.anthropic_api_key = ENV['ANTHROPIC_API_KEY']  
  config.gemini_api_key = ENV['GEMINI_API_KEY']  
  config.deepseek_api_key = ENV['DEEPSEEK_API_KEY'] # 선택 사항  
end  

자연스러운 대화 처리

# 기본 모델(GPT-4o-mini)로 채팅 시작  
chat = RubyLLM.chat  
  
# 다른 모델 사용  
chat = RubyLLM.chat(model: 'claude-3-7-sonnet-20250219')  
  
# 간단한 질문  
chat.ask "attr_reader와 attr_accessor의 차이는?"  
  
# 다중 턴 대화 처리  
chat.ask "예제를 들어줄 수 있나요?"  
  
# 스트리밍 응답  
chat.ask "루비 프로그래머에 관한 이야기 해줘" do |chunk|  
  print chunk.content  
end  
  
# 다른 입력 형태 지원  
chat.ask "이 두 다이어그램을 비교해줘", with: { image: ["diagram1.png", "diagram2.png"] }  
chat.ask "이 문서를 요약해줘", with: { pdf: "contract.pdf" }  
chat.ask "이 오디오에서 무슨 말이 나왔는지 알려줘", with: { audio: "meeting.wav" }  
  
# 대화 중 모델 변경 가능  
chat.with_model('gemini-2.0-flash').ask "가장 좋아하는 알고리즘은?"  

Rails 통합 지원

# app/models/chat.rb  
class Chat < ApplicationRecord  
  acts_as_chat  
  
  broadcasts_to ->(chat) { "chat_#{chat.id}" }  
end  
  
# app/models/message.rb  
class Message < ApplicationRecord  
  acts_as_message  
end  
  
# app/models/tool_call.rb  
class ToolCall < ApplicationRecord  
  acts_as_tool_call  
end  
  
# 컨트롤러에서 사용 예제  
chat = Chat.create!(model_id: "gpt-4o-mini")  
chat.ask("루비에서 가장 유용한 gem은 뭐야?") do |chunk|  
  Turbo::StreamsChannel.broadcast_append_to(  
    chat,  
    target: "response",  
    partial: "messages/chunk",  
    locals: { chunk: chunk }  
  )  
end  
  
# 채팅 기록은 자동 저장됨  

툴 작성 예제

class Search < RubyLLM::Tool  
  description "지식 베이스에서 검색 수행"  
  
  param :query, desc: "검색어"  
  param :limit, type: :integer, desc: "최대 결과 수", required: false  
  
  def execute(query:, limit: 5)  
    Document.search(query).limit(limit).map(&:title)  
  end  
end  
  
# AI에서 툴 사용  
chat.with_tool(Search).ask "루비 3.3의 새로운 기능에 대한 문서 찾아줘"  
Hacker News 의견
  • 이 인터페이스는 스트리밍과의 관계를 개선할 필요가 있음. 응답에 항상 지연이 있고 많은 사람들이 응답을 기다리며 프로세스를 중단하는 대신 비차단 스레드에서 스트리밍을 원할 것임. 이는 문서화 문제일 수 있지만, 어쨌든 스트리밍은 몇 초 이상 걸리고 IO를 사용하는 모든 것에서 일급 시민임
    • 그 외에 DSL은 꽤 훌륭함
  • 예시를 사용할 때 주의가 필요함: 링크
  • langchain 같은 불편한 DX 라이브러리와 비교하면 신선한 공기 같은 느낌임
  • 이것이 내가 드디어 Rails를 시도하게 만드는 것일까? Ruby 문법은 정말로 멋짐
  • Ruby는 여전히 잘 살아있음
  • LLM과 상호작용하는 가장 간결한 API 중 하나임
    • 계속 진행하길 바람! ollama가 PR을 지원하는 것을 보니 기쁨
  • 나는 LLM 기반 앱 스크립트를 작성 중인데, 이것은 정말 수월한 느낌임
  • 와우. 정말 사려 깊음
  • Ruby: 파티에 늦게 왔지만, 맥주통을 가져옴
  • 누군가 이 패키지가 왜 그렇게 좋은지 설명해줄 수 있나요? 그냥 API 호출을 하는 것처럼 보임. 비판적인 것이 아니라, 단지 이 분야를 잘 이해하지 못해서 진심으로 궁금함
  • 와우, 문법이 아름다움