4 คะแนน โดย GN⁺ 2025-03-17 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ไลบรารี 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 ความคิดเห็น

 
GN⁺ 2025-03-17
ความคิดเห็นจาก Hacker News
  • อินเทอร์เฟซนี้ควรปรับปรุงเรื่องการทำงานร่วมกับการสตรีม ยังมีความหน่วงในคำตอบเสมอ และหลายคนน่าจะอยากได้การสตรีมบนเธรดแบบไม่บล็อก แทนที่จะต้องหยุดโปรเซสเพื่อรอคำตอบ นี่อาจเป็นปัญหาเรื่องเอกสารก็ได้ แต่ไม่ว่าอย่างไร การสตรีมเป็นสิ่งสำคัญระดับแรกสำหรับทุกอย่างที่ใช้ IO และใช้เวลามากกว่าสองสามวินาที
    • นอกเหนือจากนั้น DSL ก็ค่อนข้างยอดเยี่ยม
  • ต้องระวังเวลาใช้ตัวอย่าง: ลิงก์
  • เทียบกับไลบรารี DX ที่ใช้งานชวนอึดอัดอย่าง langchain แล้ว มันให้ความรู้สึกเหมือนได้สูดอากาศบริสุทธิ์
  • นี่จะเป็นสิ่งที่ทำให้ผม/ฉันลองใช้ Rails ในที่สุดหรือเปล่า? ไวยากรณ์ของ Ruby เท่มากจริง ๆ
  • Ruby ยังมีชีวิตชีวาอยู่มาก
  • นี่เป็นหนึ่งใน API ที่กระชับที่สุดสำหรับการโต้ตอบกับ LLM
    • หวังว่าจะเดินหน้าต่อไป! ดีใจที่เห็น ollama รองรับ PR
  • ผม/ฉันกำลังเขียนแอปสคริปต์ที่ใช้ LLM อยู่ และอันนี้ให้ความรู้สึกว่าทำได้ง่ายมาก
  • ว้าว ช่างคิดมาอย่างดีจริง ๆ
  • Ruby: มางานช้า แต่หิ้วถังเบียร์มาด้วย
  • มีใครอธิบายได้ไหมว่าแพ็กเกจนี้ดีมากเพราะอะไร? มันดูเหมือนแค่เรียก API เอง ไม่ได้จะวิจารณ์นะ แค่ยังไม่ค่อยเข้าใจพื้นที่นี้เลยอยากรู้จริง ๆ
  • ว้าว ไวยากรณ์สวยงามมาก