langchain-rust:在 Rust 裡組裝 LLM 流程,v4.6.0 之後的取捨
🦜️🔗LangChain for Rust, the easiest way to write LLM-based programs in Rust
秒懂
- 它是什麼?
- langchain-rust 把 LangChain 的抽象帶進 Rust,用 async 串流與 trait 物件包住 LLM、向量庫與鏈。它的價值在於型別與併發,代價是版本節奏與生態廣度。
- 適合誰用?
- langchain-rust 適合已經在用 Rust 寫服務、需要把 OpenAI、Azure OpenAI、Ollama 或 Anthropic Claude 接進既有 tokio 程式,並且願意自己讀 examples/ 目錄決定實作細節的團隊。若你需要的是大量現成整合、頻繁的社群範例,或不想處理 async 串流與 trait 物件帶來的型別摩擦,這個專案會讓你花更多時間在讀原始碼而不是寫功能。
- 可以商用嗎?
- 可以。MIT 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
- 還在維護嗎?
- 有在維護。儲存庫最近一次提交在 7 天前。
- 用什麼語言寫的?
- 主要是 Rust(依據 GitHub 的語言統計)。
以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。
開源專案深度解析
把 LangChain 的組裝模型搬進 Rust 的非同步執行環境
這個專案要解決的問題很具體:Rust 生態裡不缺呼叫單一 LLM API 的客戶端,缺的是把「模型呼叫、向量檢索、文件載入、多步驟鏈」組合成一條流程的共用抽象。langchain-rust 的 README 開頭寫得很直白,它是 LangChain 的 Rust 語言實作,目標是「透過可組合性用 Rust 建構 LLM 應用」。
它的受眾不是資料科學家,而是已經有 Rust 服務、想把檢索增強生成或工具呼叫代理塞進現有後端的人。這些人通常已經在用 tokio,對 async 執行環境、錯誤處理與型別安全有要求,也不想為了呼叫模型而多開一個 Python 服務。README 的 Current Features 清單就是為這群人排的:LLM 端有 OpenAi、Azure OpenAi、Ollama、Anthropic Claude;Embeddings 端多了 Local FastEmbed 與 MistralAI;VectorStores 涵蓋 OpenSearch、Postgres、Qdrant、Sqlite 與 SurrealDB。
值得注意的是它把 Chain 與 Agent 分成兩層。Chain 是固定順序的組合,例如 LLM Chain、Conversational Chain、Sequential Chain、Q&A Chain、SQL Chain;Agent 則讓模型自己決定要不要呼叫工具,README 列了 Chat Agent with Tools 與 Open AI Compatible Tools Agent 兩種。這個分層決定了你寫程式時的心智模型:能事先畫出流程圖的用 Chain,需要模型臨場判斷的用 Agent。
串流、trait 物件與 examples 目錄:實際的組合方式
從 README 的程式碼片段可以看出它的資料流設計。文件載入器回傳的不是 Vec,而是需要自行 collect 的串流。以 PDF 載入器為例,載入後要 .map(|d| d.unwrap()).collect::<Vec<_>>().await 才能拿到文件集合,這表示載入過程是惰性且可漸進的,代價是每個元素都包在 Result 裡,錯誤處理散在迭代過程中。
這個模式在 HtmlLoader、HtmlToMarkdownLoader、CsvLoader、GitCommitLoader 上完全一致。PandocLoader 稍微不同,建構時就要先 await,因為它得先確認外部 pandoc 可執行檔能跑。CsvLoader 的建構子要求你先給欄位名稱向量,這等於強迫你事先知道表格結構,好處是產出的文件有明確的 metadata 欄位,壞處是標頭變動就得改程式。
HtmlToMarkdownLoader 提供 HtmlToMarkdownOptions::default().with_skip_tags(vec!["figure".to_string()]) 這類選項,讓你排除特定標籤再轉換。這種 builder 風格在 Rust 裡很常見,也符合專案把設定留在型別系統內、而不是靠執行期字串的傾向。
向量庫與 LLM 的抽象則走 trait 物件路線,這也是它能同時支援 OpenSearch、Postgres、Qdrant、Sqlite、SurrealDB 的原因。抽象帶來統一介面,但也意味著當某個後端有獨特能力時,你可能得繞過抽象層直接呼叫底層客戶端。README 沒有描述 trait 的具體簽名,實際的邊界得看原始碼。
安裝與最小可跑路徑
取得方式很單純:Cargo.toml 加入相依,版本以 crates.io 上的 langchain-rust 為主,README 的徽章指向 crates.io/crates/langchain-rust,最新發布的 release 是 v4.6.0(2024-10-06),前一版 v4.5.0 同日發布,再往前是 v4.4.2(2024-09-10)。
專案沒有提供 CLI,也沒有設定檔。所有設定都在程式碼裡,例如 PdfExtractLoader::from_path(path)、PandocLoader::from_path(InputFormat::Docx.to_string(), path)、HtmlLoader::from_path(path, Url::parse("https://example.com/").unwrap())、CsvLoader::from_path(path, columns)。這代表沒有 config key 需要記,反過來說也沒有環境變數或設定檔能讓你在部署時切換供應商,切換得改程式重編。
供應商的選擇對應到不同的建構路徑,README 的 examples 目錄下有 llm_openai.rs、llm_azure_open_ai.rs、llm_ollama.rs、llm_anthropic_claude.rs,embeddings 端則有 embedding_openai.rs、embedding_azure_open_ai.rs、embedding_ollama.rs、embedding_fastembed.rs、embedding_mistralai.rs。最快的上手方式是照著對應範例複製,而不是從文件推導。
向量庫的範例分得更細:vector_store_opensearch.rs、vector_store_postgres.rs、vector_store_qdrant.rs、vector_store_sqlite_vss.rs,SurrealDB 則放在 vector_store_surrealdb/src/main.rs 這樣的子目錄裡。Sqlite 走的是 vss 擴充,Postgres 與 Qdrant 通常需要外部服務,這些依賴不會因為用了這個 crate 就消失,你的部署仍然得準備對應的資料庫。
當抽象開始漏水:依賴、版本與文件落差
第一個限制來自外部依賴。PandocLoader 需要系統上有 pandoc;Sqlite 向量庫走 vss 擴充;OpenSearch、Postgres、Qdrant、SurrealDB 都是獨立服務。這個 crate 幫你統一了介面,沒有幫你消除維運成本。如果你的環境不能安裝這些東西,對應的向量庫選項就等於不存在。
第二個限制是版本節奏與 API 穩定性。v4.5.0 與 v4.6.0 在同一天發布,這種密集的 minor 版本通常意味著介面還在調整。同時倉庫在 2026-09-08 仍有推送,代表 main 分支比最後一個 release 更新。你照 README 或線上教學寫的程式碼,可能對應的是某個特定版本,升級時要預期有破壞性變更。鎖版本是務實做法。
第三個限制是文件深度。README 用大量程式碼片段展示載入器,但對 Chain 與 Agent 的說明只有清單與連結。LLM Chain 與 Sequential Chain 的差異、Conversational Retriever 在接上向量庫後如何管理對話歷史、Agent 的工具呼叫迴圈上限是多少,這些在提供的材料裡都看不到。這不是說它們沒有文件,而是說你評估時必須把 examples/ 目錄當成主要規格來源,而不是把 README 當成完整手冊。
還有一個容易被忽略的點:專案描述自稱「easiest way to write LLM-based programs in Rust」,但從載入器要手動 collect、錯誤要逐層 unwrap 來看,它換來的是控制權而不是便利。把它當成便利層會失望,當成組合層才合理。
Python LangChain 與 Rust 版本的分工差異
最直接的替代方案就是 README 自己指出的上游:langchain-ai/langchain。兩者的差別不在功能清單,而在整合廣度與執行模型。
Python 版累積的整合數量與第三方套件遠多於此處列出的清單。若你需要的是某個冷門向量庫、某個地區性模型供應商,或某個剛出現的檢索技巧,Python 版更可能已經有人做過。langchain-rust 的 README 列出的是明確的支援範圍:LLM 四家、Embeddings 五家、VectorStores 五種,超出這個範圍就得自己實作 trait。
反過來,Rust 版的優勢在部署形態。它是一個 crate,編譯進你的服務,沒有直譯器與虛擬環境,適合已經有 Rust 後端、不想再多一個 Python 服務與跨語言呼叫的團隊。async 串流與型別檢查在編譯期就擋掉一部分錯誤,這在長時間執行的服務裡有實際價值。
這裡的判斷很簡單:如果你的瓶頸是整合數量與範例密度,選 Python 版;如果你的瓶頸是部署複雜度與跨語言邊界,且需求落在 README 清單內,Rust 版才成立。兩者不是同一種工具的不同包裝,而是針對不同團隊形狀的取捨。
維護成本、授權與採用邊界
授權是 MIT,這對商業使用相對寬鬆,但這不是法律意見,實際條款仍應以倉庫內的 LICENSE 檔案為準,並依你組織的政策確認。
維護成本主要落在三處。第一是供應商 API 變動,OpenAI、Azure OpenAI、Anthropic Claude 的介面都會演進,這個 crate 得跟上,你的升級週期因此與上游綁定。第二是向量庫的客戶端版本,Postgres、Qdrant、OpenSearch 的 Rust 客戶端各自獨立更新,可能出現版本衝突需要處理。第三是 main 分支與 release 的落差,若你依賴某個尚未發布的修正,就得改用 git 相依,這會讓建置可重現性變差。
升級時的具體做法是先在 Cargo.toml 鎖定版本,再對照 examples/ 目錄中與你使用情境相符的檔案,例如你用 Anthropic 就看 llm_anthropic_claude.rs,用 Qdrant 就看 vector_store_qdrant.rs,用 SQL Chain 就看 sql_chain.rs。這些範例是這個專案最接近規格的東西,把它們納入你的升級檢查清單,比讀變更日誌更直接。
什麼情況下這不是對的工具:你需要大量現成工具整合、需要成熟的代理框架、或團隊成員不熟悉 Rust 的非同步生態。這三種情況下,把時間花在 langchain-rust 上不會得到對應回報。
編輯結論
langchain-rust 適合已經在用 Rust 寫服務、需要把 OpenAI、Azure OpenAI、Ollama 或 Anthropic Claude 接進既有 tokio 程式,並且願意自己讀 examples/ 目錄決定實作細節的團隊。若你需要的是大量現成整合、頻繁的社群範例,或不想處理 async 串流與 trait 物件帶來的型別摩擦,這個專案會讓你花更多時間在讀原始碼而不是寫功能。採用前先確認三件事:你需要的 LLM 供應商與向量庫是否都在 README 的支援清單內、你的執行環境能否透過 Docker 或系統套件提供 Qdrant 與 Postgres 這類外部依賴、以及你打算鎖定的版本(v4.6.0 之後 main 分支仍有推送)其 API 是否與你參考的範例一致。
社群筆記