RubyLLM: 주요 AI 제공자를 하나로 묶는 Ruby 프레임워크
(rubyllm.com)- RubyLLM은 Ruby 앱에서 챗봇, AI 에이전트, RAG, 콘텐츠 생성 같은 AI 워크플로를 한 프레임워크로 만들게 해줌
- GPT, Claude, 로컬 Ollama 등을 같은 인터페이스로 다루며, 의존성은 Faraday, Zeitwerk, Marcel 3개로 제한됨
- 채팅뿐 아니라 이미지·비디오 분석, 오디오 전사, 문서 처리, 이미지 생성, 임베딩, 모더레이션, 도구 호출, 구조화 출력, 스트리밍까지 포괄함
- Rails에서는
acts_as_chat, 모델 로딩, 선택적 채팅 UI 생성기를 제공하고 ` 바로 쓸 수 있는 채팅 인터페이스를 열 수 있음 - OpenAI, xAI, Anthropic, Gemini, VertexAI, Bedrock, DeepSeek, Mistral, Ollama, OpenRouter, Perplexity, GPUStack, OpenAI 호환 API를 지원함
Ruby용 단일 AI 프레임워크
- RubyLLM은 주요 AI 제공자를 하나의 Ruby 프레임워크로 다루기 위한 도구임
- 챗봇, AI 에이전트, RAG 애플리케이션, 콘텐츠 생성기, 기타 AI 워크플로 구축을 대상으로 함
- Chat with Work에서 실제 사용 중임
제공자별 API 차이를 감추는 인터페이스
- AI 제공자마다 클라이언트, API, 응답 형식, 관례가 달라지는 문제를 줄이는 데 초점을 둠
- 동일한 인터페이스로 GPT, Claude, 로컬 Ollama를 사용할 수 있음
- 의존성은 Faraday, Zeitwerk, Marcel 3개만 사용함
기본 사용 방식
- 간단한 질문은
RubyLLM.chat으로 채팅 객체를 만들고chat.ask로 실행함- 예:
chat.ask "What's the best way to learn Ruby?"
- 예:
- 파일 분석은
with:옵션에 파일을 전달하는 방식임- 이미지:
ruby_conf.jpg - 비디오:
video.mp4 - 오디오:
meeting.wav - PDF:
contract.pdf - 코드:
app.rb
- 이미지:
- 여러 파일은 배열로 전달해 한 번에 분석할 수 있음
- 예:
with: ["diagram.png", "report.pdf", "notes.txt"]
- 예:
- 스트리밍 응답은 블록을 넘겨
chunk.content를 처리함
AI 기능 범위
RubyLLM.paint로 이미지 생성을 수행함RubyLLM.embed로 텍스트 임베딩을 생성함RubyLLM.transcribe로 오디오를 텍스트로 전사함RubyLLM.moderate로 콘텐츠 안전성을 확인함RubyLLM::Tool을 상속한 클래스로 AI가 Ruby 메서드를 호출하게 할 수 있음- 예시
Weather도구는 위도와 경도를 받아 Open-Meteo API에서 현재 날씨 데이터를 가져옴
- 예시
RubyLLM::Agent로 지시문과 도구를 포함한 재사용 가능한 에이전트를 정의할 수 있음- 예시
WeatherAssistant는gpt-5-nano모델, 간결한 응답 지시문,Weather도구를 사용함
- 예시
RubyLLM::Schema로 구조화 출력 스키마를 정의할 수 있음- 예시
ProductSchema는name,price,features필드를 정의함
- 예시
기능 목록과 제공자 지원
- 주요 기능은 다음과 같음
- Chat:
RubyLLM.chat기반 대화형 AI - Vision: 이미지와 비디오 분석
- Audio:
RubyLLM.transcribe기반 음성 전사와 이해 - Documents: PDF, CSV, JSON 등 파일 타입에서 추출
- Image generation:
RubyLLM.paint기반 이미지 생성 - Embeddings:
RubyLLM.embed기반 임베딩 생성 - Moderation:
RubyLLM.moderate기반 콘텐츠 안전성 확인 - Tools: AI가 Ruby 메서드를 호출
- Agents:
RubyLLM::Agent기반 재사용 가능한 어시스턴트 - Structured output: JSON 스키마 기반 구조화 출력
- Streaming: 블록 기반 실시간 응답
- Rails:
acts_as_chat기반 ActiveRecord 통합 - Async: Fiber 기반 동시성
- Model registry: 기능 감지와 가격 정보를 포함한 800개 이상 모델
- Extended thinking: 모델 사고 과정 제어, 보기, 저장
- Chat:
- 지원 제공자는 OpenAI, xAI, Anthropic, Gemini, VertexAI, Bedrock, DeepSeek, Mistral, Ollama, OpenRouter, Perplexity, GPUStack, OpenAI 호환 API임
설치와 Rails 통합
- 설치는 Gemfile에
gem 'ruby_llm'을 추가한 뒤bundle install을 실행함 - API 키는
config/initializers/ruby_llm.rb에서 설정함- 예:
config.openai_api_key = ENV['OPENAI_API_KEY']
- 예:
- Rails 통합은 다음 명령으로 설치함
bin/rails generate ruby_llm:installbin/rails db:migratebin/rails ruby_llm:load_models # v1.13+
- 선택적으로 채팅 UI를 추가할 수 있음
bin/rails generate ruby_llm:chat_ui
- Rails 모델에서
acts_as_chat을 선언하면 ActiveRecord 기반 채팅을 사용할 수 있음- 예시 모델은
Chat < ApplicationRecord에acts_as_chat을 선언함 Chat.create! model: "claude-sonnet-4"로 채팅을 만들고 파일을 전달해 질문할 수 있음
- 예시 모델은
- 준비된 채팅 인터페이스는
http://localhost:3000/chats에서 열 수 있음
댓글과 토론
Hacker News 의견들
-
RubyLLM이 의외로 좋았고, 사용성 면에서는 Vercel의 AI 프레임워크에 가까움
바로 동작하는 편의성과 유연성 사이에서 균형을 잡으려 하는데, 그만큼 어려움도 있지만 전반적으로 괜찮았음
실제로 겪은 큰 불편은 캐시가 항상 동작하지 않는다는 점임. 예를 들어 xAI는 completions API만 지원하고 thought signature가 잘못 반환돼 문제가 생김- Responses API가 이제 구현됐고 RubyLLM 2.0에 들어갈 예정임
https://github.com/crmne/ruby_llm/blob/main/lib/ruby_llm/pro...
- Responses API가 이제 구현됐고 RubyLLM 2.0에 들어갈 예정임
-
RubyLLM의 추상화 위에 만든 오픈소스 gem Raix가 있고 꽤 많이 쓰임
https://github.com/OlympiaAI/raix -
RubyLLM을 프로덕션에서 쓰고 있고 아주 좋아함. 훌륭하고 쓰기 쉬운 프레임워크임
Responses API가 기본 지원되지 않는 점은 다른 사람 말처럼 답답했는데, 큰 누락처럼 보였음. 다른 개발자가 만든 커넥터가 있긴 하지만 버그가 있고 메인 gem만큼 품질이 높지는 않음
앞으로의 개발, 특히 2.0이 기대됨. 이제 Responses API가 네이티브로 들어갔다면 꼭 확인해볼 생각임- RubyLLM 1.x에서 Responses API가 구현되지 않았던 이유는, 내부적으로 제공자와 프로토콜이 1:1로 대응된다고 사실상 가정했기 때문임
OpenAI는 서로 다른 기능을 가진 프로토콜이 2개이고, VertexAI의 모든 모델에 접근하려면 단일 제공자 아래 여러 프로토콜을 지원해야 해서 이 가정이 더 이상 맞지 않게 됨
그래서 Protocols와 Providers를 분리하고, 같은 Provider 아래에서도 모델별로 다른 Protocol로 투명하게 라우팅하는 큰 리팩터링이 필요했음. 이 작업이 RubyLLM 2.0에 포함될 예정임
궁금하면 참고할 만한 커밋: https://github.com/crmne/ruby_llm/commit/d398354da493570b050...
https://github.com/crmne/ruby_llm/commit/0875ce2dfeae9d28a3a...
- RubyLLM 1.x에서 Responses API가 구현되지 않았던 이유는, 내부적으로 제공자와 프로토콜이 1:1로 대응된다고 사실상 가정했기 때문임
-
RubyLLM은 사용하기 매우 쉬움. 작년에 한 프로젝트에서 많이 활용했음
단점은 진짜 추적 관측성을 위해 계측하기 어려웠고, 재시도 시 내부 모델을 삭제하는 패턴이 있어서 보이는 이력은 깔끔하지만 실제 API 호출 순서를 정확히 보기는 별로였음- Rails 스타일 계측이 1.16.0에 들어갔음
https://rubyllm.com/instrumentation/
- Rails 스타일 계측이 1.16.0에 들어갔음
-
Claude만 바라보는 무언가를 만들고 있고, Anthropic 생태계를 벗어날 계획은 없음. 이런 경우에도 RubyLLM이 Anthropic의 Ruby SDK를 직접 쓰는 것보다 이점이 있는지 궁금함
다르게 말하면 이 선택이 Fog와 aws-sdk-s3 사이의 선택에 가까운지, 아니면 Active Storage와 aws-sdk-s3 사이의 선택에 가까운지 궁금함- Active Storage와 aws-sdk-s3의 관계에 더 가깝다고 봄
RubyLLM에서 좋은 점은 ActiveRecord처럼 메서드를 체이닝할 수 있는 DSL, 에이전트·도구·프롬프트를 정리하는 구조, Anthropic에서 DeepSeek으로 쉽게 테스트하고 옮겨 비용을 90% 넘게 줄일 수 있었던 이식성임
bin/rails generate ruby_llm:install만으로 각 채팅을 데이터베이스에 저장할 수 있는 ActiveRecord 통합도 좋음. 저장된 채팅 이력을 주기적으로 내려받아 claude code에 주고 에이전트 지시문을 다듬게 하는 것도 큰 도움이 됐음 - 나중에 어떤 제공자든 선택할 수 있는 도구가 있는데 굳이 한 제공자에 종속되도록 만들 이유가 있나 싶음
장애 대응만 봐도, 꼭 서비스가 필요한 날 Anthropic API가 내려가면 어떻게 할 건지 생각해야 함
- Active Storage와 aws-sdk-s3의 관계에 더 가깝다고 봄
-
사이드 프로젝트에서 RubyLLM을 쓰는데 훌륭함
작년 SF Ruby conf의 질문과 코멘트에 있던 것들이 이미 생태계의 기능으로 출시된 점이 흥미로움: https://youtu.be/y535u1EWqAg?si=rbyv52T035apKwQk -
몇 달 전 RubyLLM을 꽤 깊게 써봤는데, 설계와 구현이 아주 좋았음
여러 Lisp 언어로 직접 만든 LLM 클라이언트가 있는데 RubyLLM의 설계를 일부 가져올까 생각했을 정도임. 모방은 칭찬임 -
Ruby를 AI 커뮤니티에 가져오고 오픈소스로 작업해줘서 고마움
좋은 언어는 더 많이 탐구되고 주목받아야 함- Ruby 얘기할 때 Hacker News가 MINASWAN 분위기가 되는 점이 좋음
-
Laravel에도 비슷한 라이브러리가 있음
https://laravel.com/docs/13.x/ai-sdk -
RubyLLM을 프로덕션에서도 쓰고 있는데, 지금까지 본 이 분야 라이브러리 중 가장 우아한 라이브러리임
이슈 트래커 운영 방식도 좋았음. “Feature Request”를 선택하면 우회 방법을 어떻게 찾아봤는지, 왜 RubyLLM에 들어가야 한다고 보는지 등을 설명하게 해서 범위가 끝없이 커지는 걸 막음