深入淺出從 RAG 到 Agentic RAG:AI 智能體如何重構(gòu)檢索增強(qiáng)生成的技術(shù)閉環(huán)?
1. 引言
從2024年邁入2025年,AI領(lǐng)域的焦點(diǎn)正從檢索增強(qiáng)生成(RAG)轉(zhuǎn)向更具突破性的——具能動(dòng)性RAG(Agentic RAG)。本文將為你介紹具能動(dòng)性RAG的概念、實(shí)現(xiàn)方式及其優(yōu)缺點(diǎn)。
圖片
1.1 具能動(dòng)性RAG概述
檢索增強(qiáng)生成(RAG)是人工智能領(lǐng)域的重要進(jìn)步,它將大型語(yǔ)言模型(LLM)的生成能力與實(shí)時(shí)數(shù)據(jù)檢索相結(jié)合。盡管LLM在自然語(yǔ)言處理中表現(xiàn)出色,但其依賴靜態(tài)預(yù)訓(xùn)練數(shù)據(jù)的特性常導(dǎo)致響應(yīng)過(guò)時(shí)或不完整。RAG通過(guò)從外部源動(dòng)態(tài)檢索相關(guān)信息并融入生成過(guò)程,解決了這一局限,實(shí)現(xiàn)了上下文準(zhǔn)確且實(shí)時(shí)更新的輸出。
1.2 RAG與具能動(dòng)性RAG的對(duì)比
RAG系統(tǒng)的架構(gòu)集成了三個(gè)主要組件:
- 檢索模塊:負(fù)責(zé)查詢知識(shí)庫(kù)、API或向量數(shù)據(jù)庫(kù)等外部數(shù)據(jù)源。高級(jí)檢索器利用密集向量搜索和基于Transformer的模型提升檢索精度和語(yǔ)義相關(guān)性。
- 增強(qiáng)模塊:處理檢索到的數(shù)據(jù),提取并總結(jié)最相關(guān)信息以匹配查詢上下文。
- 生成模塊:將檢索信息與LLM的預(yù)訓(xùn)練知識(shí)結(jié)合,生成連貫且符合上下文的響應(yīng)。
圖片
圖片
具能動(dòng)性RAG引入了使用AI智能體的自主決策與編排能力,支持更健壯靈活的檢索-生成工作流,其核心流程包括:
- 智能體導(dǎo)向的查詢分析:用戶查詢被路由至AI智能體,解析查詢意圖與上下文。
- 記憶與策略制定:智能體利用短期(會(huì)話)和長(zhǎng)期(歷史)記憶跟蹤上下文,制定動(dòng)態(tài)檢索與推理策略。
- 工具選擇與數(shù)據(jù)收集:智能體智能選擇工具(如向量搜索、API連接器或其他智能體),從相關(guān)知識(shí)庫(kù)(如MCP服務(wù)器、圖數(shù)據(jù)庫(kù)、文檔存儲(chǔ))檢索數(shù)據(jù)。
- 提示詞構(gòu)建:檢索內(nèi)容與結(jié)構(gòu)化上下文、系統(tǒng)指令結(jié)合,形成增強(qiáng)提示詞并傳遞給LLM。
- LLM響應(yīng)生成:LLM處理優(yōu)化后的上下文提示詞,生成高相關(guān)性、可解釋且自適應(yīng)的響應(yīng)。
2. RAG范式的演進(jìn)
檢索增強(qiáng)生成(RAG)領(lǐng)域已顯著演進(jìn),以應(yīng)對(duì)現(xiàn)實(shí)應(yīng)用中日益增長(zhǎng)的復(fù)雜性——上下文準(zhǔn)確性、可擴(kuò)展性和多步推理能力至關(guān)重要。從簡(jiǎn)單的基于關(guān)鍵詞的檢索開(kāi)始,RAG已發(fā)展為復(fù)雜、模塊化且自適應(yīng)的系統(tǒng),能夠集成多樣化數(shù)據(jù)源和自主決策流程。這一演進(jìn)凸顯了RAG系統(tǒng)高效處理復(fù)雜查詢的迫切需求。
2.1 樸素RAG
樸素RAG是檢索增強(qiáng)生成的基礎(chǔ)實(shí)現(xiàn),其核心是基于關(guān)鍵詞的檢索和靜態(tài)數(shù)據(jù)集的“檢索-讀取”工作流。這類系統(tǒng)依賴TF-IDF和BM25等簡(jiǎn)單關(guān)鍵詞檢索技術(shù)從靜態(tài)數(shù)據(jù)集中獲取文檔,再利用檢索文檔增強(qiáng)語(yǔ)言模型的生成能力。
局限性:
- 缺乏上下文感知:依賴詞法匹配而非語(yǔ)義理解,導(dǎo)致檢索文檔常無(wú)法捕捉查詢的語(yǔ)義細(xì)微差別。
- 輸出碎片化:缺少高級(jí)預(yù)處理或上下文集成,易產(chǎn)生不連貫或過(guò)于泛化的響應(yīng)。
- 可擴(kuò)展性問(wèn)題:基于關(guān)鍵詞的檢索技術(shù)在處理大規(guī)模數(shù)據(jù)集時(shí),難以識(shí)別最相關(guān)信息。
圖片
2.2 高級(jí)RAG
高級(jí)RAG系統(tǒng)通過(guò)引入語(yǔ)義理解和增強(qiáng)檢索技術(shù),彌補(bǔ)了樸素RAG的不足。這類系統(tǒng)利用密集檢索模型(如Dense Passage Retrieval, DPR)和神經(jīng)排序算法提升檢索精度,實(shí)現(xiàn)語(yǔ)義增強(qiáng)的檢索和迭代式上下文感知流水線。
圖片
2.3 模塊化RAG
模塊化RAG代表了RAG范式的最新演進(jìn),強(qiáng)調(diào)靈活性和可定制性。該系統(tǒng)將檢索與生成流水線分解為獨(dú)立可復(fù)用的組件,支持領(lǐng)域特定優(yōu)化和任務(wù)適應(yīng)性,其架構(gòu)包含混合檢索策略、可組合流水線和外部工具集成。
圖片
2.4 圖結(jié)構(gòu)RAG
圖結(jié)構(gòu)RAG通過(guò)集成圖數(shù)據(jù)結(jié)構(gòu)擴(kuò)展了傳統(tǒng)RAG系統(tǒng),利用圖數(shù)據(jù)中的關(guān)系和層次結(jié)構(gòu)增強(qiáng)多跳推理和上下文豐富性。通過(guò)引入圖檢索,圖結(jié)構(gòu)RAG能生成更豐富準(zhǔn)確的輸出,尤其適用于需要關(guān)系理解的任務(wù)(如醫(yī)療診斷、法律研究)。
圖片
局限性:
- 可擴(kuò)展性有限:依賴圖結(jié)構(gòu)可能限制大規(guī)模數(shù)據(jù)源的擴(kuò)展。
- 數(shù)據(jù)依賴性:高質(zhì)量圖數(shù)據(jù)是生成有意義輸出的關(guān)鍵,限制了其在非結(jié)構(gòu)化或標(biāo)注不良數(shù)據(jù)集中的應(yīng)用。
- 集成復(fù)雜度:將圖數(shù)據(jù)與非結(jié)構(gòu)化檢索系統(tǒng)集成增加了設(shè)計(jì)和實(shí)現(xiàn)難度。
圖片
2.5 具能動(dòng)性RAG
具能動(dòng)性RAG通過(guò)引入能夠動(dòng)態(tài)決策和工作流優(yōu)化的自主智能體,實(shí)現(xiàn)了范式轉(zhuǎn)換。與靜態(tài)系統(tǒng)不同,具能動(dòng)性RAG采用迭代優(yōu)化和自適應(yīng)檢索策略,以處理復(fù)雜、實(shí)時(shí)和多領(lǐng)域的查詢。該范式在引入基于智能體的自主性的同時(shí),利用了檢索和生成過(guò)程的模塊化特性。
圖片
3. 傳統(tǒng)RAG系統(tǒng)的挑戰(zhàn)與局限
盡管檢索增強(qiáng)生成(RAG)通過(guò)結(jié)合生成能力與實(shí)時(shí)數(shù)據(jù)提升了LLM性能,但在復(fù)雜現(xiàn)實(shí)場(chǎng)景中仍存在關(guān)鍵挑戰(zhàn):
- 上下文集成難題:即使RAG系統(tǒng)成功檢索到相關(guān)信息,也常難以將其無(wú)縫融入生成響應(yīng)。檢索流水線的靜態(tài)特性和有限的上下文感知能力,導(dǎo)致輸出碎片化、不一致或過(guò)于泛化。示例:當(dāng)被問(wèn)及“阿爾茨海默病研究的最新進(jìn)展及其對(duì)早期治療的影響”時(shí),RAG可能提取相關(guān)研究,但無(wú)法將這些發(fā)現(xiàn)轉(zhuǎn)化為患者護(hù)理的可操作見(jiàn)解。
- 多步推理缺失:復(fù)雜問(wèn)題通常需要多步推理,但傳統(tǒng)RAG通常僅執(zhí)行單跳檢索,缺乏深度綜合能力。示例:“歐洲可再生能源政策中有哪些經(jīng)驗(yàn)可應(yīng)用于發(fā)展中國(guó)家,潛在經(jīng)濟(jì)影響如何?”這類查詢需要結(jié)合政策數(shù)據(jù)、本地上下文和經(jīng)濟(jì)預(yù)測(cè),而RAG常無(wú)法將這些要素整合成連貫答案。
- 可擴(kuò)展性與延遲問(wèn)題:隨著外部數(shù)據(jù)增長(zhǎng),搜索和排序大規(guī)模數(shù)據(jù)集會(huì)降低響應(yīng)速度,這對(duì)實(shí)時(shí)用例(如實(shí)時(shí)金融分析或客戶支持)構(gòu)成挑戰(zhàn)。
4. 具能動(dòng)性RAG的分類體系
4.1 單智能體具能動(dòng)性RAG:路由型
單智能體具能動(dòng)性RAG作為集中式?jīng)Q策系統(tǒng),由單個(gè)智能體管理信息的檢索、路由和集成,適用于工具或數(shù)據(jù)源有限的場(chǎng)景。
工作流程:
- 查詢提交與評(píng)估:用戶提交查詢,協(xié)調(diào)智能體分析并確定合適的數(shù)據(jù)源。
- 知識(shí)源選擇:包括結(jié)構(gòu)化數(shù)據(jù)庫(kù)(如PostgreSQL、MySQL)、語(yǔ)義搜索(如PDF、書(shū)籍)、網(wǎng)頁(yè)搜索和推薦系統(tǒng)。
- 數(shù)據(jù)集成與LLM綜合:檢索數(shù)據(jù)傳遞給LLM,生成連貫響應(yīng)。
- 輸出生成:系統(tǒng)為用戶生成簡(jiǎn)潔、可操作的響應(yīng)。
圖片
4.2 多智能體具能動(dòng)性RAG系統(tǒng)
多智能體系統(tǒng)中,多個(gè)專門(mén)智能體協(xié)同工作,每個(gè)智能體專注于特定數(shù)據(jù)源或任務(wù),支持復(fù)雜查詢的可擴(kuò)展、模塊化處理。
圖片
工作流程:
- 查詢提交:協(xié)調(diào)智能體接收查詢并分發(fā)給專門(mén)智能體。
- 專門(mén)檢索智能體:如處理結(jié)構(gòu)化數(shù)據(jù)的智能體、語(yǔ)義搜索智能體、實(shí)時(shí)網(wǎng)頁(yè)搜索智能體等。
- 工具訪問(wèn)與數(shù)據(jù)檢索:并行利用向量搜索、Text-to-SQL、網(wǎng)頁(yè)搜索和外部API。
- 數(shù)據(jù)集成與LLM綜合:聚合數(shù)據(jù)傳遞給LLM,生成全面輸出。
4.3 分層式具能動(dòng)性RAG系統(tǒng)
分層系統(tǒng)采用結(jié)構(gòu)化的多層方法處理信息檢索與流程,智能體按層級(jí)組織,高層智能體監(jiān)督指導(dǎo)低層智能體,實(shí)現(xiàn)多級(jí)決策。
工作流程:
- 查詢接收:頂層智能體接收查詢并負(fù)責(zé)初始評(píng)估與任務(wù)分配。
- 戰(zhàn)略決策:頂層智能體評(píng)估查詢復(fù)雜度,根據(jù)領(lǐng)域相關(guān)性和數(shù)據(jù)可靠性選擇下屬智能體、數(shù)據(jù)庫(kù)或API。
- 任務(wù)委派:任務(wù)分配給專門(mén)的低層智能體,獨(dú)立執(zhí)行檢索。
- 聚合與綜合:低層智能體將結(jié)果返回頂層智能體,集成綜合為統(tǒng)一響應(yīng)。
4.4 具能動(dòng)性糾正型RAG
糾正型RAG引入自我糾正機(jī)制,通過(guò)在工作流中嵌入智能體,迭代優(yōu)化檢索結(jié)果,提升文檔利用率和響應(yīng)質(zhì)量。
工作流程:
- 上下文檢索智能體:從向量數(shù)據(jù)庫(kù)檢索初始上下文文檔。
- 相關(guān)性評(píng)估智能體:評(píng)估檢索文檔的相關(guān)性,標(biāo)記不相關(guān)或模糊文檔。
- 查詢優(yōu)化智能體:利用語(yǔ)義理解重寫(xiě)和優(yōu)化查詢,改善檢索結(jié)果。
- 外部知識(shí)檢索智能體:若上下文不足,執(zhí)行網(wǎng)頁(yè)搜索或訪問(wèn)替代數(shù)據(jù)源。
圖片
4.5 自適應(yīng)具能動(dòng)性RAG
自適應(yīng)RAG通過(guò)基于查詢復(fù)雜度定制檢索策略,引入動(dòng)態(tài)查詢處理能力,提升靈活性和效率。
圖片
核心邏輯:
- 簡(jiǎn)單查詢:直接生成響應(yīng)(如“水的沸點(diǎn)是多少?”)。
- 中等復(fù)雜查詢:?jiǎn)尾綑z索(如“我最新的電費(fèi)賬單狀態(tài)如何?”)。
- 復(fù)雜查詢:多步檢索與迭代優(yōu)化(如“城市X過(guò)去十年人口變化及其影響因素”)。
圖片
4.6 基于圖結(jié)構(gòu)的具能動(dòng)性RAG
4.6.1 Agent-G:圖結(jié)構(gòu)RAG的具能動(dòng)性框架
Agent-G引入新型架構(gòu),將圖知識(shí)庫(kù)與非結(jié)構(gòu)化文檔檢索結(jié)合,提升RAG系統(tǒng)的推理和檢索精度,其核心包括圖知識(shí)庫(kù)、非結(jié)構(gòu)化文檔處理、批評(píng)模塊和反饋循環(huán)。
4.6.2 GeAR:圖增強(qiáng)型具能動(dòng)性RAG
GeAR通過(guò)集成圖結(jié)構(gòu)檢索和智能體控制,增強(qiáng)傳統(tǒng)RAG,改善復(fù)雜查詢的多跳檢索能力,其核心是圖擴(kuò)展模塊和基于智能體的檢索策略管理。
圖片
4.7 具能動(dòng)性文檔工作流(ADW)
ADW通過(guò)在以文檔為中心的流程中編排端到端知識(shí)工作自動(dòng)化,擴(kuò)展傳統(tǒng)RAG,集成解析、檢索、推理和結(jié)構(gòu)化輸出與智能體。
5. 具能動(dòng)性RAG框架的對(duì)比分析
圖片
6. 構(gòu)建具能動(dòng)性RAG系統(tǒng)
本教程將構(gòu)建一個(gè)檢索智能體,使LLM能夠決策是從向量存儲(chǔ)檢索上下文還是直接響應(yīng)用戶。
圖片
6.1 文檔預(yù)處理
- 獲取文檔:使用
WebBaseLoader
獲取Lilian Weng博客的最新頁(yè)面:
from langchain_community.document_loaders import WebBaseLoader
urls = [
"https://lilianweng.github.io/posts/2024-11-28-reward-hacking/",
"https://lilianweng.github.io/posts/2024-07-07-hallucination/",
"https://lilianweng.github.io/posts/2024-04-12-diffusion-video/",
]
docs = [WebBaseLoader(url).load() for url in urls]
- 分割文檔:將文檔分割為小塊以便索引到向量存儲(chǔ):
from langchain_text_splitters import RecursiveCharacterTextSplitter
docs_list = [item for sublist in docs for item in sublist]
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=100, chunk_overlap=50
)
doc_splits = text_splitter.split_documents(docs_list)
6.2 創(chuàng)建檢索工具
- 初始化向量存儲(chǔ):使用內(nèi)存向量存儲(chǔ)和OpenAI嵌入:
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import OpenAIEmbeddings
vectorstore = InMemoryVectorStore.from_documents(
documents=doc_splits, embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever()
- 創(chuàng)建檢索工具:使用LangChain的
create_retriever_tool
:
from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever,
"retrieve_blog_posts",
"Search and return information about Lilian Weng blog posts.",
)
- 測(cè)試工具:
retriever_tool.invoke({"query": "types of reward hacking"})
6.3 生成查詢
構(gòu)建generate_query_or_respond
節(jié)點(diǎn),調(diào)用LLM基于當(dāng)前圖狀態(tài)生成響應(yīng),決定是檢索還是直接響應(yīng):
from langgraph.graph import MessagesState
from langchain.chat_models import init_chat_model
response_model = init_chat_model("openai:gpt-4.1", temperature=0)
def generate_query_or_respond(state: MessagesState):
"""根據(jù)當(dāng)前狀態(tài)調(diào)用模型生成響應(yīng),決定檢索或直接回答。"""
response = (
response_model
.bind_tools([retriever_tool]).invoke(state["messages"])
)
return {"messages": [response]}
6.4 文檔評(píng)分
在構(gòu)建智能體增強(qiáng)檢索生成(Agentic RAG)系統(tǒng)時(shí),文檔評(píng)分是關(guān)鍵環(huán)節(jié),它能評(píng)估檢索結(jié)果的相關(guān)性并決定后續(xù)處理流程。以下是具體實(shí)現(xiàn)步驟及代碼解析:
6.4.1 添加條件邊:文檔相關(guān)性評(píng)估
我們需要?jiǎng)?chuàng)建一個(gè)條件邊grade_documents
,通過(guò)結(jié)構(gòu)化輸出模型判斷檢索文檔是否與用戶問(wèn)題相關(guān)。該函數(shù)會(huì)根據(jù)評(píng)分結(jié)果決定下一步操作(生成答案或重寫(xiě)問(wèn)題)。
代碼實(shí)現(xiàn):
from pydantic import BaseModel, Field
from typing import Literal
# 定義文檔評(píng)分提示詞,用于評(píng)估檢索文檔與問(wèn)題的相關(guān)性
GRADE_PROMPT = (
"你是一個(gè)評(píng)分器,負(fù)責(zé)評(píng)估檢索到的文檔與用戶問(wèn)題的相關(guān)性。\n"
"以下是檢索到的文檔:\n\n{context}\n\n"
"以下是用戶問(wèn)題:{question}\n"
"如果文檔包含與用戶問(wèn)題相關(guān)的關(guān)鍵詞或語(yǔ)義含義,則評(píng)為相關(guān)。\n"
"請(qǐng)給出二進(jìn)制評(píng)分'yes'或'no',表示文檔是否與問(wèn)題相關(guān)。"
)
# 定義結(jié)構(gòu)化輸出模型,用于規(guī)范評(píng)分結(jié)果格式
class GradeDocuments(BaseModel):
"""使用二進(jìn)制評(píng)分檢查文檔相關(guān)性"""
binary_score: str = Field(
descriptinotallow="相關(guān)性評(píng)分:'yes'表示相關(guān),'no'表示不相關(guān)"
)
# 初始化評(píng)分模型(使用GPT-4.1,溫度系數(shù)為0以保證確定性)
grader_model = init_chat_model("openai:gpt-4.1", temperature=0)
def grade_documents(
state: MessagesState,
) -> Literal["generate_answer", "rewrite_question"]:
"""判斷檢索到的文檔是否與問(wèn)題相關(guān)"""
question = state["messages"][0].content # 提取用戶問(wèn)題
context = state["messages"][-1].content # 提取檢索到的文檔內(nèi)容
# 格式化提示詞,傳入問(wèn)題和文檔內(nèi)容
prompt = GRADE_PROMPT.format(questinotallow=question, cnotallow=context)
# 調(diào)用評(píng)分模型,使用結(jié)構(gòu)化輸出解析結(jié)果
response = (
grader_model
.with_structured_output(GradeDocuments).invoke(
[{"role": "user", "content": prompt}]
)
)
score = response.binary_score # 提取評(píng)分結(jié)果
if score == "yes":
return"generate_answer"# 相關(guān)則進(jìn)入答案生成環(huán)節(jié)
else:
return"rewrite_question"# 不相關(guān)則重寫(xiě)問(wèn)題
6.4.2 測(cè)試:不相關(guān)文檔的評(píng)分流程
通過(guò)模擬不相關(guān)的檢索結(jié)果,驗(yàn)證評(píng)分函數(shù)是否能正確識(shí)別并觸發(fā)重寫(xiě)問(wèn)題邏輯。
代碼實(shí)現(xiàn):
from langchain_core.messages import convert_to_messages
# 構(gòu)造測(cè)試輸入:用戶問(wèn)題、檢索工具調(diào)用、不相關(guān)的工具響應(yīng)("meow")
input = {
"messages": convert_to_messages(
[
{
"role": "user",
"content": "Lilian Weng 對(duì)獎(jiǎng)勵(lì)黑客的類型有什么看法?",
},
{
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "1",
"name": "retrieve_blog_posts",
"args": {"query": "types of reward hacking"},
}
],
},
{"role": "tool", "content": "meow", "tool_call_id": "1"},
]
)
}
# 調(diào)用文檔評(píng)分函數(shù),查看返回的下一步操作
grade_documents(input) # 應(yīng)返回"rewrite_question"
6.4.3 測(cè)試:相關(guān)文檔的評(píng)分流程
使用包含正確信息的檢索結(jié)果,驗(yàn)證評(píng)分函數(shù)是否能正確識(shí)別并允許生成答案。
代碼實(shí)現(xiàn):
# 構(gòu)造測(cè)試輸入:用戶問(wèn)題、檢索工具調(diào)用、相關(guān)的工具響應(yīng)(包含獎(jiǎng)勵(lì)黑客類型的描述)
input = {
"messages": convert_to_messages(
[
{
"role": "user",
"content": "Lilian Weng 對(duì)獎(jiǎng)勵(lì)黑客的類型有什么看法?",
},
{
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "1",
"name": "retrieve_blog_posts",
"args": {"query": "types of reward hacking"},
}
],
},
{
"role": "tool",
"content": "獎(jiǎng)勵(lì)黑客可分為兩類:環(huán)境或目標(biāo)指定錯(cuò)誤,以及獎(jiǎng)勵(lì)篡改",
"tool_call_id": "1",
},
]
)
}
# 調(diào)用文檔評(píng)分函數(shù),查看返回的下一步操作
grade_documents(input) # 應(yīng)返回"generate_answer"
6.4.4 核心邏輯解析
- 評(píng)分機(jī)制:通過(guò)提示詞引導(dǎo)模型分析文檔與問(wèn)題的語(yǔ)義相關(guān)性,使用二進(jìn)制評(píng)分(yes/no)簡(jiǎn)化決策流程。
- 結(jié)構(gòu)化輸出:利用Pydantic模型
GradeDocuments
確保評(píng)分結(jié)果格式統(tǒng)一,避免非結(jié)構(gòu)化文本導(dǎo)致的解析錯(cuò)誤。 - 動(dòng)態(tài)路由:根據(jù)評(píng)分結(jié)果決定流程走向:
若相關(guān)(yes),進(jìn)入generate_answer
生成最終回答;
若不相關(guān)(no),進(jìn)入rewrite_question
優(yōu)化查詢語(yǔ)句,避免無(wú)效檢索。
6.4.5 實(shí)際應(yīng)用優(yōu)化建議
- 評(píng)分提示詞優(yōu)化:可根據(jù)領(lǐng)域特性調(diào)整提示詞,例如在醫(yī)療場(chǎng)景中加入專業(yè)術(shù)語(yǔ)匹配規(guī)則。
- 多輪評(píng)分機(jī)制:對(duì)于復(fù)雜問(wèn)題,可引入多輪評(píng)分(如結(jié)合TF-IDF權(quán)重和語(yǔ)義相似度),降低誤判率。
- 人工反饋集成:在生產(chǎn)環(huán)境中,可收集人工標(biāo)注數(shù)據(jù)微調(diào)評(píng)分模型,提升長(zhǎng)期準(zhǔn)確性。
通過(guò)文檔評(píng)分環(huán)節(jié),Agentic RAG系統(tǒng)能夠自主過(guò)濾無(wú)效信息,確保后續(xù)生成的回答基于高質(zhì)量上下文,這是區(qū)別于傳統(tǒng)RAG系統(tǒng)的核心能力之一。
6.5 重寫(xiě)問(wèn)題
在智能體增強(qiáng)檢索生成(Agentic RAG)系統(tǒng)中,當(dāng)檢索工具返回不相關(guān)文檔時(shí),需要通過(guò)重寫(xiě)問(wèn)題來(lái)優(yōu)化查詢邏輯。這一環(huán)節(jié)能有效提升檢索準(zhǔn)確性,避免因原始問(wèn)題表述模糊導(dǎo)致的無(wú)效響應(yīng)。以下是具體實(shí)現(xiàn)步驟及代碼解析:
6.5.1 構(gòu)建rewrite_question節(jié)點(diǎn)
該節(jié)點(diǎn)的核心功能是基于原始用戶問(wèn)題生成更精準(zhǔn)的查詢語(yǔ)句,引導(dǎo)檢索工具獲取相關(guān)信息。通過(guò)調(diào)用語(yǔ)言模型,系統(tǒng)能理解問(wèn)題的深層語(yǔ)義意圖,并重新組織表述方式。
代碼實(shí)現(xiàn):
# 定義問(wèn)題重寫(xiě)提示詞,引導(dǎo)模型分析問(wèn)題語(yǔ)義并優(yōu)化表述
REWRITE_PROMPT = (
"請(qǐng)分析輸入內(nèi)容,推理其潛在的語(yǔ)義意圖/含義。\n"
"以下是初始問(wèn)題:\n"
"------- \n"
"{question}"
"\n ------- \n"
"請(qǐng)構(gòu)建一個(gè)優(yōu)化后的問(wèn)題:"
)
def rewrite_question(state: MessagesState):
"""重寫(xiě)原始用戶問(wèn)題,提升檢索相關(guān)性"""
messages = state["messages"] # 獲取對(duì)話狀態(tài)中的消息列表
question = messages[0].content # 提取用戶的原始問(wèn)題
# 格式化提示詞,傳入原始問(wèn)題
prompt = REWRITE_PROMPT.format(questinotallow=question)
# 調(diào)用語(yǔ)言模型生成優(yōu)化后的問(wèn)題
response = response_model.invoke([{"role": "user", "content": prompt}])
# 返回重寫(xiě)后的問(wèn)題,更新對(duì)話狀態(tài)
return {"messages": [{"role": "user", "content": response.content}]}
6.5.2 功能測(cè)試:重寫(xiě)問(wèn)題流程演示
通過(guò)模擬不相關(guān)檢索結(jié)果的場(chǎng)景,驗(yàn)證rewrite_question
節(jié)點(diǎn)是否能生成更精準(zhǔn)的查詢語(yǔ)句。
代碼實(shí)現(xiàn):
# 構(gòu)造測(cè)試輸入:用戶問(wèn)題、檢索工具調(diào)用、不相關(guān)的工具響應(yīng)("meow")
input = {
"messages": convert_to_messages(
[
{
"role": "user",
"content": "Lilian Weng 對(duì)獎(jiǎng)勵(lì)黑客的類型有什么看法?",
},
{
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "1",
"name": "retrieve_blog_posts",
"args": {"query": "types of reward hacking"},
}
],
},
{"role": "tool", "content": "meow", "tool_call_id": "1"},
]
)
}
# 調(diào)用問(wèn)題重寫(xiě)函數(shù)
response = rewrite_question(input)
# 打印重寫(xiě)后的問(wèn)題
print("重寫(xiě)后的問(wèn)題:")
print(response["messages"][-1]["content"])
6.5.3 核心邏輯解析
- 語(yǔ)義理解:通過(guò)提示詞引導(dǎo)語(yǔ)言模型分析原始問(wèn)題的深層意圖,而非僅關(guān)注表面關(guān)鍵詞。例如,將“獎(jiǎng)勵(lì)黑客的類型”理解為“分類方式”或“具體類別”。
- 表述優(yōu)化:模型會(huì)將模糊或歧義的問(wèn)題轉(zhuǎn)化為更精準(zhǔn)的查詢。例如,將“什么看法”轉(zhuǎn)化為“如何分類”或“包含哪些類型”。
- 流程閉環(huán):重寫(xiě)后的問(wèn)題會(huì)重新觸發(fā)檢索流程,形成“查詢優(yōu)化-重新檢索”的閉環(huán),確保系統(tǒng)能自主修正檢索方向。
6.5.4 實(shí)際應(yīng)用優(yōu)化建議
- 領(lǐng)域特定提示詞:針對(duì)不同場(chǎng)景(如醫(yī)療、法律)定制重寫(xiě)提示詞,融入領(lǐng)域術(shù)語(yǔ)。例如,在法律場(chǎng)景中,將“合同問(wèn)題”重寫(xiě)為“合同條款爭(zhēng)議類型”。
- 用戶意圖聚類:通過(guò)歷史對(duì)話數(shù)據(jù)聚類用戶意圖,預(yù)定義常見(jiàn)問(wèn)題的優(yōu)化模板,提升重寫(xiě)效率。
- 多輪重寫(xiě)機(jī)制:對(duì)于復(fù)雜問(wèn)題,可設(shè)置多輪重寫(xiě)(如首次重寫(xiě)聚焦語(yǔ)義,二次重寫(xiě)補(bǔ)充限定條件),逐步縮小檢索范圍。
6.5.5 示例:重寫(xiě)效果演示
原始問(wèn)題:“Lilian Weng 對(duì)獎(jiǎng)勵(lì)黑客的類型有什么看法?”不相關(guān)檢索結(jié)果:“meow”(模擬無(wú)效數(shù)據(jù))重寫(xiě)后問(wèn)題(可能輸出):“Lilian Weng 論文中提到的獎(jiǎng)勵(lì)黑客分類方式有哪些?”
通過(guò)添加“論文中提到的”限定條件,明確了信息來(lái)源,同時(shí)將“類型”轉(zhuǎn)化為“分類方式”,更符合學(xué)術(shù)文獻(xiàn)的表述習(xí)慣,從而提升后續(xù)檢索的相關(guān)性。
問(wèn)題重寫(xiě)是Agentic RAG系統(tǒng)實(shí)現(xiàn)自主優(yōu)化的關(guān)鍵環(huán)節(jié),它賦予系統(tǒng)“反思”和“調(diào)整”的能力,避免傳統(tǒng)RAG中“錯(cuò)誤查詢-無(wú)效結(jié)果”的死循環(huán)。
6.6 生成答案
在智能體增強(qiáng)檢索生成(Agentic RAG)系統(tǒng)中,當(dāng)檢索文檔通過(guò)相關(guān)性評(píng)分后,需要基于用戶問(wèn)題和檢索內(nèi)容生成最終回答。這一環(huán)節(jié)要求語(yǔ)言模型(LLM)不僅能整合信息,還能以自然、簡(jiǎn)潔的方式呈現(xiàn)結(jié)果。以下是具體實(shí)現(xiàn)步驟及代碼解析:
6.6.1 構(gòu)建generate_answer節(jié)點(diǎn)
該節(jié)點(diǎn)的核心功能是根據(jù)用戶問(wèn)題和檢索到的上下文生成回答。通過(guò)定制提示詞,引導(dǎo)模型提煉關(guān)鍵信息并控制輸出長(zhǎng)度,確?;卮鸷?jiǎn)潔且準(zhǔn)確。
代碼實(shí)現(xiàn):
# 定義答案生成提示詞,引導(dǎo)模型基于上下文回答問(wèn)題
GENERATE_PROMPT = (
"你是一個(gè)問(wèn)答助手。請(qǐng)使用以下檢索到的上下文回答問(wèn)題。"
"如果不知道答案,請(qǐng)直接說(shuō)明不知道。"
"最多使用三個(gè)句子,保持回答簡(jiǎn)潔。\n"
"問(wèn)題:{question} \n"
"上下文:{context}"
)
def generate_answer(state: MessagesState):
"""基于用戶問(wèn)題和檢索上下文生成最終答案"""
question = state["messages"][0].content # 提取用戶問(wèn)題
context = state["messages"][-1].content # 提取檢索到的上下文內(nèi)容
# 格式化提示詞,傳入問(wèn)題和上下文
prompt = GENERATE_PROMPT.format(questinotallow=question, cnotallow=context)
# 調(diào)用語(yǔ)言模型生成回答
response = response_model.invoke([{"role": "user", "content": prompt}])
# 返回生成的答案,更新對(duì)話狀態(tài)
return {"messages": [response]}
6.6.2 功能測(cè)試:答案生成流程演示
通過(guò)模擬相關(guān)檢索結(jié)果的場(chǎng)景,驗(yàn)證generate_answer
節(jié)點(diǎn)是否能正確整合信息并生成有效回答。
代碼實(shí)現(xiàn):
# 構(gòu)造測(cè)試輸入:用戶問(wèn)題、檢索工具調(diào)用、相關(guān)的工具響應(yīng)(包含獎(jiǎng)勵(lì)黑客類型的描述)
input = {
"messages": convert_to_messages(
[
{
"role": "user",
"content": "Lilian Weng 對(duì)獎(jiǎng)勵(lì)黑客的類型有什么看法?",
},
{
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "1",
"name": "retrieve_blog_posts",
"args": {"query": "types of reward hacking"},
}
],
},
{
"role": "tool",
"content": "reward hacking can be categorized into two types: environment or goal misspecification, and reward tampering",
"tool_call_id": "1",
},
]
)
}
# 調(diào)用答案生成函數(shù)
response = generate_answer(input)
# 打印生成的答案
print("生成的答案:")
response["messages"][-1].pretty_print()
6.6.3 核心邏輯解析
- 信息整合:模型會(huì)從上下文中提取與問(wèn)題相關(guān)的關(guān)鍵信息。例如,從“兩類:環(huán)境或目標(biāo)指定錯(cuò)誤、獎(jiǎng)勵(lì)篡改”中提煉分類結(jié)果。
- 格式控制:通過(guò)提示詞限定回答長(zhǎng)度(最多三句話),避免生成冗長(zhǎng)或無(wú)關(guān)內(nèi)容,提升信息密度。
- 不確定性處理:若上下文缺乏足夠信息,模型會(huì)遵循提示詞要求,直接說(shuō)明“不知道”,避免虛構(gòu)答案。
6.6.4 實(shí)際應(yīng)用優(yōu)化建議
- 回答風(fēng)格定制:根據(jù)應(yīng)用場(chǎng)景調(diào)整提示詞,例如:
客服場(chǎng)景:“請(qǐng)用口語(yǔ)化表達(dá),分點(diǎn)說(shuō)明解決方案”
學(xué)術(shù)場(chǎng)景:“請(qǐng)引用上下文觀點(diǎn),并補(bǔ)充相關(guān)研究背景”
- 證據(jù)溯源機(jī)制:在回答中加入上下文引用標(biāo)記(如“根據(jù)文檔第3段”),提升回答可信度。
- 多輪生成優(yōu)化:對(duì)于復(fù)雜問(wèn)題,可先生成草稿回答,再通過(guò)提示詞優(yōu)化表述(如“將技術(shù)術(shù)語(yǔ)轉(zhuǎn)化為通俗語(yǔ)言”)。
6.6.5 示例:答案生成效果
用戶問(wèn)題:“Lilian Weng 對(duì)獎(jiǎng)勵(lì)黑客的類型有什么看法?”檢索上下文:“獎(jiǎng)勵(lì)黑客可分為兩類:環(huán)境或目標(biāo)指定錯(cuò)誤,以及獎(jiǎng)勵(lì)篡改。”生成答案:
Lilian Weng將獎(jiǎng)勵(lì)黑客分為兩類:環(huán)境或目標(biāo)指定錯(cuò)誤,以及獎(jiǎng)勵(lì)篡改。她認(rèn)為獎(jiǎng)勵(lì)黑客是一個(gè)更廣泛的概念,其中包含了獎(jiǎng)勵(lì)篡改。部分研究將獎(jiǎng)勵(lì)篡改單獨(dú)定義,但Weng將其歸為獎(jiǎng)勵(lì)黑客的范疇。
該回答不僅整合了上下文的分類信息,還補(bǔ)充了概念范疇的說(shuō)明,符合“三句話內(nèi)簡(jiǎn)潔回答”的要求,同時(shí)保持了學(xué)術(shù)表述的嚴(yán)謹(jǐn)性。
答案生成是Agentic RAG系統(tǒng)的最終輸出環(huán)節(jié),其質(zhì)量直接影響用戶體驗(yàn)。通過(guò)精準(zhǔn)的提示詞設(shè)計(jì)和模型調(diào)用,系統(tǒng)能將檢索到的碎片化信息轉(zhuǎn)化為結(jié)構(gòu)化回答。
6.7 組裝圖結(jié)構(gòu)
在完成文檔預(yù)處理、檢索工具創(chuàng)建、查詢生成、文檔評(píng)分、問(wèn)題重寫(xiě)和答案生成等核心組件后,需要將這些功能模塊組裝成一個(gè)完整的圖結(jié)構(gòu)工作流。通過(guò)狀態(tài)圖(StateGraph)的形式,Agentic RAG系統(tǒng)能夠?qū)崿F(xiàn)組件間的動(dòng)態(tài)路由和條件跳轉(zhuǎn),形成自主決策的檢索-生成閉環(huán)。以下是具體實(shí)現(xiàn)步驟及架構(gòu)解析:
6.7.1 構(gòu)建狀態(tài)圖工作流
使用LangGraph框架的StateGraph
類定義組件間的連接關(guān)系,通過(guò)條件邊實(shí)現(xiàn)基于規(guī)則的流程控制。以下是完整的圖結(jié)構(gòu)組裝代碼:
代碼實(shí)現(xiàn):
from langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import ToolNode
from langgraph.prebuilt import tools_condition
# 初始化狀態(tài)圖,指定狀態(tài)類型為MessagesState(包含對(duì)話消息列表)
workflow = StateGraph(MessagesState)
# 添加核心功能節(jié)點(diǎn)
workflow.add_node(generate_query_or_respond) # 查詢生成/響應(yīng)節(jié)點(diǎn)
workflow.add_node("retrieve", ToolNode([retriever_tool])) # 檢索工具節(jié)點(diǎn)
workflow.add_node(rewrite_question) # 問(wèn)題重寫(xiě)節(jié)點(diǎn)
workflow.add_node(generate_answer) # 答案生成節(jié)點(diǎn)
# 定義起始節(jié)點(diǎn)到查詢生成節(jié)點(diǎn)的連接
workflow.add_edge(START, "generate_query_or_respond")
# 添加條件邊:根據(jù)查詢生成節(jié)點(diǎn)的輸出決定是否調(diào)用檢索工具
workflow.add_conditional_edges(
"generate_query_or_respond",
# 使用tools_condition函數(shù)判斷是否需要調(diào)用工具
tools_condition,
{
"tools": "retrieve", # 如需調(diào)用工具則跳轉(zhuǎn)至檢索節(jié)點(diǎn)
END: END # 如直接響應(yīng)則結(jié)束流程
},
)
# 添加檢索節(jié)點(diǎn)后的條件邊:根據(jù)文檔評(píng)分結(jié)果決定下一步
workflow.add_conditional_edges(
"retrieve",
# 調(diào)用grade_documents函數(shù)評(píng)估文檔相關(guān)性
grade_documents,
{
"generate_answer": "generate_answer", # 相關(guān)則生成答案
"rewrite_question": "rewrite_question"# 不相關(guān)則重寫(xiě)問(wèn)題
},
)
# 添加最終節(jié)點(diǎn)連接
workflow.add_edge("generate_answer", END) # 答案生成后結(jié)束流程
workflow.add_edge("rewrite_question", "generate_query_or_respond") # 重寫(xiě)問(wèn)題后重新生成查詢
# 編譯狀態(tài)圖為可執(zhí)行的工作流
graph = workflow.compile()
6.7.2 圖結(jié)構(gòu)可視化
通過(guò)Mermaid語(yǔ)法繪制狀態(tài)圖,直觀展示組件間的交互邏輯。以下是生成可視化圖像的代碼:
代碼實(shí)現(xiàn):
from IPython.display import Image, display
# 生成狀態(tài)圖的Mermaid格式并轉(zhuǎn)換為PNG圖像
display(Image(graph.get_graph().draw_mermaid_png()))
6.7.3 圖結(jié)構(gòu)核心組件解析
- 節(jié)點(diǎn)類型:
- 生成查詢/響應(yīng)節(jié)點(diǎn)(
generate_query_or_respond
):決定是否調(diào)用檢索工具或直接回答。 - 檢索節(jié)點(diǎn)(
retrieve
):調(diào)用向量數(shù)據(jù)庫(kù)獲取相關(guān)文檔。 - 問(wèn)題重寫(xiě)節(jié)點(diǎn)(
rewrite_question
):優(yōu)化查詢語(yǔ)句。 - 答案生成節(jié)點(diǎn)(
generate_answer
):整合信息生成回答。
- 邊的類型:
tools_condition
:根據(jù)LLM是否返回工具調(diào)用指令決定是否檢索。grade_documents
:根據(jù)文檔相關(guān)性評(píng)分決定生成答案或重寫(xiě)問(wèn)題。- 無(wú)條件邊(
add_edge
):固定流程跳轉(zhuǎn)(如起始節(jié)點(diǎn)到查詢生成節(jié)點(diǎn))。 - 條件邊(
add_conditional_edges
):
- 狀態(tài)流轉(zhuǎn)邏輯:
graph TD
START --> generate_query_or_respond
generate_query_or_respond -->|需要工具| retrieve
generate_query_or_respond -->|直接響應(yīng)| END
retrieve -->|文檔相關(guān)| generate_answer
retrieve -->|文檔不相關(guān)| rewrite_question
rewrite_question --> generate_query_or_respond
generate_answer --> END
6.7.4 動(dòng)態(tài)路由機(jī)制詳解
- 工具調(diào)用判斷:
tools_condition
函數(shù)會(huì)檢查L(zhǎng)LM輸出中是否包含tool_calls
字段。若有,則觸發(fā)檢索工具;若無(wú),則直接生成回答。 - 文檔相關(guān)性決策:
grade_documents
函數(shù)根據(jù)評(píng)分結(jié)果(yes/no)決定流程走向,形成“檢索-評(píng)估-修正”的閉環(huán)。 - 重寫(xiě)優(yōu)化循環(huán):當(dāng)文檔不相關(guān)時(shí),系統(tǒng)通過(guò)
rewrite_question
節(jié)點(diǎn)優(yōu)化查詢,再重新進(jìn)入檢索流程,避免重復(fù)無(wú)效檢索。
6.7.5 實(shí)際應(yīng)用架構(gòu)優(yōu)化建議
- 分層圖結(jié)構(gòu)設(shè)計(jì):對(duì)于復(fù)雜場(chǎng)景(如多數(shù)據(jù)源檢索),可采用分層架構(gòu),將節(jié)點(diǎn)按“策略層-執(zhí)行層-優(yōu)化層”分組,提升可維護(hù)性。
- 并行檢索節(jié)點(diǎn):在多智能體場(chǎng)景中,可添加并行檢索節(jié)點(diǎn)(如同時(shí)查詢內(nèi)部知識(shí)庫(kù)和外部API),通過(guò)聚合節(jié)點(diǎn)合并結(jié)果。
- 超時(shí)熔斷機(jī)制:在檢索節(jié)點(diǎn)中加入超時(shí)控制,當(dāng)響應(yīng)時(shí)間超過(guò)閾值時(shí)自動(dòng)觸發(fā)備用流程(如使用緩存數(shù)據(jù)或降級(jí)回答)。
6.7.6 圖結(jié)構(gòu)的核心優(yōu)勢(shì)
- 可視化流程管理:通過(guò)狀態(tài)圖可直觀監(jiān)控系統(tǒng)運(yùn)行路徑,便于調(diào)試和優(yōu)化。
- 可擴(kuò)展性:新增功能(如多模態(tài)檢索)時(shí),只需添加新節(jié)點(diǎn)并定義邊的連接規(guī)則,無(wú)需修改現(xiàn)有邏輯。
- 故障定位:當(dāng)輸出異常時(shí),可通過(guò)狀態(tài)圖追溯具體節(jié)點(diǎn)的輸入輸出,快速定位問(wèn)題環(huán)節(jié)。
圖片
狀態(tài)圖的組裝標(biāo)志著Agentic RAG系統(tǒng)從組件開(kāi)發(fā)進(jìn)入整體集成階段。通過(guò)圖結(jié)構(gòu)的動(dòng)態(tài)路由能力,系統(tǒng)能夠像人類一樣自主規(guī)劃?rùn)z索策略、修正查詢方向并生成回答。
6.8 運(yùn)行智能體RAG
在完成智能體增強(qiáng)檢索生成(Agentic RAG)系統(tǒng)的圖結(jié)構(gòu)組裝后,需要通過(guò)實(shí)際案例演示完整工作流的執(zhí)行過(guò)程。以下將通過(guò)模擬用戶查詢場(chǎng)景,展示系統(tǒng)如何從問(wèn)題分析、文檔檢索、內(nèi)容評(píng)估到最終答案生成的全流程自主決策能力,并解析關(guān)鍵環(huán)節(jié)的運(yùn)行機(jī)制。
6.8.1 全流程運(yùn)行演示
通過(guò)graph.stream()
方法啟動(dòng)流式運(yùn)行,實(shí)時(shí)觀察每個(gè)節(jié)點(diǎn)的輸出和狀態(tài)流轉(zhuǎn)。以下是完整的運(yùn)行代碼及輸出解析:
代碼實(shí)現(xiàn):
# 定義用戶查詢:關(guān)于Lilian Weng對(duì)獎(jiǎng)勵(lì)黑客類型的觀點(diǎn)
user_query = "What does Lilian Weng say about types of reward hacking?"
# 啟動(dòng)流式運(yùn)行,獲取每個(gè)節(jié)點(diǎn)的實(shí)時(shí)輸出
for chunk in graph.stream(
{
"messages": [
{
"role": "user",
"content": user_query
}
]
}
):
for node, update in chunk.items():
print(f"【節(jié)點(diǎn)輸出:{node}】")
print("-" * 50)
# 解析消息內(nèi)容,區(qū)分AI回復(fù)、工具調(diào)用等類型
messages = update["messages"]
for msg in messages:
if msg.role == "assistant"and msg.tool_calls:
# 處理工具調(diào)用指令
tool_call = msg.tool_calls[0]
print(f"AI決策:調(diào)用工具 {tool_call.name}")
print(f"工具參數(shù):{tool_call.args}")
elif msg.role == "tool":
# 處理工具返回結(jié)果
print(f"工具響應(yīng):{msg.content[:100]}...") # 截?cái)嚅L(zhǎng)內(nèi)容便于展示
else:
# 處理最終答案
print(f"最終回答:{msg.content}")
print("\n" + "=" * 60 + "\n")
6.8.2 運(yùn)行流程分步解析
第一步:查詢生成節(jié)點(diǎn)(generate_query_or_respond)
【節(jié)點(diǎn)輸出:generate_query_or_respond】
--------------------------------------------------
AI決策:調(diào)用工具 retrieve_blog_posts
工具參數(shù):{'query': 'types of reward hacking'}
==================================================
- 核心邏輯:系統(tǒng)分析用戶問(wèn)題后,判斷需要調(diào)用檢索工具(
retrieve_blog_posts
),并生成關(guān)鍵詞查詢“types of reward hacking”。 - 決策依據(jù):用戶問(wèn)題涉及特定領(lǐng)域知識(shí)(Lilian Weng的研究),需外部文檔支持,因此觸發(fā)工具調(diào)用。
第二步:檢索節(jié)點(diǎn)(retrieve)
【節(jié)點(diǎn)輸出:retrieve】
--------------------------------------------------
工具響應(yīng):Detecting Reward Hacking#In-Context Reward Hacking#...(截?cái)囡@示)
==================================================
- 核心邏輯:檢索工具根據(jù)查詢?cè)~從向量數(shù)據(jù)庫(kù)中獲取相關(guān)文檔,返回包含“獎(jiǎng)勵(lì)黑客分類”的內(nèi)容片段。
- 關(guān)鍵信息:文檔中明確提到“獎(jiǎng)勵(lì)黑客可分為兩類:環(huán)境或目標(biāo)指定錯(cuò)誤(environment or goal misspecification)和獎(jiǎng)勵(lì)篡改(reward tampering)”。
第三步:文檔評(píng)分節(jié)點(diǎn)(grade_documents)
- 隱式執(zhí)行:在圖結(jié)構(gòu)中,檢索節(jié)點(diǎn)輸出后自動(dòng)觸發(fā)
grade_documents
評(píng)分,判斷文檔是否相關(guān)。 - 評(píng)分結(jié)果:文檔包含用戶問(wèn)題的關(guān)鍵詞(“types”“categorized”),評(píng)分結(jié)果為“yes”,流程跳轉(zhuǎn)至答案生成節(jié)點(diǎn)。
第四步:答案生成節(jié)點(diǎn)(generate_answer)
【節(jié)點(diǎn)輸出:generate_answer】
--------------------------------------------------
最終回答:Lilian Weng categorizes reward hacking into two types: environment or goal misspecification, and reward tampering. She considers reward hacking as a broader concept that includes both of these categories. Some work defines reward tampering separately, but Weng includes it under the umbrella of reward hacking.
==================================================
- 核心邏輯:系統(tǒng)基于用戶問(wèn)題和檢索到的上下文,生成結(jié)構(gòu)化回答,明確分類內(nèi)容并補(bǔ)充概念范疇說(shuō)明。
- 格式控制:回答符合提示詞要求的“三句話限制”,同時(shí)保持學(xué)術(shù)表述的嚴(yán)謹(jǐn)性。
6.8.3 全流程狀態(tài)圖追溯
- 關(guān)鍵跳轉(zhuǎn):
起始節(jié)點(diǎn)→查詢生成節(jié)點(diǎn):觸發(fā)工具調(diào)用決策。
檢索節(jié)點(diǎn)→答案生成節(jié)點(diǎn):因文檔評(píng)分“相關(guān)”,跳過(guò)問(wèn)題重寫(xiě)環(huán)節(jié)。
6.8.4 異常場(chǎng)景模擬:文檔不相關(guān)時(shí)的流程
若檢索工具返回不相關(guān)內(nèi)容(如“meow”),系統(tǒng)會(huì)進(jìn)入問(wèn)題重寫(xiě)流程:
# 模擬不相關(guān)檢索結(jié)果的運(yùn)行(簡(jiǎn)化輸出)
for chunk in graph.stream({...}):
# 第一步:同上,調(diào)用檢索工具
# 第二步:工具返回不相關(guān)內(nèi)容
【節(jié)點(diǎn)輸出:retrieve】
工具響應(yīng):meow
==================================================
# 第三步:文檔評(píng)分結(jié)果為“no”,跳轉(zhuǎn)至問(wèn)題重寫(xiě)節(jié)點(diǎn)
【節(jié)點(diǎn)輸出:rewrite_question】
重寫(xiě)后的問(wèn)題:What specific categories of reward hacking are discussed in Lilian Weng's research papers?
==================================================
# 第四步:重新進(jìn)入查詢生成節(jié)點(diǎn),觸發(fā)二次檢索
【節(jié)點(diǎn)輸出:generate_query_or_respond】
AI決策:調(diào)用工具 retrieve_blog_posts
工具參數(shù):{'query': 'Lilian Weng reward hacking categories research papers'}
==================================================
# 第五步:檢索到相關(guān)文檔,生成答案
【節(jié)點(diǎn)輸出:generate_answer】
最終回答:...(同正常流程)
- 核心機(jī)制:通過(guò)“檢索-評(píng)估-重寫(xiě)”的閉環(huán),系統(tǒng)能自主修正查詢策略,提升檢索成功率。
6.8.5 性能優(yōu)化與監(jiān)控建議
- 實(shí)時(shí)日志追蹤:在生產(chǎn)環(huán)境中,可記錄每個(gè)節(jié)點(diǎn)的輸入輸出、處理耗時(shí)及決策依據(jù),便于后續(xù)分析優(yōu)化。
- 緩存機(jī)制:對(duì)高頻查詢的檢索結(jié)果和答案進(jìn)行緩存,當(dāng)相同問(wèn)題再次出現(xiàn)時(shí)直接返回緩存結(jié)果,降低延遲。
- 資源監(jiān)控:監(jiān)控向量數(shù)據(jù)庫(kù)查詢耗時(shí)、LLM調(diào)用頻率等指標(biāo),設(shè)置閾值觸發(fā)告警(如檢索超時(shí)、成本超限)。
6.8.6 Agentic RAG的核心價(jià)值體現(xiàn)
- 自主決策能力:系統(tǒng)能根據(jù)實(shí)時(shí)反饋動(dòng)態(tài)調(diào)整檢索策略,無(wú)需人工干預(yù)。
- 上下文連貫性:通過(guò)狀態(tài)圖維護(hù)對(duì)話歷史,確保多輪交互中檢索策略的一致性(如持續(xù)優(yōu)化同一問(wèn)題)。
- 錯(cuò)誤容錯(cuò)機(jī)制:當(dāng)檢索失敗時(shí),自動(dòng)觸發(fā)問(wèn)題重寫(xiě)等補(bǔ)救措施,提升系統(tǒng)魯棒性。
運(yùn)行智能體RAG標(biāo)志著從理論架構(gòu)到實(shí)際應(yīng)用的落地。通過(guò)上述案例可以看到,Agentic RAG系統(tǒng)不僅能完成“檢索-生成”的基礎(chǔ)任務(wù),還具備類似人類的“反思-修正”能力。