4 Punkte von GN⁺ 2025-03-17 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2025-03-17
Hacker-News-Kommentare
  • Diese Schnittstelle müsste ihre Beziehung zum Streaming verbessern. Es gibt immer Latenz bei Antworten, und viele würden Streaming in einem nicht blockierenden Thread wollen, statt den Prozess zu unterbrechen und auf die Antwort zu warten. Das mag ein Dokumentationsproblem sein, aber unabhängig davon ist Streaming bei allem, was IO nutzt und länger als ein paar Sekunden dauert, ein erstklassiger Bestandteil.
    • Davon abgesehen ist das DSL ziemlich großartig.
  • Bei der Verwendung der Beispiele ist Vorsicht nötig: Link
  • Verglichen mit umständlichen DX-Bibliotheken wie langchain ist das wie ein frischer Luftzug.
  • Wird mich das endlich dazu bringen, Rails auszuprobieren? Die Ruby-Syntax ist wirklich schön.
  • Ruby ist immer noch putzmunter.
  • Das ist eine der prägnantesten APIs für die Interaktion mit LLMs.
    • Bitte weitermachen! Es freut mich zu sehen, dass ollama PRs unterstützt.
  • Ich schreibe gerade eine LLM-basierte App-Skriptlösung, und das hier fühlt sich wirklich mühelos an.
  • Wow. Wirklich durchdacht.
  • Ruby: spät zur Party gekommen, aber ein Bierfass mitgebracht.
  • Kann jemand erklären, warum dieses Paket so gut ist? Es wirkt, als würde es nur API-Aufrufe machen. Nicht kritisch gemeint, ich verstehe dieses Feld einfach nicht gut und frage aus echtem Interesse.
  • Wow, die Syntax ist wunderschön.