从传统RAG到Agentic RAG:构建具备自主规划与推理能力的智能问答系统

发布时间:2026/8/24 2:23:48
从传统RAG到Agentic RAG:构建具备自主规划与推理能力的智能问答系统 最近在尝试把一些内部文档和知识库接入到智能问答系统时遇到了一个典型问题传统的RAG检索增强生成系统在回答简单、事实性明确的问题时表现不错但一旦问题变得复杂、需要多步推理或综合多个文档片段时就很容易“翻车”。要么是检索到的片段不相关要么是模型无法有效整合这些零散信息给出的答案要么是“车轱辘话”要么干脆就是错的。这让我开始重新审视RAG的演进路径。从最初的“检索-拼接-生成”三步走到后来引入重排序、查询改写、HyDE假设性文档嵌入等技术本质上都是在优化“检索”和“理解”这两个环节的精度。但一个更根本的瓶颈在于传统RAG是一个被动的、线性的流程。它假设用户的一次提问就能通过一次检索和一次生成得到完美答案。然而真实世界的问题尤其是专业领域的问题往往是迭代的、探索性的。这引出了我们今天要深入探讨的主题Agentic RAG。它不是一个全新的技术而是一种思维范式的转变——将RAG从一个静态的“问答管道”转变为一个由智能体Agent驱动的、具备自主规划、执行、反思和迭代能力的动态系统。很多人一听到“Agent”就觉得复杂、遥远但Agentic RAG的核心思想非常朴素让系统学会“像人一样思考问题”即先拆解问题再分步获取信息最后综合判断给出答案。接下来的内容我将带你从零开始理解Agentic RAG的原理并动手搭建一个最小可用的原型。我们不会追求大而全的框架而是聚焦于核心机制让你能清晰地看到如何让一个RAG系统“活”起来。1. 为什么传统RAG会“卡住”从被动检索到主动求解的鸿沟在深入Agentic RAG之前我们必须先理解传统RAG的局限性在哪里。这不是为了否定它而是为了看清进化的方向。1.1 传统RAG的“三板斧”与它的阿喀琉斯之踵一个标准的RAG流程通常包含三步索引Indexing将文档切块、向量化存入向量数据库。检索Retrieval将用户问题向量化从数据库中找出最相似的文本块Top-K。生成Generation将检索到的文本块作为上下文连同问题一起交给大语言模型LLM生成最终答案。这个流程在以下场景中表现良好事实性问答“公司的年假制度是怎样的”定义解释“什么是微服务架构”简单总结“概括一下这份产品需求文档的核心目标。”然而一旦遇到复杂问题这个流程就开始捉襟见肘场景一多跳问答Multi-hop QA用户问题“根据我们上周的会议纪要和项目A的技术方案评估一下如果采用方案B对项目整体预算的影响是什么”传统RAG的困境系统可能会分别检索到“会议纪要中关于预算的讨论”和“技术方案B的成本部分”但很难自动意识到需要先从会议纪要中找到整体预算基线再从技术方案中找到B方案的增量成本最后进行对比计算。它更可能把两个不相关的片段拼在一起生成一个混乱的答案。场景二需要综合与推理的问题用户问题“对比一下产品X和产品Y在安全性、易用性和性能三个维度的优劣并给出选型建议。”传统RAG的困境检索可能会返回关于X产品安全性、Y产品性能等分散的片段。LLM需要在这些碎片信息中自行拼凑、对比、权衡。这个过程没有“检查”机制很容易遗漏关键信息或做出片面的判断。场景三模糊或需要澄清的问题用户问题“那个功能做得怎么样了”传统RAG的困境“那个”指代不明。传统RAG要么胡乱检索要么直接回答“无法确定”。它缺乏主动向用户提问、澄清需求的能力。问题的根源在于传统RAG的“检索-生成”是一个开环系统。它执行一次预设动作后便结束没有自我评估和调整的机制。而Agentic RAG引入的“智能体”思维正是为了构建一个闭环系统。1.2 Agentic RAG的核心思想将问题求解过程“任务化”Agentic RAG不再把用户问题直接丢给检索器。它引入了一个“大脑”——一个具备规划能力的LLM或一个轻量级规划模块。这个大脑的工作是理解与规划分析用户问题将其分解成一系列可执行的子任务。例如“对比产品X和Y”可以分解为“检索X的安全性信息”、“检索Y的安全性信息”、“检索X的易用性信息”……“综合以上信息生成对比报告”。执行与检索根据规划依次或并行地执行每个子任务。每个子任务都可能产生一个更精确的检索查询。反思与迭代检查当前收集到的信息是否足以回答原始问题。如果不够则生成新的、更深入的查询去检索如果发现信息矛盾则尝试从其他来源验证。综合与生成在所有必要信息收集齐全且通过验证后综合所有上下文生成最终答案。这个过程的本质是将一次性的、模糊的信息检索请求转变为一个结构化的、可迭代的问题求解项目。智能体扮演了项目经理兼执行者的角色。2. 从零搭建Agentic RAG拆解核心组件与工作流理解了“为什么”之后我们来看“怎么做”。我们将构建一个最小化的Agentic RAG系统它包含四个核心组件并遵循一个清晰的工作流。2.1 核心组件四要素一个典型的Agentic RAG系统通常由以下部分组成我们自底向上来看工具集Tools智能体可以调用的外部能力。对我们来说最核心的工具就是检索工具。它接收一个查询字符串从向量数据库返回相关的文档片段。未来可以扩展其他工具如计算器、代码执行器、API调用等。# 伪代码示例一个简单的检索工具 class RetrieverTool: def __init__(self, vector_store): self.vector_store vector_store def run(self, query: str, top_k: int 5): 执行检索返回相关文档片段 results self.vector_store.similarity_search(query, ktop_k) return results智能体Agent系统的“大脑”。它接收用户问题决定调用哪个工具、传入什么参数并处理工具的返回结果。我们通常使用一个功能较强的LLM如GPT-4、Claude 3或开源的DeepSeek、Qwen等作为智能体的核心。关键能力理解指令、规划步骤、决定何时使用工具、解析工具输出、判断任务是否完成。工作记忆Working Memory存储当前会话的上下文。这包括用户原始问题。智能体已经执行过的动作调用了什么工具输入输出是什么。从工具中获取到的所有信息片段。智能体内部的推理过程Chain-of-Thought。这是实现“反思与迭代”的基础让智能体知道自己已经做了什么还缺什么。规划器与执行引擎Orchestrator协调整个流程的控制器。它管理智能体、工具和记忆之间的交互循环。一个简单的循环如下开始 - 接收用户问题 - 智能体规划 - 执行工具 - 更新记忆 - 智能体判断是否完成 - 否继续规划/执行 - 是生成最终答案 - 结束2.2 工作流详解一次完整的Agentic问答之旅让我们通过一个具体问题走一遍系统的工作流。假设用户问“我们Q3的产品发布计划中市场部负责的推广活动有哪些它们的预算和负责人是谁”步骤零准备阶段已将公司的“Q3产品发布计划.pdf”文档切块、向量化存入向量数据库如Chroma、Weaviate、Milvus。检索工具已初始化并连接到该数据库。步骤一问题接收与初步分析规划器将用户问题放入工作记忆并调用智能体进行首次分析。智能体分析后可能输出“这是一个需要从‘Q3产品发布计划’文档中提取特定信息的问题。我需要先找到文档中关于‘市场部推广活动’的部分然后提取每个活动的预算和负责人信息。”步骤二规划与执行第一轮规划智能体决定首先调用检索工具查询词为“市场部 推广活动 Q3 产品发布计划”。执行检索工具运行返回5个最相关的文档片段。记忆更新这些片段被存入工作记忆。反思智能体阅读这些片段。它可能发现片段中列出了活动A、B、C但只有活动A明确提到了预算活动B和C的负责人信息缺失。步骤三迭代与细化第二轮规划智能体判断信息不完整。它规划新的子任务针对“活动B 预算”发起新的检索查询。针对“活动C 负责人”发起新的检索查询。执行依次或并行执行这两个检索任务。记忆更新新获取的信息被补充到工作记忆中。步骤四综合与生成判断智能体检查工作记忆确认已收集到所有三个活动的预算和负责人信息或确认文档中确实缺失某些信息。生成智能体综合所有片段组织成结构化的答案“根据Q3产品发布计划市场部负责的推广活动如下1. 活动A预算XX元负责人张三2. 活动B预算YY元负责人李四3. 活动C预算ZZ元负责人王五。其中活动B的预算信息在文档中未明确列出是根据XX部分推算得出。”输出规划器将最终答案返回给用户。这个流程的关键在于动态性。智能体根据中间结果不断调整后续动作而不是一条路走到黑。3. 手把手代码实战构建一个最小可行原型理论说得再多不如动手实现。我们将使用Python、LangChain一个流行的LLM应用框架和OpenAI API也可以用其他兼容API的模型来搭建一个最简单的Agentic RAG原型。环境准备确保已安装langchain,langchain-openai,chromadb,tiktoken等库。需要一个可用的OpenAI API Key或兼容的本地模型API端点。3.1 第一步搭建基础RAG——文档加载与向量化首先我们建立传统RAG的部分作为智能体的“工具”基础。# core_rag_setup.py from langchain_community.document_loaders import TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_chroma import Chroma import os # 1. 加载文档这里用文本文件示例可以是PDF、Word等 loader TextLoader(./data/q3_plan.txt) # 假设你的文档在这里 documents loader.load() # 2. 分割文档 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 块大小 chunk_overlap50, # 重叠部分保持上下文 separators[\n\n, \n, 。, , , , , ] ) docs text_splitter.split_documents(documents) # 3. 创建向量存储 embeddings OpenAIEmbeddings(openai_api_keyos.getenv(OPENAI_API_KEY)) vector_store Chroma.from_documents( documentsdocs, embeddingembeddings, persist_directory./chroma_db # 持久化到本地 ) print(向量数据库构建完成)3.2 第二步创建智能体与工具接下来我们使用LangChain的Agent框架来创建智能体和它的检索工具。# agentic_rag_agent.py from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_openai import ChatOpenAI from langchain.tools.retriever import create_retriever_tool from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder # 1. 从已构建的向量库创建检索器 retriever vector_store.as_retriever(search_kwargs{k: 4}) # 每次检索4个片段 # 2. 将检索器包装成一个标准的“工具” retriever_tool create_retriever_tool( retriever, document_retriever, Search for information in the companys Q3 product launch plan document. Use this tool when you need to find specific details, facts, or sections from the plan. ) # 3. 初始化LLM作为智能体的“大脑” llm ChatOpenAI(modelgpt-4-turbo-preview, temperature0, openai_api_keyos.getenv(OPENAI_API_KEY)) # 4. 定义智能体的提示词模板。这是控制智能体行为的关键 prompt ChatPromptTemplate.from_messages([ (system, You are a helpful assistant that answers questions about the companys Q3 product launch plan. You have access to a document retrieval tool. Your goal is to provide accurate, comprehensive answers based ONLY on the information you find in the documents. Follow these steps: 1. Understand the users question thoroughly. 2. If the question is simple and direct, use the retrieval tool once with an appropriate query. 3. If the question is complex, break it down into sub-questions. Use the tool multiple times if needed to gather all pieces of information. 4. After each retrieval, analyze if you have enough information to answer the original question. If not, think about whats missing and search again. 5. Once you have all necessary information, synthesize it and provide a final, clear answer. 6. If information is truly not found in the document, say so. Do not make up information. Always cite which parts of your answer come from the retrieved documents by referencing the content briefly. ), MessagesPlaceholder(variable_namechat_history), # 预留位置给对话历史工作记忆 (human, {input}), MessagesPlaceholder(variable_nameagent_scratchpad), # 智能体的思考过程 ]) # 5. 创建智能体 tools [retriever_tool] agent create_openai_tools_agent(llm, tools, prompt) # 6. 创建执行器它将管理智能体与工具的交互循环 agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue)3.3 第三步运行与测试现在让我们用几个问题来测试我们的Agentic RAG系统。# test_agentic_rag.py # 测试简单问题 simple_question What is the launch date for the new product? print(fQ: {simple_question}) result agent_executor.invoke({input: simple_question, chat_history: []}) print(fA: {result[output]}\n) # 测试复杂问题多跳推理 complex_question What are the marketing activities led by the Marketing department in the Q3 plan, and who is responsible for each along with their budget? print(fQ: {complex_question}) result agent_executor.invoke({input: complex_question, chat_history: []}) print(fA: {result[output]}\n) # 测试模糊问题观察其是否尝试澄清或推断 vague_question Tell me about the risks mentioned. print(fQ: {vague_question}) result agent_executor.invoke({input: vague_question, chat_history: []}) print(fA: {result[output]})运行上述代码你将看到verboseTrue模式下智能体的思考过程。它会展示Thought: 智能体在决定下一步做什么。Action: 它选择调用哪个工具这里是document_retriever。Action Input: 它生成的查询词是什么。Observation: 工具返回的检索结果。然后循环直到它认为可以给出最终答案Final Answer。这就是一个最基础的Agentic RAG系统。它已经具备了规划通过提示词引导、执行调用检索工具、反思判断信息是否足够的能力。4. 超越原型关键优化点与生产级考量搭建出原型只是第一步。要让Agentic RAG真正可靠、高效地运行我们需要在以下几个关键维度上进行深化和优化。4.1 提示词工程塑造智能体的“思维模式”智能体的能力很大程度上受限于提示词。上面的基础提示词可以进一步优化强化分解能力明确要求智能体在遇到复杂问题时先输出一个分解计划。For complex questions, FIRST output a step-by-step plan like: Plan: 1. Find information about [Sub-question 1]. 2. Find information about [Sub-question 2]. 3. Synthesize findings from step 1 and 2 to answer [Original Question]. Then, execute the plan.引入自我验证要求智能体在给出最终答案前进行事实交叉验证。Before giving the final answer, check for consistency across different retrieved snippets. If there are contradictions, try to resolve them by searching for more authoritative or clarifying information.控制幻觉严格限制回答范围并明确引用来源。Your answer must be grounded in the retrieved documents. For each key point in your answer, note which document snippet it comes from (e.g., According to the section on Marketing...).4.2 工具扩展从检索到行动检索只是智能体可用的工具之一。一个强大的Agentic系统可以集成多种工具计算工具处理“预算增加15%后是多少”这类问题。代码解释器执行数据分析或生成图表。外部API调用查询实时数据股票、天气、触发工作流创建Jira ticket、发送邮件。其他知识库检索器同时查询多个不同领域的向量数据库。在LangChain中可以轻松地将这些工具添加到tools列表中。智能体在规划时会自动选择最合适的工具。4.3 记忆与状态管理实现多轮对话与长期记忆我们的原型只处理单次查询。真正的对话是连续的。对话历史Chat History需要将之前的问答记录纳入上下文。这可以通过在invoke时传入chat_history参数实现我们已在提示词中预留了位置。使用ChatMessageHistory等类来管理。长期记忆Long-term Memory对于用户偏好、历史决策等信息可以向量化后存入独立的记忆数据库在相关会话中动态检索并注入上下文。摘要记忆长对话会消耗大量Token。一种策略是定期将较旧的对话内容总结成摘要存入记忆既保留关键信息又节省上下文窗口。4.4 性能、成本与稳定性延迟Agentic RAG涉及多次LLM调用和检索延迟远高于传统RAG。优化策略包括并行执行独立子任务、使用更快的LLM或小模型进行简单规划、缓存常见查询结果。成本每次LLM调用和工具执行都可能产生成本API调用、计算资源。需要设置预算、监控使用量并对简单问题设置短路逻辑直接走传统RAG。错误处理与稳定性智能体可能陷入死循环、生成无效查询、或误解工具输出。必须设置最大迭代次数防止无限循环。超时机制对每个工具调用设置超时。结构化输出解析确保智能体输出的动作指令能被正确解析。Fallback机制当智能体多次失败后回退到基础问答或提示用户重新表述问题。4.5 评估与监控如何知道它真的变好了引入Agentic能力后评估变得复杂。不能只看最终答案的对错。过程评估记录智能体的思考链Chain-of-Thought、工具调用序列、中间结果。分析它在哪一步做出了正确或错误的决策。成本效益分析对比解决复杂问题时Agentic RAG与传统RAG的答案质量提升与所增加的延迟和成本是否匹配。人工评估Human-in-the-loop在关键场景可以将智能体的分解计划或初步答案提供给人类审核确认再继续执行或修正。这是平衡自动化与可靠性的有效手段。5. 思维跃迁从“工具使用者”到“流程设计者”完成一个Agentic RAG项目最大的收获可能不是代码而是一种思维方式的转变。我们不再仅仅是调用API和拼接组件的“工匠”而是设计智能工作流的“架构师”。5.1 设计思维定义清晰的智能体角色与边界在开始编码前应该像设计一个产品一样设计你的智能体它的核心职责是什么例如精准回答基于某知识库的复杂问题它的能力边界在哪里例如只处理文档内信息不进行外部搜索或创造性写作它应该如何与用户交互例如主动澄清模糊问题分步骤展示推理过程失败时该如何优雅降级将这些设计决策体现在提示词、工具集和流程控制中。5.2 迭代思维构建-评估-优化的循环Agentic系统的开发是高度迭代的。构建最小可行原型MVP就像我们上面做的那样先跑通核心循环。设计评估集收集一批有代表性的简单、复杂、模糊、多跳问题。运行与评估让系统回答这些问题仔细分析日志思考过程、工具调用。识别失败模式是检索查询生成得不好优化提示词中关于查询生成的指令是规划能力不足提供更详细的规划示例是工具输出解析错误改进工具的结果格式化是陷入了无效循环增加最大步数限制或引入超时针对性优化修改提示词、调整工具、增加规则。回到第3步持续循环。5.3 工程思维可靠性高于炫技在追求智能体的“智能”时永远不要忘记软件工程的基本原则可观测性全面的日志记录输入、输出、中间步骤、耗时、Token使用量是调试和优化的生命线。可测试性为智能体的关键决策点如问题分解、工具选择编写单元测试和集成测试。可维护性将提示词、工具定义、流程控制逻辑模块化、配置化便于单独调整。安全性对智能体生成的查询或指令进行安全检查防止其调用危险工具或泄露敏感信息。Agentic RAG不是传统RAG的替代品而是一个强有力的补充和进阶。对于简单、明确的问题传统RAG轻量、快速、成本低的优势依然明显。但对于那些需要探索、推理、验证的复杂问题Agentic RAG提供了一条通向更可靠、更智能答案的路径。它代表的是一种方向未来的AI应用不会只是一个被动应答的“知识库”而会越来越多地成为一个能够主动思考、规划并执行任务的“协作者”。从这个原型出发你可以尝试加入更多工具设计更复杂的协作流程如多个智能体分工或将其应用到具体的业务场景中去解决那些真正棘手的、非结构化的信息处理难题。真正的挑战和乐趣现在才刚刚开始。