跳到主要内容

检索增强与规划 — 给模型接外脑,让它走一步看一步

这一章讲两件事: RAG——模型知识不够时,怎么先搜资料再回答(三段流程,三段各自的病与药); 规划——复杂任务怎么拆成「出动作 → 执行 → 收反馈 → 改动作」的循环(ReAct 与 Reflexion)。 两件事在章末合流:规划循环里的「搜索」动作,用的正是 RAG 的检索。 主走查: 原书的多跳问答例——从查「Grown-Ups」到查「Allo Allo!」再到改查「Sam Kelly」, 看一段「反思」文本怎么改变下一轮动作。

1. RAG 三阶段:先搜再答,三段各有病

模型的知识停在训练数据截止那天,专业领域也有盲区(第 09 章:过时与领域缺失都是幻觉病因)。 检索增强生成(RAG)的解法:答题前先去外部资料库搜一圈,把搜到的内容连同问题一起喂给模型。 原书把它拆成三段1:

① 检索 ② 组提示 ③ 生成
问题 ──→ 从文档库搜出 ──→ 资料+指令拼进提示 ──→ 模型参照资料作答
相关资料 │ │
病:搜不准、粒度不对 病:资料太长,塞中间 病:资料里有无关甚至
药:改检索单元、改写查询 的被忽略(本节 §2) 矛盾的内容 → 模型自评
图说:三段流水,每一段都有专门的病,也因此各有一段专门的增强办法(§2、§3)。

第 ① 段的检索有两派做法:关键词检索——给文档建倒排索引 (一张「从词指向包含它的文档」的查找表),按词面匹配找;

语义检索——把文档变成向量,按「意思相近」找最近邻 (向量距离最近的那些文档)。两派都能扛大规模文档库2

2. lost in the middle:给了资料 ≠ 会用资料

第 ② 段的病有个专门名字:lost in the middle——把好几篇长文档直接拼进提示, 模型对开头和结尾的内容用得好,对塞在中间的内容几乎看不见3。 (对照第 05 章的「Λ 形注意力」:模型天生对开头与近邻分配高注意力,这是同一个现象的工程后果。)

两味药。重排:搜回来的文档不按检索分直接塞,而是按与问题的相关度重新排队—— 最相关的放首尾黄金位,不太相关的扔到中后段,无关的干脆删掉; 重排模型还可以拿「大模型用这份资料答得好不好」当奖励信号来训练, 让排序标准贴着生成端的需求走4压缩:把长文档提炼后再塞—— 抽取关键句、自动摘要;更细的做法是按 token 的重要性筛 (用模型算每个 token 的预测概率,留高删低)——但要先保住实体, 不然会把人名的姓删掉、意思全变5

第 ① 段也有增强:检索单元可以从整篇文档换成命题 (语义完整、能独立成立的最小文本片段——原书举例用 GPT-4 造数据、训小模型来抽取), 减少无关内容混入;查询本身也可以让模型改写或拆成子查询6

3. 迭代与自适应:搜几遍、何时搜,交给模型

复杂问题(多跳推理)搜一遍往往不够。迭代检索:把已经生成的内容拼回查询再搜一轮, 如此往复;何时停?让模型自己评估当前答案的置信度(比如看困惑度), 没把握就继续搜7。更进一步,自适应检索把「要不要搜」这个决定整个交给模型: 它可以在生成中发出一个特殊标记来主动触发检索, 或者由一条规则(困惑度过阈值)、一个分类器来判断「现在该查了」8。 ——注意,到这里,RAG 已经不再是「搜一次答一次」的固定管道, 而是一个「模型自己决定何时调用工具」的循环。这正是下一节的主角。

4. 规划:智能体的最小骨架

ICL 和 CoT(第 12 章)能解一锤子买卖的题,但「管理一天的活动」「写一个有多个依赖的程序」 这类复杂任务,需要规划:把大任务拆成一串互相衔接的子任务,逐步执行、随时修正。 原书给出的框架只有三个组件,这是所有智能体系统的最小骨架9:

┌────────────── 循环 ──────────────┐
↓ │
① 规划器(LLM):出计划/出下一个动作 ──→ ② 执行器:照做(模型自己,或机器人)
↑ │
└──────── ③ 环境:执行后给反馈 ──────┘
(反馈再进规划器,修正下一轮动作)
图说:**智能体**(agent,能感知环境、自己做决策并行动的系统)的最小形态:
一个会出主意的 LLM + 一双会执行的手 + 一个会给反馈的世界。

计划可以用自然语言写(「先打鸡蛋,再切番茄」),也可以用代码写—— 需要精确计算或调用工具时,代码能交给解释器严格执行;多跳问答、推荐这类难形式化的任务, 自然语言更合适10

5. 主走查:ReAct 的三步与 Reflexion 的一念之差

出计划有两种策略。一次性生成:一口气写完整套步骤——简单,但容错极低, 中间一步错了满盘皆输。迭代生成:边走边看,代表方法是 ReAct—— 「先想一步,再做一步」:每一轮,规划器输出一段「想法」(分析现状) 和一个「动作」(具体做什么),执行器做完,环境反馈进入下一轮11

原书的多跳问答例(图 11.3a)走一遍12:

问题(多跳):一部剧的导演还导过什么——要先弄清「这部剧是什么」,再查它的导演。

第 ① 轮:想法 1「我需要先搜 Grown-Ups 这部剧的信息」
→ 动作 1:搜索「Grown-Ups」→ 反馈 1:返回该剧资料
第 ② 轮:想法 2「分析资料,线索指向 Allo Allo!」
→ 动作 2:搜索「Allo Allo!」→ 反馈 2:返回对应信息
……每轮:想法(为什么这么做)→ 动作(做什么)→ 反馈(世界怎么说)。
图说:与 CoT 的差别——CoT 的「步骤」全在脑子里推演,
ReAct 的每一步都要到真实环境里走一遭、拿到真的反馈。

ReAct 有个残留问题:一步走岔了,它会带着错误继续往下编。 补救是给循环加一路「内部反馈」:Reflexion——一轮计划失败后, 让模型把「失败的过程」复盘成一段自然语言的反思,这段反思写进下一轮的提示里。 原书记录了它改变行为的实锤(例 11.3b):第一轮的第 ② 步搜的是「Allo Allo!」, 复盘之后,第二轮的第 ② 步改成了搜「Sam Kelly」—— 搜索词本身被反思修正了13

反馈因此分两路:外部反馈——工具报错(代码解释器)、人、虚拟环境的执行结果; 内部反馈——模型自评(「当前这步对吗」),以及把干巴巴的「成功/失败」 扩写成有内容的自然语言总结(Reflexion 就是这一路)14

判断(我们的,不是书里的): RAG 与规划在这一章合流,不是偶然: 检索是智能体的第一个工具,而「何时检索」是第一个被交给模型的决定。 从「固定管道」(搜→答)到「模型自主调用」(自适应检索/ReAct), 跨过的是同一条线——LLM 从「管道里的一个环节」变成「调度环节的大脑」。 第 14 章的多智能体,不过是这个骨架的复制与组网。 如果错,会错在: 如果「端到端(不拆环节、一口气从头干到尾)长思维链」(第 14 章 o1/R1 路线)被证明在多数任务上 优于「外挂工具+显式循环」,这条「骨架合流」的叙事就会被「内化推理」取代—— 目前两条路线并存,各有胜场,原书也是并列讲的。

6. 作者的判断与证据

  • 有论文支撑: lost in the middle 现象3、命题检索单元6、ReAct12、Reflexion13, 均出自各自论文;图 11.3 的搜索词修正是原书示例里的真实记录;
  • 作者的归纳: RAG 三段框架与「每段的病与药」、反馈两路的划分, 是原书对文献的梳理114;
  • 工程建议: 「重排要贴生成端需求」「压缩先保实体」「代码计划用于精确任务」 是原书给的实践建议4510

7. 边界与局限

  • RAG 缓解的是「知识缺失」型幻觉,对「模型本身推理出错」型幻觉无能为力(第 09 章的分类); 而且检索来的资料本身可能有错——原书提醒要与模型内部知识冲突时先过滤。
  • 「模型自评何时检索」依赖模型对自身不确定性的估计,这个估计本身的可靠性没有保证。
  • ReAct 循环的每一步都是一次 LLM 调用,成本与延迟随步数线性涨; 原书没有给「多少步该停」的通用判据。
  • 规划框架假设环境反馈「可观测、可解读」;真实世界(物理环境、 noisy 传感器) 的反馈远比文本环境脏,原书的例子全部在文本世界里。

8. 可带走的

  1. RAG 三段:检索 → 组提示 → 生成;每段有专门的病,各配一药;
  2. 检索两派:关键词(倒排索引)与语义(向量最近邻);检索单元可用「命题」压缩噪音;
  3. lost in the middle:资料塞中间等于没给——重排放首尾,压缩先保实体;
  4. 迭代检索:生成内容拼回查询再搜;自适应检索:让模型自己决定何时搜;
  5. 规划三组件:规划器(LLM)、执行器、环境——一切智能体的最小骨架;
  6. 计划两形态:自然语言(难形式化任务)与代码(精确执行任务);
  7. 一次性出全计划容错低;ReAct:想一步、做一步、收反馈、再想一步;
  8. Reflexion:把失败复盘成自然语言写进下一轮提示——搜索词从「Allo Allo!」改成「Sam Kelly」;
  9. 反馈两路:外部(工具/人/环境)与内部(自评/反思文本);
  10. RAG 是智能体的第一个工具——「何时用工具」是模型接管的第一个调度权。

9. 原文地图

主题原书章原文位置
RAG 动机与三段流程10.4.1text/58-ch10-04-10-4-retrieval-augmented-generation.txt:3(搜「timely, domain-relevant knowledge」) · text/58-ch10-04-10-4-retrieval-augmented-generation.txt:7(搜「three main stages」)
两派检索10.4.1text/58-ch10-04-10-4-retrieval-augmented-generation.txt:11(搜「inverted index」)
lost in the middle10.4.1text/58-ch10-04-10-4-retrieval-augmented-generation.txt:13(搜「lost in the middle」)
重排与压缩10.4.2text/58-ch10-04-10-4-retrieval-augmented-generation.txt:33(搜「reranking model」) · text/58-ch10-04-10-4-retrieval-augmented-generation.txt:35(搜「surname」)
命题检索单元10.4.2text/58-ch10-04-10-4-retrieval-augmented-generation.txt:25(搜「propositions」)
查询改写与蒸馏10.4.2text/58-ch10-04-10-4-retrieval-augmented-generation.txt:27(搜「query expansion」)
迭代与自适应检索10.4.2text/58-ch10-04-10-4-retrieval-augmented-generation.txt:41(搜「iterative retrieval」) · text/58-ch10-04-10-4-retrieval-augmented-generation.txt:43(搜「adaptive retrieval」)
训练侧增强10.4.2text/58-ch10-04-10-4-retrieval-augmented-generation.txt:49(搜「position bias」)
规划三组件11.1.1text/62-ch11-01-11-1-llm-based-planning.txt:7(搜「task planner, the plan executor, and the environment」)
自然语言 vs 代码计划11.1.2text/62-ch11-01-11-1-llm-based-planning.txt:7(搜「code snippets」) · text/62-ch11-01-11-1-llm-based-planning.txt:25(搜「multi-hop question answering」)
一次性 vs 迭代/ReAct11.1.2text/62-ch11-01-11-1-llm-based-planning.txt:19(搜「low fault tolerance」) · text/62-ch11-01-11-1-llm-based-planning.txt:29(搜「ReAct」)
ReAct 多跳例11.1.2text/62-ch11-01-11-1-llm-based-planning.txt:31(搜「Allo Allo!」)
外部反馈11.1.3text/62-ch11-01-11-1-llm-based-planning.txt:43(搜「code interpreters」)
Reflexion 与搜索词修正11.1.3text/62-ch11-01-11-1-llm-based-planning.txt:53(搜「Reflexion」) · text/62-ch11-01-11-1-llm-based-planning.txt:55(搜「Sam Kelly」)

Footnotes

  1. 出处:「10.4.1 Basic Process of RAG」第 7 段(text/58-ch10-04-10-4-retrieval-augmented-generation.txt:7,搜「three main stages」)。 2

  2. 出处:「10.4.1 Basic Process of RAG」第 11 段(text/58-ch10-04-10-4-retrieval-augmented-generation.txt:11,搜「inverted index」;同段搜「approximate nearest neighbor」)。

  3. 出处:「10.4.1 Basic Process of RAG」第 13 段(text/58-ch10-04-10-4-retrieval-augmented-generation.txt:13,搜「lost in the middle」)。 2

  4. 出处:「10.4.2 Prompt Enhancement」第 33 段(text/58-ch10-04-10-4-retrieval-augmented-generation.txt:33,搜「reranking model」;同段搜「reward scores」)。 2

  5. 出处:「10.4.2 Prompt Enhancement」第 35 段(text/58-ch10-04-10-4-retrieval-augmented-generation.txt:35,搜「surname」)。 2

  6. 出处:「10.4.2 Retrieval Enhancement」第 25 段(text/58-ch10-04-10-4-retrieval-augmented-generation.txt:25,搜「propositions」)。 2

  7. 出处:「10.4.2 Retrieval Process Enhancement」第 41 段(text/58-ch10-04-10-4-retrieval-augmented-generation.txt:41,搜「iterative retrieval」;同段搜「perplexity」)。

  8. 出处:「10.4.2 Retrieval Process Enhancement」第 43 段(text/58-ch10-04-10-4-retrieval-augmented-generation.txt:43,搜「adaptive retrieval」)。

  9. 出处:「11.1.1 Overall Framework」第 7 段(text/62-ch11-01-11-1-llm-based-planning.txt:7,搜「task planner, the plan executor, and the environment」)。

  10. 出处:「11.1.2 Plan Generation」第 7 段(text/62-ch11-01-11-1-llm-based-planning.txt:7,搜「code snippets」)与第 25 段(text/62-ch11-01-11-1-llm-based-planning.txt:25,搜「multi-hop question answering」)。 2

  11. 出处:「11.1.2 Plan Generation」第 19 段(text/62-ch11-01-11-1-llm-based-planning.txt:19,搜「low fault tolerance」)与第 29 段(text/62-ch11-01-11-1-llm-based-planning.txt:29,搜「ReAct」)。

  12. 出处:「11.1.2 Iterative Plan Generation」第 31 段(text/62-ch11-01-11-1-llm-based-planning.txt:31,搜「Allo Allo!」)。 2

  13. 出处:「11.1.3 Internal Feedback」第 53-55 段(text/62-ch11-01-11-1-llm-based-planning.txt:53,搜「Reflexion」;text/62-ch11-01-11-1-llm-based-planning.txt:55,搜「Sam Kelly」)。 2

  14. 出处:「11.1.3 Feedback Acquisition」第 37-53 段(text/62-ch11-01-11-1-llm-based-planning.txt:43,搜「code interpreters」;text/62-ch11-01-11-1-llm-based-planning.txt:51,搜「Is the current action step correct」)。 2