对应 Maps to:CMU 17-630 Prompt Engineering(Prof. Travis Breaux),第 9 周 · Agents – Reasoning and Planning。原课 Schedule 对这一讲的说明(意译):开放域与封闭域的规划、神经符号的规划方法、评估”人所看重的”计划的指标;以及通过长思维链中的回溯来改进规划的微调策略。 依据说明:原课的 slides 和阅读清单不公开。Schedule 点名的四项——开放域与封闭域规划(§1、§6)、神经符号方法(§3)、计划的评估指标(§6)、长思维链与回溯(§5)——各占一节;§2(LLM 直接规划的表现)和 §4(Tree of Thoughts)是理解前面几项所需的背景。材料来自 Valmeekam et al.(2023,PlanBench;2024,LLMs Still Can’t Plan; Can LRMs?)、Liu et al.(2023,LLM+P)、Kambhampati et al.(2024,LLM-Modulo)、Yao et al.(2023,Tree of Thoughts)、Gandhi et al.(2024,Stream of Search)、OpenAI(2024,o1)、DeepSeek-AI(2025,DeepSeek-R1)等;引用的数字都核对过原文。全部实验是本讲义自己设计的,不代表课堂上讲了什么。 配套代码 Code:
code/lecture13/(只用 Python 标准库;2 个模块 + 5 个脚本;不需要 API key;每个脚本 15 秒以内) 预计阅读时间:3.5 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 用”状态、动作(前提条件与效果)、目标”描述一个规划问题,知道 PDDL 是什么、经典规划器做的是什么。
- 解释为什么 LLM 直接生成的计划常常不可执行,以及”混淆领域”实验说明了什么(模式匹配 vs 推理)。
- 说出两类改进:神经符号(LLM 翻译 + 经典规划器;LLM 提议 + 外部校验器)和搜索(Tree of Thoughts:提议、评估、回溯),以及它们各自依赖什么。
- 解释”评估比生成容易”在搜索里的作用:一个可靠的评估器决定了搜索要花多少预算。
- 把推理模型(o1、DeepSeek-R1 一类)理解为”把搜索和回溯训练进了模型”,并知道它们仍然没有正确性保证。
- 分层评估一个计划:可执行、达成目标、最优 / 代价,以及开放域里”人所看重的”那些指标。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲只给直觉,后面再展开 Previewed only |
|---|---|
| 第 4 讲:思维链、self-consistency | 智能体循环、ReAct、Reflexion、记忆(第 14 讲) |
| 第 8 讲:先规划 vs 边做边看(ReWOO vs ReAct) | 多智能体辩论(第 15 讲) |
| 第 9 讲:分解、错误传播 p^k | 评估设计(第 17 讲) |
| 第 10 讲:外部反馈、“验证比生成容易” | |
| 第 11 讲:校验器 / 测试是可靠的外部反馈 |
0.3 本讲地图 Map
§1 什么是规划:状态、动作、目标;开放域与封闭域
§2 LLM 直接规划:PlanBench 与"看着对、其实走不通" ← 代码 01、02
§3 神经符号:LLM+P(翻译 + 经典规划器)与 LLM-Modulo(提议 + 校验) ← 代码 03、05
§4 把搜索放进提示:Tree of Thoughts ← 代码 04
§5 把搜索训练进模型:长思维链、回溯与推理模型
§6 怎样评估一个计划:可执行、目标、最优,以及"人所看重的" ← 代码 04
§7 在真实模型上 ← 代码 05(可选)
§8 小结 §9 常见误区 §10 练习 §11 延伸阅读 §12 下一讲预告
0.4 记号与术语 Notation & terms
| 术语 | 本讲义里的意思 |
|---|---|
| 状态(state) | 世界此刻的样子:每块积木在哪、手里拿着什么 |
| 动作(action) | 改变状态的操作;有前提条件(什么时候能做)和效果(做了之后怎样) |
| 计划(plan) | 一个动作序列,从初始状态出发、每一步都可执行、最后达成目标 |
| PDDL | 规划领域定义语言:用形式化的方式写下动作的前提和效果、问题的初始状态和目标 |
| 经典规划器(classical planner) | 在形式化的问题上系统地搜索计划的程序(例如 Fast Downward) |
| 可执行(executable) | 计划的每一步,前提条件都满足 |
| 最优(optimal) | 步数(或代价)最少的计划 |
| 神经符号(neuro-symbolic) | 神经网络(LLM)和符号系统(规划器、校验器)分工合作 |
0.5 本讲的实验装置 · The setup
一个真实的积木世界(blocks_world.py)。桌上有几块积木,一只手,四个动作:
pickup X 前提:手空、X 在桌上、X 顶上没有东西 效果:手里拿着 X
putdown X 前提:手里拿着 X 效果:X 在桌上,手空
stack X Y 前提:手里拿着 X、Y 顶上没有东西 效果:X 在 Y 上,手空
unstack X Y 前提:手空、X 在 Y 上、X 顶上没有东西 效果:手里拿着 X
问题 = 初始摆法 + 目标(例如”积木 2 在积木 1 上、积木 3 在积木 2 上”)。optimal_plan 是一个真实的广度优先搜索规划器(一定给出步数最少的计划),validate 是一个真实的校验器(逐步执行计划,检查每一步的前提条件和最后的目标)。它们没有任何随机性。
模拟的规划者 SimPlanner(planner_sim.py)代表”会规划的 LLM”:每一步,它能大致看出哪个动作让状态更接近目标,但看得有噪声——small / medium / large 三种规模噪声不同;把领域换成看不懂的名字(混淆)时,噪声大增。噪声大时,它可能提议一个前提条件不满足的动作(计划不可执行),或者走远。**启发式、校验、规划器、搜索都是真实的代码,只有”模型的方向感有多准”是旋钮。**它能把”为什么直接规划不可靠、为什么 LLM+P 和搜索有效”的论证变具体,但不能说明真实模型的数字;每次用它,讲义都给出论文里的数字作对照。
1. 什么是规划 · What planning is
1.1 直觉
规划就是”想好一串动作,让世界从现在的样子变成你想要的样子”。早上出门:先穿鞋还是先拿钥匙无所谓,但必须先开门才能出门;你在脑子里排了一个顺序,每一步都要”能做”(前提条件),整串做完要达到目的(目标)。
形式化之后,一个规划问题由三部分组成:
- 状态:世界此刻的样子;
- 动作:每个动作有前提条件(什么时候能做)和效果(做了之后状态怎样变);
- 目标:想要的状态满足哪些条件。
计划就是一个动作序列:从初始状态出发,每一步的前提条件都满足,最后的状态满足目标。
1.2 为什么规划难:搜索
规划难,是因为要搜索:可能的动作序列随步数指数增长,绝大多数走不通。积木世界只有 4 块积木时,最优计划可能就要 10 步(blocks_world.py 自检里的例子);每一步有好几个能做的动作,盲目地试,组合起来是一个巨大的树。
经典规划器(Fast Downward 一类)用形式化的语言(PDDL)读入问题,系统地、有启发式指导地搜索这棵树,给出有保证的答案:只要有解就能找到,可以要求最优。optimal_plan 是它的最小版:广度优先搜索,第一次到达目标时的路径就是最短计划。
1.3 封闭域与开放域
- 封闭域(closed-domain):动作、前提、效果都能精确地写下来——积木世界、物流调度、机器人搬运。这里有经典规划器,也有自动的校验器。
- 开放域(open-domain):动作和约束难以穷举、目标模糊——“帮我规划一次三天的东京旅行""给这个新功能拟一个上线计划”。没有现成的规划器,也很难自动判断一个计划”好不好”。
LLM 让人兴奋的地方,是它似乎能直接处理开放域的规划——用自然语言就能给出一个像样的计划。这一讲的问题是:它给出的计划可靠吗?怎样让它可靠?
2. LLM 直接规划 · Direct planning with LLMs
2.1 看着对、其实走不通
最直接的做法:把问题用自然语言告诉模型,让它一口气写出整个计划。01_direct_planning.py 演示 1:3、4 块积木各 150 个问题,按最优计划的长度分组看成功率(成功 = 每一步可执行、最后达成目标):
| 模型 | 最优 1–2 步 | 3–4 步 | 5–7 步 | 8 步以上 |
|---|---|---|---|---|
| small | 18.5% | 7.1% | 0.0% | 0.0% |
| medium | 44.6% | 23.5% | 17.7% | 2.1% |
| large | 96.7% | 83.7% | 79.0% | 68.8% |
短问题还行,长一点就崩溃。原因和第 9 讲的错误传播一样:直接规划把整个搜索压进”一次生成”里,模型只有一个大致的方向感,每一步都有一定概率走错,步数越多越容易在中途走丢。
失败是怎样失败的?演示 2(medium,最优 ≥ 3 步的问题):82.7% 是非法动作(某一步的前提条件不满足——模型以为某块积木顶上是空的、或手是空的,其实不是),只有 0.5% 是”每一步都合法、但没到目标”。这种错误靠读文字很难发现:每一步单独看都像一句合理的指令。计划必须执行一遍(交给校验器)才能判定对错。
Valmeekam et al.(2023)的 PlanBench 在真实模型上做了系统的测量:他们用一个自动的计划校验器(VAL)逐步检查模型给出的计划。GPT-4 在标准积木世界上自主生成的计划约三分之一正确(约 34%),而且随问题变难迅速下降。
2.2 一个容易犯的推理错误
“模型在 1–2 步的问题上 45% 正确,所以它会规划,只是不太稳”——这个推理有一个隐藏的跳跃。短计划往往不需要搜索:目标离初始状态很近,顺着最明显的方向走一两步就到了。真正考验规划能力的是需要”先做一件暂时看起来离目标更远的事”(例如先把压在上面的积木挪开)的问题,这正是长计划失败的地方。
2.3 混淆领域:模式匹配还是推理?
PlanBench 里最有启发的实验是 Mystery Blocksworld:把动作和谓词换成没有意义的词(pickup → feast,stack → overcome,on → craves……),问题的结构完全不变——同一个问题,最优计划一模一样。02_obfuscation.py:
| 做法 | 熟悉的名字 | 混淆的名字 |
|---|---|---|
| 直接规划(small) | 8.0% | 0.0% |
| 直接规划(medium) | 25.3% | 0.0% |
| 直接规划(large) | 84.3% | 0.7% |
| 经典规划器 | 100% | 100% |
模拟器里这个崩溃是按设定发生的(混淆让模型的方向感几乎消失);它要表达的是 PlanBench 在真实模型上观察到的现象:GPT-4 在混淆版本上只有个位数的成功率(论文附录里约 2%–4%)。经典规划器毫不在乎——它只看形式化的结构,名字对它没有意义。
Valmeekam et al. 据此认为:模型在熟悉的领域里表现好,很大程度上靠的是认出熟悉的模式(训练数据里有大量”把积木从一摞上拿下来”的文字),而不是对状态和动作做真正的推理——名字一换,模式就认不出来了。这是一个提醒:在熟悉的 benchmark 上表现好,不等于掌握了这项能力(第 11 讲的数据污染、第 17 讲的 benchmark 设计都会回到这一点)。
3. 神经符号:让 LLM 做它擅长的那一部分 · Neuro-symbolic planning
如果规划难在搜索、而经典规划器擅长搜索,自然的想法是分工:LLM 做它擅长的(理解自然语言、处理开放的描述),规划器做它擅长的(系统地搜索、给出保证)。
3.1 LLM+P:只做翻译
Liu et al.(2023)的 LLM+P 分三步:
- LLM 把自然语言描述的问题翻译成 PDDL;
- 经典规划器在 PDDL 上求解;
- LLM 把规划器的解翻译回自然语言。
论文报告,LLM+P 在他们的基准上能为大多数问题给出最优解,而单独的 LLM 无法可靠地解决长程规划问题。03_llm_plus_p.py(medium 模型;翻译以一定概率漏掉一条目标关系,积木越多越容易翻错):
| 做法 | 最优 1–2 步 | 3–4 步 | 5–7 步 | 8 步以上 | 拿到最优计划 |
|---|---|---|---|---|---|
| 直接规划 | 44.6% | 23.5% | 17.7% | 2.1% | 13.7% |
| LLM+P | 87.0% | 90.8% | 88.7% | 70.8% | 86.0% |
- LLM+P 的成功率和计划长度基本无关:难的搜索交给了规划器,它不会累积错误。最长一组略低(71%),是因为那一组多是 4 块积木的问题(48 个里 40 个),要翻译的关系更多——它的成功率取决于问题有多大,而不是计划要走多少步。
- LLM+P 成功的计划都是最优的;直接规划即使成功也常常绕远路。
- 混淆的名字对 LLM+P 影响很小(86.0% → 82.7%):翻译只是把名字一一映射过去,不需要”想”怎么解。
3.2 LLM+P 怎样失败:垃圾进,垃圾出
LLM+P 只可能在翻译这一步出错:300 个问题里 49 个翻译漏掉了一条目标关系,规划器忠实地解了一个错误的问题,其中 42 个对原问题没有达成目标。规划器只能保证”解对了你给它的问题”。所以 LLM+P 的关键检查点在翻译:把翻译出来的形式化问题拿给人看、或者用另一种方式交叉检查它和原问题是否一致,比检查最终计划更容易。
它的代价是适用范围:需要一个能用 PDDL 描述的领域和一个现成的规划器。开放域的任务(“规划一次旅行”)没法直接这样做。
3.3 LLM-Modulo:LLM 提议,校验器把关
Kambhampati et al.(2024)在《LLMs Can’t Plan, But Can Help Planning in LLM-Modulo Frameworks》里提出了更一般的框架:LLM 不当最后拍板的规划者,而是生成候选的一方;一组外部的校验器(检查可执行性、硬约束、风格偏好……)对候选给出反馈,LLM 根据反馈修改,循环直到通过。它的直觉和第 10–11 讲完全一致:LLM 擅长提出想法,不擅长保证正确;校验器擅长保证正确——把两者组合起来,正确性由校验器保证,覆盖面由 LLM 提供。
这个框架在开放域也能用:即使没有完整的规划器,往往也能写出部分校验器(时间不冲突、预算不超、每一站营业时间对得上)。05_real_llm.py 就是它的最小版:真实模型写计划,validate 给出”第 k 步不可执行”或”没有达成目标”的反馈,模型重试。
4. 把搜索放进提示:Tree of Thoughts · Search in the prompt
LLM+P 把搜索交给外部程序;另一条路是让模型自己搜索,但不是在”一次生成”里,而是在提示的层面显式地组织搜索。
4.1 Tree of Thoughts
Yao et al.(2023)的 Tree of Thoughts(ToT)把思维链(一条线)推广成一棵树:
- 提议:在当前的部分解上,让模型提出几个候选的下一步(“想法”);
- 评估:让模型自己评估每个候选有没有希望(“这一步之后还可能凑出 24 吗?”);
- 搜索:用广度优先或深度优先在这棵树上展开,有希望的继续、没希望的剪掉,走不通就回溯。
论文报告:在 Game of 24(用 4 个数和加减乘除凑出 24)上,GPT-4 用思维链只解出 4%,用 ToT 解出 74%。
4.2 在积木世界上:过滤 + 回溯
04_search_tot.py 用 5 块积木、最优计划至少 4 步的问题(3–4 块积木的状态空间太小,任何搜索都能很快穷举,显不出差别)。同一个模型,三种用法:
| 模型 | 直接规划 | 直接 + 挡掉非法动作 | ToT 搜索(+ 回溯) | 调用次数 |
|---|---|---|---|---|
| small | 1.2% | 21.2% | 80.0% | 1.8 / 17.0 / 21.9 |
| medium | 3.8% | 47.5% | 91.2% | 2.6 / 16.0 / 17.9 |
| large | 81.2% | 96.2% | 98.8% | 10.5 / 11.1 / 15.2 |
收益可以拆成两部分:
- 过滤:每一步有一个检查把前提条件不满足的动作挡回去(3.8% → 47.5%)——不让一个非法动作毁掉整个计划。这一步本身已经用到了一个可靠的校验器。
- 回溯:保留多条路,一条走不通就退回来换一条(47.5% → 91.2%)。
代价是调用次数:ToT 每展开一个节点要一次提议、一次评估。这是测试时计算(test-time compute)的又一种形式。
4.3 搜索的价值来自评估器
ToT 有一个容易被忽略的前提:评估比生成容易——判断”这一步之后离目标近了吗”,要比一口气想出整个计划容易。演示 2 改变评估的准确度和搜索预算(medium):
| 评估 | 预算 5 | 预算 10 | 预算 20 | 预算 40 |
|---|---|---|---|---|
| 评估很准(噪声 ×0.1) | 23.8% | 78.8% | 100.0% | 100.0% |
| 默认(×0.45) | 21.2% | 68.8% | 97.5% | 100.0% |
| 评估和生成一样不准(×1.0) | 13.8% | 41.2% | 81.2% | 96.2% |
| 混淆的名字 | 6.2% | 33.8% | 51.2% | 83.8% |
- 预算小的时候,评估的准确度决定成败:预算 10 时,评估很准 79%,和生成一样不准 41%。
- 预算一大,差别就缩小:这个领域的状态不多,搜得足够多,连”看不准”的搜索也能碰到目标——那正是经典规划器做的事(系统地穷举)。
所以评估器的价值是省节点:一个可靠的评估器让搜索把预算花在有希望的分支上。真实问题的状态空间大得多、不可能穷举,评估器的质量直接决定搜索能不能在可承受的成本内成功。这和第 10 讲的结论是同一件事:没有可靠的评估,“多试几次”只是在随机游走。混淆的名字下,模型既提议不出好的动作、也评估不出哪个状态更好,这时可靠的评估器只能来自模型之外。
5. 把搜索训练进模型:长思维链与回溯 · Training search into the model
ToT 在提示的层面组织搜索:每一个节点都是一次独立的模型调用,由外面的程序决定展开哪个、回溯到哪里。一个自然的问题是:能不能让模型在一次长长的生成里自己完成提议、评估、回溯?
5.1 Stream of Search:在搜索的轨迹上训练
Gandhi et al.(2024)的 Stream of Search 做了一个干净的实验:在 Countdown 游戏(用给定的数凑出目标数)上从零训练一个小 Transformer。一组只在最优解的轨迹上训练(“直接写出正确答案”),另一组在搜索的过程上训练——启发式求解器探索、碰壁、退回、再试的完整文字记录。论文报告:在搜索过程上训练的模型,搜索准确率比只学最优轨迹的高 25%;再用自我改进的方法(STaR、APA)微调,能解出 36% 原先解不出的问题,包括一些任何启发式求解器都解不出的。
直觉:只看最优答案,模型学到的是”答案长什么样”;看搜索的过程,模型学到的是”怎样找答案”——包括犯错之后怎样发现、怎样退回来。这正是原课 Schedule 说的”通过长思维链中的回溯来改进规划的微调策略”。
5.2 推理模型:o1 与 DeepSeek-R1
2024–2025 年的推理模型把这条路推到了大模型上:
- OpenAI 的 o1(2024)用强化学习训练模型在回答之前先”思考”——生成一段很长的思维链,里面会尝试、检查、改正;OpenAI 报告,它的表现随训练时的计算量和测试时(思考时)的计算量增加而提高。
- DeepSeek-R1(2025)公开了类似的方法:在可以自动验证对错的任务(数学、编程)上做大规模的强化学习,奖励只看最终答案对不对。论文里的 R1-Zero 版本完全不用人写的推理示范,模型自己在长思维链里发展出了自我验证、反思、换策略这些行为;R1 在此基础上加入少量”冷启动”的示范数据,推理表现和 o1 相当。
从这一讲的角度看,推理模型是”把搜索和回溯训练进了模型”:ToT 由外部程序组织的提议—评估—回溯,现在发生在模型自己的一段长生成里。奖励来自可验证的结果——又一次,可靠的外部信号(答案能被检查)是这一切能训练起来的前提。
5.3 推理模型能规划了吗?
Valmeekam et al.(2024)的后续研究《LLMs Still Can’t Plan; Can LRMs?》用 PlanBench 测了 o1-preview:标准积木世界上 97.8%(当时最好的普通 LLM 62.6%),Mystery Blocksworld 上 52.8%(当时最好的普通 LLM 只有 0.8%)。进步是巨大的——但混淆版仍远低于标准版,而且:
- 它没有正确性保证:一个 97.8% 正确的规划者,在需要可靠的场合仍然要配一个校验器;
- 它贵得多:论文估算 o1-preview 每 100 个问题的成本约 42 美元,而当时最贵的普通 LLM(GPT-4)约 1.8 美元;
- 经典规划器 Fast Downward 在两种版本上都是 100%,而且有保证、便宜。
结论不是”推理模型没用”,而是选工具要看问题:领域能形式化、需要保证——用规划器(LLM 负责翻译);领域开放、需要灵活——用推理模型或 LLM-Modulo,并把能写成校验器的约束都写成校验器。
6. 怎样评估一个计划 · Evaluating plans
6.1 分层的指标
一个计划至少要分开看几层。04_search_tot.py 演示 3(5 块积木,medium):
| 做法 | 可执行 | 达成目标 | 最优 | 成功时多走几步 |
|---|---|---|---|---|
| 直接规划 | 3.8% | 3.8% | 1.2% | 2.67 |
| ToT 搜索 | 100.0% | 91.2% | 70.0% | 0.60 |
| LLM+P | 100.0% | 78.8% | 78.8% | 0.00 |
| 经典规划器(基准) | 100.0% | 100.0% | 100.0% | 0.00 |
- 可执行:每一步的前提条件都满足。直接规划大量卡在这一层;ToT 的计划总能执行(非法动作在提议时就被挡掉)。
- 达成目标:执行完之后目标成立。
- 最优 / 代价:步数、时间、花费。LLM+P 成功即最优;ToT 达成目标的比例更高(5 块积木上 LLM+P 的翻译更容易错),但常常绕远路。
- 生成计划的成本:模型调用次数、token、延迟(演示 1 的调用次数)。
没有一种做法在所有指标上都最好,所以要分开报告——不要用一个总分掩盖”计划根本执行不了”。
6.2 开放域:“人所看重的”计划
封闭域里,上面这些指标都能自动算。开放域难得多。想一想”规划一次三天的东京旅行”:
- 硬约束(可以写成校验器):每个景点在营业时间内到达、换乘时间够、总预算不超、不会同时出现在两个地方;
- 软偏好(难以自动判断):节奏是否舒服、是否照顾到同行老人的体力、口味是否合适、有没有留出弹性;
- 可调整性:下雨了、某处关门了,计划容易改吗?
- 可解释性:用户能看懂为什么这样排吗?
TravelPlanner(Xie et al. 2024)这类 benchmark 就把”硬约束通过率”和”常识约束通过率”分开测,发现即使最强的模型,一个计划同时满足全部约束的比例也很低。
实践上的建议:
- 把能自动检查的约束写成校验器(LLM-Modulo)——它们给出可靠的、可以反馈给模型的信号;
- 把软偏好交给人或 LLM 判官(第 10 讲:注意判官的偏差),并且明确评分标准(rubric);
- 分开报告硬约束和软偏好,硬约束不过的计划不应该因为”写得好”而得高分;
- 评估要包含执行:在真实或模拟的环境里走一遍,很多问题只有执行时才暴露。
7. 在真实模型上 · On a real model
05_real_llm.py(可选,需要 API key,约 20–50 次调用,预算上限 1.00 美元)让真实的 Claude 解 10 个积木世界问题:先直接写出计划,用 validate 检查;不对时把校验器的报错(“第 k 步不可执行""执行完没有达成目标”)交给它,最多重试 2 次——LLM-Modulo 的最小版本。要看的是:第一次就对的比例;带校验器反馈之后提高多少;成功的计划是不是最优的。强的推理模型在这么小的积木世界上可能第一次就几乎全对——那就把积木数加到 5–6、或者改用混淆的名字再试。不管结果如何,执行前先校验这一步都不能省。--toy 模式用 SimPlanner 跑同一段代码(编写讲义的环境里没有运行真实模型)。
8. 小结 · Summary
- 规划 = 在动作序列里搜索一条每步可执行、最终达成目标的路;难在搜索,经典规划器在形式化的问题上给出有保证的答案。
- LLM 直接规划不可靠:随计划变长迅速崩溃(medium 45% → 2%),失败大多是不可执行的动作;PlanBench 上 GPT-4 约三分之一正确。混淆名字后崩溃到接近 0,说明熟悉领域里的表现很大程度上来自模式匹配。
- 神经符号:LLM+P 让 LLM 只翻译、规划器搜索——成功率和计划长度基本无关、成功即最优,但”垃圾进垃圾出”,翻译是关键检查点;LLM-Modulo 让 LLM 提议、外部校验器把关,开放域也能用部分校验器。
- Tree of Thoughts 把搜索放进提示:提议、评估、回溯。收益来自过滤非法步骤和回溯(3.8% → 47.5% → 91.2%),代价是调用次数;它的价值取决于评估器是否比生成器可靠——评估器决定要花多少预算。
- 推理模型把搜索和回溯训练进了模型(Stream of Search、o1、DeepSeek-R1);o1-preview 在积木世界上 97.8%、混淆版 52.8%——巨大的进步,但没有保证、成本高。
- 分层评估计划:可执行、达成目标、最优 / 代价、生成成本;开放域里把硬约束写成校验器,软偏好交给人或判官,分开报告。
9. 常见误区 · Common pitfalls
| 误区 | 实际情况 |
|---|---|
| “模型写的计划读起来很合理,应该能用” | 不可执行的步骤读起来也很合理;计划必须执行一遍(交给校验器)才能判定 |
| “短问题能做对,说明它会规划” | 短问题往往不需要搜索;需要先做”看起来更远”的事的长问题才考验规划 |
| “在标准 benchmark 上表现好,说明掌握了规划” | 换成混淆的名字就崩溃,说明很多来自模式匹配 |
| “LLM+P 有规划器,所以一定对” | 规划器只保证解对你给它的问题;翻译错了,答案就错 |
| “ToT 就是多试几次” | 它的价值来自比生成更可靠的评估器;评估不准时只能靠堆预算 |
| “推理模型已经解决了规划” | 进步巨大,但没有正确性保证、成本高;需要保证时仍要校验器或规划器 |
| “用一个总分评估计划就够了” | 要分开看可执行、目标、最优、成本;硬约束不过的计划不能因为写得好而得高分 |
| “开放域没法评估” | 能把一部分约束写成校验器(时间、预算、营业时间),剩下的用人或判官,并写清楚 rubric |
10. 练习 · Exercises
练习 1(形式化) 用”状态、动作(前提 / 效果)、目标”描述”做一杯手冲咖啡”:至少 5 个动作,写出每个动作的前提和效果,以及一个目标。指出哪个动作的前提最容易在计划里被忽略。
参考答案(一种可能):状态:水(冷 / 热)、豆子(整颗 / 磨好)、滤纸(有没有放)、杯子上有没有滤杯、咖啡(有没有冲好)。动作:烧水(前提:有水壶和水;效果:水是热的);磨豆(前提:有整颗豆子;效果:豆子是磨好的);放滤纸(前提:滤杯里没有滤纸;效果:有滤纸);放滤杯(前提:杯子上没有滤杯;效果:滤杯在杯子上);倒粉(前提:有滤纸、豆子磨好;效果:滤杯里有粉);注水(前提:水是热的、滤杯里有粉、滤杯在杯子上;效果:咖啡冲好)。目标:咖啡冲好。最容易被忽略的是”注水”的前提”滤杯在杯子上”和”放滤纸在倒粉之前”——一个看起来通顺的计划可能把粉倒进了没有滤纸的滤杯。这说明了为什么要逐步检查前提条件。
练习 2(解释) §2.3 里,经典规划器在混淆的名字下仍然是 100%,而 large 模型从 84% 掉到 1%。(a)这个对比排除了哪种解释?(b)它支持哪种解释?(c)它没有证明什么?
参考答案:(a)排除了”混淆后的问题更难”——结构完全不变,最优计划一样,规划器的表现也一样。(b)支持”模型的表现依赖熟悉的表面形式(名字、措辞),很大程度上是模式匹配,而不是对状态和动作的抽象推理”。(c)没有证明模型”完全不会推理”——它说明的是在这个任务上、这种模型的能力很大一部分依赖表面形式;推理模型在混淆版本上 52.8% 说明训练方法能显著改变这一点。(模拟器里的崩溃是按设定发生的,真正的证据来自 PlanBench 在真实模型上的测量。)
练习 3(计算) 一个模型直接规划时,每一步以 0.9 的概率选对动作(选错就失败)。(a)一个最优 8 步的问题,成功概率是多少?(b)如果每一步都有一个校验器挡掉非法动作、让模型重选,选错的情况里有一半是非法动作(会被挡掉重选),另一半是”合法但走远了”——成功概率大约变成多少?(假设重选时总能选对,“走远”就失败。)
参考答案:(a)0.9⁸ ≈ 0.43。(b)每一步失败的概率从 0.1 变成 0.05(非法的那一半被挡掉重选了),成功概率 0.95⁸ ≈ 0.66。这就是 §4.2 里”过滤”那一部分收益的来源;剩下的”合法但走远了”要靠回溯(搜索)来挽回。
练习 4(设计) 为”给一个 5 人团队排下周的会议日程”设计一个 LLM-Modulo 系统:LLM 做什么?写出至少三个校验器,以及它们给 LLM 的反馈长什么样。
参考答案(一种可能):LLM:读每个人的自然语言约束(“周三下午不行""每天最多两个会”),提议一个日程(结构化的:会议、时间、参会人)。校验器:(1)冲突检查——同一个人同一时间不在两个会里;反馈:“Alice 在周二 10:00 同时在 A 会和 B 会里”。(2)可用时间检查——每个会的时间在每个参会人声明的可用时间内;反馈:“C 会安排在周三 15:00,但 Dan 周三下午不可用”。(3)每日上限检查——每人每天的会不超过上限;反馈:“Bob 周四有 3 个会,超过上限 2 个”。(4)时区 / 会议室容量(如果有)。循环:LLM 根据反馈修改,直到全部通过;软偏好(“尽量不要排在午饭时间”)交给 LLM 自己权衡或让人确认。正确性(硬约束)由校验器保证,LLM 负责理解自然语言约束和提出候选。
练习 5(动手) 在 04_search_tot.py 里把候选数 beam 从 3 改成 1 和 5,重新运行演示 1。结果怎样变?为什么 beam = 1 时搜索几乎退化成”直接 + 挡掉非法动作”?
参考答案:编写讲义时(medium 模型):beam = 1 只有 7.5%,beam = 3 是 91.2%,beam = 5 是 98.8%;“直接 + 挡掉非法动作”是 47.5%。beam = 1 时每个节点只展开一个子节点,搜索树退化成一条链——没有别的分支可以回溯;而且搜索不允许回到走过的状态,一旦走进死胡同就彻底没路了(直接规划允许绕回来),所以它比”直接 + 挡掉非法动作”还差得多。beam 增大,可以回溯的分支变多,成功率上升,但每个节点要评估的候选变多;在这个小领域里,beam = 5 已经覆盖了大多数状态的全部合法动作,搜索接近穷举。这说明 beam 控制的是”探索的宽度”,和预算(探索的总量)一起决定了搜索的成本和成功率;“去重”这样看似无害的实现细节,也会改变搜索的行为。
练习 6(批判) 有人说:“我们用推理模型给仓库机器人规划搬运路线,内部测试 98% 的计划正确,可以直接上线执行。“指出问题并给出改进。
参考答案:问题:(1)98% 意味着每 50 个计划就有一个错的,而机器人执行一个错误的计划可能撞坏货物或伤人——需要的是保证,不是高概率;(2)内部测试的分布可能和真实场景不同(新的仓库布局、新的货物),推理模型在分布外(像混淆领域那样)可能明显变差;(3)没有提到成本和延迟。改进:仓库搬运是封闭域、可以形式化——用经典规划器或至少用一个校验器在执行前检查每个计划(可执行、不碰撞、满足约束);推理模型可以负责把自然语言的任务翻译成形式化的目标(LLM+P),或者在规划器之外处理异常情况;执行时保留监控和人工干预;在真实布局的模拟环境里做分布外测试。
11. 延伸阅读 · Further reading
LLM 与规划
- Valmeekam et al. (2023). PlanBench: An Extensible Benchmark for Evaluating Large Language Models on Planning and Reasoning about Change. NeurIPS Datasets and Benchmarks.
- Valmeekam et al. (2023). On the Planning Abilities of Large Language Models – A Critical Investigation. NeurIPS.
- Valmeekam et al. (2024). LLMs Still Can’t Plan; Can LRMs? A Preliminary Evaluation of OpenAI’s o1 on PlanBench.
- Kambhampati et al. (2024). LLMs Can’t Plan, But Can Help Planning in LLM-Modulo Frameworks. ICML.
- Xie et al. (2024). TravelPlanner: A Benchmark for Real-World Planning with Language Agents. ICML.
神经符号
- Liu et al. (2023). LLM+P: Empowering Large Language Models with Optimal Planning Proficiency.
- Ghallab, Nau & Traverso (2016). Automated Planning and Acting(经典规划的教科书)。
搜索与推理模型
- Yao et al. (2023). Tree of Thoughts: Deliberate Problem Solving with Large Language Models. NeurIPS.
- Gandhi et al. (2024). Stream of Search (SoS): Learning to Search in Language.
- OpenAI (2024). Learning to Reason with LLMs(o1)。
- DeepSeek-AI (2025). DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning.
12. 下一讲预告 · Next lecture
这一讲的”智能体”还很初级:给它一个问题,它产出一个计划,我们在外面校验。真正的智能体要在环境里行动:做一步、看结果、再决定下一步;要记得之前发生了什么;还可能被赋予一个”角色”。第 14 讲继续原课第 10 周:智能体(二):角色、记忆与行动。
- 智能体循环:观察 → 思考 → 行动 → 观察;
- ReAct(Yao et al. 2023):把思考和行动交错,第 8 讲已经见过它的工具版本;
- Reflexion(Shinn et al. 2023):失败之后写一段”反思”,下一次尝试时带上它——一种不改参数的”学习”;
- 角色(persona)提示的作用与局限;
- AgentKit、AutoGen 这类框架在做什么;
- 记忆:上下文窗口、摘要、检索式记忆、MemGPT、Generative Agents 的记忆流——怎样让智能体”记住”超出上下文长度的东西。