
不用 LangChain 的 RAG:無需 Python 框架建構生產級檢索管線
LangChain 成為了 RAG 的預設起點。但越來越多的生產團隊正在離開它——原因包括抽象開銷、除錯困難和供應商鎖定。以下是替代方案。
每當有人在 Reddit、Stack Overflow 或任何 AI Discord 上問「我該怎麼建構 RAG」時,LangChain 已經成為了預設推薦。這是有道理的:在 2023-2024 年間,它讓人們從零到一個可運作的原型比其他任何工具都快。你可以用五十行 Python 程式碼連接一個向量資料庫、一個嵌入模型和一個聊天補全端點。
但越來越多的生產團隊正在悄悄 地將其移除。不是因為 LangChain 不好——它確實幫助引導了 RAG 生態系統。他們移除它是因為那些讓 LangChain 在原型階段表現出色的特性在生產規模下變成了負擔。
如果你正在評估如何在不使用 LangChain 的情況下建構 RAG 管線,或者在考慮是否應該遷移,這是一篇誠實的分析:到底有什麼問題、有哪些替代方案,以及什麼時候 LangChain 仍然是正確的選擇。
抽象稅
每個框架都有代價。你用控制權換取便利性。當抽象是穩定的、文件齊全的,並且能清晰地映射到你對底層系統的心智模型時,這種權衡是值得的。
LangChain 的抽象在生產環境中的這三個方面都表現不佳。
版本變動。 LangChain 的 API 介面在各版本之間變化劇烈。基於 langchain==0.0.x 建構的團隊發現他們的程式碼被 0.1.x 破壞,然後又被 langchain-core / langchain-community 的拆分再次破壞。在原型環境中,你固定一個版本就繼續前進。在有 CI/CD 管線、相依性稽核和安全審查的生產系統中,每次破壞性變更都要消耗工程時間。
除錯黑盒。 當 RAG 管線回傳一個不好的答案時,你需要檢查每個階段:查詢轉換、嵌入、檢索步驟、重排序和提示詞組裝。LangChain 將每一個都包裹在層層抽象中——鏈、可執行物件、回呼——這使得很難看到每個步驟實際發生了什麼。團隊報告說花在除錯框架上的時間比除錯管線邏輯的時間還多。
簡單管線的過度工程化。 大多數生產 RAG 系統遵循一個簡單直接的模式:嵌入查詢、搜尋向量儲存、將上下文組裝到提示詞中、呼叫模型。這大概是 100 行直接程式碼。LangChain 為本質上是線性資料流的東西引入了鏈、代理、輸出解析器、檢索器和記憶物件等概念。認知開銷是真實的,特別是在讓新工程師熟悉程式碼庫時。
供應商耦合。 LangChain 透過其整合層支援數十個 LLM 供應商、向量儲存和嵌入模型。但這個整合層意味著你依賴 LangChain 來維護每個供應商的包裝器。當供應商更新他們的 SDK 時,你要等 LangChain 跟上。當你想使用供應商特定的功能時,你要與抽象作鬥爭才能存取它。
這些都不意味著 LangChain 是一個糟糕的專案。它意味著這個框架是為廣度和入門速度最佳化的,而不是為生產中重要的營運關注點最佳化的:可除錯性、穩定性和透明性。
替代方案 1:直接 SDK 呼叫
團隊離開 LangChain 時最常走的路是最簡單的:完全放棄框架,直接呼叫供應商的 SDK。
使用直接呼叫建構的生產 RAG 管線通常是這樣的:
- 嵌入查詢,使用你的嵌入供應商的 SDK(OpenAI、Cohere 或透過 sentence-transformers 使用本地模型)
- 搜尋向量儲存,使用儲存的原生客戶端(Pinecone、Weaviate、Qdrant、pgvector)
- 可選地重排序檢索到的分塊,使用交叉編碼器或重排序 API
- 組裝提示詞,將檢索到的上下文插入你的提示詞模板
- 呼叫 LLM,使用供應商的 SDK 和你組裝好的提示詞
每個步驟都是一個函式呼叫。每個函式呼叫回傳你可以獨立記錄、檢查和測試的資料。沒有框架狀態需要管理,沒有回呼系統需要設定,你和實際操作之間沒有鏈式抽象。
適用場景: 擁有強大 Python/TypeScript 工程能力的團隊,定義明確且不會頻繁改變形態的管線,以及在每個步驟都需要完全可觀測性的需求。當你想要除已有服務之外零外部相依性時,這是 LangChain 最佳的本地替代方案。