4 ポイント 投稿者 GN⁺ 2025-03-17 | 1件のコメント | WhatsAppで共有
  • 美しく表現力豊かなRubyベースの統合AIライブラリ
  • AIプロバイダーごとにクライアントライブラリ、レスポンス形式、ストリーミング処理の方法がすべて異なり、複数のAIモデルを使うには互換性のないAPIと複雑な依存関係を扱う必要がある
  • RubyLLMはこうした問題を解決する統合APIを提供

主な機能

  • 対話: OpenAI、Anthropic、Gemini、DeepSeekモデルをサポート
  • ビジョンと音声: 画像および音声の理解
  • PDF解析: 文書の要約と分析
  • 画像生成: DALL-Eなどさまざまなモデルをサポート
  • 埋め込み生成: ベクトル検索と意味解析
  • ツール提供: RubyコードとAIの連携が可能
  • Rails統合: ActiveRecordでチャット履歴を保存可能
  • ストリーミング: リアルタイム応答処理をサポート

RubyLLMの利点

# 簡単に質問する  
chat = RubyLLM.chat  
chat.ask "Rubyを学ぶのに最も良い方法は?"  
  
# 画像解析  
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 "Rubyプログラマーに関する話をして" do |chunk|  
  print chunk.content  
end  
  
# ほかの入力形式もサポート  
chat.ask "この2つの図を比較して", 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("Rubyで最も役立つ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 "Ruby 3.3の新機能に関する文書を探して"  

1件のコメント

 
GN⁺ 2025-03-17
Hacker Newsのコメント
  • このインターフェースは、ストリーミングとの付き合い方を改善する必要がある。レスポンスには常に遅延があり、多くの人は応答を待ってプロセスを止めるのではなく、ノンブロッキングスレッドでのストリーミングを望むはず。これはドキュメントの問題かもしれないが、いずれにせよストリーミングは数秒以上かかり、IOを使うあらゆるものにおいて一級市民であるべき
    • それはさておき、DSLはかなり素晴らしい
  • 例を使う際には注意が必要: リンク
  • langchainのような扱いづらいDXライブラリと比べると、新鮮な空気のように感じる
  • これでついにRailsを試す気になるだろうか? Rubyの文法は本当に素晴らしい
  • Rubyは今もなお健在
  • LLMとやり取りするための、最も簡潔なAPIの1つ
    • このまま続けてほしい! ollamaがPRをサポートしているのを見てうれしい
  • 私はLLMベースのアプリスクリプトを書いているが、これは本当に楽に感じる
  • うわあ。本当によく考えられている
  • Ruby: パーティーには遅れて来たが、ビール樽を持ってきた
  • 誰か、このパッケージがなぜそんなに良いのか説明してくれませんか? ただAPI呼び出しをしているだけに見えます。批判したいわけではなく、この分野をよく理解していないので純粋に気になっています
  • うわあ、文法が美しい