- Eine elegante und ausdrucksstarke integrierte KI-Bibliothek auf Ruby-Basis
- Bei jedem KI-Anbieter unterscheiden sich Client-Bibliotheken, Antwortformate und die Verarbeitung von Streaming; wer mehrere KI-Modelle nutzen will, muss inkompatible APIs und komplexe Abhängigkeiten handhaben
- RubyLLM stellt eine einheitliche API bereit, die diese Probleme löst
Hauptfunktionen
- Konversation: Unterstützung für OpenAI-, Anthropic-, Gemini- und DeepSeek-Modelle
- Vision und Audio: Verstehen von Bildern und Audio
- PDF-Analyse: Zusammenfassung und Analyse von Dokumenten
- Bildgenerierung: Unterstützung für verschiedene Modelle wie DALL-E
- Erzeugung von Embeddings: Für Vektorsuche und semantische Analyse
- Tool-Bereitstellung: Verknüpfung von Ruby-Code mit KI möglich
- Rails-Integration: Chat-Verläufe können mit ActiveRecord gespeichert werden
- Streaming: Unterstützung für die Verarbeitung von Antworten in Echtzeit
Vorteile von RubyLLM
# Einfach eine Frage stellen
chat = RubyLLM.chat
chat.ask "Was ist der beste Weg, Ruby zu lernen?"
# Bildanalyse
chat.ask "Was ist auf diesem Bild zu sehen?", with: { image: "ruby_conf.jpg" }
# Audioanalyse
chat.ask "Worüber wurde in diesem Meeting gesprochen?", with: { audio: "meeting.wav" }
# Dokumentenzusammenfassung
chat.ask "Bitte fasse diesen Vertrag zusammen", with: { pdf: "contract.pdf" }
# Bildgenerierung
RubyLLM.paint "Male einen Sonnenuntergang über einem Berg im Aquarellstil"
# Vektor-Embeddings erzeugen
RubyLLM.embed "Ruby ist elegant und ausdrucksstark"
# KI kann Code verwenden
class Weather < RubyLLM::Tool
description "Liefert das aktuelle Wetter für einen bestimmten Ort"
param :latitude, desc: "Breitengrad (z. B. 52.5200)"
param :longitude, desc: "Längengrad (z. B. 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 "Wie ist das Wetter in Berlin? (52.5200, 13.4050)"
Installation
# Zur Gemfile hinzufügen
gem 'ruby_llm'
# Installieren
bundle install
# Oder direkt installieren
gem install ruby_llm
API-Schlüssel einrichten
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'] # optional
end
Natürliche Konversationsverarbeitung
# Chat mit dem Standardmodell (GPT-4o-mini) starten
chat = RubyLLM.chat
# Ein anderes Modell verwenden
chat = RubyLLM.chat(model: 'claude-3-7-sonnet-20250219')
# Einfache Frage
chat.ask "Was ist der Unterschied zwischen attr_reader und attr_accessor?"
# Verarbeitung von Multi-Turn-Konversationen
chat.ask "Kannst du ein Beispiel geben?"
# Streaming-Antwort
chat.ask "Erzähl mir eine Geschichte über einen Ruby-Programmierer" do |chunk|
print chunk.content
end
# Unterstützung für verschiedene Eingabeformen
chat.ask "Vergleiche diese beiden Diagramme", with: { image: ["diagram1.png", "diagram2.png"] }
chat.ask "Fasse dieses Dokument zusammen", with: { pdf: "contract.pdf" }
chat.ask "Sag mir, was in diesem Audio gesagt wird", with: { audio: "meeting.wav" }
# Modell kann während der Konversation gewechselt werden
chat.with_model('gemini-2.0-flash').ask "Was ist dein Lieblingsalgorithmus?"
Unterstützung für Rails-Integration
# 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
# Verwendungsbeispiel im Controller
chat = Chat.create!(model_id: "gpt-4o-mini")
chat.ask("Welches ist das nützlichste Gem in Ruby?") do |chunk|
Turbo::StreamsChannel.broadcast_append_to(
chat,
target: "response",
partial: "messages/chunk",
locals: { chunk: chunk }
)
end
# Chat-Verlauf wird automatisch gespeichert
Beispiel zum Schreiben eines Tools
class Search < RubyLLM::Tool
description "Führt eine Suche in der Wissensdatenbank durch"
param :query, desc: "Suchbegriff"
param :limit, type: :integer, desc: "Maximale Anzahl an Ergebnissen", required: false
def execute(query:, limit: 5)
Document.search(query).limit(limit).map(&:title)
end
end
# Tool in der KI verwenden
chat.with_tool(Search).ask "Finde Dokumente zu den neuen Funktionen von Ruby 3.3"
1 Kommentare
Hacker-News-Kommentare