5.1 RAG 框架概述(LangChain、LlamaIndex)
框架把載入、分塊、檢索、生成這些常用零件包好,但要不要用、什麼時候用,值得想一下。
載入文件、分塊、建立索引、檢索和呼叫模型都有現成工具。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,自己串起來。
要不要用框架
| 用框架 | 自己寫 | |
|---|---|---|
| 起步速度 | 快 | 慢一點 |
| 彈性與掌控 | 受框架設計的限制 | 完全自己決定 |
| 除錯 | 出問題時要鑽進框架的內部才看得懂 | 每一行都是自己寫的,比較容易追 |
| 維護 | 要跟著框架更新,改版可能破壞原本的程式 | 依賴少,比較穩定 |
| 學習 | 容易只學會用工具,不懂原理 | 有助於理解每個環節 |
| 常見零件 | 現成 | 要自己接 |
我的建議是:
- 學習階段,先自己寫一次。這章就是這樣做,約一百行就能做出基本的 RAG。你會知道每一步在做什麼。
- 要做正式的系統、需要很多整合時,再考慮框架。這時你已經懂原理,看得懂框架在做什麼,也知道怎麼調整。
- 別把框架當成黑盒子。不管用什麼,都要能看到「檢索到什麼」「送給模型的提示詞是什麼」,這是除錯的關鍵。
這章的做法
接下來的範例用到:
- sentence-transformers:嵌入模型(和第 2 章一樣)。
- Chroma:向量資料庫(和第 3 章一樣)。
- LLM 的官方 SDK:呼叫模型。
- 純 Python 把它們串起來。
不用 LangChain 或 LlamaIndex,所以你會看到完整的流程沒有被隱藏起來。