EN

5.1 RAG 框架概述(LangChain、LlamaIndex)

框架把載入、分塊、檢索、生成這些常用零件包好,但要不要用、什麼時候用,值得想一下。

RAG下一篇 →

載入文件、分塊、建立索引、檢索和呼叫模型都有現成工具。RAG 框架把這些工具包成共同介面,減少串接工作;代價則是多一層抽象,出問題時不一定容易追。

框架幫你做什麼

一個 RAG 系統有很多零件:文件載入器、分塊器、嵌入模型、向量資料庫、LLM、提示詞模板。每個零件都有很多種選擇,各家的介面又不一樣。

框架的價值在於:

  • 統一介面:換向量資料庫或換 LLM,只要改一兩行。
  • 現成的零件:幾十種文件載入器、分塊器、資料庫連接。
  • 常見流程的封裝:幾行就能搭出一個基本的問答。
  • 周邊功能:記錄、追蹤、評估、對話記憶等。

LangChain

LangChain 是最廣為人知的框架之一,定位是「把各種 LLM 應用的零件串起來」,範圍比 RAG 更廣。

  • 特色:零件齊全,生態系很大,連接的服務非常多。
  • 概念:文件載入器、文字分割器、向量儲存、檢索器、提示詞模板、模型,用「鏈」(chain)串起來。
  • 延伸:也有支援多步驟、有狀態的代理(agent)流程的相關工具。
  • 提醒:這個框架演進得很快,介面和推薦用法常常改變,網路上舊的教學範例可能已經不能用。

LlamaIndex

LlamaIndex 的重心放在「資料」:怎麼把各種資料接進 LLM 並建立索引、查詢。

  • 特色:對 RAG 這個主題特別專注,預設的流程做得很完整。
  • 概念:文件(Document)切成節點(Node),建立索引(Index),透過查詢引擎(Query Engine)提問。
  • 最簡單的用法,只要幾行:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

documents = SimpleDirectoryReader("data").load_data()   # 讀取 data 資料夾裡的檔案
index = VectorStoreIndex.from_documents(documents)       # 分塊、嵌入、建索引
query_engine = index.as_query_engine()                   # 建立查詢引擎
print(query_engine.query("沒休完的特休假會怎麼處理?"))

注意 這段我沒有實際執行。LlamaIndex 預設會使用外部服務的嵌入模型和 LLM,通常需要先設定 API 金鑰,也可以改成本機的模型。套件的介面會隨版本改變,請以官方文件為準。

其他選擇

  • Haystack:另一個專注在搜尋和問答流程的框架,用「管線(pipeline)」的概念組織。
  • 直接自己寫:只用嵌入模型、向量資料庫、LLM 的 SDK,自己串起來。

要不要用框架

用框架 自己寫
起步速度 快 慢一點
彈性與掌控 受框架設計的限制 完全自己決定
除錯 出問題時要鑽進框架的內部才看得懂 每一行都是自己寫的,比較容易追
維護 要跟著框架更新,改版可能破壞原本的程式 依賴少,比較穩定
學習 容易只學會用工具,不懂原理 有助於理解每個環節
常見零件 現成 要自己接

我的建議是:

  1. 學習階段,先自己寫一次。這章就是這樣做,約一百行就能做出基本的 RAG。你會知道每一步在做什麼。
  2. 要做正式的系統、需要很多整合時,再考慮框架。這時你已經懂原理,看得懂框架在做什麼,也知道怎麼調整。
  3. 別把框架當成黑盒子。不管用什麼,都要能看到「檢索到什麼」「送給模型的提示詞是什麼」,這是除錯的關鍵。

這章的做法

接下來的範例用到:

  • sentence-transformers:嵌入模型(和第 2 章一樣)。
  • Chroma:向量資料庫(和第 3 章一樣)。
  • LLM 的官方 SDK:呼叫模型。
  • 純 Python 把它們串起來。

不用 LangChain 或 LlamaIndex,所以你會看到完整的流程沒有被隱藏起來。

← 全部文章