從RAG到Agentic RAG:構建更智能的檢索增強系統
在人工智能領域,大型語言模型(LLMs)正以前所未有的速度滲透到各行各業的應用中。從智能客服到企業知識管理系統,從內容創作輔助到數據分析,LLMs展現出了強大的通用智能。然而,這些模型在處理需要特定領域知識或實時信息的任務時,常常暴露出"知識遺忘"或"幻覺"問題——它們可能會基于預訓練時記憶的信息生成看似合理卻不符合事實的回答。為解決這一挑戰,檢索增強生成(RAG)技術應運而生,并迅速成為連接LLMs與外部知識的橋梁。
一、RAG的基本原理與局限
1.1 RAG的核心架構與工作流程
檢索增強生成(Retrieval-Augmented Generation, RAG)是一種在推理階段將外部知識注入LLM的框架,其設計初衷是讓模型能夠"按需查詢"而非單純依賴預訓練記憶。RAG的核心工作流程可以拆解為三個關鍵步驟:
首先,當用戶提交查詢時,系統會將問題轉換為向量表示。這一過程通過嵌入模型(如OpenAI的text-embedding-3-large)實現,它能將文本映射到高維語義空間,使得語義相近的文本在向量空間中距離更近。
其次,系統會將生成的查詢向量與預構建的向量數據庫中的文檔向量進行匹配。向量數據庫(如ChromaDB、Milvus)存儲著經過預處理的文檔片段,通過余弦相似度等算法,系統能夠檢索出與查詢語義最相關的文檔。
最后,檢索到的文檔與原始查詢會一同輸入LLM,模型基于這些上下文生成回答。這種方式讓LLM能夠"參考"最新或特定領域的知識,從而提高回答的準確性并減少幻覺現象。
1.2 RAG的局限性:靜態流程的固有缺陷
盡管RAG顯著提升了LLM的事實性回答能力,但傳統RAG架構存在一個根本性缺陷:它采用固定的"檢索-生成"線性流程,缺乏對檢索結果的智能評估和流程優化能力。這種靜態設計導致了以下問題:
- 檢索質量依賴初始查詢:如果用戶的查詢表述模糊或存在歧義,向量檢索可能返回不相關或噪聲文檔,而RAG系統無法自動修正查詢,導致LLM基于錯誤上下文生成誤導性回答。
- 缺乏上下文相關性驗證:傳統RAG直接將檢索結果輸入LLM,不具備對文檔相關性的主動評估機制。即使檢索到無關內容,系統也會盲目使用,從而放大錯誤。
- 無法處理復雜推理鏈:對于需要多輪檢索或跨文檔推理的復雜問題,線性RAG流程難以應對,可能因單次檢索的局限性導致回答不完整。
這些局限本質上反映了傳統RAG的"被動性"——它只是機械地執行檢索和生成,而缺乏類似人類的決策和反思能力。要突破這些瓶頸,需要將RAG系統升級為具備主動決策能力的智能體,這正是Agentic RAG的核心創新點。
二、Agentic RAG:從工具到智能體的進化
2.1 Agentic RAG的決策閉環設計
Agentic RAG通過將決策能力嵌入RAG流程,將傳統的線性架構升級為循環推理系統。其核心思想是讓RAG系統像人類一樣思考:先分析問題是否需要檢索,再根據檢索結果評估是否需要調整策略,形成"決策-檢索-評估-優化"的閉環。
這一進化的關鍵在于引入了三個核心能力:
- 動態決策能力:系統能夠基于問題特性判斷是否需要檢索。例如,對于"你好"這類簡單問候,Agentic RAG會直接回答而不觸發檢索;對于"2025年人工智能大會的舉辦時間"這類需要實時信息的問題,則主動啟動檢索流程。
- 上下文評估能力:在生成回答前,系統會評估檢索到的文檔是否真正與用戶意圖匹配。這種評估不是簡單的相似度計算,而是通過LLM自身進行語義理解和相關性判斷。
- 流程優化能力:當檢索結果不相關時,系統能夠自動重寫查詢,使其更精準地匹配用戶需求,然后重新啟動檢索和評估流程,直至獲得滿意的上下文。
2.2 Agentic RAG的工作流程詳解
Agentic RAG的工作流程可以拆解為五個核心步驟,形成一個完整的推理循環:
第一步:查詢評估與決策用戶提交查詢后,系統首先將問題輸入LLM,但此時LLM的任務不是直接生成回答,而是分析問題的性質。它需要判斷:這個問題是否需要外部知識支持?是否可以基于模型自身知識直接回答?例如,對于"相對論的基本原理"這類常識性問題,LLM可能判斷無需檢索;而對于"某公司最新財報數據"這類時效性強的問題,則決定啟動檢索。
第二步:智能檢索(如需)如果決策結果為需要檢索,系統會將查詢轉換為向量并檢索向量數據庫。與傳統RAG不同,這里的檢索工具被封裝為可調用的"工具節點",其使用受到決策模塊的嚴格控制,避免了無意義的檢索調用。
第三步:文檔相關性分級檢索到文檔后,系統不會直接將其輸入LLM,而是先進行相關性評估。這一步通過專門的"分級函數"實現,該函數使用LLM對文檔與查詢的相關性進行語義判斷,輸出"相關"或"不相關"的二元結果。這種基于理解的評估比單純的向量相似度計算更準確,能有效過濾噪聲文檔。
第四步:回答生成或查詢重寫
- 如果文檔相關:系統調用生成模塊,將檢索到的上下文與原始查詢結合,由LLM生成基于事實的回答。
- 如果文檔不相關:系統觸發查詢重寫模塊,通過LLM分析用戶原始意圖,生成更精準的查詢語句。重寫后的查詢會被送回決策模塊,啟動新一輪的檢索-評估循環,直到獲得相關上下文。
第五步:循環優化與結果輸出查詢重寫后,系統會重復決策、檢索、評估的流程,形成一個閉環。這種循環機制允許系統不斷優化自身的檢索策略,直到找到合適的文檔或確認無法通過當前知識庫回答(此時可能觸發外部搜索等 fallback 機制)。
2.3 Agentic RAG的架構優勢
與傳統RAG相比,Agentic RAG在以下幾個方面展現出顯著優勢:
- 準確性提升:通過動態決策和相關性評估,減少了基于錯誤上下文的回答,實驗表明其事實性錯誤率較傳統RAG降低40%以上。
- 魯棒性增強:面對模糊或歧義查詢時,重寫機制能自動優化檢索條件,提高系統在復雜場景下的適應性。
- 用戶體驗優化:系統能夠根據問題類型智能選擇響應方式,避免了不必要的檢索延遲,同時減少了"幻覺"回答導致的用戶困惑。
- 可解釋性改進:決策閉環中的每一步都可追溯,便于分析系統行為,為模型優化提供明確方向。
這些優勢本質上源于Agentic RAG將"被動工具"轉變為"主動智能體"的設計理念——它不再只是執行預設流程,而是能夠根據實時情況做出理性決策,如同一個具備領域知識的助理,能夠思考、判斷并調整策略。
三、技術實現:使用LangChain與LangGraph構建Agentic RAG
3.1 開發環境準備與核心組件
構建Agentic RAG系統需要以下關鍵技術棧:
- LangChain:作為連接LLM與外部工具的框架,提供了檢索、文檔處理、工具調用等核心功能。
- LangGraph:一個基于圖的工作流引擎,用于定義和執行Agentic RAG的決策循環邏輯。
- 向量數據庫:這里使用ChromaDB存儲文檔嵌入,它提供了簡單高效的向量存儲和檢索能力。
- LLM模型:選擇OpenAI的ChatGPT系列模型作為推理核心,利用其強大的自然語言理解和生成能力。
3.2 構建知識基座:文檔加載、分塊與索引
第一步:加載依賴與初始化模型首先需要加載環境變量并初始化LLM和嵌入模型:
from dotenv import load_dotenv
load_dotenv()
import os
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
llm = ChatOpenAI() # 初始化LLM用于推理
embeddings = OpenAIEmbeddings(model="text-embedding-3-large") # 初始化嵌入模型
第二步:加載與扁平化文檔使用WebBaseLoader從網頁加載文檔,并將結果扁平化為單一文檔列表:
from langchain_community.document_loaders import WebBaseLoader
urls = [
"https://lilianweng.github.io/posts/2023-06-23-agent/",
"https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/"
]
docs = [WebBaseLoader(url).load() for url in urls]
docs_list = [item for sublist in docs for item in sublist]
第三步:文檔分塊處理使用RecursiveCharacterTextSplitter將文檔分割為合適大小的塊,重疊部分確保上下文連續性:
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=100,
chunk_overlap=25
)
doc_splits = text_splitter.split_documents(docs_list)
第四步:創建向量存儲將分塊后的文檔轉換為向量并存儲到ChromaDB中:
from langchain_community.vectorstores import Chroma
vectorstore = Chroma.from_documents(
documents=doc_splits,
collection_name="rag-chrome",
embedding=embeddings,
persist_directory="./chroma_db"
)
3.3 構建智能決策工具鏈
創建檢索工具將向量存儲封裝為LangChain工具,定義其使用場景和限制:
from langchain.tools.retriever import create_retriever_tool
retriever = vectorstore.as_retriever()
retriever_tool = create_retriever_tool(
retriever,
"retriever_blog_post",
"""
搜索并返回Lilian Weng關于LLM代理、提示工程和LLM對抗性攻擊的博客文章信息。
僅當查詢明確與LangChain博客數據相關時使用'retriever_tool'。
對于所有其他查詢,直接響應而不使用任何工具。
對于'hi'、'hello'或'how are you'等簡單查詢,提供常規響應。
"""
)
tools = [retriever_tool]
from langgraph.prebuilt import ToolNode
retriever_node = ToolNode(tools)
llm_with_tool = llm.bind_tools(tools)
實現LLM決策函數定義一個函數,使用LLM判斷是否需要調用檢索工具:
from typing import Annotated, Sequence, TypedDict
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages
class AgentState(TypedDict):
messages: Annotated[Sequence[BaseMessage], add_messages]
def LLM_Decision_Maker(state: AgentState):
print("----CALL LLM_DECISION_MAKER----")
message = state["messages"]
last_message = message[-1]
question = last_message.content
response = llm_with_tool.invoke(question)
return {"messages": [response]}
文檔相關性分級函數創建一個函數,使用LLM評估文檔與查詢的相關性,并決定下一步操作:
from pydantic import BaseModel, Field
from typing import Literal
from langchain_core.prompts import PromptTemplate
class Grade(BaseModel):
binary_score: str = Field(descriptinotallow="相關性分數'yes'或'no'")
def grade_documents(state: AgentState) -> Literal["Output Generator", "Query Rewriter"]:
print("----CALLING GRADE FOR CHECKING RELEVANCY----")
llm_with_structure_op = llm.with_structured_output(Grade)
prompt = PromptTemplate(
template="""你是一個評分員,決定文檔是否與用戶的問題相關。
這是文檔:{context}
這是用戶的問題:{question}
如果文檔談論或包含與用戶問題相關的信息,標記為相關。
給出'yes'或'no'答案,顯示文檔是否與問題相關。""",
input_variables=["context", "question"]
)
chain = prompt | llm_with_structure_op
message = state['messages']
last_message = message[-1]
question = message[0].content
docs = last_message.content
scored_result = chain.invoke({"question": question, "context": docs})
score = scored_result.binary_score
if score == "yes":
print("----DECISION: DOCS ARE RELEVANT----")
return "generator"
else:
print("----DECISION: DOCS ARE NOT RELEVANT----")
return "rewriter"
3.4 構建生成與重寫模塊
回答生成函數基于檢索到的上下文生成最終回答:
from langchain import hub
def generate(state: AgentState):
print("----RAG OUTPUT GENERATE----")
message = state["messages"]
question = message[0].content
last_message = message[-1]
docs = last_message.content
prompt = hub.pull("rlm/rag-prompt") # 從LangChain Hub獲取RAG提示模板
rag_chain = prompt | llm
response = rag_chain.invoke({"context": docs, "question": question})
print(f"this is my response: {response}")
return {"messages": [response]}
查詢重寫函數當文檔不相關時,優化用戶查詢:
from langchain.schema import HumanMessage
def rewrite(state: AgentState):
print("----TRANSFORM QUERY----")
message = state["messages"]
question = message[0].content
input = [
HumanMessage(cnotallow=f"""分析輸入并推理潛在的語義意圖或含義。
這是初始問題:{question}
制定一個改進的問題:""")
]
response = llm.invoke(input)
return {"messages": [response]}
3.5 組裝LangGraph工作流
最后,使用LangGraph定義Agentic RAG的決策流圖:
from langgraph.graph import END, StateGraph, START
from langgraph.prebuilt import tools_condition
workflow = StateGraph(AgentState)
workflow.add_node("LLM Decision Maker", LLM_Decision_Maker)
workflow.add_node("Vector Retriever", retriever_node)
workflow.add_node("Output Generator", generate)
workflow.add_node("Query Rewriter", rewrite)
workflow.add_edge(START, "LLM Decision Maker")
workflow.add_conditional_edges(
"LLM Decision Maker",
tools_condition,
{
"tools": "Vector Retriever",
END: END
}
)
workflow.add_conditional_edges(
"Vector Retriever",
grade_documents,
{
"generator": "Output Generator",
"rewriter": "Query Rewriter"
}
)
workflow.add_edge("Output Generator", END)
workflow.add_edge("Query Rewriter", "LLM Decision Maker")
3.6 系統測試與可視化
編譯并測試工作流,可視化決策流程圖:
app = workflow.compile()
from IPython.display import Image, display
display(Image(app.get_graph().draw_mermaid_png()))
import warnings
warnings.filterwarnings("ignore")
app.invoke({
"messages": [
"what is LLM Powered Autonomous Agents explain the planning and reflection and prompt engineering explain me in terms of agents and langchain?"
]
})
四、Agentic RAG的未來演進:從閉環到生態
4.1 Corrective RAG:引入外部搜索的魯棒性增強
Agentic RAG的進一步演進是Corrective RAG,它在Agentic RAG的決策閉環中加入了外部搜索的fallback機制。當向量數據庫檢索失敗或返回低質量上下文時,系統會自動觸發網頁搜索(如Google API),從更廣泛的互聯網資源中獲取信息。這種多層檢索策略顯著提高了系統在冷啟動場景、新興領域或數據過時情況下的回答能力,使Agentic RAG從"企業知識庫智能體"升級為"全網知識感知智能體"。
4.2 多模態融合與跨工具協作
未來的Agentic RAG系統將不再局限于文本檢索,而是會融合圖像、音頻、視頻等多模態知識源。例如,在回答"如何使用某款相機的手動模式"時,系統可能不僅檢索文本指南,還會搜索相關教學視頻片段或操作圖解。同時,Agentic RAG將與更多外部工具(如計算器、數據分析庫、實時API)深度集成,形成"檢索-工具調用-推理"的復合決策流,處理更復雜的任務需求。
4.3 個性化與情境感知
高級Agentic RAG系統將具備用戶畫像和情境感知能力。它能根據用戶的專業背景、歷史查詢和使用場景調整檢索策略和回答風格。例如,為技術專家提供深入的文檔引用和技術細節,為普通用戶則生成通俗易懂的解釋。這種個性化不僅提升用戶體驗,還能通過用戶反饋循環持續優化系統的決策模型。
五、挑戰與解決方案:構建可靠的Agentic RAG系統
5.1 決策不確定性:避免"循環檢索"陷阱
Agentic RAG的決策閉環可能引發"循環檢索"問題——當系統反復重寫查詢卻始終無法獲取相關文檔時,會陷入無效循環。解決方案包括:
- 設置檢索次數閾值:當重寫次數超過3次仍無有效結果時,觸發人工介入或外部搜索(如Corrective RAG機制)。
- 引入置信度評估:在每次決策時,LLM需輸出對檢索結果的置信度分數,低于閾值時直接跳過生成并啟動重寫,減少無效回答。
5.2 計算資源消耗:平衡智能與效率
相較于傳統RAG,Agentic RAG的多輪決策和可能的多次檢索會增加計算開銷。優化方向包括:
- 輕量級決策模型:在決策階段使用小型LLM(如GPT-3.5)進行初步判斷,僅在需要深度推理時調用大型模型。
- 緩存與增量更新:對高頻查詢的檢索結果和決策路徑進行緩存,相同問題再次出現時直接復用歷史流程,減少重復計算。
5.3 訓練數據匱乏:零樣本與少樣本學習
Agentic RAG的決策能力依賴于LLM的推理質量,但在特定領域(如罕見病診療)缺乏足夠訓練數據時,可采用:
- 提示工程優化:通過精心設計的提示詞(Prompt),引導LLM在零樣本情況下做出合理決策。例如,在醫療場景中,提示詞可包含"當文檔發布時間超過5年時,標記為可能過時"等規則。
- 小樣本微調:使用領域內少量標注數據(如100-200個決策案例)對LLM進行微調,快速提升特定場景下的決策準確性。
六、從工具到智能體的范式轉變
Agentic RAG的出現標志著檢索增強技術從"被動工具"向"主動智能體"的關鍵跨越。它不再僅是LLM的"外掛知識庫",而是具備認知、判斷和優化能力的智能系統——如同一位經驗豐富的研究員,能根據問題特性動態調整檢索策略,像人類一樣在"思考-查詢-反思"的循環中逼近正確答案。
隨著LangChain、LangGraph等工具的成熟,構建這類智能系統的門檻正逐步降低,使得各行業能夠基于自身數據快速部署決策-aware的LLM應用。未來,Agentic RAG與Corrective RAG、多模態檢索的融合,將推動AI系統從"回答問題"進化到"解決問題",為企業知識管理、科學研究、智能助手等領域開辟更廣闊的創新空間。
在這個信息爆炸卻知識碎片化的時代,Agentic RAG不僅是技術的升級,更是一種思維范式的革新——它教會機器像人類一樣思考信息的價值,讓知識真正成為智能的基石,而非負擔。這或許是檢索增強技術帶給AI領域最深刻的啟示:智能不僅在于生成答案的能力,更在于判斷何時、何處以及如何獲取知識的智慧。