
做了一阵子大模型应用的同学应该都有体会RAG单独跑个demo很容易Agent单独做几个 function calling 也很容易但真正把 RAGAgent 组合起来落成一个能用的系统才是分水岭。最近“rag知识库”、“agent开发”、“agentic rag”这些词密集出现网上资料也很多但大多是概念科普真正告诉你“怎么组合、为什么这样组合、坑在哪里”的实战内容反而稀缺。这篇东西就想把这层窗户纸捅破用一套可实际复用的思路讲讲大模型智能体落地的核心组合到底怎么搭。先说清楚它解决什么问题单靠大模型知识是封闭的幻觉是随机的复杂任务一步做不完单靠RAG只能做“检索问答”不会调用工具、不会多步规划单靠Agent又容易在长任务中丢失依据、胡编乱造。RAGAgent组合本质上是给智能体装上一个“可查询的外部记忆库”同时让知识库具备“能执行任务的流程大脑”。这篇内容适合正在做智能体落地、准备把业务知识接入大模型的工程师也适合刚入行想系统理解架构的技术负责人。接下来我会从组合逻辑、核心技术细节、可复现代码结构、避坑经验四个层面展开把值得抠的细节都交代清楚。1. 为什么RAG和Agent必须绑在一起拆开看各自的边界1.1 RAG的真正作用是给模型补一个“外部知识接口”大模型本身是个“参数化记忆容器”预训练完成之后知识就凝固在权重里。你问它今年年初公司新发布的某款产品参数它大概率答不上来你让它回答企业内部知识库里的流程规范它更是完全没听过。这就是RAG存在的根本原因——它把“模型不知道的”变成“模型可以查到的”。RAG的流程看着简单先把文档切块、向量化、建索引用户提问时检索出最相关的片段把片段和问题一起交给模型生成答案。但很多人忽略了一个关键点RAG本质上是把大模型改造成一个“阅读型答题器”它不做多步骤推理不调外部工具也不负责在多个数据源之间做决策路由。你问它“这个设备的维修流程是什么”它能答你问它“设备A出现故障请按照内部流程帮我提交工单、通知责任人、同时给出维修建议”它就抓瞎了因为这不是一次检索能解决的事。所以RAG的场景边界非常清晰适合单轮或浅多轮的知识问答不适合需要连续决策和工具调用的复杂任务。这也是为什么在很多落地项目里纯RAG做的知识库问答Demo很惊艳一上生产就被业务方嫌弃“太笨”。1.2 Agent是任务执行框架但它自己不带“知识数据库”Agent的核心能力不是“知道什么”而是“能做什么”。它通过大模型的推理能力把用户意图拆解成步骤选择合适的工具执行工具并观察结果再决定下一步动作。典型的机制包括规划Planning、工具调用Tool Use、记忆Memory和反射Reflection。但这里有个容易被忽略的陷阱Agent的“知识”来自两个地方一是模型本身预训练的参数化知识二是工具返回的实时信息。当你让它处理一个需要“公司内部最新制度”的任务时如果你没有给它挂上检索工具它就会基于预训练知识或者干脆临场发挥来回答结果就是一本正经地胡说八道。我见过不止一个团队Agent框架搭得很顺功能调用都正常但业务效果一塌糊涂原因就是知识底座是空的。所以Agent单独运行的局限也很清晰它具备“行动能力”但缺乏“知识来源”。它的规划越复杂对事实性依据的需求就越强否则整个推理链就是空中楼阁。1.3 组合起来才能覆盖真实业务里“既要知道、又要会做”的需求真实业务场景几乎都是知识行动的混合体。比如一个售后智能体用户报修一个故障它需要先理解故障描述检索该设备的维修手册RAG再根据故障码查询备件库存工具调用然后按内部流程生成工单并通知相应班组多步Agent编排。这里面知识检索和任务执行是交错进行的不是谁先谁后而是你中有我。做个直白的对比方案能做知识问答能做多步执行能控制幻觉能处理实时数据适合场景纯大模型部分有幻觉弱差差闲聊、简单咨询纯RAG强弱中上差企业知识库问答纯Agent弱强差强工具编排、流程自动化RAGAgent强强中上强复杂业务智能体组合的本质并不复杂把RAG包装成Agent的一个工具或者把RAG结果作为Agent推理的依据存储进记忆让智能体在每一步决策时都能“查到资料再行动”。这样一来知识库不再是答话机而是Agent的“参考书架”Agent也不只是执行器而是一个有知识依据的“办事员”。后面几节我拆开讲RAG侧怎么做得扎实Agent侧怎么编排合理然后再给一套组合落地的具体做法。2. 先吃透RAG检索增强不是简单拼接2.1 索引构建阶段切块、元数据、向量化每一项都影响召回质量很多项目只把“切块-向量化-存库”当流水线走结果检索质量忽高忽低。实际上索引阶段就定了上限后面召回再怎么调都只是找回损失的质量。切块策略是第一个大坑。按固定字符切比如每512个字符一块是最省事的但会把完整语义切断。比如一个产品规格表前半部分是参数后半部分是保修说明硬切一刀后两块的语义都残缺。我的习惯是优先按文档结构切Markdown按标题层级划分HTML按标签语义划分PDF优先按段落切没有结构时用滑动窗口重叠重叠量一般在10%~15%比如每块512字符、重叠64字符保证跨块语义不丢。元数据是第二个容易被忽视的点。每条切块入库时建议至少带上文档标题、章节路径、来源文件、更新时间、业务线标签。这五个字段不是摆设召回阶段可以用元数据过滤比如只看某个产品线的文档重排序后可以用来源做去重和展示审计时能回溯到原始文件的准确位置。很多RAG项目上线后没法回答“你这个答案依据是哪份文档的哪一页”就是元数据没做全。向量化这步要选对模型。中文场景下现在可选的开源embedding模型很多挑的时候重点看三个指标检索准确率、向量维度、推理速度。维度不是越高越好768维和1536维在业务量不大时效果差异没有想象中大但存储和延迟差异很大。另外同一套系统里不要混用多个embedding模型否则向量空间不兼容检索语义会对不上。线下测试时用“难度较高”的领域内问题做百级样本召回率评测比盲目换大模型更有意义。2.2 召回策略向量召回、关键词召回、混合检索与重排序向量召回擅长语义相似缺点是对专有名词、精确编号不敏感。比如用户问“CML-2000型设备报警E03”向量检索可能把它理解成“设备报警”召回一堆不太相关的通用文档反而把精确型号信息淹没了。关键词召回擅长精确匹配但同义词和口语化表达又匹配不上。所以生产环境里我基本不做单选而是用混合检索。常用方法是“向量召回TopK 关键词召回TopK RRF融合”。RRFReciprocal Rank Fusion原理很朴素每个文档在多个结果列表里都有个排名把所有列表的排名倒数相加作为融合分排名越靠前贡献越大。它不依赖分数归一化对不同检索器返回的分数尺度不一致问题天然免疫工程实现也简单。召回之后必须接重排序Rerank。向量检索的TopK可能只有“字面相关”不代表“真正回答了问题”。重排序用Cross-Encoder模型把“问题候选文档”拼接起来精细打分效果比向量相似度高一截。生产环境建议召回50~100条候选重排序后取前5~10条进上下文这样既控制token量又保住精度。注意重排序模型和embedding模型是两个独立模型很多人在这步省掉结果检索结果一多大模型就被无关信息干扰了。2.3 生成环节把检索结果组织成“证据包”而不是直接塞给模型检索完不是直接把片段拼接进Prompt就完事。这里的关键是把检索结果组织成结构化“证据包”让模型知道哪些是依据、哪些是用户问题、回答时如何引用。我的标准Prompt结构大概是四段第一段是角色与任务说明比如“你是企业知识助手请仅根据提供的参考片段回答”第二段是带编号的参考片段列表每条注明来源和元数据第三段是用户问题第四段是输出约束包括“如果参考片段不足以回答请明确说信息不足不要编造”“回答中标注引用的片段编号”。还有一个重要细节上下文窗口管理。RAG的检索结果可能很多但大模型上下文是有限的。一般做法是设定一个“知识窗口预算”比如总上下文是32K token那检索片段最多给8K token留出模型推理和生成的空间。超出时要按重排序分数从高往低截断。遇到长文档用户还想追全篇信息的情况宁可多做几轮对话式检索比如先让模型判断缺什么再检索第二次也不要一次把整个超大文档塞进去。3. Agent编排让大模型学会“做事”3.1 Agent的核心机制规划、工具、记忆、反思一个都不能少把Agent拆开看核心是四个机制。规划是把大任务分解成小步骤的能力。简单场景可以用一次性规划先生成完整步骤再逐步执行复杂场景需要动态规划边做边想下一步。对RAGAgent组合来说规划还有一个附加动作识别“哪一步需要查资料”不能上来就凭模型直觉回答。工具是Agent与外部世界交互的接口。工具定义的关键不是函数本身而是“给模型看的说明书”。工具的名称、描述、参数Schema要写得极其清楚模型才知道什么场景该调这个工具。比如说有个工具是“search_knowledge_base”描述里最好写明“用于检索企业内部产品文档、维修手册、制度规范当用户问题涉及具体产品参数、流程步骤时调用”这比只写“知识库检索”效果好得多。记忆分短期和长期。短期记忆就是当前任务里的对话历史和中间状态长期记忆是把有价值的信息存下来跨会话复用。这里有一个RAGAgent组合的关键点长期记忆的存储和召回本质上就是RAG——把历史经验向量化存库新任务时检索相关经验注入提示词。所以你会看到Agent框架里Memory模块和RAG模块的底层技术是打通的。反思是对自己执行过程的自检。现在主流的做法是让模型生成答案后再把自己当成评审者检查推理过程是否合理、回答是否有依据。对于RAGAgent系统反思环节非常重要因为多步骤执行中间任何一步用了错误知识最终结果都是错的。3.2 三种主流编排范式ReAct、Plan-and-Execute、Reflection怎么选ReAct是目前最通用的范式。核心思路是“想一步、做一步、观察一步”交替进行。大模型看到用户问题先推理需要什么信息调用工具观察工具返回结果再决定下一步。它的优势是灵活、能中途调整缺点是token消耗大、步骤多了容易产生逻辑漂移。适合工具调用频繁、任务路径不确定的场景比如故障诊断。Plan-and-Execute是“先计划、再执行”。先生成一个完整的任务拆解清单然后按清单顺序执行执行中每个步骤可能调工具也可能直接回答。优势是节省token、步骤可控缺点是计划一旦制定就缺乏灵活性执行中遇到意外情况难以及时调整。适合流程相对固定的任务比如日报生成、定期巡检。Reflection范式则是“执行后自检”。生成答案后模型自己对答案进行批评、找漏洞再根据批评意见重新生成。它可以作为其他两种范式的补充环节而不是单独的主流程。我的建议是主流程用ReAct或Plan-and-Execute在最终输出前加一道Reflection校验成本不高但能抓到不少幻觉问题。3.3 RAG在Agent里的两个位置工具和记忆决定了组合方式RAG在Agent里可以出现在两个位置理解这点基本就理解了“Agentic RAG”的核心。第一个位置是作为“检索工具”。这是最常见的组合方式Agent在规划中决定何时调用检索工具拿到检索结果后继续加工。这种情况下RAG是一个被动服务的角色Agent是主动编排的角色。实现上就是把检索接口包装成工具注册进Agent框架模型通过工具调用触发检索。第二个位置是作为“记忆系统”。这更高级一点也比较贴近“Agentic RAG”的本质。对话历史、中间推理结果、用户偏好、之前的任务结论都可以向量化之后存起来在下一次任务中被检索召回。比如一个长期服务的项目助手用户昨天问过某设备的维修周期今天又问同设备的保养建议Agent如果能从“长期记忆”里检索到昨天的上下文回答质量和连贯性会明显提升。这个“记忆库”的实现就是RAG。两种位置的组合方式并不互斥完整系统通常两个都有。检索工具负责“获取外部业务知识”记忆系统负责“复用历史上下文信息”双通道供给Agent才能支撑复杂业务。4. 从零到一一套可复用的RAGAgent组合案例4.1 场景定义与架构设计以内网运维助手为例用一套具体的例子讲组合落地。假设要做的是一个“企业内部IT运维助手”业务方提出的需求是员工可以问设备故障怎么处理、可以查IT服务台工单流程、可以咨询网络故障排查步骤而且整个问答过程要基于企业内部文档不能瞎编。这个需求天然适合RAGAgent组合。它既有知识问答故障手册、流程文件也有工具调用查工单状态、提交服务请求还有多步推理分析故障原因→查手册→建议排查步骤→必要时提交工单。整体模块划分如下知识库服务层负责文档解析、切块、向量化、索引存储、检索与重排序对外提供检索APIAgent编排层负责意图理解、任务规划、工具调度、上下文管理、结果生成工具层包括知识库检索工具、工单系统API工具、运维脚本执行工具、用户信息查询工具数据层向量数据库存知识块关系库或日志系统存对话记录与工单记录这个结构里知识库服务是被Agent动态调用的而不是直接对用户问答。用户问一句“打印机报错代码E403怎么处理”Agent先判断这是设备故障类问题于是调用知识库检索工具拿到维修手册片段生成具体排查步骤如果用户随即说“帮我把这个故障提交为工单”Agent再调用工单API工具完成提交动作。整个过程是连续的这也充分体现了RAG和Agent的分工协同。4.2 数据准备与索引构建文档清理、切块入库、检索验证三步走数据这一步最花时间也最容易返工。我给团队的流程是三步走。第一步是文档清理。把原始操作手册、规章制度、FAQ里的大水印、页眉页脚、目录页码全部去掉把表格转成可读文本时注意保留表头对应关系图片里的文字如果能OCR就OCR不能OCR的至少用替代文本描述“此处为拓扑图详见附件”。清理不到位的文档检索出来一堆乱码重排序都救不回来。第二步是切块入库。按章节结构切每块控制在300~800字之间重叠10%左右。元数据字段至少包含文档编号、章节标题、原文路径、更新时间、适用设备类型。入库前做一遍敏感信息扫描防止内部机密信息被检索出来。向量化模型建议选中文效果好的embedding模型库选支持过滤条件的向量数据库方便后面按设备类型做召回过滤。第三步是检索验证。建一个离线评测集准备50~100个真实业务问题标注每道题的标准答案或标准文档路径然后跑一遍召回和重排序看Top5命中率。低于80%就要回头调切块策略或者换embedding模型别急着上Agent。以下是一个索引构建的代码骨架用的是常见的Python技术栈from langchain.text_splitter import MarkdownHeaderTextSplitter # 按Markdown标题层级切块而不是硬切字符 headers_to_split_on [ (#, title), (##, chapter), (###, section), ] splitter MarkdownHeaderTextSplitter(headers_to_split_onheaders_to_split_on) with open(it_service_docs.md, r, encodingutf-8) as f: content f.read() chunks splitter.split_text(content) # 每个chunk自动带上了标题层级元数据 for chunk in chunks: print(chunk.metadata[title], chunk.metadata[chapter]) # 做清洗、向量化、入库注意这里的关键点切出来的每个块自带结构元数据后续检索时可以按章节过滤也可以在同章节内做上下文扩展。这一步做扎实了后面Agent拿到检索结果的“可读性”会好很多。4.3 Agent编排层的核心实现把检索工具注册进循环Agent编排层的实现重点不是框架而是“循环控制”。一个标准的Agent执行循环是收集用户输入→组装提示词→模型推理出下一步动作→如果是工具调用就执行工具→把工具结果追加到对话→继续循环→直到模型认为可以给出最终答案。检索工具必须按标准工具Schema注册让模型能描述清楚“什么时候调用它”。以下是一个伪代码级别的核心流程def knowledge_retrieval_tool(query: str, device_type: str None): 内部知识库检索工具用于查询产品手册、维修指南、流程规范。 candidates hybrid_search(query, top_k50, filter{device_type: device_type}) reranked rerank(query, candidates, top_k5) return build_evidence_pack(reranked) def agent_loop(user_input: str, history: list): messages build_messages(user_input, history, system_prompt) for step in range(MAX_STEPS): response llm.chat(messages, toolsAVAILABLE_TOOLS) if response.tool_calls: tool_result execute_tool(response.tool_calls[0]) messages.append(tool_result) else: final_answer response.content # 可选的反思环节把答案返回给模型自检 verified reflection_check(final_answer, evidence_sources) return verified return 已达到最大执行步骤请补充信息后重试实际部署时还要加两个关键控制一是步骤上限防止Agent陷入死循环二是工具结果截断工具返回内容可能很长必须做一次“摘要截断”再塞进上下文。知识库检索工具返回的应该是整理过的“证据包”而不是原始的一堆文档片段。4.4 质量护栏引用标注、未知信息兜底、人工审核通道智能体落地和Demo最大的区别就是“没人愿意为模型的错误担责”。所以必须加几道护栏。第一道护栏是引用标注。模型生成每个事实性回答时必须标注依据的知识条目ID或来源文档。这样用户和审核人员都能回溯验证。实现方式是在检索结果证据包里带元数据Prompt里强制要求“引用证据编号”。第二道护栏是未知信息兜底。当检索结果和用户问题相关度都低于设定阈值时不要强行回答。可以让Agent返回一句“当前知识库中暂未找到该问题的相关材料请补充关键词或咨询人工客服”同时触发把这个问题记录下来作为后续知识库补全的线索。第三道护栏是人工审核通道。在高风险动作比如自动提交工单、自动修改配置、自动发送通知之前加一个“人工确认”节点。业务上可以先让Agent生成建议和草稿人工点头后再正式执行。这虽然牺牲了一点“全自动”但换来的是可运维、可追责在大多数企业内网场景里更现实。5. 工程化落地避坑清单检索、上下文、幻觉三大问题5.1 检索结果不对先分清楚是召回问题还是重排序问题检索质量差是所有组合系统里最常见的问题但很多人一上来就盲目换模型。我的排查顺序是先看召回的Top50里有没有正确答案。如果有说明召回没问题问题在重排序或者上下文组织如果没有问题在切块策略、embedding模型或查询改写。一个非常实用的技巧把用户问题做一次“查询改写”再检索。原始用户问题往往是口语化表达比如“我们打印机老卡纸怎么办”直接拿这个去检索效果一般可以先让大模型把它改写成适合检索的短语组合比如“打印机 卡纸 常见原因 处理方法”召回精度会明显上升。这个改写环节可以作为Agent规划的一部分通常能提升5~10个百分点的检索命中率。另一个高频坑是“检索到了但答案还是错”。这种情况多半是上下文组织太乱模型被无关信息干扰了。解决办法是严格限定“仅依据参考片段作答”并把证据包里的每个片段与用户问题分开标注降低模型被低相关片段带偏的概率。5.2 上下文膨胀与token成本把预算花在刀刃上RAGAgent系统的token消耗通常比纯RAG高出几倍因为每一轮Agent循环都要带历史、工具结果、知识片段重了之后单轮可能就耗掉上万token。成本失控前要有预案。我常用的三个措施一是限制检索片段总预算重排序后最多进5条每条限制长度宁可信息不全也不要超量二是工具结果二次摘要比如工单API返回三百行字段先让大模型提取关键字段再进上下文三是对话历史裁剪超过轮次的内容做摘要摘要本身也可以存进记忆库后面需要时再检索。还有一个性价比很高的策略给检索工具加“缓存”。同一类问题的检索结果往往高度相似用一个短期缓存比如以问题改写后的Query为Key缓存Top5结果十分钟能省掉大量重复的向量检索和重排序开销尤其是热点问题高频命中的场景。5.3 幻觉残留引用校验是最实用的兜底手段即使有了RAGAgent在生成过程中也可能产生“检索证据里没有的细节”。比如知识片段只说“建议更换墨盒”模型可能会自行补充“并重启打印机”这个补充未必有依据。这种幻觉在组合系统里比纯RAG更隐蔽因为Agent的推理步骤多用户很难逐句对账。我推荐两个检测手段。第一是“引用一致性校验”模型生成的每个句子都要能对应到某个检索片段或工具返回结果无法对应的句子要么剔除、要么标记为“非引用内容”。实现上可以加一个独立的校验提示词让模型自查并标注每个句子的证据来源。第二是“反向验证”对于高风险回答把答案里的关键数字、型号、操作步骤提取出来用这些关键信息再做一次知识库检索看能否找到支撑资料。如果反向检索的分数偏低就说明这个答案很可能有幻觉成分需要降级处理或者转人工。这个“反向验证”在故障维修、医疗健康、金融合规场景里尤其重要虽然增加了成本但能把重大错误的概率压到很低。6. 工具选型与演进方向别被框架绑架6.1 框架选型对比LangChain、LlamaIndex、Haystack、AutoGen怎么挑框架选择直接影响开发效率和后续维护成本。我这些年用过几套主流方案简单做个对比。框架优势劣势适合场景LangChain生态最大工具链全社区案例多抽象层级多升级频繁排查问题要扒源码通用RAGAgent项目团队有消化能力LlamaIndexRAG能力突出索引和检索抽象做得很细Agent编排相对弱复杂工具调度不如LangChain知识库密集型场景RAG是主菜Haystack生产化程度高管道设计清晰注重检索测评国内资料少自定义能力需要深入学习对检索效果有严格评测需求的团队AutoGen多智能体协作是亮点会话管理灵活RAG组件偏基础需要自己搭检索链多角色协作、复杂对话交互场景我的建议是别追新框架优先选团队成员熟悉的那套。如果团队之前用LangChain顺手就继续用它如果核心诉求是检索质量LlamaIndex的RAG抽象确实更好用。框架只是工具真正决定效果的是“切块质量检索策略编排控制”这三件套。另外提示一下现在“Agent框架”非常多有的宣称零代码搭智能体。零代码适合快速做原型给业务看但真正进生产你一定会需要定制工具、定制记忆策略、定制校验逻辑代码方式还是最稳妥的。6.2 值得关注的趋势Agentic RAG、GraphRAG、多智能体协作最后聊几个演进方向这些不是画饼而是已经在影响架构选型的变化。第一个是Agentic RAG它把“单轮检索”变成“多次规划检索”。传统RAG是一问一检一答Agentic RAG则是Agent在回答过程中判断当前片段信息不足时主动发起第二次、第三次检索甚至检索完再检索。这比“先检索再拼Prompt”的静态方案更适合复杂问题。我前面说的查询改写、二次召回本质上都是在向Agentic RAG靠拢。第二个是GraphRAG它在向量检索之外引入了知识图谱结构。像“某设备的运维规则同时关联到备件库存部门和值班工程师排班”这类关联查询纯向量检索很难一次命中但知识图谱可以直接通过实体关系一跳抵达。现在GraphRAG的落地成本还比较高建图门槛不低可以在涉密重逻辑的领域先试水通用场景暂不必上。第三个是多智能体协作把一个大而全的Agent拆成多个专职Agent比如“知识检索Agent”“工单处理Agent”“数据分析Agent”再由一个“主管Agent”做分发和汇总。多智能体适合角色边界清晰、任务并行度高的场景但也要付出两倍以上的token成本和状态同步复杂度别为了炫技而上。回到个人体会。我踩过最大的坑是早期把RAG和Agent当成两个独立的模块拼在一起结果Agent规划得很热闹检索结果却喂不进正确的决策节点。后来改成“先定检索证据的格式和校验机制再做Agent编排”系统的稳定性和可调试性一下子提升了很多。组合架构的难点从来不在一方多强而在两者之间的“接口设计”——知识片段怎么结构化、工具返回怎么消化、校验规则怎么嵌入循环这些衔接细节才真正决定智能体能不能在生产环境活下来。做这套东西不追求功能最多追求的是每一步都有据可查、每一步都有兜底。希望这篇唠叨能让你少走一点弯路。