RubyLLM: framework Ruby hợp nhất các nhà cung cấp AI lớn
(rubyllm.com)- RubyLLM cho phép xây dựng các quy trình AI như chatbot, AI agent, RAG và tạo nội dung trong ứng dụng Ruby bằng một framework duy nhất
- Có thể làm việc với GPT, Claude, Ollama cục bộ và nhiều dịch vụ khác qua cùng một giao diện, với số phụ thuộc được giới hạn ở 3 thư viện: Faraday, Zeitwerk và Marcel
- Không chỉ trò chuyện mà còn bao quát phân tích hình ảnh·video, chép lời âm thanh, xử lý tài liệu, tạo ảnh, embedding, moderation, gọi công cụ, đầu ra có cấu trúc và streaming
- Trên Rails, cung cấp
acts_as_chat, tải model và trình tạo UI chat tùy chọn, đồng thời có thể mở ngay giao diện chat sẵn dùng tạihttp://localhost:3000/chats - Hỗ trợ OpenAI, xAI, Anthropic, Gemini, VertexAI, Bedrock, DeepSeek, Mistral, Ollama, OpenRouter, Perplexity, GPUStack và API tương thích OpenAI
Một framework AI thống nhất cho Ruby
- RubyLLM là công cụ nhằm xử lý các nhà cung cấp AI lớn trong một framework Ruby duy nhất
- Hướng đến việc xây dựng chatbot, AI agent, ứng dụng RAG, trình tạo nội dung và các quy trình AI khác
- Đang được sử dụng thực tế tại Chat with Work
Giao diện che giấu khác biệt API giữa các nhà cung cấp
- Tập trung vào việc giảm bớt vấn đề khi mỗi nhà cung cấp AI có client, API, định dạng phản hồi và quy ước khác nhau
- Có thể sử dụng GPT, Claude và Ollama cục bộ bằng cùng một giao diện
- Chỉ dùng 3 phụ thuộc là Faraday, Zeitwerk và Marcel
Cách sử dụng cơ bản
- Với câu hỏi đơn giản, tạo đối tượng chat bằng
RubyLLM.chatrồi thực thi bằngchat.ask- Ví dụ:
chat.ask "What's the best way to learn Ruby?"
- Ví dụ:
- Phân tích tệp bằng cách truyền tệp vào tùy chọn
with:- Hình ảnh:
ruby_conf.jpg - Video:
video.mp4 - Âm thanh:
meeting.wav - PDF:
contract.pdf - Mã nguồn:
app.rb
- Hình ảnh:
- Có thể truyền nhiều tệp dưới dạng mảng để phân tích cùng lúc
- Ví dụ:
with: ["diagram.png", "report.pdf", "notes.txt"]
- Ví dụ:
- Với phản hồi streaming, truyền block để xử lý
chunk.content
Phạm vi tính năng AI
- Dùng
RubyLLM.paintđể tạo ảnh - Dùng
RubyLLM.embedđể tạo embedding văn bản - Dùng
RubyLLM.transcribeđể chép lời âm thanh thành văn bản - Dùng
RubyLLM.moderateđể kiểm tra độ an toàn của nội dung - Có thể cho AI gọi phương thức Ruby bằng lớp kế thừa
RubyLLM::Tool- Ví dụ, công cụ
Weathernhận vĩ độ và kinh độ rồi lấy dữ liệu thời tiết hiện tại từ API Open-Meteo
- Ví dụ, công cụ
- Có thể định nghĩa agent tái sử dụng với chỉ thị và công cụ bằng
RubyLLM::Agent- Ví dụ,
WeatherAssistantsử dụng modelgpt-5-nano, chỉ thị trả lời ngắn gọn và công cụWeather
- Ví dụ,
- Có thể định nghĩa schema đầu ra có cấu trúc bằng
RubyLLM::Schema- Ví dụ,
ProductSchemađịnh nghĩa các trườngname,price,features
- Ví dụ,
Danh sách tính năng và hỗ trợ nhà cung cấp
- Các tính năng chính gồm có
- Chat: AI hội thoại dựa trên
RubyLLM.chat - Vision: phân tích hình ảnh và video
- Audio: chép lời và hiểu âm thanh dựa trên
RubyLLM.transcribe - Documents: trích xuất từ các loại tệp như PDF, CSV, JSON
- Image generation: tạo ảnh dựa trên
RubyLLM.paint - Embeddings: tạo embedding dựa trên
RubyLLM.embed - Moderation: kiểm tra độ an toàn nội dung dựa trên
RubyLLM.moderate - Tools: AI gọi phương thức Ruby
- Agents: trợ lý tái sử dụng dựa trên
RubyLLM::Agent - Structured output: đầu ra có cấu trúc dựa trên JSON schema
- Streaming: phản hồi thời gian thực dựa trên block
- Rails: tích hợp ActiveRecord dựa trên
acts_as_chat - Async: đồng thời dựa trên Fiber
- Model registry: hơn 800 model kèm phát hiện tính năng và thông tin giá
- Extended thinking: điều khiển, xem và lưu quá trình suy luận của model
- Chat: AI hội thoại dựa trên
- Các nhà cung cấp được hỗ trợ là OpenAI, xAI, Anthropic, Gemini, VertexAI, Bedrock, DeepSeek, Mistral, Ollama, OpenRouter, Perplexity, GPUStack và API tương thích OpenAI
Cài đặt và tích hợp Rails
- Để cài đặt, thêm
gem 'ruby_llm'vào Gemfile rồi chạybundle install - Khóa API được thiết lập trong
config/initializers/ruby_llm.rb- Ví dụ:
config.openai_api_key = ENV['OPENAI_API_KEY']
- Ví dụ:
- Tích hợp Rails được cài bằng các lệnh sau
bin/rails generate ruby_llm:installbin/rails db:migratebin/rails ruby_llm:load_models # v1.13+
- Có thể thêm UI chat một cách tùy chọn
bin/rails generate ruby_llm:chat_ui
- Nếu khai báo
acts_as_chattrong model Rails, có thể dùng chat dựa trên ActiveRecord- Model ví dụ khai báo
acts_as_chattrongChat < ApplicationRecord - Có thể tạo chat bằng
Chat.create! model: "claude-sonnet-4"rồi truyền tệp để đặt câu hỏi
- Model ví dụ khai báo
- Giao diện chat dựng sẵn có thể mở tại
http://localhost:3000/chats
1 bình luận
Ý kiến trên Hacker News
RubyLLM hóa ra khá tốt, về mặt khả năng sử dụng thì gần với framework AI của Vercel
Nó cố gắng cân bằng giữa sự tiện lợi chạy được ngay và tính linh hoạt; điều đó cũng khiến bài toán khó hơn, nhưng nhìn chung vẫn ổn
Bất tiện lớn thực sự tôi gặp phải là cache không phải lúc nào cũng hoạt động. Ví dụ, xAI chỉ hỗ trợ completions API và trả về thought signature sai nên phát sinh vấn đề
https://github.com/crmne/ruby_llm/blob/main/lib/ruby_llm/pro...
Có gem mã nguồn mở Raix được xây trên lớp trừu tượng của RubyLLM và được dùng khá nhiều
https://github.com/OlympiaAI/raix
Tôi đang dùng RubyLLM trong production và rất thích nó. Đây là một framework xuất sắc và dễ dùng
Việc Responses API không được hỗ trợ sẵn đúng là gây bực như người khác nói, và có vẻ là một thiếu sót lớn. Có connector do nhà phát triển khác làm, nhưng có bug và chất lượng không cao bằng gem chính
Tôi rất mong chờ quá trình phát triển sắp tới, đặc biệt là 2.0. Giờ nếu Responses API đã được đưa vào native thì tôi nhất định sẽ xem lại
OpenAI có 2 protocol với các tính năng khác nhau, và để truy cập mọi model của VertexAI thì cần hỗ trợ nhiều protocol dưới một provider duy nhất, nên giả định đó không còn đúng nữa
Vì vậy cần một đợt refactor lớn để tách Protocols và Providers, đồng thời định tuyến minh bạch theo từng model sang các Protocol khác nhau ngay cả dưới cùng một Provider. Công việc này sẽ được đưa vào RubyLLM 2.0
Nếu tò mò thì đây là các commit đáng tham khảo: https://github.com/crmne/ruby_llm/commit/d398354da493570b050...
https://github.com/crmne/ruby_llm/commit/0875ce2dfeae9d28a3a...
RubyLLM rất dễ dùng. Tôi đã tận dụng nó nhiều trong một dự án năm ngoái
Điểm trừ là khá khó instrument để có khả năng quan sát truy vết thực sự, và nó có kiểu xóa model nội bộ khi retry, nên lịch sử hiển thị thì gọn gàng nhưng không thật sự phù hợp nếu muốn xem chính xác thứ tự gọi API ngoài thực tế
https://rubyllm.com/instrumentation/
Tôi đang xây một thứ chỉ nhắm tới Claude và không có kế hoạch rời khỏi hệ sinh thái Anthropic. Trong trường hợp này, tôi tò mò không biết RubyLLM có còn lợi thế gì so với việc dùng trực tiếp Ruby SDK của Anthropic hay không
Nói cách khác, lựa chọn này giống chọn giữa Fog và aws-sdk-s3 hơn, hay giống chọn giữa Active Storage và aws-sdk-s3 hơn
Điểm hay của RubyLLM là DSL cho phép chain method theo kiểu ActiveRecord, cấu trúc để tổ chức agent, tool và prompt, cùng tính di động giúp dễ thử nghiệm và chuyển từ Anthropic sang DeepSeek để cắt hơn 90% chi phí
Tích hợp ActiveRecord cho phép lưu từng cuộc chat vào cơ sở dữ liệu chỉ với
bin/rails generate ruby_llm:installcũng rất hay. Việc định kỳ tải lịch sử chat đã lưu xuống rồi đưa cho claude code để tinh chỉnh chỉ dẫn cho agent cũng cực kỳ hữu íchChỉ riêng chuyện ứng phó sự cố thôi cũng phải nghĩ xem sẽ làm gì nếu đúng ngày bạn thật sự cần dịch vụ thì API của Anthropic lại bị sập
Tôi dùng RubyLLM cho một side project và thấy nó rất xuất sắc
Điều thú vị là những thứ từng xuất hiện trong phần hỏi đáp và bình luận ở SF Ruby conf năm ngoái nay đã được phát hành thành tính năng của hệ sinh thái: https://youtu.be/y535u1EWqAg?si=rbyv52T035apKwQk
Vài tháng trước tôi đã dùng RubyLLM khá sâu, và thiết kế cùng cách triển khai của nó rất tốt
Tôi có client LLM tự làm bằng vài ngôn ngữ Lisp, đến mức từng nghĩ sẽ mang một phần thiết kế của RubyLLM sang. Bắt chước là một lời khen
Cảm ơn vì đã mang Ruby đến với cộng đồng AI và làm việc này theo hướng mã nguồn mở
Một ngôn ngữ tốt xứng đáng được khám phá và chú ý nhiều hơn
Laravel cũng có một thư viện tương tự
https://laravel.com/docs/13.x/ai-sdk
Tôi cũng đang dùng RubyLLM trong production, và đây là thư viện thanh lịch nhất trong lĩnh vực này mà tôi từng thấy
Tôi cũng thích cách họ vận hành issue tracker. Khi chọn “Feature Request”, bạn phải giải thích mình đã thử tìm workaround như thế nào và vì sao nó nên có trong RubyLLM, nhờ vậy tránh được việc phạm vi cứ phình ra vô tận