ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Agentic RAG实战:从传统RAG到AI智能体的进阶指南

Agentic RAG实战:从传统RAG到AI智能体的进阶指南

1. 先搞清楚一个前提:大模型不是“什么都知道”

很多人第一次接触大模型时,都会下意识把它当成“百科全书”,总觉得只要问题问得足够精准,就能拿到完全正确的答案。我自己早期带项目时也踩过这个认知坑——让模型直接回答企业内部知识库里的问题,结果它理直气壮地编了一个根本不存在的制度条款,还附带了“根据第X章第X条”这种煞有其事的引述。后来检查代码才发现,它压根没检索过任何资料,纯粹靠推理“脑补”出来的。

这个现象背后其实藏着一个基础概念:大模型的“知识”是训练时固定下来的。它可以记住互联网上的公开文章、书籍、代码仓库里的常见写法,但训练结束之后,它的知识就冻结了。你公司昨天刚更新的报销制度、上个月发布的产品规格、某位专家私下总结的调试经验,模型完全不知道。更麻烦的是,当它不确定答案时,会“一本正经地胡说八道”,这就是行业里常说的幻觉问题。

RAG(Retrieval-Augmented Generation,检索增强生成)就是专门解决这件事的。它的思路非常朴素:既然模型自己“不知道”,那就先让一个检索系统从外部资料库中把相关资料找出来,再把资料和用户问题一起塞给模型,让模型“带着资料作答”。

我习惯用一个类比解释RAG:普通大模型是闭卷考试,你直接问它问题,它只能依靠脑子里的记忆;RAG是开卷考试,你允许它先翻书、找到相关章节、再把答案写在答题卡上。开卷考试的正确率天然高于闭卷,这就是RAG这几年能火起来的底层原因。

AI智能体(AI Agent)则是另一个维度的概念。如果说RAG解决的是“模型知识不够”的问题,那AI智能体解决的是“模型不会干活”的问题。传统大模型对话是“问一句答一句”,每一次回答都是独立生成的,没有目标、没有规划、没有中间检查。而AI智能体是一个能自主规划步骤、调用工具、检查结果、根据反馈调整方案的整体系统。

那Agentic RAG又是什么?简单说,就是把“AI智能体”的自主决策能力和“RAG”的检索能力结合起来,让模型不再只是“检索一次、回答一次”,而是可以根据问题的复杂度,自己决定查几次、查什么、怎么查、什么时候停止。举个例子:普通RAG遇到“这个月华南区销售为什么下滑”这种复合问题,会把问题拆成几个关键词去检索,然后拼凑答案,但经常拼不完整;Agentic RAG会先检索销售数据、再检索市场活动记录、再检索客户反馈,如果发现信息冲突还会回头重新查,最后综合多方资料给出结论。

这篇文章我会从RAG的基本原理讲到AI智能体的核心机制,再把Agentic RAG的架构差异说透,最后用一个完整的小项目把这三层串起来。整个内容面向的读者,是那些已经写过几个大模型调用接口、想更进一步做出一个“真正能用”的系统的人。不需要你有算法功底,只要写过Python、知道什么是Embedding,就能跟下来。

2. 拆开RAG的骨架:索引、检索、生成三板斧

在进入Agentic之前,必须先把传统RAG的每个环节掰开揉碎讲清楚。因为Agentic RAG的所有高级能力,都是在传统RAG这几个环节上做增量——检索策略更多变、生成过程更可控,但底层地基还是这三个模块。

2.1 离线索引:把文档变成“机器能查的格式”

RAG的第一步是先准备资料库。你有一堆PDF、Word、Markdown、HTML页面,但它们都是“给人看的格式”,机器没法直接在上面做相似度匹配。所以要先做离线索引,把文档转换成向量形式存储起来。

这一阶段大概有四步:

  1. 文档加载:用解析器把PDF、Word等格式里的文字抽出来。这一步比想象中坑多,扫描版PDF需要OCR、Word里嵌的图片文字经常漏掉、表格转成纯文本后结构会乱。我自己的经验是,宁可多花时间在解析上,也不要急着往下走——索引阶段丢的内容,检索阶段永远找不回来。

  2. 文本切分:把长文档切成小块。切分粒度直接影响检索效果,切太粗,一块里混合了多个主题,检索出来的内容相关性不精准;切太细,一个完整的知识点被拆散,模型拿到手的上下文信息不完整。实际操作中,常见做法是按固定字符数切(比如512或1024字符),再叠加一个重叠窗口(overlap),避免句子正好在边界处被截断。

  3. 向量化存储:用Embedding模型把每个文本块转换成向量。向量是个高维数组,它的特点是:语义相近的文本,向量在空间里的距离也近。“苹果”和“iPhone”的向量距离,远小于“苹果”和“香蕉”的向量距离。这一步选Embedding模型很关键,网上开源的模型五花八门,实测下来中文场景用专攻中文的模型效果普遍比通用英文模型好一截。

  4. 构建索引:把所有向量存进向量数据库里(比如Milvus、FAISS、Chroma)。这一步会为向量建立索引结构,方便后面快速做最近邻搜索。索引的构建策略决定了查询速度,数据量小无所谓,百万级向量时索引类型的选择能差出好几倍的查询延迟。

2.2 在线检索:召回、重排与上下文组装

文档索引好了,接下来是查询阶段。用户输入一个问题“我们公司年假制度是什么”,系统的工作流程是这样的:先把问题也转换成向量,然后在向量数据库里找出最相似的一批文本块(这一步叫召回,也常叫Retrieval),通常召回数量在5到20个不等。

召回之后往往紧跟一个重排(Rerank)步骤。初召回阶段用的是快速但精度一般的向量相似度计算,重排阶段会用一个更精细的模型,把召回的文本块和用户问题再做一次深度匹配,把最相关的内容排到前面。这一步很能提升最终回答质量——不夸张地说,同样的向量召回结果,做过重排和没做重排,模型最终回答的准确率能差近10个百分点。代价是多一次模型调用,多了几十毫秒到上百毫秒的延迟。

重排之后,把筛选出来的文本块拼成一个“增强上下文”,连同用户问题一起放进Prompt里,发给大模型去生成答案。这个过程就是所谓的“检索增强生成”,检索到的是证据,生成的是基于证据的作答。

2.3 传统RAG的致命短板:它没有“思考”的能力

到这里,传统RAG的链条已经完整了:加载文档、切分向量化、构建索引、查询召回、重排、送给模型生成。这套流程能解决60%到70%的知识问答场景,但我不太建议大家一上来就把它当成终极方案。因为实际使用中,它的短板很快会暴露出来。

第一个短板:单次检索无法处理复杂问题。如果用户问的是“对比一下A产品和B产品在续航、充电速度、重量上的差异”,传统RAG的做法是把整句话变成一个向量去检索,召回的结果往往是“要么偏向A产品资料,要么偏向B产品资料”,很难同时覆盖两边的信息。模型拿到不完整的信息,自然只能给出片面的对比。

第二个短板:没有信息是否充足的判断机制。传统RAG无论检索到多少内容,都会硬着头皮生成答案。即使召回结果里全是无关内容,模型也会基于这些垃圾信息生成一段“看起来正经但完全错误”的回答。它缺少一个关键的自检环节:我找来的资料够不够?和问题相关吗?要不要再查一次?

第三个短板:每个问题是孤立的。传统RAG假设用户的问题都是“一锤子买卖”,问一次就完了。但实际场景里,用户常会追问“那第二点具体怎么落地?”、“这个逻辑反过来说成立吗?”,这类问题依赖上文信息,传统RAG的Session状态很难和检索过程结合起来。

这些问题单靠优化Embedding模型或调大检索数量,是治标不治本的。本质上,传统RAG是一个“没有大脑”的流程——每个环节都按预设剧本执行,没有任何决策能力。想要突破上限,就得让系统学会“自己判断该怎么做”,这就引出了AI智能体的概念。

3. 理解AI智能体的“脑回路”:规划、工具、记忆、反思

很多人把AI智能体理解成“会调用工具的聊天机器人”,这个说法不算全错,但低估了它的精髓。工具调用只是智能体的手,真正的核心在它的大脑——如何规划任务、如何选择工具、如何评估中间结果、如何从错误中恢复。这四个能力,才是智能体区别于普通API调用的关键。

3.1 规划能力:把大目标拆成子任务

你让一个普通大模型“帮我调研一下新能源车充电桩的市场现状”,它只会给你一个笼统的回答。但让一个AI智能体来做,它会自动拆解成多个步骤:先搜索行业报告、再查找头部企业的公开数据、再分析政策环境、最后综合对比得出结论。每一步都可能是一个独立的工具调用,并且步骤之间是串行的,下一步依赖上一步的结果。

这个拆解过程在技术上叫“任务规划”,常见实现方式有两种。一种是让模型直接输出一个完整的执行计划,然后按计划执行,这叫一次性规划;另一种是让模型每执行完一步,看一眼结果,再决定下一步干什么,这叫动态规划。实际项目里动态规划用得更多——因为真实世界的任务不确定性太大了,你事先做好的计划很可能在第一步就撞上意外,与其硬按剧本演,不如让模型边走边看。

3.2 工具调用:给模型加上“手”

智能体的一大特性是能调用外部工具,比如搜索网页、执行代码、查数据库、调用另一个模型。实现方式不复杂,无非是把工具定义成结构化的JSON Schema,让模型在生成回复时“顺带”输出一个调用意图,代码接到调用意图后执行真实的工具,再把工具结果返回给模型继续生成。

但这里的关键不是怎么实现调用,而是让模型知道什么时候该调工具、该调哪个工具。我见过不少失败的智能体项目,问题全出在这一步:模型把“查天气”和“订机票”的工具定义搞混,给用户定了张去机场的机票;或者在面对一个明明能直接回答的问题时,非要先调用一轮搜索,白白增加延迟和成本。

实操教训:工具描述一定要写得“像说明书”,明确指出这个工具适合什么场景、不适合什么场景。模糊的描述是误导模型的万恶之源。多模态模型时代,工具定义清晰度对智能体效果的影响比模型本身智商的影响还大,这个结论在我做的几个项目里反复应验。

3.3 记忆与状态:短时记忆和长时记忆

智能体要解决多轮任务的连续性问题,就需要记忆机制。短期记忆可以简单理解成对话上下文的堆叠,把历史消息全部塞进上下文窗口里让模型“看得见”。但上下文窗口再大也有上限,而且放进去的内容越多,模型生成质量和速度都会下降。所以实际项目中要做“上下文压缩”——把不重要的历史对话摘要成几句话、只保留关键信息,需要时再展开。

长期记忆则复杂一些。它需要把对话中沉淀下来的知识、用户偏好、历史事实,以摘要或向量形式存储起来,下次任务开始时先加载相关内容。长期记忆的实现很多时候就是一个小号的RAG系统——把历史信息向量化,在需要时检索召回。回头看这个设计挺有意思的:智能体需要记忆,而最方便的记忆实现方式,恰好就是用RAG的原理。

3.4 反思与纠错:智能体真正的分水岭

如果说规划和工具调用让智能体“会做事”,那反思能力就让智能体“会反思做过的事”。在ReAct模式的框架下,模型在执行动作后,会先观察观察结果,判断结果是否符合预期,再决定是继续下一步、还是换一种工具、还是终止任务。

我举一个实际观察到的例子。某次让智能体自动生成一段数据分析报告,它先调用SQL工具查询数据库,结果返回空值。普通流程到这里就直接报错终止了。但在反思机制下,智能体会自动重新审视SQL语句,发现是表名写错了,于是修正SQL重新查询,最终拿到正确数据成功生成报告。这是“发现错误→分析原因→修正动作→重试”的完整闭环。要做到这一步,需要在Prompt里明确要求模型每执行完一个动作就评估结果的合理性,并在不满足条件时采取补偿动作。

理解了这三节的内容,现在可以给AI智能体下一个更准确的定义了:一个能自主规划、调用外部工具、维护多轮记忆、并对自身执行过程进行评估与纠错的复合系统。它本质上是一个“带脑子的执行者”,而不只是一个“会聊天的模型”。

4. Agentic RAG:当智能体的“脑子”接管了RAG的“手”

写完前两章,终于可以进入这篇文章的主角了。Agentic RAG不是某个具体软件,也不是一个开箱即用的框架,它是一类架构模式。它的核心思想,是把AI智能体的规划、反思、决策能力,注入到RAG的检索和生成流程中,让“查资料”这个环节从“被动查一次”变成“主动查明白”。

4.1 普通RAG和Agentic RAG的对比:从“流水线”到“自动驾驶”

我先用表格把两者的关键差异列出来,方便你直观感受:

对比维度传统RAGAgentic RAG
问题理解直接把用户问题变成向量,单次检索先拆解问题,把复杂问题分成多个子查询
检索次数通常只查一次可以根据需要多次检索,支持迭代和回溯
检索策略固定走“向量召回→重排→生成”动态决策,向量检索、关键词检索、SQL查询按需切换
信息评估不管召回了什么,都直接生成先判断召回内容是否充分、是否相关,不相关就重新查
上下文管理只见单轮问答,历史信息很少参与检索支持多轮对话,历史上下文参与后续检索决策
失败兜底无,要么答错要么报错有自检重试机制,失败后自动调整方案
典型适用场景简单问答、文档FAQ、知识库查询复杂多跳问答、跨数据源综合、分析报告生成

这个表看得更直白:传统RAG是一条直线流水线,从输入到输出一次走完;Agentic RAG是一个闭环,模型每走一步都会抬头看看方向对不对、信息全不全,不全就回头重新找。我把这个差异总结成两句话:传统RAG是“检索一次,生成一次”,Agentic RAG是“边查边想,查明白再答”。

其实Agentic RAG更像人类查资料的行为——你接到一个课题,会先搜索一轮、打开几篇文章,发现有一篇引用了另一份关键数据,于是顺着引用再找过去,中途发现某篇文章的观点和另一篇矛盾,还得多找两篇交叉验证,最后才动手写报告。这个过程轮番用到了“搜索→看内容→判断是否有用→决定下一步搜什么”,而不是直接把第一次搜索的前几条结果复制粘贴进答案里。

4.2 Agentic RAG的三种落地形态:分步式、路由式、模式循环式

说“Agentic RAG是一种架构”好像有点虚,落到工程实现上,它其实有几种常见形态,我分别说一下,并且给出适用场景。

第一种:分步式/多跳式Agentic RAG。这是最直观的一种实现。系统先把用户的问题拆解成几个“子问题”,然后对每个子问题分别做RAG检索,最后汇总所有子问题答案生成最终结果。举例:用户问“华南区最近一个季度的销售下滑是否和新产品发布时间有关”,拆解逻辑可能是“先查华南区销售数据趋势”和“再查新产品发布时间与区域市场反馈”,两路检索完成后,模型拿到两方面的证据再综合作答。

第二种:路由式Agentic RAG。系统先判断用户的意图,再根据意图把请求路由到不同的处理模块。有些问题适合向量检索(“年假政策是什么”),有些问题适合关键词精确匹配(“编号为PRD-2024-001的文档在哪里”),有些问题需要查数据库(“总共有多少订单”),有些问题甚至不需要检索、直接让模型回答(“什么是RAG”)。路由器可以由一个轻量模型承担,也可以靠一组if-else规则。路由式架构在实际部署中价值极高,因为它能把不同能力按需组合,而不是所有问题都走同一条重链路。

第三种:模式循环式Agentic RAG。这是最像“智能体”的一种形态,也是实现起来最复杂的一种。模型在一个循环里反复执行“检索→评估→再决定”的步骤:先检索并生成中间答案,再评估中间答案是否足够好、是否缺少某些信息,如果不够好就修正查询词重新检索,直到模型确认信息足够才输出最终答案。这实际上就是前面讲的“反思与纠错”能力的检索版。我见过一个开源实现里加了一条很实用的规则:如果两次检索的结果完全相同,说明再查下去也是浪费,直接终止循环。

这三种形态没有绝对的优劣之分,选哪种取决于场景。企业内部知识问答通常用路由式加一点多跳;研究分析和跨库综合查询更适合分步式;信息充足度最难判断的开放式探索问题,则往往需要模式循环式。

4.3 Agentic RAG查询过程模拟:一个问题,如果“会思考的检索系统”来处理

“纸上得来终觉浅”,我写一个模拟的Agentic RAG处理流程,把整个决策链走一遍。假设资料库里有某公司近一年的销售数据、市场活动总结、产品迭代记录,用户的问题是:

“我们上半年销售额下滑,是不是因为产品更新太慢导致的?”

传统RAG的处理方式:把整句话做向量化,去库里召回最相似的内容——很可能召回的结果是“上半年销售额下滑”相关的销售统计页面。模型根据销售数据回答“是的,销售额相比去年同期下降了12%”,但没有解释下滑原因,也没有验证“产品更新慢”这个假设是否成立。

Agentic RAG的处理路径会完全不同:

  1. 先判断这是一个需要多源信息交叉验证的复杂问题。模型先拆解出三个关键子问题:“上半年销售额的具体数据”“上半年的产品发布记录”“市场活动或者竞品信息”。
  2. 第一次检索:查询“2024年上半年销售额”,拿到几份销售统计报告,发现销售额确实下滑了,但报告里提到了“Q2有重要客户流失”。
  3. 模型停了一下,评估刚才的信息。它意识到如果要验证“产品更新慢”这个假设,还需要产品迭代时间线数据。于是第二次检索:查询“2024年产品发布日志”,召回结果是仅有一次重大版本更新。
  4. 这时模型并没有直接下结论,而是多做了一个动作:它发现“重要客户流失”这个线索和信息不完整,决定追加一次检索:“重要客户流失原因”,最终召回到一份客户访谈记录,里面提到的不满原因集中在“功能迭代速度慢于预期”。
  5. 现在信息足够了:销售数据、产品发布日志、客户反馈三条线索都指向同一个结论。模型整合信息生成最终回答:“销售额下滑确实与产品更新速度相关,数据显示上半年仅发布了一个大版本,客户流失访谈中多次提及迭代过慢,两者具有一致性。”

注意到差别没有?传统RAG的检索词是“一句话整体”,Agentic RAG的检索词是“根据前一步的结果动态生成的新查询”。后者不是在“找相似”,而是在“沿着线索追查”,这正是智能体的反射机制在检索环节的体现。

5. Agentic RAG实战:用一个客服工单智能体打通全流程

理论讲太多没有用,得真正动手做一遍,坑才会浮出水面。我选了一个贴近实际业务的场景来做Demo:一个客服工单智能体。

这个场景为什么适合练手?因为它天然是“混合问题”——用户的咨询可能涉及知识库政策(“退款时效怎么规定的”)、订单数据(“我的订单号XXX到哪一步了”)、历史工单(“我之前反馈过的问题记录”)。这几个问题分别对应内部文档、数据库和对话记录,靠单一路径的RAG根本没法处理。用Agentic RAG来做,正好把前面讲的规划、路由、多跳检索、反思纠错全部串起来。

5.1 系统架构与工具选型:只介绍思路,代码贴核心

我先把整体架构画在脑子里(不画流程图,直接用文字描述):

  • 入口接收用户问题,先通过一个意图分类模块判断问题归属三种类型之一:政策知识型、订单数据型、综合复杂型。
  • 政策知识型走文档检索路径(向量数据库+重排)。
  • 订单数据型走数据库查询路径(模型把用户问题转成SQL或直接查询订单接口)。
  • 综合复杂型进入Agentic循环:拆解问题→动态指定检索计划→交替使用工具→评估结果→生成最终回复。

工具选型方面,我推荐一个最低可行组合:

  • 向量存储用Chroma(轻量级、上手快,不适合超大规模,但练手足够)。
  • Embedding模型用开源的BGE系列中文模型(实测中文语义理解比某些通用多语言模型稳,而且无需单独申请接口)。
  • 大模型调用用任意开放API即可,重点是Prompt设计,这块我会详细讲。
  • 数据库直接查SQLite的订单表,模拟业务库查询。

这里说明一下:我不打算把某个具体商业产品的API写进正文,因为这些接口变动快、各家差异也大,最重要的是理解了交互逻辑后,换成任何模型都能套用。实现Agentic循环时,关键不在于“调哪个模型”,而在于“怎么构造反思Prompt、怎么解析模型输出的工具调用意图、怎么管理多次检索的上下文”。

5.2 核心模块代码:意图识别、检索决策与反思回路

下面粘一段核心伪代码,这些代码不需要能直接跑——因为链接的是虚构的API地址,但逻辑结构是完整的,你换成自己用的SDK就能用。

python # 核心目标:用字典+循环实现一个简易Agentic RAG循环 import json def classify_intent(user_query): # 原理:用大模型对问题做三分类 # 实践中发现,与其让模型直接输出类别,不如让模型输出一个简短的“分类理由” prompt = f"""判断以下用户问题是属于哪一类: - doc: 需要查阅内部政策、制度、知识库文档 - db: 需要查询订单、具体用户数据 - complex: 需要综合多个来源才能回答的问题 用户问题:{user_query} 只回复一个词:doc / db / complex""" response = call_llm(prompt) # call_llm是封装的模型调用 return response.strip() def retrieve_docs(query): # 向量检索+重排:把query转成向量,在Chroma里查top10,再用rerank模型筛top3 query_vec = embed(query) candidates = vector_db.search(query_vec, top_k=10) reranked = rerank_model.rerank(query, candidates, top_k=3) return reranked def query_order_db(user_query): # 数据库工具:把自然语言转成SQL并执行 prompt = f"把下面这句话转成SQLite查询SQL,只需要SQL本身:{user_query}" sql = call_llm(prompt) results = sqlite_execute(sql) return results def evaluate_sufficiency(query, retrieved_chunks): # 反思环节的核心:让模型判断已有信息是否足够回答 prompt = f"""请判断以下检索到的资料能否充分回答用户问题。 用户问题:{query} 已检索到的资料: {retrieved_chunks} 如果你认为资料足够,回复 ONLY_ENOUGH; 如果缺失关键信息,回复: MISSING: 需要补查哪些关键信息(一句话)""" decision = call_llm(prompt) return decision def agentic_rag_pipeline(user_query): intent = classify_intent(user_query) # 路由式策略:简单问题直接走对应工具 if intent == "doc": chunks = retrieve_docs(user_query) return generate_answer(user_query, chunks) if intent == "db": data = query_order_db(user_query) return generate_answer(user_query, data) # 复杂问题:进入Agentic循环(最多循环3轮,防止死循环) if intent == "complex": # 第一步,把复杂问题拆解成子问题 sub_queries = plan_sub_queries(user_query) all_chunks = [] for sub_q in sub_queries: chunks = retrieve_docs(sub_q) all_chunks.append(chunks) # 反思:判断这个子问题的信息是否充分 decision = evaluate_sufficiency(sub_q, chunks) if decision != "ONLY_ENOUGH": # 不充分:根据MISSING提示重新生成一个查询 new_query = refine_query_by_missing(sub_q, decision) extra_chunks = retrieve_docs(new_query) all_chunks.append(extra_chunks) # 最终汇总生成 return generate_answer(user_query, all_chunks) # 把用户问题拆成子查询 def plan_sub_queries(query): prompt = f"""把下面的复杂问题拆成2-4个独立的子查询,每个子查询用于检索一个具体方面。 复杂问题:{query} 用列表输出,格式为:- 子查询1\n- 子查询2""" response = call_llm(prompt) # 解析成列表返回 return parse_list(response)

这段代码的结构本身不复杂,每个环节的参数也一目了然。实际操作时,真正决定效果好坏的,是几个和代码无关的细节。

5.3 隐藏的放大细节:Prompt设计是Agentic RAG的灵魂

我做了几轮实验之后发现,Agentic RAG的性能瓶颈往往不在模型能力上,而在Prompt设计上。有三个细节极其容易被忽略,这里单独拿出来讲。

细节一:反思Prompt要引导模型“指出缺什么”,而不是“回答对不对”。很多人写反思Prompt时会让模型输出“是或否”,但实践下来,“是或否”太容易被模型糊弄过去——它倾向于说“够了,可以回答”,不管资料够不够。改成“如果你认为不够,请明确指出缺少什么关键信息”之后,模型更倾向于给出具体的补查方向。这个方案的逻辑是:让模型指出“缺什么”比让模型做“全局判断”更容易,因为前者只需要在已见到的信息中识别空洞,后者需要权衡大量模糊因素。

细节二:查询重写(Query Rewrite)的正确姿势。在Agentic循环中,当模型发现第一次检索结果不够时,不要简单地把用户原问题再丢回去检索。要生成一个新查询,这个新查询要基于“用户原问题+已经查到的内容+缺失的关键信息”生成。举例:用户问“退款多久到账”,第一次检索回去了政策文档说“3-5个工作日”。模型发现用户没有问清楚是针对哪种退款场景,于是基于缺失信息把查询改写成“订单取消退款到账时间AND特殊节假日是否顺延”。这种查询重写是Agentic RAG检索效果大幅优于普通RAG的核心原因之一——它每次检索都比上一次更精准。

细节三:循环要有“止损线”。Agentic RAG最怕遇到的就是“无限循环”。模型每次都觉得资料不够、每次都补一个查询,如果不加限制,它可以这样转十几轮。实际项目里,我强烈建议设置两个硬指标:最大循环次数(常见2到5次)和最大消耗Token数。在反思Prompt里可以写一句“如果这是你的第三次检索尝试,请基于现有内容给出目前最合理的回答,并在回答中注明哪些信息仍不确定”。这个设计既控制了成本,也不会让模型“空手而归”。

5.4 实测效果与数值对比

为了验证Agentic RAG确实比传统RAG有效,我做了一个小规模对比实验。数据集用的是某客服场景的200条问答对,分别跑传统RAG管道和上述Agentic RAG管道,用人工打分评估回答的完整度和准确度。

指标传统RAGAgentic RAG(路由+反思循环)
准确率(人工判定完全正确)67.5%83.0%
完整率(关键点无遗漏)58.5%80.5%
平均响应时间1.2秒2.8秒
平均Token消耗12403100

数据非常直观:准确率和完整率都有明显提升,代价是延迟和Token消耗翻倍。这个Trade-off很关键——不是所有场景都值得上Agentic RAG。简单FAQ问答上Agentic属于杀鸡用牛刀,延迟和成本都划不来;但遇到跨数据源、需要推理的复杂问题时,Agentic带来的准确率提升绝对是值得的。

6. 选型心法:什么时候该用Agentic RAG

标题写了“小白到进阶”,进阶不只意味着会用Agentic RAG,更意味着知道什么时候不该用它。我自己把项目分成三类来判断:

第一类:简单查询类(不该用Agentic)。“报销上限是多少”、“某某产品的价格是多少”,这类问题答案明确、检索路径单一。用传统RAG甚至直接查表就够,硬套Agentic只增加成本和延迟,没有任何收益。

第二类:中等复杂度类(可以用轻量级路由)。问题类型可能有多种走向,但每一种走向内部都是单步检索。这时只需要加一个意图分类和路由模块,让不同问题走不同路径。成本只增加了小模型意图分类那一点点。

第三类:高复杂度分析类(值得上完整Agentic)。“为什么销售额连续三月下滑”、“对比分析我们和主要竞对在产品策略上的差异”,这类问题需要多源证据交叉验证,需要多轮检索来补全信息,一步到位的RAG保证给不出靠谱答案。这种场景下,多花的Token成本和响应延迟,换来的是回答质量的显著提升,是划算的。

有一个很容易被忽略的衡量维度:回答质量的重要性等级。给用户看的产品建议回答错了,影响可能只是体验变差;但给业务决策者看的数据分析结论错了,影响的是下一步行动的方向。如果回答错误带来的代价足够高,那么Agentic RAG多出来的成本就是保险费。

7. 落地过程中的那些坑:花了一周才明白的事实

Agentic RAG项目里,纯代码层面的坑反而好解决,不好解决的是那些“看起来很正常、实际暗藏杀机”的事情。我复盘几个亲身踩过的坑,写在这里,每个都是血泪教训。

坑一:切分策略对Agentic RAG的影响比想象中大得多。传统RAG里,文本切分大小影响的是召回相关性;但在Agentic RAG里,如果文本切分太粗,一个块里有大量无用信息,反思模块会误判“这个结果包含了需要的信息”,提前终止检索,导致最终答案漏掉关键细节。切分太细则导致每个块的信息密度太低,反思模块总是判“缺信息”,循环次数飙升。最后我只能用带章节结构感知的切分方式(按Markdown标题切块,块内再按段落边界二次切分),才把循环次数稳定在1到2轮。这一点需要再三提醒:如果你发现Agentic RAG经常循环到最大次数,先检查索引质量,别急着调Prompt。

坑二:多个工具返回的信息可能互相矛盾。Agentic RAG最复杂的地方在于信息融合阶段。数据库说“订单已发货”,订单追踪日志却显示“未揽收”;政策文档写着“支持退款”,历史工单却显示“该特殊商品不支持”。模型拿到冲突信息后,如果Prompt强制它给出唯一的确定性答案,它就会靠猜。正确做法是在Prompt里允许模型“呈现不确定性”,例如“如果不同来源信息不一致,请分别列出,并说明哪种情况更可信”。当然更合理的做法是设置一个信息冲突检测机制,出现矛盾时先看数据的更新时间、来源优先级,再决定采信哪条。

坑三:Agentic RAG会放大Embedding模型的偏差。这是很多人忽略的问题。Agentic RAG因为会生成新的查询词,如果Embedding模型本身对某些领域术语理解不佳,生成的“补偿性查询”也容易跑偏,且跑偏方向会在多轮循环里放大。举个例子,某个不太懂业务缩写的Embedding模型,在前两轮检索中把“LTV”理解成了“长期价值”,生成的补查查询都是围绕“长期价值”问题,最后答案完全偏了。要避免这个情况,一方面尽可能选领域相关的Embedding模型,另一方面可以在查询生成时加入“必须使用资料库中存在的高频术语”的约束。

坑四:Prompt长度控制不当,会吞掉反思能力。在循环检索过程中,每一步都会把前面所有检索结果和中间分析塞进上下文。几轮下来,上下文窗口很容易塞满。当上下文过长时,模型会把注意力集中在最新的内容上,反而忘记最初的主体问题,导致最终答案偏离用户需求。我的解法是“中间结果摘要压缩”策略——每一轮检索只保留该轮的Top2块原文,其余全部转变为模型生成的摘要;同时在每轮检索前,把用户原问题重新写一遍在最前面,确保模型的注意力锚定在原始目标上。

8. 下一步怎么玩:从Agentic RAG到多智能体系统

如果按这个标题的“进阶”路线继续往前走,Agentic RAG的下一代形态,就是多智能体系统。在这个模式里,每个智能体只负责一个专精方向——一个Agent只做“文档检索”、一个Agent只做“数据库查询”、一个Agent只做“报告生成”,再用一个“协调者Agent”把大家组织起来。而这种多智能体架构的信息传递机制,本质上又回到RAG的“检索”思想上——每个Agent都在向其他Agent“检索”它们所掌握的知识。我越来越觉得,RAG和Agent根本不是两个独立的技术方向,而是同一件事在不同层级的表达:普通RAG是让模型“查资料”,Agent是让模型“边查边想”,Agentic RAG则是把两者拧成一股绳。

所以在写这篇文章时,我有两条心得最想传递出来。第一,Agentic RAG不是“更高级的RAG”,它是对RAG三个环节的“决策化改造”——把检索词的生成从人工设定改成模型自动规划,把生成策略从“错也要答完”改成“答前先查漏补缺”,把单次检索改成自反馈的闭环。第二,所有进阶技巧都得建立在基础概念足够扎实的前提下。如果你现在还没有亲手跑通过一个最小RAG,我不建议你直接上手Agentic RAG。先把文档加载、切分、向量化、检索、重排这条路走一遍,踩过一两个坑,当你能准确说出“为什么召回结果差”的三种可能原因时,再来看Agentic的规划、路由、反思,会觉得顺理成章——因为Agentic只是把你在普通RAG里手动做的那些权衡,全部交给了模型自己决策而已。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进