本文收录于专栏《AI Agent原理与实战》2026版—— 专栏系统覆盖 AI Agent 的记忆、工具、插件与实战,点击订阅可跟踪后续更新。
本课定位:规划常涉及外部知识。本课从固定流程 RAG 讲到 Agentic RAG:模型参与检索决策(充分性判断、查询改写、继续/停止),多跳问答实战 + 开销控制。知识密集型应用(第 20 课 Dify 知识库)的能力内核就是这一课。
阶段 2|单 Agent 核心机制 | 来源:【微·5】(微软 AI Agents for Beginners 第 5 课)
关键字:Agentic RAG、检索增强生成、Self-RAG、CRAG、多跳问答、查询改写、检索决策、知识库问答
本节目录
- 11.1 固定流程 RAG vs Agentic RAG
- 11.2 学术脉络:从 Self-RAG 到 CRAG
- 11.3 检索决策:三个核心判断
- 11.4 自我修正与兜底
- 11.4b 微软第 5 课的补充:自主边界、治理与适用场景
- 11.5 多轮检索的开销控制
- 11.6 实测输出
- 11.7 动手练习
概念讲解
11.1 固定流程 RAG vs Agentic RAG
经典 RAG(Retrieval-Augmented Generation,检索增强生成)是一条固定流水线:
经典 RAG: 问题 → 向量检索 top-k → 拼 prompt → 生成答案 (一次,不可逆) Agentic RAG:问题 → [评估 → 决策(查什么/够不够) → 检索] 循环 → 作答 (多轮,可自我修正)微软原课对两者差异的一句概括:传统 RAG 依赖人类预定义的路径,Agentic RAG 的标志性品质是"拥有自己的推理过程"(owning the reasoning process)。具体差别展开为四点:
| 维度 | 经典 RAG | Agentic RAG |
|---|---|---|
| 检索时机 | 固定:生成前一次 | 动态:模型判断需要时 |
| 查询内容 | 原问题直接向量化 | 按信息缺口改写 |
| 失败处理 | 检索差就硬答 | 换查询、换工具、甚至拒答 |
| 复杂问题 | 多跳问题答不全 | 逐跳拆解、逐步补全 |
多跳问答(multi-hop question)是分水岭:“第二代替诺福韦前体药是哪家公司主导临床研究的?”——先要查出"第二代前体药是 TAF",再用 TAF 去查主导公司。固定流水线用原问题检索,第一跳的知识缺口就堵死了整条链。
11.2 学术脉络:从 Self-RAG 到 CRAG
这一方向有两篇奠基工作,代表的两种思路值得区分:
- Self-RAG(arXiv:2310.11511,Asai 等):把"何时检索、检索结果相关与否、答案有无支撑"训练成模型自身的反思 token——判断力内化进权重,需要微调。
- CRAG(Corrective RAG)(arXiv:2401.15884,Yan 等):不动模型,在流水线外挂一个轻量"检索评估器",给检索结果打置信度:正确就用、不正确就触发网络搜索兜底 + 分解重组过滤——判断力外置成编排逻辑。
Agent 系统多走 CRAG 路线(闭源 API 模型没法训练),但把"评估器"升级成了 LLM 本身——这正是 Agentic RAG 的形态:判断力既不藏在权重里,也不固定在流水线里,而是在循环里现场生成。
11.3 检索决策:三个核心判断
Agentic RAG 循环的每一跳,模型做三个判断:
1. 信息充分性判断(够不够)。对照问题盘点已有信息,明确缺口在哪。这是停止条件的基础——判断失准的两种代价:过早停止(答案缺一条腿)、过晚停止(token 无底洞)。
2. 查询改写(查什么)。这是 Agentic RAG 增益的最大来源:第二跳的查询应该包含第一跳学到的知识。"哪家公司主导临床研究"查不到东西,"丙酚替诺福韦 TAF 临床研究 主导公司"才能命中——改写后的查询站在已有信息的肩膀上。
3. 路由选择(去哪查)。多数据源场景(向量库 / SQL / 网络搜索 / API)下还要选工具。微软原课的例子:产品发布策略任务中,模型自主决定先查市场趋势报告(Bing)、再查竞品(AI Search)、再关联内部销售(SQL)——检索路由本身就是第 7 课工具调用的一种。
11.4 自我修正与兜底
检索失败时(返回无关文档、空结果),Agentic RAG 的处置梯度:改写重查 → 换数据源 → 降级为"信息不足"的拒答或人工上报。最后一级常被忽略但最重要:承认查不到,比编一个答案好。原课把它称为边界意识——Agent 的自主性被限制在可用工具与数据源之内,它不是 AGI。
11.4b 微软第 5 课的补充:自主边界、治理与适用场景
微软第 5 课在机制之外给了一层"何时能用、如何管住"的判断,这里完整吸收:
自主性的三条边界(原课口径):Agentic RAG 的"自主"受限于人类开发者提供的工具、数据源和政策——①领域边界:只在设定领域内动态编排现有资源,无法自创工具或越界;②基础设施依赖:能力上限就是开发者集成的工具与数据,无人干预时无法超越;③规范约束:策略(policy)由人定,Agent 在策略内行动。
治理、透明度与信任(系统越自主,这层越关键):①可解释推理——保留查询轨迹、参考来源与推理步骤记录(本课案例的 decision.reason 字段就是最小实现),调试与审计都靠它;②偏见控制与平衡检索——调优检索策略保证数据源的平衡性与代表性,定期审计输出检测倾斜;③人工监督与合规——敏感任务人工审查不可缺,Agentic RAG 增强而非替代高风险决策中的人工判断(与第 25 课 human-in-the-loop 呼应)。
三类最适用的场景(原课归纳):正确性优先的环境(合规检查、法规分析、法律研究——反复验证事实直到答案经得起审核)、复杂数据库交互(NL2SQL 查询常失败需自主调整)、长程工作流(会话随新信息持续演化)。反过来说,一次性简单问答不值得上 Agentic RAG——开销(第 11.5 节)只有在这些场景里才回本。
11.5 多轮检索的开销控制
自主循环的代价是开销随跳数线性涨(每跳 = 1 次决策调用 + 1 次检索 + 上下文变长)。四个控制手段:
- 最大跳数(max_hops):硬熔断,和第 6 课的 max_turns 同构。
- 增量上下文:只把新文档追加进上下文,已读文档去重(本课案例的
used_docs集合)。 - 检索结果预算:每跳 top-k 要小(2-3 篇),无关文档进入上下文不仅费 token 还会干扰判断——第 13 课的 context distraction 失败模式。
- 决策与作答合并:最后一跳的"信息充分"判断和"生成答案"可以合并成一次调用(本课案例为教学清晰分开为两次)。
生产系统还要记检索账本(哪跳、什么查询、命中什么),用于事后审计答案的证据链——这也是第 12 课外部验证的基础。
案例实战:多跳问答完整实现
目标
一个药品知识库上的两跳问答:第一跳确定"第二代前体药 = TAF",第二跳用 TAF 查主导临床研究的公司。同时跑一个单跳对照问题,展示开销差异。演示四个机制:检索决策、查询改写、信息充分性判断、开销统计。
环境
- Windows(推荐):Windows 10/11 + Python 3.9+,
pip install openai==3.6.0,setx DEEPSEEK_API_KEY "sk-..."后新开终端运行python 11_agentic_rag.py——脚本无操作系统相关依赖 - Linux(本课实测环境):Ubuntu 22.04,Python 3.10.12,openai 3.6.0,deepseek-chat,2026-10-01 实测。检索器用关键词打分模拟向量检索(聚焦循环逻辑,不引 embedding 依赖)
- JSON 输出模式(
response_format)为 DeepSeek API 特性,换其他兼容 API 时的注意事项同第 10 课 - 换国内模型:接入参数与实测行为见第 7 课"国内模型适配"节,代码改
base_url与model两行
完整代码
# 11_agentic_rag.py(完整可运行版见 code/ 目录)importos,jsonfromopenaiimportOpenAI client=OpenAI(api_key=os.environ["DEEPSEEK_API_KEY"],base_url="https://api.deepseek.com/v1")# ---------- 模拟文档库 ----------DOCS={"doc1":{"text":"替诺福韦(Tenofovir)是核苷类逆转录酶抑制剂,2001 年首次获批…","tags":["替诺福韦","tenofovir","hiv","tdf"]},"doc2":{"text":"丙酚替诺福韦(TAF)是替诺福韦的第二代前体药物,2015 年获批,剂量仅为 TDF 的十分之一。","tags":["taf","丙酚替诺福韦","前体"]},"doc3":{"text":"比克替拉韦与 TAF 组成复方制剂 Biktarvy…","tags":["bictegravir","biktarvy","复方"]},"doc4":{"text":"恩替卡韦用于乙型肝炎治疗…","tags":["恩替卡韦","乙肝"]},"doc5":{"text":"TAF 的肾安全性关键临床研究(Study 108 与 Study 110)由 Gilead Sciences 主导完成…","tags":["taf","gilead","study108","肾安全性"]},}defretrieve(query:str,top_k:int=2)->list:"""关键词打分模拟向量检索,返回 top_k 文档 id。"""scored=[(sum(1fortind["tags"]iftinquery.lower()),did)fordid,dinDOCS.items()]scored=[(s,d)fors,dinscoredifs>0]scored.sort(reverse=True)return[didfor_,didinscored[:top_k]]defchat_json(system,user):# DeepSeek JSON 模式,见 code/ 完整版...defagentic_rag(question:str,max_hops:int=4)->str:context,used_docs=[],set()forhopinrange(1,max_hops+1):# ① 检索决策:信息够不够?不够查什么?decision=chat_json("你是检索决策器。信息已足够则输出 {\"action\": \"answer\"};""否则输出 {\"action\": \"search\", \"query\": \"改写后的检索词\", ""\"reason\": \"缺什么\"}。检索词要具体,不要照抄原问题。",f"问题:{question}\n已有信息:{contextor'(无)'}")ifdecision["action"]=="answer":break# 信息充分 → 退出循环# ② 检索(增量,去重)doc_ids=[dfordinretrieve(decision["query"])ifdnotinused_docs]ifnotdoc_ids:break# 无新文档 → 兜底作答fordidindoc_ids:used_docs.add(did)context.append(f"[{did}]{DOCS[did]['text']}")# ③ 只用检索到的文档作答,引用编号...【已实测】2026-10-01,deepseek-chat。
11.6 实测输出
两跳问题:“第二代替诺福韦前体药物是哪家公司主导其临床研究的?”
[跳1] 决策: 检索 '第二代替诺福韦前体药物 临床研究 主导公司'(需确认具体药物名称及主导企业) 命中 doc2: 丙酚替诺福韦(TAF)是替诺福韦的第二代前体药物… 命中 doc1: 替诺福韦(Tenofovir)是核苷类逆转录酶抑制剂… [跳2] 决策: 检索 '丙酚替诺福韦 TAF 临床研究 主导 公司 吉利德' (已有信息仅说明 TAF 是第二代前体,未提及主导公司) ← 查询改写用了跳1的新知识! 命中 doc5: TAF 的肾安全性关键临床研究由 Gilead Sciences 主导… [跳3] 决策: 信息充分,直接作答 [开销] 检索 2 跳 / 3 篇 / LLM 调用 4 次 答案:…丙酚替诺福韦(TAF)的肾安全性关键临床研究(Study 108 与 Study 110) 由 Gilead Sciences 主导完成 [doc5]。单跳对照:“恩替卡韦治什么病?”
[跳1] 决策: 检索 '恩替卡韦 适应症 说明书' → 命中 doc4 [跳2] 决策: 信息充分,直接作答 [开销] 检索 1 跳 / 1 篇 / LLM 调用 3 次三处行为值得精读:
- 跳 2 的查询改写是全案例的题眼:“丙酚替诺福韦 TAF 临床研究 主导 公司 吉利德”——“丙酚替诺福韦 TAF"这个关键词在原问题里根本不存在,它是跳 1 从 doc2 里学到的。这就是"owning the reasoning process"的可观测证据:每一跳站在上一跳的肩膀上。(它甚至预猜了"吉利德”,这是模型的参数知识参与了查询构造——用得好事半功倍,但要警惕它诱导确认偏误。)
- 决策器的 reason 字段是免费的可解释性:每跳记录"缺什么",事后审计能还原整条推理链——生产系统务必保留。
- 开销自适应:单跳问题就花一跳的钱(1 篇 / 3 次调用),复杂问题才花两跳的钱——固定流水线不论问题难易都付一样的检索成本,Agent 按需付费。
11.7 动手练习
- 把
max_hops设为 1 再跑两跳问题——观察答案缺失哪条腿(能答出 TAF 但答不出公司),体会"多跳问题一跳答不全"。 - 把 doc5 的 tags 里 “taf” 删掉,制造"第二跳检索也失败"场景——观察兜底分支触发后,答案是拒答还是编造(取决于决策器提示词里有没有"查不到就说不知道")。
小结
- Agentic RAG 的本质:检索从"固定步骤"变成"模型自己拥有的循环"——决策(够不够)、改写(查什么)、路由(去哪查)三判断逐跳执行。
- 查询改写是增益核心:第二跳的查询包含第一跳学到的知识,多跳问题只有这样才能逐跳补全。
- 开销控制四件套:max_hops 熔断、增量去重上下文、小 top-k、决策/作答合并。
- 学术两路线:Self-RAG 把判断力训练进权重(需微调),CRAG 把判断力外挂成评估器(即插即用)——Agent 生产系统多走后者形态。
检索解决"信息从哪来";下一课解决"做完之后怎么知道自己做得对不对"(参见第 12 课《元认知与反思》)。检索回来的文档塞满上下文怎么办,第 13 课《上下文工程》处理。
扩展阅读
🌐 网络提示:github.com 需代理(clone 可走 ghproxy 加速、push 优先 SSH);学术站 arxiv.org 境内多可直连(慢),其余评测/规范站需代理;pip 安装建议加清华镜像
-i https://pypi.tuna.tsinghua.edu.cn/simple。详见总纲附录《国内网络访问与国产适配指南》。
- 微软原课第 5 课(Agentic RAG):https://github.com/microsoft/ai-agents-for-beginners/tree/main/05-agentic-rag
- Self-RAG 论文(arXiv:2310.11511):https://arxiv.org/abs/2310.11511
- CRAG 论文(arXiv:2401.15884,代码 github.com/HuskyInSalt/CRAG):https://arxiv.org/abs/2401.15884
- Adaptive-RAG(按问题复杂度路由检索策略,arXiv:2403.14403):https://arxiv.org/abs/2403.14403
我的专栏
| 蛋白 / 抗体 / 多肽 / 核酸 | 分子模拟 / 动力学 / 对接 | 药物 / 设计 / 案例 | AI / Agent / 大模型 |
|---|---|---|---|
| 开源蛋白结构预测 | 分子模拟基础 | 小分子药物设计案例 | AI Agent系列 |
| 开源蛋白生成方法实践 | 分子动力学模拟-Amber | 蛋白药物设计案例 | 化学大模型 |
| 开源多肽设计模型 | 分子动力学模拟-Gromacs | 多肽药物设计案例 | 《AI Agent原理与实战》 |
| 开源多肽性质预测 | 分子动力学模拟-OpenMM | 开源小分子生成设计 | CADD中的机器学习模型 |
| DNA/RNA药物设计 | 結合自由能 | 高效计算配置 | 《MCP 入门实战》 |
| siRNA药物设计模型 | UCSF DOCK系列 | 我胡师兄说药 | 《AI入门实战2026》 |
| ASO药物设计模型 | rDock系列 LeDock系列 gnina系列 | 《经典机器学习实战》 |