4 poin oleh GN⁺ 2025-03-17 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2025-03-17
Komentar Hacker News
  • Antarmuka ini perlu memperbaiki hubungannya dengan streaming. Selalu ada latensi pada respons, dan banyak orang kemungkinan ingin streaming di thread non-blocking alih-alih menunggu respons dan menghentikan proses. Ini mungkin masalah dokumentasi, tetapi bagaimanapun juga, streaming adalah fitur kelas satu dalam segala hal yang memakan lebih dari beberapa detik dan menggunakan IO
    • Selain itu, DSL-nya cukup hebat
  • Perlu berhati-hati saat menggunakan contoh: tautan
  • Dibandingkan dengan library DX yang canggung seperti langchain, ini terasa seperti udara segar
  • Apakah ini akhirnya akan membuat saya mencoba Rails? Sintaks Ruby memang keren
  • Ruby masih sangat hidup
  • Ini salah satu API paling ringkas untuk berinteraksi dengan LLM
    • Semoga terus lanjut! Senang melihat ollama mendukung PR
  • Saya sedang menulis skrip aplikasi berbasis LLM, dan ini terasa sangat mulus
  • Wow. Sangat dipikirkan dengan matang
  • Ruby: datang terlambat ke pesta, tapi membawa satu tong bir
  • Bisakah seseorang menjelaskan mengapa paket ini begitu bagus? Kelihatannya hanya seperti melakukan pemanggilan API. Bukan bermaksud kritis, saya hanya sungguh penasaran karena tidak terlalu memahami bidang ini
  • Wow, sintaksnya indah