- Pustaka AI terpadu berbasis Ruby yang indah dan ekspresif
- Setiap penyedia AI memiliki pustaka klien, format respons, dan cara penanganan streaming yang berbeda-beda, sehingga untuk menggunakan beberapa model AI kita harus menangani API yang tidak kompatibel dan dependensi yang kompleks
- RubyLLM menyediakan API terpadu untuk menyelesaikan masalah ini
Fitur utama
- Percakapan: mendukung model OpenAI, Anthropic, Gemini, dan DeepSeek
- Visi dan audio: memahami gambar dan audio
- Analisis PDF: peringkasan dan analisis dokumen
- Pembuatan gambar: mendukung berbagai model seperti DALL-E
- Pembuatan embedding: pencarian vektor dan analisis semantik
- Penyediaan tool: memungkinkan integrasi kode Ruby dengan AI
- Integrasi Rails: dapat menyimpan riwayat chat dengan ActiveRecord
- Streaming: mendukung pemrosesan respons secara real-time
Kelebihan RubyLLM
# Mengajukan pertanyaan dengan sederhana
chat = RubyLLM.chat
chat.ask "Apa cara terbaik untuk belajar Ruby?"
# Analisis gambar
chat.ask "Apa yang terlihat di gambar ini?", with: { image: "ruby_conf.jpg" }
# Analisis audio
chat.ask "Apa yang dibahas dalam rapat ini?", with: { audio: "meeting.wav" }
# Ringkasan dokumen
chat.ask "Tolong ringkas kontrak ini", with: { pdf: "contract.pdf" }
# Pembuatan gambar
RubyLLM.paint "Gambarkan matahari terbenam di atas gunung dengan gaya cat air"
# Pembuatan embedding vektor
RubyLLM.embed "Ruby itu elegan dan sangat ekspresif"
# AI dapat menggunakan kode
class Weather < RubyLLM::Tool
description "Menyediakan cuaca saat ini untuk lokasi tertentu"
param :latitude, desc: "Lintang (mis: 52.5200)"
param :longitude, desc: "Bujur (mis: 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 "Bagaimana cuaca di Berlin? (52.5200, 13.4050)"
Cara instalasi
# Tambahkan ke Gemfile
gem 'ruby_llm'
# Instal
bundle install
# Atau instal langsung
gem install ruby_llm
Pengaturan API key
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'] # opsional
end
Penanganan percakapan yang alami
# Mulai chat dengan model default (GPT-4o-mini)
chat = RubyLLM.chat
# Gunakan model lain
chat = RubyLLM.chat(model: 'claude-3-7-sonnet-20250219')
# Pertanyaan sederhana
chat.ask "Apa perbedaan antara attr_reader dan attr_accessor?"
# Menangani percakapan multi-turn
chat.ask "Bisakah beri contoh?"
# Respons streaming
chat.ask "Ceritakan tentang seorang programmer Ruby" do |chunk|
print chunk.content
end
# Mendukung bentuk input lain
chat.ask "Bandingkan dua diagram ini", with: { image: ["diagram1.png", "diagram2.png"] }
chat.ask "Ringkas dokumen ini", with: { pdf: "contract.pdf" }
chat.ask "Tolong beri tahu apa yang dikatakan dalam audio ini", with: { audio: "meeting.wav" }
# Bisa mengganti model di tengah percakapan
chat.with_model('gemini-2.0-flash').ask "Algoritme favoritmu apa?"
Dukungan integrasi 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
# Contoh penggunaan di controller
chat = Chat.create!(model_id: "gpt-4o-mini")
chat.ask("Gem apa yang paling berguna di Ruby?") do |chunk|
Turbo::StreamsChannel.broadcast_append_to(
chat,
target: "response",
partial: "messages/chunk",
locals: { chunk: chunk }
)
end
# Riwayat chat disimpan secara otomatis
Contoh pembuatan tool
class Search < RubyLLM::Tool
description "Melakukan pencarian di basis pengetahuan"
param :query, desc: "Kata kunci pencarian"
param :limit, type: :integer, desc: "Jumlah hasil maksimum", required: false
def execute(query:, limit: 5)
Document.search(query).limit(limit).map(&:title)
end
end
# Menggunakan tool dari AI
chat.with_tool(Search).ask "Tolong cari dokumen tentang fitur baru di Ruby 3.3"
1 komentar
Komentar Hacker News