跳到主要内容

agentic RAG — 路由器、检索器群、答案批评家

这一章讲三件事: 「agentic」这个词在 RAG 语境下的具体含义(三个零件,不多不少); 工具调用(给模型一张工具清单,它点名、系统执行)的真实分工;以及让这套循环不失控的两个设计 ——批评家留出口、复评只做一轮。这一章是从「多个检索器」到「一个系统」的装配章。

1. 顶层全景:三个零件

到上一章为止,我们手里已经攒了几种检索器:向量检索(管非结构化)、 Cypher 模板查询(管精确命中)、text2cypher(管聚合兜底)。 agentic RAG 就是把它们编成班的调度系统——让系统自己决定 「这个问题该用哪个检索器」,并检查拿回来的材料够不够1

┌── 检索器 A(向量)──┐
问题 → 路由器 ────┼── 检索器 B(模板)──┼──→ 答案批评家 ──→ 放行 或 追问
(LLM 选工具+参数) └── 检索器 C(t2c)─┘ (不合格拦下)

图说:整本书的检索器,在这里第一次被当成「工具」调度,而不是被写成固定流程。

「agent(智能体)」在本书语境下没有玄学含义:就是一个能替用户做决定的系统。 本章的系统只做两种决定——选哪个检索器、材料够不够; 更高级的系统会自己拆解任务、定计划,书里明说那是进阶形态,从基本款学起2

2. 关键机制:LLM 只「点菜」,系统「下厨」

这是全章最值得记住的机制。当系统把工具列表递给 LLM 时, LLM 返回的不是执行结果,而是一张「点菜单」:用哪个工具 + 传什么参数。 真正调用工具的,始终是外部系统3

LLM 返回:[ { 工具名: "capital_by_country", 参数: "France" } ]


外部系统拿着这张单子,在代码里找到同名函数,真的调用它,拿到结果

这个能力叫工具调用:给模型一张工具清单,它点名该调哪个、传什么参数,系统照单执行;行话也叫函数调用——一回事。

OpenAI 家的 GPT(就是 ChatGPT 背后那批模型,GPT-3.5/GPT-4 都算)原生支持;

没有原生支持的模型可以用 ReAct 方案实现(让模型以固定格式交替输出「想法」和「动作」,系统解析(从固定格式里抠出要点)后执行),出自 2022 年的论文 (Yao 等)4。书里预判:这个能力迟早会成为所有 LLM 的标配4

工具能被选对的前提,是描述写得好:工具叫什么、干什么用、参数什么含义—— LLM 全靠这几行描述做决定,描述含糊,路由就含糊5

3. 三个零件,逐一讲透

零件一:检索器群——泛用打底,专用救场

书里给了一个务实的判断:泛用检索器(向量检索、text2cypher)在生产环境 很难单凭自己达到用户预期——所以要有意识地沉淀专用检索器: 窄、但极准。运维节奏是:发现 text2cypher 答不好哪类问题, 就为那类问题造一个专用检索器(比如硬编码(预先写死、只留参数可换)的参数化查询), text2cypher 退居兜底6

书里的实战班底四个工具:按片名查电影、按演员查电影(两个 Cypher 模板)、 text2cypher(兜底)、以及一个容易忽略的 answer_given—— 处理「答案就在问题里」的情况:用户问「Dave Smith 的姓是什么?」, 根本不用查库,把「Smith」从问题里抽出来即可7

零件二:路由器——LLM 选工具,顺带改写问题

路由器把问题和工具列表交给 LLM,拿回点菜单再由系统执行。 书里的最小例:「法国的首都是什么?」→ 路由器选中 capital_by_country 工具、参数 France8

路由器还有一个常被低估的副业:连续问题更新。 多部分问题被拆成小问题后逐个处理,后一个问题往往依赖前一个的答案—— 「谁拿的奥斯卡最多,那人还在世吗?」拆成两问,第二问在第一问答完之前 是没法检索的。解法:每答完一问,用 query updater(一个带指令的 LLM 调用) 把还没处理的问题用已知答案改写一遍,改成自足的、可直接检索的形态9。 纪律只有一条:只许改写得更完整,不许问出比原问题更多的新东西10

零件三:答案批评家——验收,但必须留出口

批评家把「原始问题 + 所有检索结果」再过一遍 LLM,判断材料够不够; 不够就生成一组补充问题,送回路由器再检索一轮11。 它是拦截器:不合格的答案到不了用户手里。

两个防失控的设计:

  1. 必须有退出条件——正确答案可能根本不在数据源里, 循环必须能在「确认无答案」时停机并向用户说明12;
  2. 复评只做一轮——书里的实现把批评结果再追一轮检索就收手, 还不完整就让 LLM 如实告知用户缺了什么13。 LLM 每一环都是概率性的,无限自我修正循环只会烧钱、不收敛(转不出结果、停不下来)。

4. 主走查:一道复合题在系统里的完整旅程

拿书里的问题走全程:「Who has won the most Oscars, and is that person alive?」(谁拿的奥斯卡最多,那人还在世吗?)14

第 1 步 问题进系统,先拆:问题含两问——
① 谁拿的奥斯卡最多 ② 那人还在世吗
(书里演示了拆问与依赖:② 依赖 ① 的答案,箭头就在这)

第 2 步 路由器处理 ①:工具列表四个,LLM 选中 text2cypher
(参数 = ①的原文)——因为是聚合统计,模板工具覆盖不了

第 3 步 系统执行 text2cypher:生成查询→执行→拿到结果
(为演示编的结果示意:某演员名 + 获奖数)

第 4 步 query updater 用 ① 的答案改写 ②:
「Is Katharine Hepburn alive?」——把「那人」替换成真名
(这个改写结果是演示编的;书里给的机制保证是「用已知答案填空」)

第 5 步 路由器处理改写后的 ②:命中专用模板工具「按人名查信息」

第 6 步 批评家验收:原始两问都有材料支撑 → 放行 →
生成器汇总成最终回答;若缺,则按只补一轮的纪律收尾[^13]

这道走查覆盖了全部三个零件,以及本章两条纪律(填空式改写、复评一轮)。

5. 作者的判断与证据

  • 「基础款往往就够」——书里明说,对 RAG 任务,「选检索器+验材料」 这个基本形态常常已经覆盖需求,不必上更复杂的 agent 形态2;
  • 专用检索器是长期资产——泛用检索器打底、错误驱动地沉淀专用件, 是书里给的生产路径6;
  • critique 只一轮是作者明确的取舍,不是疏忽13

判断(我们的,不是书里的): 这一章的「agent」克制得出奇—— 没有自主规划、没有多轮反思,只有一次路由加一次验收。 在检索场景里,这种克制是对的:检索失败的大头是「选错工具」和「材料不全」, 两者各配一个决策点就够。别把「agent」当成堆循环的理由; 每加一圈循环,都要能回答「这一圈在修哪一种失败」。 如果错,会错在: 如果任务真的需要多步推理(答案要分几次检索、 中间还要计算),只跑一遍的结构确实不够——但那是换问题形态, 不是在本章结构上无限加圈。

6. 边界与局限

  • 书里明确只做「选检索器 + 验答案」两种决定,不做任务拆解与规划2;

  • 路由质量完全依赖工具描述的质量,书里只给了「要写好」的原则, 没有给描述的评测方法;

  • 每一环都是一次 LLM 调用(路由、改写、批评),每多一环就多一份等待时间(行话叫延迟)与一份钱——

    第 11 章的评测会量化(折成具体数字)到这一点(不走 text2cypher 的题明显更快)15;

  • 批评家自己也是 LLM,验收本身会错;书里承认 LLM 当裁判会出现不一致打分16;

  • ReAct 只是点名(给了论文链接),没有实现演示4

7. 可带走的

  1. agentic RAG 三零件:路由器 + 检索器群 + 答案批评家,没有更多玄学;
  2. LLM 只决定调谁、传什么参数;执行永远是外部系统的事——点菜/下厨分工;
  3. 工具描述就是路由器的「菜单」,描述含糊路由必含糊;
  4. 泛用检索器打底,专用检索器按错误驱动沉淀,text2cypher 退居兜底;
  5. 别忘 answer_given 这类「零检索」工具——有些问题根本不用查库;
  6. 复合问题拆开后,用已得答案填空改写下一问,只许补全不许加戏;
  7. 批评家必须留出口、复评只一轮——自我修正循环要么收敛要么停机,绝不空转。

8. 原文地图

主题原书章原文位置
agentic RAG 定义5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:50(搜「variety of retrieval agents」)
三零件5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:53(搜「Retriever router」) · text/14-ch05-5-agentic-rag.txt:57(搜「Answer critic」)
基本款够用、进阶才有规划5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:47(搜「make up plans」) · text/14-ch05-5-agentic-rag.txt:49(搜「often all you need」)
工具调用与 ReAct5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:21(搜「use tools」) · text/14-ch05-5-agentic-rag.txt:25(搜「ReAct approach」)
LLM 不亲手调工具5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:245(搜「can't make actual calls」)
工具描述要写好5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:241(搜「be careful」)
泛用不够、专用救场5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:68(搜「not trivial」) · text/14-ch05-5-agentic-rag.txt:69(搜「very narrow」)
专用检索器随时间沉淀5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:118(搜「Over time」)
France 路由例5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:78(搜「capital of France」) · text/14-ch05-5-agentic-rag.txt:90(搜「capital_by_country」)
answer_given 与 Dave Smith5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:254(搜「Dave Smith」)
批评家拦截与追问5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:97(搜「blocking」) · text/14-ch05-5-agentic-rag.txt:101(搜「new question」)
退出条件5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:103(搜「exit criteria」)
连续问题更新(Oscars 例)5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:337(搜「most Oscars」) · text/14-ch05-5-agentic-rag.txt:335(搜「rewrite the next question」)
只许补全不许加戏5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:356(搜「Do not ask for more」)
复评只一轮5 Agentic RAGtext/14-ch05-5-agentic-rag.txt:594(搜「only critique」)
评测预告(延迟差异)8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:418(搜「significantly lower」)
LLM 裁判不一致8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:419(搜「LLM as a judge」)

Footnotes

  1. 出处:「5 Agentic RAG」第 50 段(text/14-ch05-5-agentic-rag.txt:50,搜「variety of retrieval agents」)。原文:agentic RAG 是一个有多种检索 agent 可用、按需取数回答用户问题的系统。

  2. 出处:「5 Agentic RAG」第 47 段(text/14-ch05-5-agentic-rag.txt:47,搜「make up plans」)与第 49 段(text/14-ch05-5-agentic-rag.txt:49,搜「often all you need」)。原文:本章系统只做「选检索器」和「判断材料是否答了问题」;更高级系统才会做任务规划;对 RAG 任务,基础形态常常就够。 2 3

  3. 出处:「5 Agentic RAG」第 245 段(text/14-ch05-5-agentic-rag.txt:245,搜「can't make actual calls」)。原文:LLM 不能真正调用你的检索器,只能决定用哪个、传什么参数;实际调用由调用 LLM 的系统完成。

  4. 出处:「5 Agentic RAG」第 25 段(text/14-ch05-5-agentic-rag.txt:25,搜「ReAct approach」)。原文:GPT-3.5/GPT-4 有原生工具能力;其他模型可用 ReAct 方案实现(arXiv:2210.03629);作者判断此能力将出现在所有 LLM 中。书末参考文献列为 Yao 等 2023(出处:「references」第 27 段,text/22-fm-references.txt:27,搜「ReAct」)。 2 3

  5. 出处:「5 Agentic RAG」第 241 段(text/14-ch05-5-agentic-rag.txt:241,搜「be careful」)。原文:要小心描述检索器的方式,确保 LLM 理解它并能做决定;参数的描述同样重要。

  6. 出处:「5 Agentic RAG」第 68 段(text/14-ch05-5-agentic-rag.txt:68,搜「not trivial」)、第 69 段(text/14-ch05-5-agentic-rag.txt:69,搜「very narrow」)与第 118 段(text/14-ch05-5-agentic-rag.txt:118,搜「Over time」)。原文:泛用检索器在生产中不易达到用户预期;专用检索器窄而准;随时间识别 text2cypher 答不好的问题、为它们建专用件,text2cypher 作兜底。 2

  7. 出处:「5 Agentic RAG」第 254 段(text/14-ch05-5-agentic-rag.txt:254,搜「Dave Smith」)。原文:几乎总会包含的一个通用工具——答案已在问题或上下文中时,直接抽取返回。

  8. 出处:「5 Agentic RAG」第 78 段(text/14-ch05-5-agentic-rag.txt:78,搜「capital of France」)与第 90 段(text/14-ch05-5-agentic-rag.txt:90,搜「capital_by_country」)。

  9. 出处:「5 Agentic RAG」第 335 段(text/14-ch05-5-agentic-rag.txt:335,搜「rewrite the next question」)与第 337 段(text/14-ch05-5-agentic-rag.txt:337,搜「most Oscars」)。原文:顺序处理问题,可用前面答案改写后面问题;Oscars 例拆成两问,第二问依赖第一问。

  10. 出处:「5 Agentic RAG」第 356 段(text/14-ch05-5-agentic-rag.txt:356,搜「Do not ask for more」)。原文:不许比原问题要更多信息,只许改写得更完整。

  11. 出处:「5 Agentic RAG」第 101 段(text/14-ch05-5-agentic-rag.txt:101,搜「new question」)。原文:答案被拦截时,批评家生成新问题用于检索正确答案,再走一轮检索。

  12. 出处:「5 Agentic RAG」第 103 段(text/14-ch05-5-agentic-rag.txt:103,搜「exit criteria」)。原文:正确答案可能不在数据源中,循环需要退出条件,此时向用户返回「无答案」。

  13. 出处:「5 Agentic RAG」第 594 段(text/14-ch05-5-agentic-rag.txt:594,搜「only critique」)。原文:只批评一轮;若仍不完整,按原样返回并靠 LLM 告知用户缺了什么。 2

  14. 出处:「5 Agentic RAG」第 337 段(text/14-ch05-5-agentic-rag.txt:337,搜「most Oscars」)。走查第 3、4 步中的具体检索结果与改写文本是演示编的,书里只给了机制与问题本身。

  15. 出处:「8 RAG application evaluation」第 418 段(text/20-ch08-8-rag-application-evaluation.txt:418,搜「significantly lower」)。原文:不需要 text2cypher 的查询延迟显著更低,因为省掉了一次额外的 LLM 调用。

  16. 出处:「8 RAG application evaluation」第 419 段(text/20-ch08-8-rag-application-evaluation.txt:419,搜「LLM as a judge」)。