Python+LangGraph+RAGAS構建一個復雜的、可用于生產的RAG系統
構建一個可用于生產的 RAG 系統,需要一系列深思熟慮且迭代的步驟。
一切從 清理和準備數據 開始,接著測試不同的 切分策略(邏輯切分與傳統切分),以找到最適合你業務場景的方法。
然后是 匿名化,通過去除敏感或無關的細節來減少幻覺。
為了進一步提升檢索器的性能,可以構建 子圖(Subgraph),讓檢索更聚焦于最相關的信息,同時過濾掉噪聲。
在檢索層之上,我們引入一個由 LLM 驅動的規劃與執行系統。它就像一個智能體(Agent),能夠從前面的步驟中學習,并決定下一步應該執行什么操作。
最后,當 RAG 系統生成回答后,我們會使用一系列指標對其性能進行評估。
在接下來的一系列文章中,我們將一步步演示如何構建這樣一個全棧 RAG 系統。
整個過程將基于LangChain、LangGraph 和 RAGAS(用于評估),一切從真實的企業需求出發,并展示開發者在構建生產級 RAG 系統時會遇到的實用解決方案。
在開始編碼之前,最好先從全局可視化角度理解我們的 RAG Pipeline 的整體結構。隨著后續的推進,我們會逐步可視化其中的每個組件。

我們最終版 RAG 流水線的高層概覽:
- 問題匿名化:先對用戶輸入的問題進行匿名化處理
- 規劃器(Planner)生成高層策略
- 去匿名化:重新引入上下文信息
- 計劃分解:將整體計劃拆解為更小的任務
- 任務處理:為每個任務選擇合適的工具
- 檢索工具執行:若工具為引語、切分塊或摘要檢索,則進行數據獲取
- 重新規劃(Replan):基于新獲取的信息,系統可能會調整計劃
- 生成最終答案:如果系統確認可以回答問題,則輸出最終答案
- 流程結束
首先,我們調用 anonymize_question。它會將具體的人名(例如 “Harry Potter”、“Voldemort”)替換為占位符(如 Person X、Villain Y),以避免LLM 因預訓練知識而產生偏差。
接下來,planner 會生成一個高層策略。比如對于問題 “How did X defeat Y?”,它可能會規劃如下步驟:
- 識別 X 和 Y
- 定位他們的最終對抗場景
- 分析 X 的行為
- 起草答案
然后我們運行de_anonymize_plan,恢復原始名字,使計劃更加具體且可執行。更新后的計劃會傳遞給 break_down_plan,將每個高層步驟拆解為更具體的任務。
接著,task_handler 會為每個任務選擇合適的工具。可能的選項包括:
- chosen_tool_is_retrieve_quotes:檢索具體的引言或對話
- chosen_tool_is_retrieve_chunks:獲取一般信息與上下文
- chosen_tool_is_retrieve_summaries:查詢總結整章內容
- chosen_tool_is_answer:在已有足夠上下文時,直接生成答案
當使用某個檢索工具(如retrieve_book_quotes、retrieve_chunks 或retrieve_summaries)后,新的信息會被傳遞給 replan。
replan 會審查當前的進展、目標以及新輸入,判斷是否需要更新或擴展原有計劃。
整個循環task_handler → tool → replan 會持續進行,直到系統判定該問題 can_be_answered_already(已經可以回答)。此時,get_final_answer 會綜合所有信息,生成完整的回答。
最后,檢查答案的準確性和是否忠實于來源。如果通過檢查,流程會以 end 結束,交付一個經過驗證、推理合理的最終答案。
本文轉載自??PyTorch研習社??,作者:南七無名式

















