RubyLLM 實測一個月:Rails 工程師到底要不要從 Python AI 框架跳槽?
AI工具📖 約 37 分鐘閱讀👁 ---

RubyLLM 實測一個月:Rails 工程師到底要不要從 Python AI 框架跳槽?

image

上個月我做了一件工程師才會做的蠢事:把 side project 的 AI 模組從 Python 寫的 LangChain 微服務,整套搬回 Ruby on Rails,用 RubyLLM 1.16 跑了一個月。

不是因為 Ruby 比較潮,也不是因為 LangChain 不行。是因為我那個 side project 一開始是為了 demo 給 Rails 客戶看,結果 demo 完客戶說「這個東西能不能直接整合進我們現有的後台?」,我整個晚上就在想:為什麼我要多維護一個 Python 微服務?

一個月後的結論先講:如果你是 Rails 工程師,RubyLLM 已經是 2026 年最值得認真評估的 AI 框架選項。但它不是「萬靈丹」,有些情境你還是會想用 Python。

這篇文章把我 30 天的真實使用紀錄、踩過的雷、還有我最後留下誰、淘汰誰,全部攤開來講。如果你是 Rails 工程師想接 AI 功能、或是 AI 工程師在評估要不要學 Ruby,這篇應該能幫上忙。

這篇文章你會看到

  • RubyLLM 1.16 到底在紅什麼,跟 LangChain / 直接用 SDK 比差在哪
  • 我設計的 30 天實測怎麼跑(不是業配、不是讀官方文件的導讀)
  • 五個真實 Rails 工作場景的對照(chatbot、PDF 摘要、agent、image、embeddings)
  • RubyLLM 救我專案的兩個關鍵時刻,跟它讓我後悔的三個地方
  • 一張「我會選誰」的決策表,直接抄
  • RubyLLM 是什麼?為什麼我會注意到它

    RubyLLM 是一個純 Ruby 的 LLM 框架,由 Carmine Paolino(網路上叫他 crmne)從 2023 年開始維護。2026 年 6 月的 1.16.0 是最新版本,GitHub 上有 4.1k stars、464 forks

    它的核心賣點只有一句話:同一個 Ruby API,可以用 12 家 LLM provider——OpenAI、Anthropic、Google Gemini、xAI、DeepSeek、OpenRouter、Perplexity、Mistral、AWS Bedrock、Google Vertex AI、本地 Ollama、還有 GPUStack。隨時切換,不改 business logic。

    👤 我自己是 2017 年開始寫 Rails,到 2026 年已經寫了快 9 年。過去三年我接的 AI 案子,主流方案是這樣:

  • 1. Rails 寫前端跟後台
  • 2. 用 Python 寫一個獨立的 AI 微服務(FastAPI + LangChain)
  • 3. 兩個容器,gRPC 或 HTTP 互通
  • 這個架構沒什麼不好,但有兩個讓人抓狂的問題:

  • 兩個 codebase 要維護:model schema、auth、logging 全部要寫兩次
  • 部署成本變兩倍:每次升級 Python 或換 library 都要兩邊測
  • 📰 根據 Carmine 在 2025 年 RubyConf 的演講,Ruby AI 生態系的問題不是 Ruby 不夠好,是沒有人把 Python 那種「統一介面」的概念帶過來。RubyLLM 就是想做這件事。

    RubyLLM 1.16 vs LangChain 2026 vs 直接用 SDK:核心差異

    我先做一張表,把三種方案放在同一個基準點上比較。這是我看完官方文件跟自己實測後整理的版本。

    面向RubyLLM 1.16LangChain 2026 (Python)直接用 OpenAI/Anthropic SDK
    支援的 provider 數量12 家(內建)+ 任何 OpenAI 相容 API30+ 家(透過整合包)1 家/provider
    程式語言Ruby(純 stdlib + Faraday)Python(需要 15+ 相依套件)Ruby/Python/JS 都可
    安裝複雜度gem 'ruby_llm' 一行搞定pip install langchain langchain-openai 一堆一個 gem 一個 provider
    Rails 整合acts_as_chat 直接吃 ActiveRecord要自己寫 ORM mapping要自己寫
    Chat 介面一行 generator (rails g ruby_llm:chat_ui) 就有 Tailwind UI要自己接 Streamlit / Gradio / React要自己刻 UI
    Tool calling用 Ruby class 定義,自動推 schema用 Python class + decorator要手寫 JSON schema
    Agent framework內建 RubyLLM::AgentLangGraph 是獨立子套件要自己 loop
    Structured outputwith_schema 內建with_structured_output 內建要自己驗 JSON
    Image generationRubyLLM.paint 內建(支援編輯)langchain-experimental要自己 call API
    EmbeddingsRubyLLM.embed 內建透過 vector store 套件要自己寫
    Cost tracking1.15+ 內建 response.cost.totalLangSmith 付費方案要自己算 token 計價
    StreamingFiber 或 thread-based(1.16 新功能)async/await + astreamprovider SDK 各異
    並行 tool 執行1.16 內建(thread 或 fiber)要自己用 asyncio.gather要自己寫
    文件品質完整 Jekyll 站 + llms.txt完整但分散只有官方 API ref
    維護活躍度1.15 (5/7) → 1.16 (6/9) 持續出每月小版、每季大版看 provider
    適合誰Rails 工程師、Sidekiq / Hotwire stackPython / Data 團隊、複雜 agent簡單單一 provider 場景
    📚 表格裡「LangChain 2026」的數字是我根據 LangChain 官方 changelogLangGraph 文件 整理的,「RubyLLM」的數字來自 rubyllm.comGitHub Releases
    image

    我怎麼設計這個 30 天實驗

    跟上次寫的「AI 助手實測」一樣,這次我也給自己訂了規則,不靠感覺:

  • 1. 同一份 PRD、同一個 side project:把現有的 LangChain Python 微服務(產品是「客服自動摘要 + 多語翻譯 + 文件問答」)直接 porting
  • 2. 同一組測資:100 筆真實客服對話 + 50 份 PDF(中文 30、英文 20)
  • 3. 固定 5 個工作場景:chatbot 對話、PDF 摘要、Agent 多步推理、Image generation、Embeddings + 向量搜尋
  • 4. 記錄三件事:完成度、開發時間(從寫 code 到能跑)、production 穩定性
  • 5. 預算一致:每個方案配 USD$50 的 API credit,跑完算單位成本
  • 👤 實測前我先承認:我是 Rails 工程師,我對 Ruby 本來就有 home court advantage。但這也是為什麼我選這個角度實測——多數在評估 LLM 框架的 Rails team,面對的就是我這個問題

    實測的三個方案

  • 1. 方案 A — RubyLLM 1.16:純 Rails monorepo,無 Python
  • 2. 方案 B — LangChain 2026 + FastAPI:保留原本的 Python 微服務架構
  • 3. 方案 C — 直接用 OpenAI Ruby SDK:最陽春,只接一家 provider
  • 每個方案跑一週的 side-by-side 工作天,最後兩週做 production hardening(錯誤處理、retry、monitoring)。

    場景 1:客服 chatbot 對話 — RubyLLM 大勝

    這是我原本最擔心的場景。客服 chatbot 需要:

  • 多輪對話記憶
  • Streaming 回應(使用者體驗差很多)
  • Tool calling(查訂單、查會員等級)
  • RubyLLM 寫法

    `ruby

    class SupportAgent < RubyLLM::Agent model "gpt-5-nano" instructions "你是一個專業的客服助手,回答簡潔有禮貌" tools OrderLookup, MembershipCheck end

    agent = SupportAgent.new agent.ask(message) do |chunk| # streaming block, 每收到一段就 push 到 Turbo Stream ActionCable.server.broadcast("chat_#{session_id}", chunk.content) end `

    👤 我寫這個 class 花了 15 分鐘,包含 OrderLookup 那個 tool。對比一下 LangChain 我之前寫的版本:

  • Python 的 LangChain 版本要寫 @tool decorator + Pydantic schema
  • 要寫 ConversationBufferMemory 物件
  • 要寫 AgentExecutor 跟 LLM chain
  • 全部加起來大約 180 行 Python 配 50 行 Rails 串接
  • RubyLLM 版本總共 35 行 Ruby

    LangChain 版本的差異

    不是說 LangChain 寫不出來,而是同樣的功能你要寫三倍以上的程式碼。這對維護成本是實質影響。

    📊 根據 Stack Overflow 2025 年開發者調查,Ruby on Rails 在「我最喜愛的框架」排行從 2018 年的第 5 名掉到 2024 年的第 12 名。👤 我自己感覺很大一部分原因是 Rails 工程師要接 AI 時,發現官方沒有 Python 那種統一介面,乾脆跳槽。RubyLLM 1.16 這個版本出來之後,這個狀況應該會開始翻轉。

    場景 1 結論

    RubyLLM 在「Rails 工程師要在既有系統加 chatbot」這個情境是碾壓。完成度、速度、可維護性三個維度都贏

    image

    場景 2:PDF 摘要 + 文件問答 — RubyLLM 內建 vision 跟 transcribe

    客服系統有個需求:客戶上傳 PDF(合約、使用手冊、退貨單),系統要能摘要、回答問題。

    RubyLLM 的多模態支援

    `ruby

    chat.ask "這份合約的重點條款是什麼?", with: "contract.pdf"

    chat.ask "這張照片裡有什麼?", with: "screenshot.jpg" chat.ask "這段會議錄音在討論什麼?", with: "meeting.wav" chat.ask "幫我摘要這份 CSV", with: "sales_q3.csv" `

    👤 這是我這次實測最驚豔的地方。我原本以為要分別串接:

  • OpenAI 的 pdf-parseunstructured.io
  • Whisper API
  • 影片的話要 ffmpeg + frame extract
  • 結果 RubyLLM 在 chatwith: 參數 直接全包。我看了一下原始碼,它在底層幫你處理:

  • MIME type 自動判斷
  • 大檔自動切 chunk
  • 圖片自動轉 base64
  • 音檔直接 forward 給 provider 的 transcription endpoint
  • 📚 Anthropic 的 Claude 系列從 Claude 3.5 開始原生支援 PDF 視覺理解,OpenAI 的 GPT-5 系列則是把 PDF 當成 vision token 處理。RubyLLM 把這些 provider 差異抽象掉,你寫的程式碼跟 provider 無關

    場景 2 結論

    PDF 摘要這個場景,RubyLLM 完成度跟 LangChain 差不多,但程式碼少 60%。LangChain 在「多模態 + vector store」這塊還是比較成熟(它有專門的 MultiVectorRetriever),但對一般 side project 來說,RubyLLM 已經夠用。

    場景 3:Agent 多步推理 — 並行 tool 執行救了我

    這是 1.16 版最讓我驚豔的新功能。

    問題場景

    客戶問「我上個月買的這個東西,可以退貨嗎?」,agent 要:

  • 1. 查訂單(OrderLookup)
  • 2. 查退貨政策(PolicyLookup,根據會員等級)
  • 3. 查物流狀態(ShippingCheck)
  • 傳統做法是序列執行:先查訂單(2 秒)→ 再查政策(2 秒)→ 再查物流(2 秒),總共 6 秒。使用者等到天荒地老。

    RubyLLM 1.16 的並行 tool 執行

    `ruby RubyLLM.configure do |config| config.tool_concurrency = true # 開 threads, 不用裝額外 gem end

    chat.with_tools(OrderLookup, PolicyLookup, ShippingCheck).ask(message) `

    📊 RubyLLM 1.16 release notes 寫到:「當 model 一次回傳多個 tool calls 時,RubyLLM 永遠是序列執行。對 I/O bound 的工具來說超級浪費。」1.16 開了並行之後,我那三個查詢從 6 秒降到 2.1 秒

    👤 實測細節:用 :threads 模式會在 Rails executor 內跑,每個 tool call 在自己的 connection pool thread,不會搞壞 ActiveRecord。:fibers 模式需要裝 async gem,吞吐量更高但要改寫部分 controller。

    LangChain 對照

    LangChain 也有 async tool execution,但要:

  • 全部 tool 寫成 async def
  • asyncio.gather 包起來
  • Python 3.10+ 才有的 asyncio.TaskGroup
  • 👤 不是做不到,是對 Rails team 來說這個 learning curve 高了一截。RubyLLM 用 thread-based 並行 + Rails executor 整合,把這個問題整個藏起來。

    場景 3 結論

    並行 tool 執行是 2026 年 LLM framework 的標配。RubyLLM 1.16 把這件事做得比其他 Ruby 框架都簡單,但跟 LangChain 比是「簡單 vs 完整」的取捨——LangChain 在複雜 agent workflow(條件分支、狀態恢復)還是比較強。

    image

    場景 4:Image generation — RubyLLM 1.15 的祕密武器

    這個功能我原本以為不重要,實測之後才發現威力。

    Image editing 整合

    RubyLLM 1.15 (5/7 release) 加了 image editing:`ruby

    image = RubyLLM.paint "a sunset over mountains in watercolor style"

    image = RubyLLM.paint( "把 logo 改成綠色, 背景保持透明", model: "gpt-image-1", with: "logo.png", mask: "logo_mask.png" ) `

    👤 我 side project 用到這個功能的場景:客戶上傳產品照片,AI 幫他去背、調亮、生成社群媒體版本。過去我要串三個不同的 API(rembg 服務、亮度調整、image generation),RubyLLM 一個 method 全包。

    Cost tracking 也內建

    `ruby image.tokens.input image.tokens.output image.cost.total `

    📊 1.15 還把 cost tracking 標準化了。之前我用 LangChain 算成本要自己寫一個 token counter + 價格表同步任務,RubyLLM 直接從 model registry 抓最新價格算給你。

    場景 4 結論

    Image generation 跟 cost tracking 這兩個功能,RubyLLM 在 2026 年 6 月這個版本是領先 LangChain 一步的。LangChain 的 cost tracking 要串 LangSmith(付費),RubyLLM 內建。

    image

    場景 5:Embeddings + 向量搜尋 — 還是用 pgvector 比較實在

    這個場景 RubyLLM 跟 LangChain 都沒做全套——向量搜尋的儲存跟查詢本來就是另一層的事。

    我的做法

    `ruby

    embedding = RubyLLM.embed("客戶問的問題").vectors

    ActiveRecord::Base.connection.execute( "INSERT INTO documents (content, embedding) VALUES ($1, $2)", [content, embedding.to_s] )

    similar = Document.order("embedding <=> '#{query_embedding}'").limit(5) `

    👤 我選 pgvector 而不是 Pinecone / Weaviate 的原因很簡單:我已經在 Rails 上跑 PostgreSQL 了,多裝一個 vector database 是 over-engineering

    📚 pgvector 是 PostgreSQL 官方 extension,2024 年之後版本效能改善很多,1M 向量內的查詢延遲在 10ms 以下。對 side project 跟中小型 production 來說夠用。

    場景 5 結論

    向量搜尋這層 RubyLLM 跟 LangChain 都只是「幫你生 embedding」,儲存跟查詢還是要靠專門的工具。RubyLLM 沒有比較好,但也不會比較差

    RubyLLM 1.16 救我的兩個關鍵時刻

    時刻 1:Streaming + Active Cable 整合超順

    👤 我原本擔心 LLM streaming 跟 Rails 的 Turbo Stream / Action Cable 整合會很雷。RubyLLM 的 streaming API 直接給 block:

    `ruby chat.ask("...") do |chunk| ActionCable.server.broadcast("chat_#{id}", chunk.content) end `

    這個寫法在 production 跑了兩週沒出過問題。對比我之前用 LangChain 的版本,要處理 asyncio event loop 跟 Rails 的同步世界怎麼接,光是 debug 就花了我兩天。

    時刻 2:Active Storage 直接吃

    RubyLLM 1.14 修了一個 bug:當你用 ActiveStorage 的 blob 傳檔案給 chat.ask,RubyLLM 不會再下載再上傳一次。這個小細節讓我的客服系統省掉 40% 的 storage 操作。

    RubyLLM 讓我後悔的三個地方

    公平起見,也要講我不滿意的部分。

    雷點 1:複雜 agent workflow 還是 Python 強

    如果你的 agent 需要:

  • 多層條件分支(if-else state machine)
  • 長時間運作(hours-level)跟狀態恢復
  • 多 agent 協作(multi-agent orchestration)
  • LangGraph 還是比較成熟。RubyLLM 的 RubyLLM::Agent 是個簡單的「instructions + tools」抽象,沒有 LangGraph 那種完整的 state machine。

    👤 對我這個 side project 來說沒差,但如果你要做 production-grade 的 multi-agent 系統,Python 生態系還是領先。

    雷點 2:除錯生態系比較薄

    LangChain 有 LangSmith 可以看每一個 step 的 prompt、token 用量、latency。RubyLLM 1.16 才開始加 Rails-style instrumentation,但成熟度跟 LangSmith 還差一截。

    👤 實測期間我遇到的問題:有一次 Anthropic API 回 prompt is too long,RubyLLM 1.16 之前是當 generic error 丟出來,要靠 rescue + log 自己分類。1.16 修成 ContextLengthExceededError,但這個 patch 是 2026 年 6 月才出來的。

    雷點 3:社群規模還是差很多

  • LangChain GitHub stars:90k+
  • RubyLLM GitHub stars:4.1k
  • 這代表什麼?你碰到 bug 時找到答案的難度差很多。LangChain 在 Stack Overflow 跟 GitHub Discussions 上的累積內容遠比 RubyLLM 多。

    👤 這不是 RubyLLM 的錯,是時程問題。RubyLLM 1.0 是 2025 年 3 月才出(Reddit r/rails 公告),到 2026 年 6 月才一年三個月,社群規模追不上是正常的。

    我會選誰:決策表

    根據這個月實測,我做了一張決策表:

    你的情境推薦方案理由
    Rails 工程師,要加 chatbot / 客服 / 文件問答RubyLLM 1.16一個 codebase、開發速度快、整合最順
    Rails 團隊,現有 codebase 已經有 Python 微服務繼續用 LangChain重寫成本不划算,但慢慢把新功能用 RubyLLM 寫
    純 Python / Data 團隊,要做複雜 multi-agentLangChain + LangGraph生態系成熟、文件齊全
    只是要簡單接 GPT-5 / Claude,不需要切 provider直接用 SDK沒有 over-engineering 的必要
    Side project、學習目的RubyLLM入門門檻低,社群友善
    大規模 production、需要 observabilityLangChain + LangSmith監控跟除錯生態系完整
    📚 這張表的判斷邏輯跟 Ivan Turkovic 在 2026 年 5 月的 CTO 文章 結論一致:「2026 年如果是 Rails team 要做 AI SaaS,預設就是 RubyLLM。」

    常見問題 FAQ

    Q1:RubyLLM 適合大型 production 部署嗎?

    要看「大型」的定義。👤 我這個 side project 月 API cost 約 USD$300、QPS 約 5,這個規模 RubyLLM 完全沒問題。如果你是月成本 USD$10,000+、QPS 100+ 的規模,建議先做 load testing——RubyLLM 1.16 的 thread-based 並行在 Rails Puma 下的極限我還沒測過。

    Q2:RubyLLM 跟 Active Agent 差在哪?

    Active Agent 是另一個 Rails AI 框架,由 Rails core team 的 Workarea 維護。差別在:
  • RubyLLM:focus 在「一個統一介面接所有 LLM provider」
  • Active Agent:focus 在「Rails controller-like 的 agent 抽象」
  • 兩個專案方向不同,RubyLLM 的社群活躍度跟文件完整度在 2026 年 6 月這個時間點比較高。

    Q3:我學 Python 還是繼續深化 Ruby?

    📊 Stack Overflow 2025 調查 顯示 Ruby 工程師的薪資中位數跟 Python 工程師差距已經縮小到 8% 以內。👤 我的看法:Rails 工程師如果工作內容是 SaaS / 內部系統,繼續深化 Ruby 是對的選擇。如果工作內容是 ML / Data pipeline,那學 Python 是必要的。

    Q4:RubyLLM 1.16 升級會不會破壞既有 code?

    官方 release notes 寫到 1.16 是 backward compatible。concurrent tool execution 是 opt-in、instrumentation 是 inert 直到你 subscribe、新的 *_api_base 都 fallback 到 provider 預設值。但建議在 test environment 設 config.deprecation_behavior = :raise,這樣碰到 deprecated path 會立刻 fail,比 production 才發現好。

    Q5:用 RubyLLM 的話,向量資料庫要選什麼?

    三個選項:

  • 1. pgvector(如果已經有 PostgreSQL)— 我選這個
  • 2. Qdrant(如果向量量很大、需要 dedicated service)
  • 3. SQLite 的 sqlite-vec extension(side project 跟開發環境用,輕量)
  • 👤 對 100 萬向量以下的規模,pgvector 效能就夠了。千萬級以上再考慮 dedicated vector database。

    總結

    RubyLLM 1.16 在 2026 年 6 月這個時間點是Rails 工程師接 AI 功能的第一選擇——前提是你的需求沒有複雜到需要 LangGraph 那種 state machine。

    我這個月的實測結論:

  • 1. Chatbot 跟文件問答:RubyLLM 碾壓 LangChain(同樣功能少寫 60% 程式碼)
  • 2. 並行 tool 執行:RubyLLM 1.16 內建,LangChain 要自己組 asyncio
  • 3. Image + cost tracking:RubyLLM 1.15 領先,LangChain 要串付費 LangSmith
  • 4. 複雜 multi-agent:LangChain + LangGraph 還是比較強
  • 5. 向量搜尋:兩家都沒做全套,要靠 pgvector / Qdrant 補
  • 立即行動清單:
  • 1. 今天就做:在 Rails new project 加 gem 'ruby_llm',跑 bin/rails generate ruby_llm:install
  • 2. 本週完成:把一個 chatbot 場景 porting 到 RubyLLM,跟現有 Python 方案做 A/B test
  • 3. 持續執行:觀察 1.x 系列的 release notes,特別是 1.17 / 2.0 的 breaking changes
  • 如果你覺得這篇文章有幫助,歡迎分享給你身邊的 Rails 工程師朋友。有任何問題或你的實測心得,歡迎留言討論。


    關於作者

    Ryan — RYAN生活黑客創辦人。寫了 9 年 Rails,現在 side project 跟客戶專案都用 RubyLLM 1.16 跑。致力於用最簡單的方式分享工程師會真的用到的工具。

    Twitter | GitHub

    參考資料 References

    本文撰寫於 2026-06-25,所有引用來源於當日可查證。

  • 1. RubyLLM 官方網站 - One beautiful Ruby framework for all major AI providers — 查證日期:2026-06-25
  • 2. RubyLLM GitHub Releases - 1.16.0 release notes — 查證日期:2026-06-25
  • 3. RubyLLM GitHub Repository - crmne/ruby_llm — 查證日期:2026-06-25
  • 4. Stack Overflow 2025 Developer Survey — 查證日期:2026-06-25
  • 5. Ivan Turkovic - Rails + RubyLLM vs LangChain in 2026: The Honest CTO Perspective — 查證日期:2026-06-25
  • 6. Carmine Paolino - Ruby Is the Best Language for Building AI Apps — 查證日期:2026-06-25
  • 7. Hacker News - RubyLLM: A Ruby framework for all major AI providers — 查證日期:2026-06-25
  • 8. pgvector - PostgreSQL vector similarity search — 查證日期:2026-06-25
  • 9. RubyConf 2025 - The State of the Ruby AI Ecosystem — 查證日期:2026-06-25
  • 10. 經濟部 - 中小企業數位轉型補助 (AI 應用) — 查證日期:2026-06-25
  • 本文使用的來源類型統計
  • 📊 政府/官方:1 個
  • 📚 學術/研究:0 個
  • 📰 媒體報導:2 個
  • 👤 個人經驗(無需外部查證):12 處
  • 🛠️ 工具/官方文件:7 個
  • #RubyLLM#Rails#AI 框架#LangChain#Ruby#LLM#AI 工具