- ไลบรารี AI แบบรวมศูนย์บนพื้นฐาน Ruby ที่สวยงามและแสดงออกได้ดี
- ผู้ให้บริการ AI แต่ละรายต่างก็มี client library, รูปแบบการตอบกลับ และวิธีจัดการสตรีมมิงที่แตกต่างกัน และหากต้องการใช้หลายโมเดล AI ก็ต้องรับมือกับ API ที่เข้ากันไม่ได้และ dependency ที่ซับซ้อน
- RubyLLM มอบ unified API เพื่อแก้ปัญหาเหล่านี้
ฟีเจอร์หลัก
- แชต: รองรับโมเดล OpenAI, Anthropic, Gemini, DeepSeek
- วิชันและออดิโอ: เข้าใจภาพและเสียง
- การวิเคราะห์ PDF: สรุปและวิเคราะห์เอกสาร
- การสร้างภาพ: รองรับหลายโมเดล เช่น DALL-E
- การสร้าง Embedding: สำหรับการค้นหาแบบเวกเตอร์และการวิเคราะห์เชิงความหมาย
- การจัดเตรียมทูล: เชื่อม Ruby code เข้ากับ 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 "วาดพระอาทิตย์ตกบนภูเขาในสไตล์สีน้ำ"
# สร้างเวกเตอร์ embedding
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 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'] # ไม่บังคับ
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 "ช่วยเปรียบเทียบไดอะแกรมสองอันนี้ให้หน่อย", 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("gem ที่มีประโยชน์ที่สุดใน Ruby คืออะไร?") 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 ความคิดเห็น
ความคิดเห็นจาก Hacker News