Lecture 9 · 规划即搜索——思维树、世界模型与蒙特卡洛树搜索 · Planning as Search

Advanced Large Language Models Research Seminar · Lecture 09。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 Maps to:CS486 课程描述的 “enhance LLM planning”——规划部分(第 8–11 讲)的第二讲:第 8 讲把搜索交给经典规划器、把 LLM 放在搜索之外;这一讲把 LLM 放进搜索里,当策略、当评估器、当世界模型。 依据说明:CS486 没有公开的日程或讲义。本讲依据启发式搜索与蒙特卡洛树搜索的经典内容(A*、UCT、AlphaZero 的 PUCT、MuZero),以及把 LLM 放进搜索的主要文献:Tree of Thoughts(Yao et al. 2023)、RAP(Hao et al. 2023)、LATS(Zhou et al. 2024)、树搜索与判别器(Chen et al. 2024)、Thought of Search(Katz et al. 2024)、LLM 当世界模拟器(Wang et al. 2024)、把搜索学进模型(Stream of Search、Searchformer)等。§4–§6 的实验是本讲义自己设计的,数字全部来自配套代码的实际输出。 配套代码 Code:code/lecture09/(PyTorch;3 个脚本 + 1 个模块;复用第 8 讲的积木世界和提议者;第一次运行共约 5 分钟——训练价值函数约 40 秒、世界模型约 25 秒;之后每个脚本 1–2 分钟) 预计阅读时间:3.5 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 把任何”LLM + 搜索”的方法拆成四个零件——状态转移(世界模型)、候选动作(策略)、状态评估(价值函数)、搜索算法——并说出 ToT、RAP、LATS、AlphaZero 式方法各自怎样实现这四个零件。
  2. 写出贪心、束搜索、最佳优先(A*)、MCTS(UCT / PUCT)的核心步骤,知道它们分别适合什么样的问题。
  3. 用实验说明:把同一个”会说计划”的模型放进搜索,能提高多少、花多少调用;为什么”闭环”需要记忆;为什么候选的提议是搜索的上限。
  4. 解释为什么价值函数的”准确率”预测不了搜索的成败:误差的结构(落在哪些状态上、是否每次都一样)和误差的大小一样重要;评估器要在搜索会访问的状态分布上测。
  5. 解释学出来的世界模型的三个问题:一步误差随步数累积、搜索会”钻”模型的空子、闭环(MPC)能把错误从致命变成可恢复。
  6. 区分”在推理时搜索”和”把搜索学进模型”(Stream of Search、Searchformer、推理模型的长思维链),并在比较搜索方法时报告计算量匹配的基线。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲不展开 Not covered
第 4 讲:覆盖率 vs 选择;验证器;best-of-N 的过度优化;束搜索对抗搜索的博弈论细节(minimax、α-β)
第 5 讲:奖励黑客;“长思维链”是怎么来的MCTS 的收敛性证明(只给直觉)
第 7 讲:可靠的反馈 vs 内在反馈部分可观测与随机环境中的规划(第 11 讲)
第 8 讲:积木世界、STRIPS、A*、可采纳启发、提议者、LLM-Modulo智能体在真实环境里的搜索(第 11 讲)

0.3 本讲地图 Map

§1  为什么要搜索:从"写出来"到"找出来";搜索的四个零件
§2  把 LLM 放进搜索:ToT、RAP、LATS、AlphaZero 式方法、智能体的树搜索
§3  搜索算法速览:贪心、束搜索、最佳优先 / A*、MCTS(UCT、PUCT)
§4  实验一:同一个提议者,不同的搜索——闭环与记忆、成本、MCTS、提议是瓶颈         ← 代码 01
§5  实验二:价值函数——准确率说明不了全部;误差的结构;在搜索的分布上评估          ← 代码 02
§6  实验三:学出来的世界模型——误差累积、搜索钻空子、闭环补救                    ← 代码 03
§7  把搜索学进模型:Stream of Search、Searchformer、推理模型
§8  现状与开放问题
§9–13  小结、常见误区、练习、延伸阅读、下一讲预告

1.1 从”写出来”到”找出来”

第 8 讲的提议者是一个”写计划”的模型:读完题目,一个字一个字地写出整个计划,从不回头。它在 5 块积木上 44%,7 块上 0%。它犯的错大多是跟丢了状态——写到第三四步时,已经不知道每块积木在哪了。

人解决同样的问题时不是这样做的。我们会试一步、看看局面、觉得不对就退回去换一条路。这就是搜索:在可能的动作序列构成的树(或图)里,有系统地探索、比较、回溯。经典规划器(A*)就是这样工作的,而且在积木世界上 100% 正确。

第 4 讲已经见过最简单的搜索:采样 N 个答案再挑一个(best-of-N),以及逐步的束搜索。这一讲把它推广到规划:每一步都是一个决策,决策之间有依赖,错误的早期决策需要回溯才能纠正。

Kahneman 的 System 1 / System 2(第 1 讲)在这里有一个很具体的对应:System 1 是”一口气写出来”(一次前向、一条路径),System 2 是”有意识地搜索”(多条路径、评估、回溯)。

1.2 搜索的四个零件

任何一个搜索过程都需要四样东西:

零件回答的问题经典规划里把 LLM 放进来时
状态转移(世界模型)在状态 s 做动作 a,会到哪个状态?规则(STRIPS 的前提与效果)LLM 预测”做了这个之后世界变成什么样”(RAP)
候选动作(策略)在 s,哪些动作值得试?所有合法动作LLM 提出几个”想法”(ToT),或给每个动作一个概率(AlphaZero 的先验)
状态评估(价值函数)s 离目标还有多远 / 有多大希望?启发函数(misplaced、FF 启发)LLM 打分(“sure / likely / impossible”)、训练出的价值网络或过程奖励模型
搜索算法按什么顺序展开、保留哪些、何时回溯?BFS、A*BFS、DFS、束搜索、MCTS

另外还有一个常被忽略的零件:目标检查(是否已经到达目标)。在积木世界里它是精确的;在数学、写代码、写报告时,它往往本身就是一个不可靠的评估器(第 4、7 讲)。

这张表是读这一讲(以及大量”LLM + 搜索”论文)的钥匙:一个方法的好坏,常常取决于它的哪个零件是可靠的、哪个是 LLM 猜的。本讲的三个实验分别把这三个零件——策略、价值函数、世界模型——换成学出来的模型,看各自会带来什么问题。


2.1 Tree of Thoughts

ToT(Yao et al. 2023,NeurIPS)把问题分解成若干步”想法”(thought),每个想法是一段文本(例如 Game of 24 里的一个中间等式)。每一步:

  1. 提议:让 LLM 根据当前的部分解,提出几个候选的下一步想法;
  2. 评估:让 LLM 评价每个部分解(例如分成 sure / likely / impossible 三档);
  3. 搜索:BFS(每一层保留最好的 b 个)或 DFS(沿最有希望的分支深入,评估为”不可能”时回溯)。

Game of 24(用 4 个数和加减乘除凑出 24,取 4nums.com 上较难的 100 题):GPT-4 直接回答 7.3%,思维链 4.0%,思维链 + 自洽性 9.0%;ToT 在 b = 1 时 45%、b = 5 时 74%。注意论文同时报告了”思维链采样 100 次取最好的”(用正确答案判断,即 oracle best-of-100)49%——ToT 的提高有一部分来自更多的采样,比较时要注意计算量。

2.2 RAP:LLM 当世界模型

RAP(Reasoning via Planning,Hao et al. 2023,EMNLP)把推理看成规划:LLM 同时扮演世界模型(预测动作后的状态)和策略(提出动作),再加上由 LLM 计算的奖励(例如对动作的自我评估、到目标的相似度),用 MCTS 搜索。在积木世界(PlanBench 的题,按最少步数 2 / 4 / 6 步分组)上,RAP(LLaMA-33B,20 次迭代)的成功率是 1.00 / 0.88 / 0.42,GPT-4 + 思维链是 0.50 / 0.63 / 0.40;论文的说法是 RAP 在 LLaMA-33B 上相对 GPT-4 思维链提高了 33%。值得注意的是:最难的 6 步题上差距几乎消失——搜索在浅层问题上帮助最大,深层问题上世界模型的误差和搜索的成本都会累积(§6)。

2.3 LATS 与智能体的树搜索

LATS(Language Agent Tree Search,Zhou et al. 2024,ICML)把 MCTS 用在智能体任务上:节点是智能体与环境交互的历史,扩展时让 LLM 提出动作并在真实环境里执行(得到真实的观察,而不是 LLM 想象的),用 LLM 打分加上环境反馈作为价值,失败时让 LLM 写”反思”放进后续的提示(Reflexion 的做法)。报告的结果:HumanEval pass@1 92.7%(GPT-4),WebShop 平均得分 75.9(GPT-3.5)。

Koh et al.(2024,“Tree Search for Language Model Agents”)在真实网页环境里做最佳优先搜索:GPT-4o 智能体加上搜索,VisualWebArena 的成功率相对提高 39.7%(到 26.4%),WebArena 相对提高 28.0%(到 19.2%),而且成功率随搜索预算增加。这里的关键前提是环境可以回退(回到之前的网页状态)——第 11 讲会看到,在不可逆的环境里这种搜索要付出代价。

2.4 AlphaZero 式:学出来的策略和价值

AlphaGo / AlphaZero(Silver et al. 2016、2017)的配方:一个策略网络给每个动作先验概率,一个价值网络估计局面的胜率,MCTS 用 PUCT 公式(§3.3)把两者结合起来;搜索得到的更好的动作分布再反过来训练策略网络(“搜索当老师”)。MuZero(Schrittwieser et al. 2020)进一步把规则也换成学出来的模型(在潜在空间里预测下一个状态、奖励和价值)。

在 LLM 推理上的对应:用 MCTS 搜索推理步骤,用过程奖励模型(PRM,第 4 讲)当价值函数,再用搜索出的轨迹训练模型。例如 rStar-Math(Guan et al. 2025)用 MCTS + 一个过程偏好模型、经过四轮自我演化,把 Qwen2.5-Math-7B 在 MATH 上从 58.8% 提到 90.0%(Phi3-mini-3.8B 从 41.4% 到 86.4%),AIME 平均解出 53.3%。

2.5 一张对照表

方法世界模型策略(候选)价值(评估)搜索
ToT(Game of 24)规则显然(算术)LLM 提出 b 个想法LLM 三档打分BFS / DFS
RAP(积木世界)LLM 预测LLMLLM 计算的奖励MCTS
LATS(网页、代码)真实环境LLMLLM 打分 + 环境反馈MCTS
Koh et al.(网页)真实环境(可回退)LLMLLM 打分最佳优先
AlphaZero规则策略网络价值网络PUCT-MCTS
MuZero学出来的模型策略网络价值网络PUCT-MCTS
经典规划(A*)规则全部合法动作人写的启发函数A*

读论文时先填这张表:哪一格是可靠的、哪一格是 LLM 猜的,基本决定了这个方法在什么条件下有效。


3. 搜索算法速览 · A quick tour of search algorithms

代码:search_lab.py 里每个算法都有详细注释,这里只讲直觉和公式。

3.1 贪心与束搜索

  • 贪心:每一步选当前看起来最好的动作,不回头。第 8 讲的提议者”一口气写完”就是贪心。
  • 束搜索(beam search):每一层保留最好的 W 个部分解(“束宽” W),展开它们的所有子节点,再保留最好的 W 个。W = 1 就是贪心,W = ∞ 就是 BFS。它不回溯,但同时追踪几条路,给”第二选择”留了机会。ToT 的 BFS 版本就是束搜索:打分来自 LLM 评估器。

3.2 最佳优先与 A*

最佳优先(best-first)维护一个”边界”(所有生成了但还没展开的状态),每次展开估计最好的那个。A* 用 f(s)=g(s)+h(s)f(s) = g(s) + h(s):已走的步数加上对剩余步数的估计。第 8 讲讲过,hh 可采纳(从不高估)时,A* 找到的计划最短。它和束搜索的关键区别是可以回到很早以前的分支:只要那里的 f 更小。

3.3 MCTS:UCT 与 PUCT

蒙特卡洛树搜索(MCTS)反复做四件事:

  1. 选择:从根往下,每一步按一个”既看平均价值、又照顾试得少的动作”的公式选子节点;
  2. 扩展:到达一个新节点,把它加入树;
  3. 评估:估计这个节点的价值——随机模拟到底(rollout),或者问价值网络;
  4. 回传:把价值沿路径传回去,更新每个节点的访问次数 N 和累计价值 W。

选择公式有两个经典版本。UCT(Kocsis & Szepesvári 2006)把每个节点当成一个多臂老虎机:

a∗=arg⁡max⁡a  Q(s,a)+cln⁡N(s)N(s,a)a^* = \arg\max_a \; Q(s,a) + c\sqrt{\frac{\ln N(s)}{N(s,a)}}

PUCT(AlphaZero)加入策略的先验 P(s,a)P(s,a):

a∗=arg⁡max⁡a  Q(s,a)+c⋅P(s,a)⋅N(s)1+N(s,a)a^* = \arg\max_a \; Q(s,a) + c \cdot P(s,a) \cdot \frac{\sqrt{N(s)}}{1 + N(s,a)}

直觉:第一项是”利用”(这个动作至今的平均价值),第二项是”探索”——策略越看好、试得越少的动作,加分越多;随着访问次数增加,探索项衰减,搜索越来越集中在真正好的动作上。

MCTS 的设计目标是估计每个动作的期望价值,所以它特别适合有对手、有随机性、价值需要平均的问题(围棋、带随机性的游戏)。§4.4 会看到,在”确定性、目标可检查、只需要找到一条路”的规划问题上,它不一定是最好的选择。

3.4 要报告什么

比较搜索方法时,至少要报告:成功率、计算量(模型调用次数、展开的节点数、token 数)、解的质量(是否最短)。第 2 讲的”计算量匹配的基线”在这里尤其重要:一个用了 100 倍调用的搜索方法打败了贪心,并不说明搜索算法本身有什么高明之处——和同样调用次数的简单采样比才公平(Kapoor et al. 2024 发现,在 HumanEval 上,“失败就提高温度重试”这样的简单基线能达到 LATS 的准确率,而成本低得多,第 11 讲)。


4. 实验一:同一个提议者,不同的搜索 · Same proposer, different searches

代码:01_search_with_a_proposer.py(第一次约 2.5 分钟,含训练价值函数约 40 秒)。

4.1 设置

  • 策略:第 8 讲的提议者(2 层 TinyReasoner,在 3–5 块积木的最短计划上训练)。把状态 s 和目标 g 交给它,它写出的第一个动作的概率就是”在 s 该做什么”:P(x,y)=P(第一个字符=x)⋅P(第二个字符=y∣x)P(x, y) = P(\text{第一个字符}=x)\cdot P(\text{第二个字符}=y \mid x)。只保留真实模拟器认为合法的动作,重新归一化(search_lab.Policy)。
  • 价值函数:另一个 2 层 TinyReasoner,同样在 3–5 块积木的题上训练,输入和提议者相同,输出最短计划的步数(A* 算出的标签),取期望值当估计(search_lab.train_value)。
  • 世界模型:本节用真实的模拟器。
  • 题目:和第 8 讲代码 03 完全相同的 4 组题(n = 4–7 块积木,每组 100 道),所以可以直接和第 8 讲的 LLM-Modulo 比较。

4.2 闭环与记忆

最简单的”把模型放进搜索”:每一步把真实状态告诉提议者,执行它最想做的合法动作。它不再需要在”脑子里”推演整个计划——这正是它在第 8 讲里失败的地方。

n开环(第 8 讲)闭环、无记忆失败中兜圈子闭环 + 记住走过的状态初始状态下合法动作上的概率
477%51%4972%0.95
544%21%7947%0.88
65%4%9621%0.81
70%2%984%0.66

两个出乎意料的结果:

  1. 没有记忆的闭环比开环还差,而且失败全部是兜圈子:提议者每次只看眼前,在两个状态之间来回横跳(把 a 搬到桌上 → 把 a 搬回去 → ……)。这是智能体最常见的失败模式之一(第 11 讲)。经典搜索算法用”已访问集合”(closed list)防止它;LLM 智能体需要显式的记忆或循环检测。
  2. 加上记忆,大题明显变好(n = 6:5% → 21%),但 n = 4 反而略差(77% → 72%)。一口气写出的计划前后连贯;每一步重新问一次的”第一步”不一定和后面的步骤配合。闭环不是免费的。

最后一列说明了另一件事:提议者在初始状态下放在合法动作上的总概率随 n 下降(0.95 → 0.66)。规则知识(哪些动作合法)是第 8 讲的提议者最缺的;真实模拟器把这部分补上了。

4.3 几种搜索算法

方法用到n = 4n = 5n = 6n = 7
闭环贪心 + 记忆策略72%47%21%4%
束搜索 W = 4策略100%88%65%28%
束搜索 W = 16策略100%97%80%44%
ToT 式 BFS W = 4策略 + 价值91%68%39%23%
最佳优先(≤ 300 个状态)策略 + 价值100%88%53%31%
MCTS(≤ 300 个状态)策略 + 价值98%61%22%10%
BFS(盲目)—100%100%100%100%
A*(misplaced)人写的启发100%100%100%100%

成本(平均展开的状态数 / 平均模型调用次数,同一状态只算一次):

方法n = 4n = 5n = 6n = 7
束搜索 W = 47 / 719 / 1937 / 3764 / 64
束搜索 W = 1614 / 1441 / 41105 / 105215 / 215
ToT 式 BFS W = 410 / 2732 / 15750 / 46573 / 1086
最佳优先10 / 3677 / 263183 / 1015242 / 2091
MCTS27 / 17147 / 76262 / 152276 / 191
BFS(盲目)10 / 092 / 0729 / 05140 / 0
A*5 / 010 / 024 / 045 / 0

读这两张表:

  1. 搜索把提议者的”第二、第三选择”变成了成功。只用策略的束搜索 W = 16 在 n = 5 / 6 / 7 上 97% / 80% / 44%;同一个提议者在第 8 讲的 LLM-Modulo(可靠验证器 + 10 轮反馈)里是 74% / 16% / 4%。代价是调用次数:n = 5 时平均 41 次,LLM-Modulo 是 4.5 次。
  2. 加上学出来的价值函数反而更差,也更贵。ToT 式 BFS(W = 4)在 n = 5 / 6 上 68% / 39%,比只按策略概率的束搜索 W = 4(88% / 65%)低 20 多个点;而且它要给每个候选打分,n = 6 时平均调用 465 次。这和”加评估器总会有帮助”的直觉相反——§5 专门研究原因。
  3. 人写的启发函数完胜。A* 全部 100%,n = 7 平均只展开 45 个状态、不调用模型。盲目的 BFS 也是 100%,只是展开得多(n = 7:5140 个)。

4.4 MCTS 在这里最慢

同样的预算下(n = 5,展开 ≤ 30 / ≤ 100 / ≤ 300 个状态),最佳优先成功 48% / 72% / 88%,MCTS 41% / 50% / 61%。练习 3 调了 MCTS 的两个参数(探索常数 c ∈ {0.3, 1, 3}、折扣 γ ∈ {0.8, 0.95}),300 个状态时在 39%–62% 之间,都不如最佳优先——不是调参的问题。

一个解释:MCTS 把预算分散在很多分支上,为的是可靠地估计每个动作的平均价值;在确定性、目标可检查的问题里,一旦碰到目标就可以停,“往最有希望的地方一直钻”的方法更快。RAP 在积木世界上用 MCTS 有效,但它的提高集中在浅层问题上(§2.2)。选搜索算法要看问题的结构:有对手或随机性时 MCTS 的平均是必要的;单人、确定性、只需要一条路时,最佳优先或束搜索通常更省。

4.5 提议是瓶颈

如果每个状态只展开提议者最看好的 b 个动作(ToT 里”提出 b 个想法”),再好的评估器也只能在这 b 个里挑。演示 3 用 misplaced 当评估器(它从不误导,§5),束宽 4:

n每个状态展开 b 个前 b 个里有最优动作成功
5158%21%
5272%29%
5382%52%
5597%98%
5全部100%100%
6368%19%
6582%81%
6全部100%100%

提议者的前 3 个动作里只有 82% 的时候包含最优动作(n = 5),一条 8 步的路要每一步都”被提出来”,成功率就掉到 52%。这是第 4 讲”覆盖率”在搜索里的版本:评估器只能在提出来的候选里挑,提议的召回率是搜索的上限。ToT 论文里 b 从 1 到 5 的提高(45% → 74%)也部分来自这一点。


5. 实验二:价值函数——准确率说明不了全部 · Value functions

代码:02_value_functions.py(约 1–1.5 分钟)。

5.1 背景:Chen et al. 的发现

Chen et al.(2024,ACL,“When is Tree Search Useful for LLM Planning? It Depends on the Discriminator”)在文本到 SQL 和数学推理上比较了三种用判别器(价值函数)的方式:重排序(采样若干完整答案、挑判别器最喜欢的)、迭代修正、树搜索。结论:判别器的准确率要到约 90%,后两种”高级”方法才明显好过简单的重排序;当时的 LLM 判别器达不到这个水平;树搜索还慢得多。

这个结论很重要,但它把判别器的质量压缩成了一个数——准确率。我们的设置可以做 Chen et al. 做不了的控制实验:真实距离已知,所以可以造出”准确率任意可调”的价值函数,也可以把学出来的价值函数的误差拿出来随意重新分配。

5.2 静态质量

在每道题初始状态的所有子状态之间两两比较(真实距离不同的每一对),看价值函数排对、打平还是排反;再看沿最短路径的状态上,和真实距离的相关(n = 5):

价值函数排对打平排反相关(路径上)
学出来的价值函数81%0%19%0.61
misplaced(人写)71%29%0%0.93
神谕 + 独立噪声 σ = 0.594%0%6%0.94
神谕 + 独立噪声 σ = 179%0%21%0.80
神谕 + 独立噪声 σ = 265%0%35%0.55
神谕 + 独立噪声 σ = 456%0%44%0.30

“神谕 + 独立噪声”= 真实距离加上每个状态独立的高斯噪声(同一个状态每次都一样)。按”排对”这个最常用的指标,学出来的价值函数(81%)和 σ = 1 的噪声神谕(79%)差不多,比 misplaced(71%)还好。

5.3 静态质量 vs 搜索的成败

价值函数静态排对ToT 式 BFS(n = 5 / 6)最佳优先(n = 5 / 6)
不用价值函数(按策略概率)—88% / 65%—
学出来的价值函数81%68% / 39%88% / 53%
misplaced(人写)71%100% / 100%100% / 100%
神谕 + 噪声 σ = 179%100% / 100%100% / 100%
神谕 + 噪声 σ = 265%94% / 91%100% / 98%
神谕 + 噪声 σ = 456%74% / 58%99% / 78%

静态准确率预测不了搜索的成败:σ = 2 的噪声神谕只排对 65%,搜索却有 94% / 91%;学出来的价值函数排对 81%,搜索只有 68% / 39%——比不用价值函数还差。按 Chen et al. 的框架,我们会说”学出来的判别器准确率不够”;可是准确率更低的噪声神谕却够了。区别在哪?

5.4 控制实验:误差落在哪些状态上

把学出来的价值函数在搜索中的误差原样收集起来(n = 5:均值 +0.02、标准差 0.81),再随机分配给各个状态——“真实距离 + 从这组误差里随机抽一个”。误差的大小分布完全相同,唯一的区别是:哪个状态错多少,和状态本身无关了。

n价值函数每层留住了最近的状态ToT 式 BFS 成功
5学出来的60%68%
5同一组误差,随机分配(3 个种子)94% / 95% / 96%100% / 100% / 99%
6学出来的45%39%
6同一组误差,随机分配(3 个种子)93% / 95% / 94%100% / 100% / 100%

(“每层留住了最近的状态”= 束搜索的每一层,保留下来的 4 个状态里是否包含所有候选中离目标最近的那个。)

误差大小完全一样,搜索从 68% 变成 100%。问题不在误差有多大,而在误差落在哪些状态上:

  • 学出来的价值函数的误差是状态的确定函数:它在某一类状态上每次都错,搜索每次走到那里都被同样地误导,换一条路也是同一类状态、同样的错;
  • 随机分配的误差在下一层就和上一层无关,即使这一层挑错了,下一层还有机会绕回来。

这和第 4 讲的”相关错误投不掉”是同一个道理:独立的错误会被搜索(或投票)平均掉,相关的错误不会。(原型里还试过一种”按事实相关”的噪声:每个 on(x, y) 事实一个固定的随机权重,相邻状态共享大部分事实,误差因此相关。同样的静态准确率下,它让搜索比独立噪声差,但仍远好于学出来的价值函数——相邻状态之间的相关是一部分原因,“错在哪一类状态上”是另一部分,见 §5.5。)

5.5 学出来的价值函数错在哪里

两个发现:

  1. 它在搜索真正比较的状态上更差:初始状态的子状态上排对 81%(n = 5),搜索过程中实际比较的状态上只有 69%(n = 6:82% → 66%)。
  2. 它分不清”快到了”。按真实距离分组,沿最短路径的状态上的平均预测(n = 5):
真实距离1234567
平均预测3.23.13.54.04.65.46.2

离目标 1、2、3 步的状态,它的预测几乎一样——而搜索的最后几步恰恰全是在这种状态之间做选择。

一个自然的猜测是训练数据里这种状态太少:随机生成的 5 块积木题只有 2.8% 离目标 1 步。练习 2 检验了这个猜测:把一半训练数据换成最短路径上的中间状态(大量”快到了”的状态)重新训练,n = 5 的 ToT 式 BFS 从 68% 提到 77%、最佳优先从 88% 提到 99%,但 n = 6 几乎没变(39% → 36%、53% → 57%),而离目标 1 / 2 / 3 步的平均预测仍然是平的(2.7 / 2.7 / 3.0)。所以数据分布只是一部分原因;更可能的是,判断”只差一步”需要把状态和目标逐块比较,这对 2 层的小模型太难——它学到的更像是一个”大概有多乱”的粗略印象。

不管原因是什么,教训是一样的:评估一个价值函数(或 PRM、LLM 裁判),要在搜索会访问的状态分布上测。搜索本身会把你带到评估器最不熟悉的地方——第 4 讲的离策略盲区、第 5 讲的奖励黑客都是这件事的不同面目。AlphaZero 用自我对弈时搜索实际访问的局面训练价值网络,部分原因正在于此。

5.6 “不知道”比”自信地错”好

misplaced 排对只有 71%,却是最好用的价值函数。它的错全是”打平”(29%)——它说不出两个状态哪个更近——但它从不排反(0%)。对搜索来说,打平只是让搜索多试几个;排反会把搜索系统性地引向错误的方向。

这也是 Thought of Search(Katz et al. 2024,NeurIPS)的思路:与其在每个节点调用 LLM 打分(不可靠、昂贵),不如让 LLM 写出后继函数和目标检查的代码,交给经典的 BFS / DFS。他们在 4 个经典搜索问题上用很少的 LLM 调用达到 100% 准确率,而对比的方法需要多得多的调用、准确率更低。LLM 擅长写出”关于问题结构的知识”(第 8 讲 §6 的思路),搜索算法负责可靠地使用这些知识。


6. 实验三:学出来的世界模型 · Learned world models

代码:03_world_models.py(第一次约 1.5 分钟)。

6.1 背景

前两个实验都用了真实的模拟器。很多实际问题没有模拟器:网页的下一个状态、一个化学反应的结果、一段代码改动之后的行为。RAP 让 LLM 自己预测”做了这个动作之后世界变成什么样”;MuZero 学一个潜在空间里的模型。

LLM 能当可靠的模拟器吗?Wang et al.(2024,ACL,“Can Language Models Serve as Text-Based World Simulators?”)在文本游戏的状态转移上测试 GPT-4:给出人写的规则时,预测完整的下一状态(动态转移)准确率 59.9%;其中由动作直接引起的变化 77.1%,由环境自身引起的变化(例如时间流逝导致的变化)只有 38.6%。他们的结论是 GPT-4 还不能当可靠的世界模拟器。

我们训练一个 2 层 TinyReasoner 当世界模型:输入”状态 + 动作”,输出下一个状态(search_lab.train_world_model),同样只在 3–5 块积木上训练。

6.2 一步准确率与误差累积

积木数34567
下一个状态完全正确99.7%95.0%82.3%30.7%0.3%

“预测下一个状态”看起来只是抄写加一处修改,但对小模型来说状态越长越难,出了训练分布就崩溃(第 6 讲的长度问题在世界模型里同样存在)。

沿着真实的最短计划在模型里一步步推演,第 k 步时”模型以为的状态”还等于真实状态的比例(n = 5):

k123456
模型推演94%81%55%43%37%26%
一步准确率的 k 次方82%68%56%46%38%31%

误差大致按一步准确率的 k 次方累积。一步 82% 听起来尚可,6 步之后只剩约四分之一。把这个算术套到 Wang et al. 的 59.9% 上,就明白为什么”LLM 在脑子里模拟多步”的规划很难可靠。

6.3 在模型里规划:搜索会钻空子

在世界模型里面做 A*(后继状态全部由模型预测),找到”模型认为能到达目标”的计划,再用可靠的验证器在真实世界里检查:

n计划从哪来模型说能到目标真实世界里能执行模型说”能”时的可信度
4A* 在模型里搜索1009595%
4提议者独立写出,交给模型检查6969100%
5A* 在模型里搜索987981%
5提议者独立写出,交给模型检查161594%

同一个模型、同样的一句”能到目标”,当计划是在模型里搜索出来的时,可信度明显更低(81% vs 94%)。按搜索的费力程度分组(n = 5):展开 ≤ 10 个状态就找到的计划 34/40 能执行,11–50 个的 32/38,50 个以上的只有 13/20。

**搜索越费力,找到的计划越不可信。**容易的题,真实的路很近;难的题,搜索在模型里找了很久,最后找到的常常是穿过某个错误转移的”捷径”。一个例子:从 c;i;j;l 到 ic;jl,模型以为第二步”把 l 放到 c 上”之后就是目标状态 ic;jl(相当于把 l 放到了 j 上),实际上是 icl;j。模型的这个错误恰好”连通”了目标,A* 就找到了它。

这和第 4 讲 best-of-N 的过度优化、第 5 讲的奖励黑客是同一个现象:优化压力越大,越会找到评估者的错误。只是这里被”钻空子”的不是奖励模型,而是世界模型。基于模型的强化学习里,这叫”模型利用”(model exploitation)。

另一面:模型当”检查者”时,漏判远多于误判。提议者在 n = 5 上真正合法的计划有 44 个,模型只认可了其中 15 个——模型的错误让很多正确的计划”走不通”。

6.4 闭环:把错误从致命变成可恢复

模型预测控制(model predictive control,MPC):在模型里规划 → 只执行第一步 → 观察真实的新状态 → 重新规划。

n开环:在模型里规划一次就执行闭环 MPC平均规划次数A*(真实模拟器)
495%97%3.5100%
579%92%5.8100%

每一步都用真实观察纠正”模型以为的状态”,模型的错误只影响眼前一步的决策,不会一路累积下去。这是智能体在环境里行动的基本形式(第 11 讲),也是运行时重规划(第 10 讲)的最简单版本。代价是要在真实环境里一步步执行、要多次规划;而且环境必须”容得下”一步走错——不可逆的动作(删文件、发邮件、下单)不能这样试错。

练习 4 换了一个在 3–7 块积木上训练的世界模型(同样 3000 步):一步准确率在 n = 5 / 6 / 7 上是 98.7% / 98.3% / 96.0%,在模型里 A* 找到的计划全部能执行(n = 5 / 6 / 7:100 / 100 / 97 道,都是真的)。世界模型足够准时,错误很少恰好造出通向目标的”捷径”;钻空子需要模型有足够多、足够”有用”的错误。


推理时搜索(§2–§6)要在外面写一个搜索算法、多次调用模型。另一条路是让模型自己在思维链里搜索:把试错、回溯写成文字。

  • Stream of Search(Gandhi et al. 2024,COLM):在 Countdown(用给定的数凑出目标数)上,用多种启发式搜索生成”带错误和回溯的搜索过程”,把它们线性化成文本来训练语言模型。比只训练”最优解路径”的模型,搜索准确率提高 25%;再用 STaR 或 APA 做策略改进,能解出 36% 原来解不出的题,包括所有启发式求解器都解不出的题。
  • Searchformer(Lehnert et al. 2024):训练 Transformer 预测 A* 的搜索过程(加入和移出搜索树的状态序列),再用”更短的搜索过程”自举微调。在没见过的推箱子(Sokoban)题上 93.7% 找到最优解,搜索步数比 A* 最多少 26.8%。
  • 推理模型:第 5 讲看到,o1、DeepSeek-R1 这样的模型的长思维链里有大量”等一下,这样不对,换一种方法”——一种学出来的、写在文字里的回溯搜索。第 5 讲的实验也显示,这种行为可以在 RL 中被”挑出来”并放大。

两条路的权衡:

推理时搜索(外部算法)学会搜索(写在思维链里)
可靠性搜索的系统性由算法保证(不会忘记回溯、不会重复)取决于模型;可能兜圈子、可能过早放弃(第 6 讲的”不足思考”)
状态追踪由模拟器或数据结构负责由模型在上下文里追踪——正是第 8 讲提议者的弱点
灵活性需要明确的状态、动作、评估可以用在没有明确结构的问题上
成本多次调用,每次有固定开销一次长生成,但 token 多

“LLM 在搜索树的每个节点被调用”的做法(ToT、RAP)和”LLM 写出搜索组件、交给经典算法”(Thought of Search)、“LLM 学会在思维链里搜索”(推理模型)之间,并没有一个普遍的赢家;本讲的实验说明,结构越清楚、规则越可靠的问题,越应该把搜索交给算法。


8. 现状与开放问题 · State of the field

  • 推理时搜索在可回退的环境里(网页、代码、带模拟器的游戏)持续有效,成功率随搜索预算增长(Koh et al.);但多数论文没有和计算量匹配的简单基线比较(§3.4)。
  • 评估器是瓶颈:Chen et al. 和本讲的实验都说明,树搜索的收益取决于评估器的质量;本讲进一步说明,评估器的误差结构——是否在搜索会访问的状态上系统性地出错——和平均准确率一样重要。
  • 学出来的世界模型在文本环境里仍然不可靠(Wang et al. 的 59.9%);搜索会利用它的错误;闭环执行是目前最实用的补救。
  • 学会搜索(Stream of Search、Searchformer、推理模型)把搜索变成了模型的一种行为;它和外部搜索怎样结合(例如用外部搜索生成训练数据,再让模型学会)是活跃的方向。

研究问题:

  1. 怎样在搜索会访问的状态分布上训练和评估价值函数?AlphaZero 用自我对弈的局面;LLM 推理里,PRM 的训练数据通常来自策略的采样——它覆盖了搜索的”最后几步”吗?
  2. 能否设计一个”误差结构”的指标,比准确率更好地预测树搜索的收益?(本讲的”每层留住最近状态的比例”是一个候选。)
  3. 搜索对世界模型的”钻空子”能否被检测出来——例如比较”在模型里找到这个计划花了多少力气”和”模型对每一步的置信度”?
  4. 在推理模型已经会在思维链里回溯的情况下,外部搜索还能带来多少?两者的收益是叠加的还是替代的?

9. 小结 · Summary

  1. 搜索有四个零件:世界模型、策略、价值函数、搜索算法(外加目标检查)。读”LLM + 搜索”的论文,先看哪个零件可靠、哪个是 LLM 猜的。
  2. ToT(提议 + 评估 + BFS/DFS)、RAP(LLM 当世界模型 + MCTS)、LATS(真实环境 + MCTS)、AlphaZero / MuZero(学出来的策略、价值、模型 + PUCT)是这四个零件的不同组合。
  3. 闭环需要记忆:没有记忆的闭环贪心全部失败在兜圈子上;加上记忆后大题明显变好,小题略差。
  4. 只用策略的束搜索把同一个提议者从 44% 提到 97%(n = 5),比 LLM-Modulo 更强,但调用多得多;MCTS 在确定性、目标可检查的问题上最慢;提议的召回率是搜索的上限。
  5. 价值函数的静态准确率预测不了搜索的成败:学出来的价值函数排对 81%,却让搜索比不用它还差;把它的误差随机重新分配,搜索就到 100%。误差的结构(系统性地错在搜索会经过的状态上)比误差的大小更关键。
  6. 人写的启发函数好用,是因为它的错误不误导(只打平、从不排反)。
  7. 学出来的世界模型:一步误差按 k 次方累积;在模型里搜索出的计划可信度更低,搜索越费力越不可信(模型利用);闭环 MPC 把 79% 提到 92%。
  8. 另一条路是把搜索学进模型(Stream of Search、Searchformer、推理模型);结构清楚、规则可靠的问题,仍然应该把搜索交给算法。

10. 常见误区 · Common pitfalls

  1. “加一个评估器 / 价值函数,搜索总会更好。” 系统性出错的评估器会让搜索比不用它还差(§5.3)。
  2. “判别器准确率 80%,够用了。” 准确率是一个平均数;要看它在搜索会访问的状态上的表现,以及错误是否每次都一样(§5.4–5.5)。
  3. “MCTS 是最强的搜索算法。” 它为估计期望价值而设计;在确定性、只需要一条路的问题上,最佳优先和束搜索常常更省(§4.4)。
  4. “闭环执行一定比开环好。” 没有记忆时闭环会兜圈子;即使有记忆,小题上也可能更差(§4.2)。
  5. “在世界模型里找到了计划,就可以执行。” 搜索会专门找到模型的错误;越难找到的计划越可疑(§6.3)。
  6. “ToT 把 Game of 24 从 4% 提到 74%,说明搜索算法很重要。” 比较时要匹配计算量:同一篇论文里思维链采样 100 次取最好的是 49%;ToT 的收益有一部分来自更多的生成。
  7. “世界模型一步 90% 准,就差不多了。” 10 步之后约 35%。规划需要的是多步的准确率。

11. 练习 · Exercises

练习 1(PUCT 手算)。某节点有三个动作,先验 P = (0.6, 0.3, 0.1),访问次数 N = (10, 2, 0),平均价值 Q = (0.5, 0.6, 未访问),c = 1,未访问动作的 Q 用节点自己的价值 0.4 代替。父节点的总访问次数 N(s) = 12。按 §3.3 的 PUCT 公式(代码里用 N(s)+1\sqrt{N(s)+1}),下一次选哪个动作?如果 c = 0.1 呢?

参考答案:13≈3.606\sqrt{13} \approx 3.606。动作 1:0.5+1×0.6×3.606/11=0.5+0.197=0.6970.5 + 1 \times 0.6 \times 3.606/11 = 0.5 + 0.197 = 0.697;动作 2:0.6+0.3×3.606/3=0.6+0.361=0.9610.6 + 0.3 \times 3.606/3 = 0.6 + 0.361 = 0.961;动作 3:0.4+0.1×3.606/1=0.7610.4 + 0.1 \times 3.606/1 = 0.761。选动作 2。c = 0.1 时:动作 1 0.5+0.020=0.5200.5 + 0.020 = 0.520,动作 2 0.6+0.036=0.6360.6 + 0.036 = 0.636,动作 3 0.4+0.036=0.4360.4 + 0.036 = 0.436——仍选动作 2,但探索项几乎不起作用,从没试过的动作 3 排到了最后:c 越小,搜索越”贪心”。

练习 2(在搜索的分布上训练价值函数)。§5.5 猜测,学出来的价值函数分不清”快到了”,是因为训练数据里离目标很近的状态太少。设计一个实验检验这个猜测。

参考答案(草稿目录里实际运行):把训练数据的一半换成”随机题的最短路径上随机一个中间状态”(标签 = 剩余步数),其余不变(同样 3000 步、同一个种子)。结果:n = 5 的 ToT 式 BFS 68% → 77%、最佳优先 88% → 99%;n = 6 的 ToT 式 BFS 39% → 36%、最佳优先 53% → 57%;离目标 1 / 2 / 3 步的平均预测(n = 5)从 3.2 / 3.1 / 3.5 变成 2.7 / 2.7 / 3.0——仍然是平的。所以”数据太少”最多是一部分原因:给了大量近目标的状态,模型仍然分不清 1 步和 3 步。更可能的解释是这需要逐块比较状态和目标,2 层的小模型做不到。进一步的实验:加深模型、或者在输入里把”哪些积木已经在最终位置”显式标出来,看预测是否变得分得清。

练习 3(MCTS 是不是调参的问题)。§4.4 的 MCTS 用 c = 1、γ = 0.8。设计一个最小的实验,判断”MCTS 不如最佳优先”是不是参数没调好。

参考答案(草稿目录里实际运行,n = 5,预算 300 个状态,学出来的价值函数):c ∈ {0.3, 1, 3} × γ ∈ {0.8, 0.95} 六种组合的成功率是 49% / 39% / 61% / 55% / 62% / 61%,最好的 62%,仍远低于最佳优先在同样预算下的 88%。注意第 2 讲的教训:给 MCTS 调了 6 组参数、最佳优先一组都没调,这个比较对 MCTS 已经是偏袒的;结论不变,说明差距来自算法和问题结构的匹配,而不是参数。

练习 4(更准的世界模型还会被钻空子吗)。把世界模型的训练分布从 3–5 块改成 3–7 块(其他不变),预测 §6.3 的结果会怎样变化。

参考答案(草稿目录里实际运行):一步准确率在 n = 3–7 上是 100% / 99.7% / 98.7% / 98.3% / 96.0%(3–5 块训练时 n = 5 只有 82.3%——训练分布更宽,连训练范围内的准确率都提高了,和第 6 讲”训练时加干扰陈述就修好”是同一类现象)。A* 在模型里找到的计划在 n = 5 / 6 / 7 上分别是 100 / 100 / 97 道,全部真的能执行。模型足够准时,错误很少恰好造出通向目标的”捷径”。教训:模型利用的严重程度取决于模型错误的数量和”位置”;但你事先不知道模型的错误在哪里,所以在可以检查的地方仍然要检查(用真实环境验证、闭环执行)。

练习 5(兜圈子)。§4.2 里没有记忆的闭环贪心在 n = 5 上失败的 79 道题全部是兜圈子。(a) 为什么一个”每一步都选最好的合法动作”的策略会来回横跳?(b) “记住走过的状态”在 LLM 智能体里对应什么?它有什么代价?

参考答案要点:(a) 策略只看当前状态和目标,没有”我刚从哪里来”的信息。如果在状态 A 时它最想做的动作通向 B,在 B 时最想做的动作通向 A,它就会永远在 A、B 之间切换——确定性的策略在没有记忆时一旦进入循环就出不来。(b) 对应把已经访问过的状态 / 已经试过的动作放进上下文(或外部记忆),并在提示里要求不要重复;或者在智能体框架里做循环检测。代价:上下文变长(第 6 讲:长上下文本身会降低小模型的准确率),而且”走过的状态”在开放环境里不一定能精确比较(两个网页”一样”吗?)。

练习 6(计算量匹配)。第 8 讲的”采样 30 次、取第一个通过验证的”在 n = 5 上成功 85%,平均调用 9.2 次;本讲的束搜索 W = 4 成功 88%,平均调用 19 次;W = 16 成功 97%,平均调用 41 次。哪个方法”更好”?你会怎样设计一个公平的比较?

参考答案要点:只看成功率,W = 16 最好;只看调用次数,采样最省。“更好”取决于你在成功率–成本曲线上的位置:应该画出每种方法在不同预算下的成功率(采样 N = 1, 4, 10, 30;束宽 W = 1, 4, 16),比较同一预算下谁更高——这是 Kapoor et al. 主张的”帕累托前沿”式报告。还要注意两点不同:采样 + 验证器用的是”计划完成后才检查”,束搜索每一步都用模拟器检查合法性——束搜索用到了更多的规则信息;而单次调用的成本也不同(束搜索一次调用要算 1 + 最上面的积木数条序列)。公平的比较要么给采样同样的逐步检查,要么明确说明两者用到的信息不同。


12. 延伸阅读 · Further reading

搜索算法

  • S. Russell, P. Norvig. Artificial Intelligence: A Modern Approach(第 3 章,启发式搜索).
  • L. Kocsis, C. Szepesvári. Bandit Based Monte-Carlo Planning(UCT). ECML 2006.
  • D. Silver et al. Mastering the Game of Go without Human Knowledge(AlphaGo Zero). Nature 2017.
  • J. Schrittwieser et al. Mastering Atari, Go, Chess and Shogi by Planning with a Learned Model(MuZero). Nature 2020.

把 LLM 放进搜索

  • S. Yao et al. Tree of Thoughts: Deliberate Problem Solving with Large Language Models. NeurIPS 2023.
  • S. Hao et al. Reasoning with Language Model is Planning with World Model(RAP). EMNLP 2023.
  • A. Zhou et al. Language Agent Tree Search Unifies Reasoning, Acting, and Planning in Language Models(LATS). ICML 2024.
  • J. Y. Koh et al. Tree Search for Language Model Agents. 2024(TMLR 2025).
  • X. Guan et al. rStar-Math: Small LLMs Can Master Math Reasoning with Self-Evolved Deep Thinking. 2025.

评估器与世界模型

  • Z. Chen et al. When is Tree Search Useful for LLM Planning? It Depends on the Discriminator. ACL 2024.
  • M. Katz et al. Thought of Search: Planning with Language Models Through The Lens of Efficiency. NeurIPS 2024.
  • R. Wang et al. Can Language Models Serve as Text-Based World Simulators? ACL 2024.

把搜索学进模型

  • K. Gandhi et al. Stream of Search (SoS): Learning to Search in Language. COLM 2024.
  • L. Lehnert et al. Beyond A*: Better Planning with Transformers via Search Dynamics Bootstrapping(Searchformer). 2024.

13. 下一讲预告 · Next lecture

第 10 讲:时序与约束规划——日程、旅行、多约束与运行时重规划(含 MACI)。 积木世界只有一种约束(前提)。真实的规划问题——安排一场婚礼、一次感恩节聚餐、一趟多城市旅行——有时间窗、先后依赖、资源冲突、预算,还会在执行中途出变故(航班延误)。TravelPlanner 上 GPT-4 只有 0.6% 的计划满足所有约束,但它满足单个约束的比例并不低——为什么?我们会看到”每个约束都大概率满足”和”所有约束同时满足”之间的指数鸿沟,约束求解器和简单时序网络怎样精确地处理时间,MACI 为什么主张”把规划和验证分开、每个智能体只保留最小的上下文”,以及执行中出了变故时,“从头重新规划”和”最小修补”之间的权衡。

← 返回课程目录