在人工智能领域,大型语言模型(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领域最深刻的启示:智能不仅在于生成答案的能力,更在于判断何时、何处以及如何获取知识的智慧。