三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

大模型为什么连 24 点都算不对?Tree of Thoughts 让它学会「试错和回头」,成功率从 4% 飙到 74%

大模型为什么连 24 点都算不对?Tree of Thoughts 让它学会「试错和回头」,成功率从 4% 飙到 74%

大模型为什么连 24 点都算不对?Tree of Thoughts 让它学会「试错和回头」,成功率从 4% 飙到 74%

你让 GPT-4 算一道 24 点(用 4 个数字加减乘除凑出 24),它大概率会卡壳。

不是因为它不会算——4+5=9这种它门儿清。而是因为它太「一根筋」:

一旦第一步选错了路,它就一路错到底,永远不会说「算了,我换条路」。

论文里有个扎心数字:在 100 道高难度 24 点上,标准推理方法(CoT)成功率只有4%。而给它加上一个叫Tree of Thoughts(思维树,ToT)的框架后——同一个 GPT-4,成功率直接干到74%

差了快 20 倍。没换模型,没加参数,没有微调。只是让它学会了「试错和回头」

这篇是长文,建议先点收藏慢慢看。我会从「为什么需要它」一直讲到「它怎么落地、坑在哪、下一步是什么」,争取一篇讲透。


〇、先对齐背景:CoT 和 SC 分别解决了什么

要懂 ToT,得先懂它的两个前辈,否则你会觉得 ToT 莫名其妙。

CoT(思维链,Chain of Thought):让模型把推理写成「一条线性链」——`问题 → 步骤1 → 步骤2 → 步骤3 → 答案」。它把难预测的一步,拆成一串易预测的小步。比如「小明买 3 斤苹果每斤 12 元…」这类题,CoT 已经能稳定答对。

SC(自一致性,Self-Consistency):同一个题用较高温度采样生成 N 条独立的 CoT,对最终答案做多数投票,滤掉单条随机错误。适合有标准答案、想用算力换稳的题(如数学 GSM8K)。

它们共同的根本限制,来自 ToT 论文(Yao et al., 2023)的原话:

语言模型在推理期,仍然被限制在「token 级、从左到右」的决策过程里。

这句话是理解全文的钥匙。它带来两个死穴:

  1. 不可回溯:某步写错,错误一路带到底,无法回头换路。
  2. 无法前瞻/规划:面对「得先试几步、发现走不通再换思路」的任务,线性或平行链都无能为力。

用两个任务一对比就清楚了:

任务CoT / SC 表现原因
小明买苹果(3×12−5+2×12=55CoT 已能稳定答对单链线性推理足够,无需试错
Game of 24(用 4 个数凑 24)CoT 仅4%必须先「试运算、看是否走得通、不通就换」

一句话定位:ToT = 把「推理」从「写一条链」重新建模成「在一棵思维树上做搜索」——可以生成多个分支、自评每个分支、前瞻与回溯。它是 CoT / SC 的自然推广(论文原文:IO、CoT、CoT-SC、self-refine 都是 ToT 在「树深/树宽受限」时的特例)。


一、大模型为什么这么「一根筋」

CoT 很强,但天生死穴就是上面说的:从左到右写,错了就只能错到底

于是有人想:那让它想 100 遍、投票决定呢?论文也试了——

  • 想一遍(CoT):4%
  • 想 100 遍投票(SC):9%

为什么没救?因为每一次「想」,它都是一根筋往前冲。100 个一根筋的人,没有一个会中途回头。多采样,只是在重复同一个不会回头的错误。

这就引出一个关键洞察:

24 点这种题,难点根本不是「会不会算」,而是「要不要试错和回头」——而这恰恰是 CoT/SC 最不会的东西。


二、ToT 是什么:把推理变成「在一棵树上搜索」

Tree of Thoughts 的思路特别像人解题:

不是「想出一条路」,而是「同时想几条路,边想边判断哪条靠谱,走不通就换一条」。

它把推理从「写一条链」,变成「在一棵思维树上做搜索」。四个关键词:

  • 思维(thought):不是单个 token,而是「一个有意义的中间步骤」——一步运算、一段话的提纲、填字的一个词。
  • 树(tree):同一状态可以分出多个候选分支,而不是一条道走到底。
  • 自评(self-evaluate):每个状态都被打分,决定保留还是剪掉。
  • 搜索(search):用 BFS / DFS 等算法在树上导航。

三者关系一句话:

CoT 是「想一条路」;SC 是「想多条路再投票」;ToT 是「想多条路、边想边判断哪条靠谱、不通就回头」。

而且论文明确说:CoT、SC 全是 ToT「缩水版」的特例。ToT 不是替代它们,是它们的升级档——按任务难度「升档」使用。


三、ToT 不是什么(先破除 3 个误解)

讲原理前,先排掉最容易踩的坑:

  • 不是新训练了一个模型:ToT完全不训练(无奖励模型、无策略梯度、无微调),跑的是冻结的预训练 LM。
  • 不是一句 prompt 就能触发:它是一套需要外部代码控制器的推理期框架(详见第五节)。
  • 不是 CoT 的替代品:它是 CoT 的推广,按任务难度升档使用。

这三点很重要,因为网上很多「ToT prompt 模板」其实只是轻量变体(后面第九节会讲),和论文里真正的框架是两回事。


四、内部机制:4 个可插拔模块

ToT 是模块化框架,由 4 个组件构成。下面仍以 24 点贯穿讲解。

4.1 思维分解(Thought Decomposition)

先决定「一个 thought 多大」,这定义了搜索的状态粒度

  • 24 点:每个 thought =一步运算(如13−9=4),状态 = 当前剩下的数字集合。
  • 创意写作:每个 thought =一段提纲 / 一段正文
  • 填字游戏:每个 thought =填一个词

4.2 候选生成(Thought Generation)

给当前状态,用 LLM生成 k 个下一步候选 thought。论文用两种策略:

策略做法特点
Sample(独立采样)同一状态独立采样 k 次,彼此无关多样性高
Propose(顺序提议)基于已有 thought 续写下一个更连贯,但更贵

24 点每状态生成 k 个候选运算(论文约 k=5)。

4.3 状态评估(State Evaluation)★ 关键分水岭

这是 ToT 与 CoT / SC 最大的不同:每个状态都单独被打分。两种方式:

方式做法24 点用法
Value(打分)让 LLM 给状态打 0–1 分(few-shot)
Vote(投票)让 LLM 对多个状态比较、选最优判断「剩余数字能否凑出 24」,标sure / maybe / impossible,每状态采样 3 次取多数

评估器通常就是 LLM 自己(自洽地当裁判)。

4.4 搜索算法(Search Algorithm)

按评估结果组织探索,论文主推两种:

  • BFS(广度优先):每一层只保留top-b个最有希望的状态,逐层展开(24 点用 BFS,b=5,depth=3)。
  • DFS(深度优先):沿一条分支深探,走到死路(impossible 或超步数)就回溯到上层换分支(填字游戏用 DFS)。

论文还提到 A* / MCTS 是更先进的未来方向。


五、剪枝与回溯:算法级真相(最容易被误读的部分)

这是 ToT 真正的精髓,也是最多人讲错的地方。我把「剪枝怎么剪、回溯怎么回」在算法层面拆开——它们不是模型「想通了往回走」,而是搜索算法的显式操作

5.1 剪枝(Pruning)

剪枝 =根据评估分数,把不值得展开的状态直接丢弃,不再为它生成子节点

  • 分类式评估:状态被贴impossible→ 立即剪掉,连子节点都不生成。
  • 数值式评估:打 0–1 分 → 按分数排序,只保留最高的 b 个(beam width b),其余全丢。

剪枝不删除已生成的 token,只是「不再继续往下生成这条分支」。

5.2 回溯(Backtracking)★ 破除最大误区

回溯不是把已生成的 token 撤销、退回去重算(Transformer 生成的 token 不可逆)。ToT 的「回溯」是搜索控制流——当一条分支走死,算法放弃它,转去处理 frontier(待探索集合)里另一条还活着的分支

  • 每个节点 = 「到目前为止的 thought 序列」(一个状态)。
  • ToT 在内存维护一棵树 + 一个待探索集合(队列 BFS / 栈 DFS)
  • 「回到 A2 / B 分支」= 用 A2 或 B 的 thought 前缀,新开一次 LLM 调用,而不是把 A1 的 token 抹掉。
  • 树是由很多次独立调用拼出来的,不是一次连续生成。

5.3 BFS 版伪代码

frontier=[初始状态]# 第 0 层fordepthinrange(max_depth):next_frontier=[]forstateinfrontier:children=generate_k(state)# 模块2:生成 k 个候选forcinchildren:c.score=evaluate(c)# 模块3:状态评估children.sort(by=c.score,desc=True)next_frontier+=children[:b]# 剪枝:只留分数最高的 b 个frontier=next_frontier# 被丢弃的 = 剪枝ifany(solved):returnsolution# 找到 24 就停returnNone

这里「回溯」表现为:A1 分支死掉后,它根本没进next_frontier,算法自然去处理同层的 A2、B。没有回退动作,只是不追这条了。

5.4 DFS 版伪代码

defdfs(state,depth):ifsolved(state):returnstate# 命中 24ifdepth>=max_depth:returnNone# 超深,死forcingenerate_k(state):c.score=evaluate(c)ifc.score==impossible:continue# 剪枝:跳过此子节点res=dfs(c,depth+1)# 深入下一层ifres:returnres# 下游找到了,一路返回returnNone# 所有子节点都死 → 回溯到上层dfs(初始状态,0)

这里「回溯」是字面意义:return None把调用栈弹回父节点,父节点for循环continue试下一个子节点。

5.5 回溯是「承重墙」(消融证据)

论文做了去掉组件的消融实验:在填字游戏上,去掉回溯(退化为 b=1 贪心 BFS),词级成功率从60% 跌到约 20%

这意味着回溯不是锦上添花,而是 ToT 生效的关键机制。少了它,整个方法塌房。


六、实战:24 点完整走查

题目:用4、9、10、13四个数,加减乘除各用一次,凑出 24。规则:每个数用一次;thought = 一步运算;状态 = 剩余数字集合。

搜索树(绿色=保留/求解,红色=评估器剪枝):

{4, 9, 10, 13} / | | \ A:13-9=4 B:10-4=6 C:9+10=19✗ D:4×9=36✗ {4,4,10} {6,9,13} (剪枝) (剪枝) / \ A1:10-4=6 A2:4+4=8 {4,6} {8,10} │ (无法凑24✗) A1a:6×4=24 ✓

逐层走查:

  1. 思维分解:切成「一步一运算」,状态 = 剩余数字集合。
  2. 生成候选:从根同时提 4 个第一步候选(见上表),C、D 被评估为impossible剪枝,只留 A、B。
  3. 沿 A 展开{4,4,10}生成 A1(10−4=6{4,6})、A2(4+4=8{8,10})。
  4. A1 求解{4,6}6×4=24 ✓。完整路径:13−9=410−4=66×4=24
  5. 如果走错了(回溯演示):假设 A1 没成,它的子节点全被剪,算法从 frontier 取A2{8,10}B{6,9,13}继续——这就是「换分支」。CoT / SC 永远没有这一手。

同题对比:

范式24 点表现原因
CoT(贪心)~4%随机选一条(常是4×9=36),死路一条、无法回头
SC(多链投票)~9%多条独立链投票,但每条链内部仍贪心,规划力有限
ToT(树搜索)~74%显式剪枝 + 回溯

七、ToT 是框架,不是 prompt:成本量化

这一节很多教程会跳过,但它决定了你能不能真用起来。

CoT / SC 是「改 prompt 就能跑」;ToT 不行,它需要一个控制器循环:维护状态树、反复调用 LLM、解析输出成状态、按评估分数决定展开/剪枝/回溯。

成本(论文数据,24 点,GPT-4):

  • 每题约5.5k 补全 token,约等于并行跑 100 次独立 CoT 试错的总量(约 100 倍单次直答成本)。
  • 实测约100 次 LLM 调用 / 题量级。
  • 比 SC 的「100 条独立链」更省(因为剪枝提前砍掉死路),但远高于单次 CoT。

一句话:ToT 用「算力换正确率」,只在「值得试错」的难题上划算。


八、评估器不可靠:ToT 的致命弱点

前面说评估器通常就是那个 LLM。如果它看走眼

  • 本该保留的好分支误判为impossible→ 错剪;
  • 死路误判为likely→ 浪费算力还走错。

这连回一个老问题:模型自评不一定反映真实推理(不忠实 CoT)

解法:用确定性 verifier 替代 / 补充。

  • 24 点里「剩余数字能否凑 24」其实可以写段代码确定性验证,不一定要 LLM 自评。
  • 论文四组件可插拔→ 评估器可以换成硬规则 verifier、外部工具、或训练好的过程奖励模型(PRM)。
  • 这把 ToT 从「纯 LLM 自评」升级为「LLM 生成 + 可靠验证」的混合系统,大幅降低误剪风险。

九、适用场景与边界(照着选,别乱用)

适合用 ToT

场景类型例子为什么有效
组合 / 数学规划Game of 24、约束满足需要试运算、前瞻、回溯
约束满足5×5 填字中间词必须互相一致,需回溯改字
带硬约束的创作给定结尾句写连贯文章全局约束,需回溯调整提纲
博弈 / 排程 / 策略多步决策、路径规划初始决策关键,需试错

不适合 / 要慎用

  • 一眼能答的简单题:增益≈0,还白白多烧几十倍 token。
  • 纯事实 / 知识问答:ToT 不补知识,不懂还是不懂,该用检索 / RAG。
  • 实时 / 高并发:搜索是多轮生成,延迟扛不住。
  • 状态难定义:很多任务拆不出干净的 thought,评估器无从打分。
  • 小模型当评估器:评估器本身得够强,小模型自评不可靠。

三档选型对照

档位方法适用成本
1CoT多步但能一次走对
2Self-Consistency有标准答案、想用算力换稳中(N 倍)
3ToT必须规划 / 试错 / 回溯高(百倍级)

十、论文实测结果(已核对原文 Yao et al., 2023)

以下数字来自 ToT 论文(arXiv:2305.10601,GPT-4),经核对原文与官方数据集。

Game of 24(100 道难题):

方法成功率
IO(输入-输出 prompt)7.3%
CoT(贪心)4.0%
CoT-SC(k=100)9.0%
ToT(b=1,退化为贪心)45%
ToT(b=5,BFS)74%

即便「best-of-100 的 CoT」也只有 49%——说明搜索更多节点胜过重复采样链

Creative Writing(给定 4 个随机结尾句写 4 段连贯文章):ToT 连贯性评分 7.56,高于 CoT 的 6.93;人类两两偏好 ToT 胜 CoT 41/100 对(CoT 胜 21/100)。

Mini Crosswords(5×5 填字):ToT(DFS)词级成功率 60%、整局 20%,远高于 CoT 的 15.6% / 1%。

消融实验(填字词级):完整 ToT 60%;用 oracle 最优状态 82.4%;去掉剪枝 65.4%;去掉回溯 ~20%——再次印证回溯是承重墙。


十一、方法版图与延伸(ToT 之后看这些)

  • GoT(Graph of Thoughts, 2023):把 ToT 的「树」放宽为「图」,允许不同分支的结论汇聚/合并,适合「多思路融合产出最终解」。
  • MCTS 路线(如 rStar-Math):用蒙特卡洛树搜索替代 BFS/DFS,带「探索-利用」权衡,更接近 AlphaGo。区别在于 MCTS 常在训练时用树搜索蒸馏进权重;ToT 是推理期、纯 prompt的对应物(不训练)。
  • 两篇都叫「Tree of Thoughts」的论文(命名澄清):Yao et al., 2023(本文所讲,通用 BFS/DFS/beam 搜索)vs Long, 2023(用强化学习训练 ToT Controller 驱动搜索策略)。查资料别撞车。
  • 轻量变体 Tree-of-Thought Prompting(Hulbert, 2023):把 ToT 思想压进单个 prompt(如「想象三位专家各自写一步,错了就离场」),无需外部控制器,但搜索深度/质量远弱于完整框架。想「零代码尝鲜」可用。
  • ToT 与 PRM 的关系:ToT 的评估器是手写的、未训练的启发式;PRM(「Let’s Verify Step by Step」)把它换成训练好的逐步验证模型。前者即插即用、零训练;后者更准但需标注数据。

十二、为什么你现在就该搞懂它

2026 年整个行业都在卷「推理」。你听到的 o1、DeepSeek-R1,还有各种 reasoning 模型,底层到处都是「搜索 + 回溯 + 逐步验证」的影子。

ToT,是这套思想最早、最干净、最好懂的一版原貌。读懂它,你就不只是「会用 prompt」的人了,而是真正理解了——

「让 AI 学会思考」这件事,在架构上到底长什么样。


📱 关注看后续


🛠 顺手推荐一个开源工具

deepSeekHarenss Desktop—— DeepSeekHarness 客户端工具一键安装 deepSeekHarenss。

📦 下载地址:https://github.com/qweqe417/dsh-desktop

有兴趣的朋友可以去下一个玩玩,顺便点个 ⭐Star支持作者 🙏


📊 一张图看懂:线性链 vs 思维树

线性链(CoT / SC)—— 一根筋走到底:

问题 │ ▼ 步骤 1 │ ▼ 步骤 2 │ ▼ 步骤 3 │ ▼ 答案 ← 错了只能错到底

思维树(ToT)—— 多路并行,能回头:

┌─→ 候选 A ─┐ │ │ 问题 ── 生成 ──┬─→├─→ 候选 B ─┼─→ 评估 ─→ 剪枝/保留 ─→ 答案 │ │ │ │ │ └─→ 候选 C ─┘ │ │ │ └──────── 回溯换路 ───────────┘

一句话:线性链「一根筋」,错了只能错到底;思维树「多条路并行 + 评估 + 剪枝 + 回溯」,错了能换路 —— 这就是 ToT 把 24 点从 4% 飙到 74% 的关键。

← 返回列表