ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

Agentic RAG实战指南:从传统检索到自主决策的知识库架构

Agentic RAG实战指南:从传统检索到自主决策的知识库架构

去年我在一个企业知识库项目里被一个需求逼到改架构。业务方问了一个看起来并不复杂的问题:“上季度哪些客户的流失预警分数较高,同时他们在本月有过客服投诉,投诉内容里还提到了竞品词。”这句话跨了三个数据源、两类非结构化文档,还要做一次交叉比对。传统 RAG 的“向量召回 + 拼接生成”流水线完全处理不了,因为它不知道“要先查预警库,再查投诉记录,然后做交集判断”。最后让项目跑起来的方案,就是 Agentic RAG——让大模型自己拆题、自己选工具、自己决定要不要二次检索。那两周的赶工让我意识到,RAG 这个方向的竞争焦点已经变了。

Agentic RAG 的本质,是把“检索增强生成”从一条固定流水线,升级成由模型自主决策的探索式闭环。它不再是“召回对了就赢了”的游戏,而是“模型能不能像人一样,在不确定中决定下一步动作”的考验。它会自己判断要不要检索、检索什么、结果够不够、矛盾时怎么办。这种能力补齐了传统 RAG 面对多跳推理、流程操作、多源数据时的短板。

这篇指南我打算按照“为什么需要 → 架构怎么拆 → 关键技术怎么实现 → 落地怎么避坑 → 技术栈怎么选”的顺序讲完。适合正在被复杂问答效果折磨的开发者、准备把知识库助理做深的产品经理,以及想了解系统边界和成本模型的后端工程师。内容会包含实际代码逻辑、参数设计思路和一些我踩过很多次的坑,已尽量做到可以直接抄作业。

1. 为什么 Agentic RAG 会火:传统 RAG 的三个致命弱点

1.1 固定流程的“断点”问题

传统 RAG 的典型链路是:用户提问 → 向量化 → 向量库召回 Top-K → 拼接上下文 → 一次生成。这段流程在生产环境里的第一个大问题是,它对“坏输入”没有容错能力。如果问题本身模糊、带指代、或者包含多个子主题,直接拿原始 query 去做向量检索,召回的内容大概率是噪音。第二个问题是模块间的割裂:检索模块不清楚生成模块需要什么样的上下文粒度,生成模块面对残缺上下文时只能“硬答”,于是经常出现“答案流畅但关键数字错误”的情况。

我常在分享时用一句类比:传统 RAG 就像一条只有传送带的流水线,原料切好送上带子,工人拿着什么料就炒什么菜。至于料切得对不对、切错了要不要回去重切、要不要换一种刀法,没有人管。早期知识库问答问题比较浅,这套流水线够用。但业务场景一旦复杂起来——多文档对比、条件筛选、跨库查询——流水线的短板就立刻暴露,而且不是靠“换个更好的 embedding 模型”能解决的。

1.2 查询意图与检索质量之间的落差

我习惯把问题分成三类,判断标准完全不同。

问题类型典型例子传统 RAG 表现
直接事实型注册流程支持哪些证件?可靠,单跳检索即可
复杂推理型A 方案和 B 方案在成本、部署周期上差多少?召回碎片化,答案经常各说各话
流程操作型帮我汇总本周各区域销售数据,再标出风险点并生成简报基本不可用

复杂推理型问题,系统需要隐式完成“子问题分解 → 多源比对 → 结论综合”,这已经不是“检索一段最相似的文字”能做到的事。流程操作型问题则要求系统像人一样按步骤推进:先查 A,再基于 A 的结果查 B,最后做判断。这两类如果用“一次检索+一次生成”的套路去怼,效果上限就是碰运气。我见过很多团队把大多数精力花在调切片大小、调 Top-K 上,结果指标涨了 2%,用户感知依然是“答非所问”。换 Agent 思路后,很多问题直接从“检索的锅”变成了“流程设计的锅”,至少能定位问题了。

1.3 Agent 带来的范式转移:从“过程”到“决策”

Agentic RAG 的范式变化体现在四个字:自主决策。它把原本由工程师预设好的固定流程,改成了模型在推理过程中动态决定下一步动作。具体来说有四种关键决策:

  • 路由决策:这个问题该走知识库检索,该走数据库查询,还是直接用模型常识回答?
  • 检索决策:一次召回够不够?需不需要用上一步的答案做查询改写再搜一次?
  • 验证决策:生成的答案和检索到的片段是否一致?不一致要修正,还是坦白说“无法确认”?
  • 行动决策:任务能不能拆成独立的子步骤?哪些可以并行,哪些必须串行?

这四类决策组合起来,“检索”就从必经路径变成了工具箱里的一件普通工具。用户的一次提问,对应的是 Agent 自主规划的一段执行旅程,而不是一次可预测的流水线处理。这也是为什么我把标题里的“技术突破”理解为:不是某一个大模型突然变强了,而是工程架构从“管道式”变成了“决策式”。

2. 核心组件拆解:一个可用 Agentic RAG 的完整架构

2.1 路由层:判断该走哪条路

路由层是整个系统的第一道闸门。它可以是训练好的轻量分类器,也可以是大模型基于少量示例做的零样本分类,目的只有一个:把进来的问题分流到正确的处理通道。我建议实现成一个意图识别优先级表:

  • 涉及实时数据、用户专属数据 → 走 API 或数据库工具
  • 涉及知识库内部流程、政策文档 → 走向量检索
  • 通用常识、闲聊、开放问题 → 走模型直接生成
  • 问题模糊、实体缺失 → 先反问澄清,不要硬答

路由层看起来简单,但坑很多。某个客户系统里,用户经常问“怎么开发票”,而知识库里同时存在“发票开具流程”“发票常见问题答疑”“发票税率规定”三类文档。如果路由层不做子主题细分,向量检索会把三类文档混在一起召回,生成结果就变成流程、答疑、税率各讲一段。后来我们在路由层加了一个“业务主题分类”字段,先分主题再检索,效果立刻稳定。记住一句话:路由做不好,后面所有模块都在给错误的目标打工。

2.2 规划层:拆解多跳任务

规划层负责把复杂任务变成子任务序列,核心输出是任务清单和依赖关系。常见的有三种编排模式:

  • 顺序执行:先检索“开放问题”,再查“内部资料”,最后做对比和结论。
  • 依赖执行:A 的检索结果经过提炼,变成 B 的查询条件。
  • 并行执行:多个相互独立的子问题同时检索,最后汇总。

规划层要解决的问题不光是“拆得对不对”,还有“怎么省钱省时间”。我踩过最深的坑是让模型自由规划,结果它把一个三跳问题拆成了八个子步骤,大量 token 消耗在重复检索上。后来我加了硬约束:最大子任务数 5 个、最大迭代轮数 3 轮、每轮工具调用最多 2 次。超出限制就触发“总结当前进展 + 请求用户补充信息”的兜底分支,这在工程上是必须的。

2.3 检索与精排层:动态召回策略

在 Agent 体系里,检索动作是一组方法集,而不是单一的向量查询。集合里应该至少包括:向量近似最近邻、关键词/全文检索、结构化 SQL 查询、外部 API 调用。至于本次任务用哪个方法组合,由上游规划层决定。这里有一个非常实用的设计:混合检索 + 重排。多路召回之后,用一个轻量级重排模型统一打分,过滤掉和任务意图无关的旧片段。

我在实践中发现,向量召回擅长语义相关,但经常忽略精确实体(比如型号、工单号);关键词召回相反,精确但语义泛化能力差。两者一混,互补效果非常明显。重排阶段千万不能省,否则混合检索召回的片段数量翻倍,直接塞给大模型会稀释注意力。宁可重排后只留 3-5 个高置信片段,也不要 10 个似是而非的片段。

2.4 反思与评估层:答案可信度闭环

传统 RAG 生成完就结束,Agentic RAG 不行,因为它中间走了太多步,任何一步的偏差都可能被放大。反思层必须做,而且要做得干脆。我最常用的三件套:

  • 自洽性检查:把生成答案里的关键实体、时间、数值全部抽出来,和检索片段逐一对上号。
  • 再检索触发:如果关键断言缺少检索片段支撑,并且置信度低于阈值,就主动发起新一轮检索。
  • 不确定性标注:再检索也找不到支撑时,强制模型输出“该信息在当前资料中无法确认”,而不是编一个概率性的说法。

反思层是防幻觉最有效的防御线。很多团队舍不得这一步的延迟成本,结果上线后用户发现答错两次就不再信任系统。我的建议是:宁可慢 300 毫秒,也要把不确定性标出来。信任这东西,重建成本远远高于那点延迟成本。

2.5 记忆与状态层:长会话中的上下文保鲜

状态层解决两个问题:多轮对话中的指代消解,以及检索状态的可追溯性。比如用户先问“上季度销售额是多少”,再问“那华东区呢”,系统必须知道“那”指的是“上季度的销售额”,而不是另一个话题。实现上需要维护一个会话记忆窗口,把 Agent 的历史动作、检索条件、中间结论都保存成结构化记录。

这里有个容易忽略的点:记忆不只是“聊天轮次”,还包括“工具调用轨迹”。某个客户系统的审计需求很强,要求能回答“这个答案是检索了哪些文档得出来的”。我们在记忆层为每条 Agent 决策写了一个动作日志,包含输入、工具、输出、耗时。这不仅是合规需要,调试的时候也极其好用——每次效果不对,直接看动作日志就知道是哪一步偏了。

3. 关键技术突破与实现路径

3.1 意图路由:先问“该不该检索”

直觉上 RAG 应该“先检索再生成”,但在真实场景里,大量问题根本不需要走外部知识。判断“是否需要外部知识”本身就是一个关键突破点。具体做法是让模型先输出一个结构化判断,用枚举类型强制约束:

from typing import Literal from pydantic import BaseModel class IntentDecision(BaseModel): intent: Literal["needs_search", "direct_answer", "ask_clarification"] reason: str suggested_query: str = ""

判断逻辑放在查询之前,可以让系统节省大量不必要的检索成本。某电商客服场景,约 25% 的问题是“你们发什么快递”“退货多久到账”这种高频固定问答,直接走模型生成即可;约 8% 的问题是“我想退一个不合适的鞋子,但我忘了订单号”这种缺少关键实体的,应该先反问订单号而不是硬检索。加了这层路由之后,整体响应延迟下降 30%,原因是绕开了没必要的向量库访问。

3.2 查询改写与子问题分解的实现细节

复杂问题直接丢给向量检索,效果通常很差。原因在于原始问句的口语表达和文档里的书面表达之间存在词汇鸿沟。我建议在检索之前加一个可选查询解析模块,做四件事:

  • 术语归一化:把“工资发少了”映射成知识库里的“薪酬异议”
  • 指代补全:把“那”“这些”“上述方案”替换成实体全称
  • 子问题拆分:把 AND 型复合问题拆成多个可独立检索的子问题
  • 路由条件生成:基于前序结果生成下一步的检索参数

实现上可以给模型一个高内聚的 prompt 模板,输出改写后的查询列表。我这里强调的是“改写后”而不是“一个改写结果”,因为很多问题需要同时检索多个不同角度的子查询。比如“对比 A 和 B 两款产品的部署成本和维护难度”,应该产生至少两个方向的子查询:一个面向“A 产品部署成本维护”,一个面向“B 产品部署成本维护”,甚至可以再拆一个“对比方法论”。

3.3 多步迭代检索:Retry 策略与停止条件

Agentic RAG 和传统 RAG 最大的行为差异,就是系统可以“没看懂就再查一次”。这个能力很强大,但也容易失控。我采用的迭代检索逻辑是:生成初始答案 → 评估答案与检索片段的支撑度 → 支撑不足则基于“缺什么信息”重写查询 → 再检索。这里最关键的是停止条件,必须显式控制最大轮数和置信度阈值,否则 Agent 会陷入自我循环,拖垮成本和延迟。

我一般把最大迭代轮数设为 3。为什么不设更高?根据项目数据,90% 以上的问题在 3 轮内能收敛到可用答案,超过 3 轮的问题通常不是“检索不够”,而是“问题本身无法靠检索解决”——可能是用户表达错误,也可能是资料库缺失。继续迭代只会提供更多的幻觉空间。停止条件里还要加上“证据覆盖度”:当答案里的关键断言都有片段支撑时,哪怕轮数没用完,也要立刻停止。

3.4 工具调用与结构化输出:Agent 与数据库对话

除了非结构化知识库,Agentic RAG 里另一半重头戏是结构化数据。通过函数调用机制,模型可以自动把一个自然语言问题转成 SQL 查询或 API 参数,执行后拿结果参与生成。这个过程中最核心的工程原则是:让模型操作 schema,而不是操作全部数据。

def talk_to_database(user_question: str, schema_desc: str) -> str: # 1. 让模型基于 schema 生成查询意图和参数 tool_call = parse_tool_call( model.generate( system="你是数据分析助手,只允许输出工具调用", user=f"schema:{schema_desc}\n问题:{user_question}" ) ) # 2. 由工具执行层校验参数并查询 query_result = execute_sql(tool_call.sql, params=tool_call.params) # 3. 对查询结果做摘要,再交给生成模块 summary = model.generate( system="只总结数据和口径,不要推测", user=f"查询结果:{query_result[:2000]}\n问题:{user_question}" ) return summary

为什么先让模型产出结构化 JSON,而不是让它直接给最终答案?因为查询这一步涉及系统权限、字段准确性和数据口径,不能交给模型自由发挥;而拿到查询结果之后再做一次摘要生成,可以确保“数据本身”和“对数据的解读”两件事分开。这个分层设计在出现口径错误时特别好排查:是查询条件错了,还是摘要解读错了,一眼就能定位。

4. 行业落地场景与工程化实践

4.1 企业知识库问答:客服系统的“高级模式”

最常见的落地场景是把传统 FAQ 升级为能处理复杂流程的客服助手。传统 FAQ 只能回答“发票可以开专票吗”这种单点问题,而 Agentic RAG 能回答“我提交了离职申请但想撤销,流程上怎么办”这种需要状态判断的问题。

我在一个模拟客户服务场景里做过对比。同样是“想撤销离职申请”,传统 RAG 召回的是“离职申请操作步骤”文档,回答的是“进入系统填写申请”这种泛泛流程,用户看完更困惑。Agentic RAG 会先解析出关键实体“离职申请”和“撤销”,再检索“撤销条件”“撤销审批人”“系统操作入口”三个方向的文档,最后按照“你是否满足撤销条件 → 联系审批人 → 系统入口操作”的决策树组织答案。这个体验差异是质变级别的。

落地时要特别关注权限控制。不是所有客服人员都能看到全部知识,Agent 每次检索都必须带上角色信息,这实际上是在路由层加一个过滤条件。很多团队忽略这一点,直接把全部文档做进向量库,导致管理员账号问出了不该看到的内容,合规上会出大问题。

4.2 结构化数据分析与报表生成

“上季度华东区销售额环比变化是多少,Top3 SKU 贡献占比如何?”这类问题在过去叫 BI,现在通过 Agentic RAG 变成自然语言接口。难点在于,它需要同时理解文本口径和结构化数据。

我的落地经验是:文本摘要 + SQL 查询 + 口径解释,三种上下文拼在一起,再交给模型生成。光给 SQL 结果,模型不知道“销售额”到底按发货日期还是订单日期算;光给文档,模型没有实际数字。有些团队在这里踩坑:直接把 SQL 执行结果原样塞进 prompt,导致模型被一堆字段名带偏。正确做法是先做一层“结果摘要”,把表格数据压缩成几行文本,再和执行口径说明一起喂给模型。另一个细节是,要给模型显式的数据日期截止字段,避免用户拿昨天的数据问今天的数。

4.3 多文档对比与研报综述

研报、招标文件、合同、竞品分析,这类场景的本质是“多源证据交叉”。某个医疗器械公司的需求是:把三类竞品的公开技术参数、价格区间、售后服务评价整合成对比报告。传统 RAG 的做法是分别召回三个产品的片段,然后让模型总结。问题在于,三个产品的召回时间、文档版本、评价维度都不一样,模型很难对齐比较维度。

Agentic RAG 的解法是:规划层先定义对比维度(价格、性能、售后、交付周期),然后对每个维度单独发起检索,每个维度下再对齐各个产品的信息。缺少某一个产品的某个维度时,Agent 会主动去补检,而不是在生成阶段含糊带过。实际交付时,我们要求每个维度的每个断言都带引用标记,产品经理可以直接点击跳到原始段落,这个功能在整个项目里收获的评价最高。

4.4 内容生成与个性化推荐工作流

内容场景是很多人没意识到的 Agentic RAG 适配领域。比如生成一份营销邮件,系统需要先检索用户历史购买记录、浏览行为、客服互动摘要,再结合当前促销政策,生成个性化文案。这里的关键是“检索什么”要由 Agent 根据用户意图动态决定,而不是预设一套字段。

我做过一次实测:同一个用户,传统 RAG 生成的推荐文案是“根据您的购买记录,为您推荐以下产品”,Agentic RAG 生成的文案则是“您上次购买的某款咖啡机快用完了,同一品牌的滤芯正在满减活动,顺便提醒您会员积分本月过期。”后者的转化预期差距巨大。区别就在于 Agent 会基于用户画像主动检索“库存状态”“积分到期时间”这些辅助信息,而不是只拿购买记录。这类工作流要控制好个性化检索的深度和隐私边界,检索到的隐私信息只允许本生命周期内使用,不能落入长期存储。

5. 踩坑实录与性能调优清单

5.1 评估先行:没有评测就没有优化

从传统 RAG 迁移到 Agentic RAG,我见过最大的错误就是一上来就堆功能,不做评估。Agent 是推荐式的,每一步的行为都会影响最终结果,如果不把评估集建好,你根本无法判断“这个改动到底是变好了还是变坏了”。

我的做法是建一个三层评测集:

  • 单跳事实型样例:验证基础检索没被 Agent 化破坏
  • 多跳推理型样例:验证规划、工具调用、反思是否有效
  • 工具调用型和异常输入型样例:验证路由层和兜底分支

每个类别至少 20-50 条。评测时不能只看最终答案对不对,还要记录 Agent 的决策轨迹:每轮检索动作、查询改写、工具耗时、token 消耗。三个核心指标分别是任务成功率、每轮 token 成本、平均响应延迟。跑完一套评测,绝大多数“感觉哪里不对”都会变成“我知道哪里不对,也知道是哪一层的不对”。

5.2 切分与索引的隐藏考点

Agentic RAG 对切片质量比传统 RAG 更敏感,因为它会在中间结果上做二次推理。一次检索回来的片段如果缺失关键上下文,后续的工具调用和查询改写都会被带偏。我强烈建议用父子切片结构:粗粒度父文档提供完整上下文,细粒度子文档负责精准召回。命中子文档后,把对应的父文档一起喂给模型。

这个设计的效果类似人阅读时“先定位到段落,再看整个版面”。纯子文档切片节省 token,但容易引起断章取义;纯父文档切片精度差,召回的段落经常不在点上。父子结构能找到平衡。索引层面还要注意元数据过滤,比如文档版本、产品线、发布日期,这些通通要作为可过滤字段。实测中,加了“版本号过滤”之后,某知识库的场景准确率提升了 15% 以上,原因很直接:用户问的是新政策,系统不再拿旧版本文档来答。

5.3 幻觉控制:让“引用”成为一种纪律

Agent 自主权越大,越要控制幻觉。我的底线是:系统里的每个关键断言,都必须可以被一个或多个检索片段支撑。为做到这一点,需要在工程上采取强制措施:

  • 生成阶段让模型输出引用片段 ID,并对没有支撑的断言标注“推测”
  • 渲染阶段根据片段 ID 回填原文引用,用户可以直接点击查看
  • 后处理阶段做一致性检查,发现断言与片段矛盾时强制改写或标记不确定

不要相信模型“我认为这个信息是对的”。模型在不知道答案时,依然会为了流畅而补全。某个项目上线初期,模型在回答某个产品参数时自创了一个数字,看起来非常自然,直到用户拿着截图来质问才知道出问题。从那以后,我们把“无支撑不输出”写进了系统提示词,并且在后处理里强制检查。宁可让模型说“资料未提及”,也不能说一个编造出来的数。

5.4 成本与延迟:让每个 Agent 动作可计量

Agentic RAG 的成本明显高于传统方式,这没什么可回避的。多轮迭代、多个工具调用、查询改写,这些都要消耗额外的 token。控制成本的第一步是“计量”:给每个动作打标签,统计每类动作的消耗。我们有一个成本看板,按路由、规划、检索、反思、生成分别统计。上线后第一周发现,反思层占比 18% 的成本,但只拦截了 2% 的错误 —— 这个比例不划算。后来我们调整了反思触发条件,只在“答案包含数字和专有名词”时才开启深度检查,成本立刻降了一半。

另一个有效手段是快慢两路:对简单问题直接走单次检索路径,对复杂问题才进入完整 Agent 流程。路由层的 intents 判断可以顺带做这件事。还要注意子问题结果缓存,同一会话内用户重复追问“那华东区呢”时,前面已经算好的全国数据可以直接复用,不用重新检索。这一步在长对话场景里效果非常惊人。

6. 架构选型与技术栈建议

6.1 从零组装还是用现有编排框架

很多团队纠结 Agentic RAG 要自己写还是用现成框架。我的结论是:快速验证 POC 用流程式的编排框架,正式产品一定要基于框架做二次封装,甚至自研核心状态机。为什么?因为 Agent 工程的核心是状态管理,而不是调大模型 API。一个可用产品需要控制状态持久化、失败重试、并发限制、全链路日志,这些在自研小工具里很容易漏掉,框架里有现成能力但形如黑盒,出事之后很难排查。

选型标准我建议看四个维度:是否有可观测性(决策步骤能被回放)、是否支持状态持久化(服务重启不丢会话)、工具扩展是否容易(接内部系统和权限体系)、是否支持分层评估。那些只支持“提示词编排”的框架,遇到复杂分支逻辑时会非常痛苦,代码全写在字符串里,没法做单元测试。

6.2 一套值得保存的模块设计

如果从零开始,我会把这几个模块做成独立服务,而不是全部塞进一个函数:

  • 意图解析组件:负责判断是否需要检索、是否需要澄清
  • 任务规划组件:负责拆解子任务、定义依赖
  • 工具执行组件:负责实际调向量库、数据库、API
  • 记忆管理组件:负责会话状态、跨轮指代、动作日志
  • 评估反馈组件:负责自洽性检查、支撑度评分、再检索触发

几个组件之间通过结构化消息通信,而不是直接拼 prompt。这样做的好处是每个组件都可以单独测试,也可以单独替换。比如你想把“意图解析”从零样本分类换成一个小型分类模型,不需要动其他部分。我特别建议加一个决策追踪日志,把每个 Agent 决策的输入、输出、耗时记成 JSONL,这个文件会在你调试效果问题时救命。

6.3 何时不推荐 Agentic RAG

不是所有场景都值得上。你要想清楚:你的用户真的会问跨数据源、多跳推理、流程操作类的问题吗?如果只是常见问题解答,查询模式稳定,对响应延迟要求极高,那传统 RAG 加上分词语料优化和缓存完全够用。Agent 化会引入不可预测的执行路径,意味着每个请求的延迟和成本都可能是传统方式的数倍。

另一个反面场景是:你的知识库本身质量差、覆盖不全。这种情况先别急着 Agent 化,先把数据治理做了。Agent 再强,检索不到的信息它依然检索不到,反而可能因为自主决策把错误信息组合成更流畅的假答案。我见过一个极端案例:知识库里有 30% 资料是过时版本,Agent 在多轮检索后把新旧政策混在一起回答,用户根本分不清哪句是权威的。这种情况的解法是回归数据清理,而不是升级系统架构。

我个人在实际操作中的体会是:Agentic RAG 不是银弹,而是一把需要驾驭的工具。它的价值不在于让简单问题回答得更花哨,而在于让复杂问题第一次拥有了“可解释的解决路径”。如果你正面临传统 RAG 效果天花板,我建议你从一个小范围、高价值的场景开始试点,配上评测集和可观测系统,先把路走通,再逐步扩大边界。最后再分享一个小技巧:在路由层加一个 easy_skip 开关,当模型判断问题简单时直接走单跳路径,这个开关能让你的整体成本至少降 40%,而用户几乎感知不到区别。

RELATED READING

延伸阅读

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