资讯动态

从传统RAG到Agentic RAG:知识库问答的进阶实战指南

发布时间:2026/10/19 3:40:36 来源:尧图企业网站定制
去年我接了一个内部知识库改造项目用传统RAG跑了两周最离谱的一次是——文档里明明写着“系统仅支持Windows部署”大模型硬是给用户回答成了“支持Mac端”原因不过是检索时召回了另一篇提到Mac的文本生成阶段压根没做冲突校验。那段时间我几乎天天跟幻觉搏斗后来试着给RAG套上Agent能力让模型自己决定“该查什么、去哪里查、查不到怎么办”很多问题才有了转机。如果你是刚接触大模型应用开发的小白估计早看烂了“RAG 检索增强生成”这句话也知道它大概是“把文档切碎存起来让大模型先查再答”。但很多人卡在同一个地方文档切多大向量库怎么选为什么资料齐全大模型还是答非所问更进一步当需求复杂到“帮我对比两个方案的差异再给出建议”时传统检索加生成根本接不住你需要的是Agentic RAG。这篇文章我会从传统RAG的完整实现讲起把切分、嵌入、检索、提示词设计整个链路摊开再讲为什么需要Agentic RAG它的规划器、工具调用、记忆和反思怎么落地最后给一个能跑通的最小示例和踩坑清单。内容偏实战适合想快速上手大模型应用、并搞懂背后原理的初学者。1. 先搞清楚传统RAG到底哪里不够用才催生了Agentic RAG1.1 RAG解决了一个痛点又带来了一堆新痛点RAG是把大模型和私有知识连接起来最朴素的方式。它解决的问题很直接大模型只训练到某个时间点且没见过你专属的文档、表格和聊天记录。RAG的思路是“你答不上来就先去资料库查一查再答”相当于考试允许翻书。传统RAG实现通常分成三段文档加载和切分、文本嵌入与向量存储、检索拼接与模型生成。看起来简单直接我第一版也是这么搭的一周就跑通了Demo。但两周后我开始意识到这个架构有一个很隐蔽的假设提问是一次性的需求是明确的答案只需要一次检索。实际业务里这三个假设会全部破产。最明显的例子用户问“我想在本机上跑一个大模型聊天助手需要什么配置”传统RAG会把“配置”当关键词去匹配文档结果召回了显卡驱动安装教程、模型下载地址还有一篇讲容器部署的。生成器拿到这些碎片只能硬拼回答看起来流畅重点却全错。RAG没有能力判断“这个用户当前最缺的是硬件配置清单而不是驱动的安装步骤”。这种重检索、轻推理的设计面对多跳问题、条件判断、多源对比时基本失灵。后面出现的Agentic RAG就是把检索变成Agent的一个动作而不是流水线上的一道命令。模型自己规划怎么搜、搜几轮、搜完怎么处理这个转变让很多原来调不通的RAG项目重新有了生气。1.2 传统RAG最常见的四个翻车点我把跟各种团队交流得到的案例归纳了一下传统RAG普遍翻车在这四个地方。第一个是召回不充分。文档切得不对或者检索式选得不对关键信息被拦腰切断向量相似度算出来就是不高。资料明明在库里但“找不到”这是最冤枉的。第二个是噪声淹没信号。召回十个片段真正有用的只有一段其余的都是同一主题但语境完全不同的内容。大模型分不清哪些该参考经常被无关片段带偏甚至幻觉更重。第三个是没法多跳推理。比如“找出所有延迟超过100ms的接口并告诉我调用次数最高的是哪个”这需要先查接口列表再拿接口名去查调用记录。传统RAG的一次检索根本没法定这种带中间步骤的问题。第四个是没有反馈纠错。检索错了就错了生成阶段不会重新查。模型宁可一本正经编出一个答案也不会说“资料不够”。这四个翻车点正是Agentic RAG的突破口。不过也要泼盆冷水如果业务问题就是“这个产品怎么下载”这种单轮问答传统RAG又快又稳没必要上Agent。学Agentic RAG之前先把基础RAG的底子打扎实是我最想强调的一点。2. RAG基础实操切分、嵌入、检索、生成的正确姿势2.1 一条完整的RAG链路长什么样用一个实际场景某公司有大量产品说明文档员工提问“售后保修期是多久”。传统RAG链路是文档处理把PDF或Word转成纯文本清洗掉页眉页脚按段落结构切块。嵌入把每个文本块通过嵌入模型转成向量。建库把向量写入向量数据库同时存原文和元数据。检索把用户问题也转成向量做相似度检索取TopK。生成把检索片段塞进提示词让大模型基于片段回答。这个流程每一环都很关键而且错误会一路累积最后反应在答案上。很多时候你以为是模型不够聪明其实是前面某一环已经把正确答案弄丢了。2.2 文档切分决定检索质量的第一道门槛切分不是一个“按字数切”的机械动作。我最开始用固定长度500字符切踩了个典型坑一份文档里“非人为损坏保修一年”和“人为损坏不在保修范围内”被切到相邻两个块。提问“保修范围是什么”检索只返回了前一块模型直接回答“保修一年”完全没看到后面的排除条款。后来我总结出三条切分原则。优先按结构切。文档标题能分章节就先按章节切章节太大再按段落切段落太长才找句子边界二次切分。简单说就是让每个文本块尽量语义完整。块与块之间加重叠。比如前后各保留一到两句话避免关键信息正好卡在边界。重叠量控制在整个块长度的一到两成太多会浪费存储和检索资源。元数据一起存下来。来源、章节号、标题、页码都要跟向量一起入库。这样检索结果才能知道“这段文字来自某文档第几章”生成阶段也能显著降低串信息的概率。还有一个很少有人注意的点表格要转成文本再做向量化。表格直接整个向量化效果很差我会先转成“字段名值”的文本行或者转成Markdown表格文本再嵌入。2.3 嵌入模型和向量数据库怎么选嵌入模型的选型没有绝对答案关键看三点语言支持、输出维度、相似度计算的稳定性。中文场景下优先选在中文本语料上训练过的模型不然“保修”和“保养”的向量可能离得比想象中远。维度也并不是越高越好高维度会推高内存占用和检索耗时效果提升却不一定明显。向量数据库这边我走过两个方向原型阶段用轻量方案服务端再用更完整的数据库。为了直观对比我整理了一张表场景推荐选择主要理由原型Demo数据量小FAISS或本地向量索引部署简单内存级查询快多人访问数据量中等Qdrant自带过滤和接口起步快大规模高可用需求Milvus分布式能力和生态更完善检索方式也别忘了“关键词加向量”的融合。实际项目里像“售后保修期”这种强实体问题先拿关键词命中召回一批再跟向量召回的结果做分数融合往往比纯向量检索好用。纯向量在语义上很灵活但词汇层面的精确匹配很容易丢失。2.4 生成阶段提示词里的隐形坑生成阶段最常见的错误是提示词只写一句“请根据以下资料回答”然后把TopK结果全部塞进去又没告诉模型“资料里没有的就直说没有”。看起来只是少写了一句话效果差很多。我后来固定用两个设定。第一给模型定义角色和输出边界“你是客户支持助手只能基于提供资料回答资料不足时明确说资料不足。”第二要求输出内容标注来源编号比如“来源1某文档第2章”。这个标注一开始觉得繁琐排障时却特别好用哪句话是编的扫一眼来源就知道。输出长度也要控制。RAG回答最常见的问题是“为了显得完整把能沾边的都讲一遍”这会稀释重点。我一般会限制输出在二到五段先给明确结论再列补充信息比长篇大论强得多。生成长度看似细节实际直接影响用户对回答质量的感知。3. 从RAG到Agentic RAG变化的不只是名字3.1 什么是Agentic RAG它到底在解决什么Agentic RAG简单说就是让Agent来编排检索、推理和生成的全过程。传统RAG的检索是流水线上的固定步骤Agentic RAG的检索是Agent在思考过程中主动执行的一个动作。它不会盲目查一次就交差而是根据任务拆解步骤也许先查一轮发现不够再查第二轮也许需要根据中间结果改写搜索词也许查完之后还要把多个来源拿来做对比。我一直用的比喻是传统RAG像自动售货机投币后掉出固定商品没货也只能干瞪眼。Agentic RAG更像你找了个资深店员。你说想买“适合下雨天穿的鞋”他先问你是通勤还是登山再回头翻库存库存不够还能打电话问厂商最后给你一个答案。店员做的事就是规划、调用工具、判断结果、再次调用。3.2 Agentic RAG和传统RAG的核心区别核心区别可以从四个层面看。检索变成可循环动作。传统RAG只检索一次Agentic RAG可以多次检索每次检索之间还能改写查询条件。我做过一个测试问“同一个需求在甲方系统、乙方系统里分别怎么实现”首次检索只返回了乙方Agent判断缺了甲方自动把查询改写成“甲方系统需求实现”又补了一次这才拼出完整对比。规划器充当大脑。Agent会先理解用户意图判断问题是简单还是复杂随后决定直接回答、检索一次、还是拆成多个子任务。对应到工程上很多人会把这个模块设计成一个路由器。工具不再只有向量数据库。Agentic RAG可以把向量库、外部API、数据库查询、代码解释器都封装成工具让Agent按需调用。传统的RAG只连接知识库Agentic RAG能连接的是一切可调用的服务。多了一个自省纠错环节。哪一轮检索质量不行模型可以自己发现并重试最终答案不合预期也能再走一轮反思。这种能力传统RAG完全没有也是幻觉治理最有效的手段之一。3.3 演进路径从增强检索到增强决策放大了看RAG到Agentic RAG的演进本质是从增强检索能力进化到增强决策能力。老思路是“让模型答得更准”新思路是“让模型知道该怎么答”。当任务涉及多步骤、多来源、条件分支时拼命堆检索质量效果永远有天花板还不如让模型参与流程设计。这也是大模型应用从问答机器人走向数字助理的必经一步。但还是要提醒一句Agentic RAG不是银弹。它的复杂度、成本和延迟都明显更高。能用传统RAG解决的简单问题强行上Agent只会给自己增加调试点。方案选型的标准始终应该是业务问题本身的复杂度而不是技术时髦度。4. Agentic RAG关键模块拆解与实现细节4.1 规划器让模型先想清楚再做规划器是Agentic RAG与传统RAG区别最大的地方。它接收用户问题输出一组动作序列。最轻量的实现方式是让模型输出一段结构化的计划比如[ {action: search, query: 接口A的调用延迟}, {action: search, query: 接口A的调用次数}, {action: compare, target: 找出延迟最高且调用频繁的接口} ]这里有一个特别容易被忽略的细节规划器输出的query不能直接照抄用户原话。用户说“哪个接口又慢又频繁”你直接拿“接口”当检索词去查效果一定差。需要让模型先改写语义扩出关键词把隐含概念显式化。我实际做的时候会让规划器输出三个字段任务类型、检索词、必要条件。比如任务类型是compare检索词是“延迟”和“调用次数”必要条件是“接口A”。规划器的设计也分成两派。一派是调一次大模型把所有计划一次性生成完另一派是循环决策每一步都重新观察、重新决策。前者实现简单但容易跑到偏后者灵活但成本高。我的建议是先做一个两步决策版本第一轮判断任务复杂度简单任务直接走单次检索复杂任务再进入多步循环。这个折中方案最容易调通也最适合初学者练手。4.2 工具封装把检索器变成Agent能调用的函数实现Agentic RAG时检索器不要写死在代码流程里要封装成工具。工具的名字、用途描述、输入参数和返回结构都要设计清楚。我见过不少项目工具描述写得很随意比如“search”模型完全不知道这个工具是干什么的调用自然频繁出错。一个合格的检索工具描述至少是这个样子TOOLS [ { name: search_docs, description: 在内部知识库中检索与用户问题最相关的文档片段, parameters: [query, top_k, source_filter] } ]这里容易被忽略的是top_k这个参数。传统RAG里top_k是全局配置但在Agentic RAG里Agent应当有权力根据场景调整top_k。宏观问题多取一些精确问题取少量。如果固定死top_k又等于退化成传统RAG。建议再封装两个额外工具。一个叫“重新检索”一个叫“读取全文”。我踩过一个很典型的坑检索只返回片段Agent想确认中间上下文但没有任何工具可用只能去猜。后来加了一个read_section工具输入文档ID和章节号返回完整章节文本大量误判直接消失。4.3 记忆机制短时记忆和长时记忆怎么设计Agentic RAG会执行多步操作每步结果如果不记住下一步就断片。工程上需要在上下文里保留一份工作记忆结构通常是用户问题、已执行的计划、每一步的检索摘要、当前结论。然后把这份工作记忆作为新的提示词传给模型让模型在已有结论基础上继续推导。长时记忆适合存两个东西。一个是已经检索出来的答案用来避免重复检索另一个是用户的历史偏好比如用户过去说过“只考虑Linux部署”后续的检索就应该带上这个过滤条件。实现时可以用对话历史向量检索也可以在规划器的提示词里附带用户画像。不需要引入复杂系统先把上下文管理做好效果就够了。4.4 反思机制最简单的自我纠错怎么做反思听起来高深最简单的实现就是“让模型再审一遍”。第一轮Agent给出候选答案后把答案连同检索片段一起丢回去让模型检查一遍“哪些结论有资料依据哪些没有依据重写一份答案。”这一步能明显减少幻觉。再进阶一点可以加一个验证器把候选答案拆成一条条断言再去检索原文逐条验证不成立的删除或重写。这个思路很像审稿虽然成本高但正确率提升明显。我实际项目里用了一个简化方案只针对带数字和专有名词的断言做验证。比如“保修期12个月”“部署环境是Ubuntu”这类断言如果出现就必须带来源编号否则强制重新检索。这套规则帮助我把关键答案的准确率拉起来不少。5. 一个能跑通的最小Agentic RAG Demo5.1 场景设定与架构选型用一个具体场景串起全文某公司想让内部助手回答“员工社保和商业保险的赔付先后顺序”文档分散在薪酬制度、福利手册和保险合作方说明三份材料里。传统RAG做这种跨文档推理很吃力。用Agentic RAG的流程是规划器判断这是多文档对比任务规划出三个检索动作。分别检索社保制度、保险手册和合作方条款。提取每份文档里的赔付顺序规则汇总成对比表。反思器检查答案是否覆盖三个来源如果漏了就补充检索。输出最终结论并附上来源。技术选型上嵌入模型选一款中文支持较好的通用模型就够向量库本地版即可Agent流程直接用函数调用方式硬写不依赖重量级框架。这里我特别想强调一点初学者最好把流程手写一遍不要一上来就套Agent框架。手写过一遍你对数据怎么流转、提示词怎么生效才会有体感。5.2 核心代码骨架下面给一个能跑通的最小骨架只保留关键逻辑。规划器和反思器都可以直接使用支持函数调用的模型来实现不需要自己搞复杂状态机。def agentic_rag(query, tools): # 第一步让模型生成行动计划 plan planner_llm(query, tools) # 第二步初始化工作记忆 memories {query: query, results: []} # 第三步循环执行计划中的动作 for step in plan[steps]: if step[type] search: result tools[search_docs]( querystep[query], top_kstep.get(top_k, 5) ) memories[results].append({ step: step[step_id], query: step[query], chunks: result }) elif step[type] read: text tools[read_section]( doc_idstep[doc_id], sectionstep[section] ) memories[results].append(text) # 第四步基于工作记忆生成答案 answer generate_with_memory(memories) # 第五步反思检查并修正 checked reflect_and_fix(answer, memories, tools) return checked这段代码看着短真正的难点在提示词。规划器提示词里必须写清楚可用工具有哪些、每个工具的输入输出是什么、检索结果不足时如何继续检索。反思器提示词里必须写清楚不得修改有依据的结论、没有依据的结论必须删掉或标注。提示词质量直接决定整个流程的上限。5.3 跑通Demo时踩过的三个坑第一个坑是规划器经常一步到位根本不分步。原因很简单提示词里没有给例子。我补了两个few-shot示例进去一个简单问题直接检索一个复杂问题拆三步模型立刻就变懂事了。第二个坑是工具调用传参格式错误。函数调用返回的参数里模型偶尔会把数字写成字符串或者把字段名拼错。这种问题不能只靠提示词纠正代码层要做参数校验和类型转换。比如对top_k直接做int强转转不了就用默认值兜底。第三个坑是反思器把正确答案改错了越改越错。我后来给反思器加了一条规则某个断言如果在两个独立来源里都被验证就标为“不可修改”只有无来源或来源冲突的断言允许改。加了这个规则之后反思器才真正变得可靠。6. 实操中的高频问题与排查思路6.1 检索结果总是“沾边但不准”遇到这个问题排查顺序是先看切分再看检索方式最后看评估方法。先用几个长句子做测试如果长句子检索效果差多半是块切得太碎换成段落级再试。检索方式方面纯向量容易“形近误判”加关键词命中做分数融合一般能有改善。另外建议建一个小型标注集固定二十个问答对每次改动后都跑一遍用数据而不是感觉来判断好坏。6.2 Agent不停循环检索很多轮都不停这是个成本杀手。常见原因是规划器提示词里没有“停止条件”。我一般这么解决给循环加最大步数上限规划器输出里增加一个completed字段值为true就强制结束每轮循环开始前先让模型判断当前答案是否已经足够足够就直接输出。光靠模型自觉不可靠必须从流程上兜底。6.3 上下文越来越长成本爆炸Agentic RAG天生会往上下文里塞很多中间结果不控制的话成本上升很快。我的优化方案是摘要化每轮检索完让模型把结果压缩成一两句要点摘要再存入上下文原始片段只保留一个索引列表需要验证时再按需取出。改完之后成本明显下降测试效果差异也不大。6.4 幻觉反而比传统RAG更严重这种情况通常是因为Agent权力太大模型为了完成流程会强行填补检索不到的内容。反思机制没兜住幻觉就会被放大。对策还是回到提示词和验证器尤其要强调“查不到就直说查不到”。我在反思阶段加了一条硬规则关于事实数字的断言没有来源就删除。这一条规则直接消掉了将近一半的幻觉。6.5 我的调试经验小结第一每层组件先单独测试再连线。规划器拿固定问题测检索器拿固定query测反思器拿故意改错的答案测最后再做端到端。第二把所有中间过程打印出来。Agentic RAG的可解释性很重要日志里必须能看到每次检索的query、召回片段和模型判断。看不到中间过程排查问题全靠猜。第三做提示词版本管理。规划器和反思器的提示词经常要调我会把每个版本和对应的测试结果一起存进仓库改坏了能回滚也能慢慢沉淀出自己的调参经验。这一路做下来我的个人体会是Agentic RAG的复杂度确实比普通RAG高了一个级别它能解决真实问题代价是你得接受它更“难伺候”。如果让我给新手一个建议我会说先别急着追求复杂架构把切分、检索、提示词这些基本功练扎实再让模型学会思考。流程能跑通之后再一步一步往上加记忆、反思、多工具。每一步都改一点、测一点比一次性搭个大框架稳得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑