大模型为什么连 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 级、从左到右」的决策过程里。
这句话是理解全文的钥匙。它带来两个死穴:
- 不可回溯:某步写错,错误一路带到底,无法回头换路。
- 无法前瞻/规划:面对「得先试几步、发现走不通再换思路」的任务,线性或平行链都无能为力。
用两个任务一对比就清楚了:
| 任务 | CoT / SC 表现 | 原因 |
|---|---|---|
小明买苹果(3×12−5+2×12=55) | CoT 已能稳定答对 | 单链线性推理足够,无需试错 |
| 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 ✓逐层走查:
- 思维分解:切成「一步一运算」,状态 = 剩余数字集合。
- 生成候选:从根同时提 4 个第一步候选(见上表),C、D 被评估为
impossible剪枝,只留 A、B。 - 沿 A 展开:
{4,4,10}生成 A1(10−4=6→{4,6})、A2(4+4=8→{8,10})。 - A1 求解:
{4,6}→6×4=24 ✓。完整路径:13−9=4→10−4=6→6×4=24。 - 如果走错了(回溯演示):假设 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,评估器无从打分。
- ❌小模型当评估器:评估器本身得够强,小模型自评不可靠。
三档选型对照
| 档位 | 方法 | 适用 | 成本 |
|---|---|---|---|
| 1 | CoT | 多步但能一次走对 | 低 |
| 2 | Self-Consistency | 有标准答案、想用算力换稳 | 中(N 倍) |
| 3 | ToT | 必须规划 / 试错 / 回溯 | 高(百倍级) |
十、论文实测结果(已核对原文 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% 的关键。