← 返回首页

🌳 Tree of Thoughts
Agent 设计模式浅析系列(18)

把推理变成搜索——同时探索多条思路,评估后择优展开

🎯
理解 Tree of Thoughts 和 Chain of Thought 的本质区别
🧠
掌握 搜索树机制:展开→评估→剪枝→继续
⚖️
学会 设计有效的评估器(Evaluator)
知道 什么时候该用、什么时候不该用
搜索树
推理范式
评估→剪枝
核心机制
BFS/DFS
搜索策略
自然语言
节点类型

为什么需要 Tree of Thoughts

很多任务不是"按步骤推下去"就能解决的。

规划路线、解谜题、做策略、写复杂方案——你走错第一步,后面写得再流畅也没用。

线性推理的问题:模型一旦选了一条路,就会沿着这条路继续编下去,不会主动回头检查。

❌ Chain of Thought(线性)

问题 → 想法1 → 想法2 → 想法3 → 答案

一条路走到底,走错就全错

✅ Tree of Thoughts(树状)

问题
├── 思路 A
│ ├── A1
│ └── A2
├── 思路 B
│ ├── B1
│ └── B2
└── 思路 C
├── C1
└── C2

评估 → 剪枝 → 继续展开 → 得到答案

多路并行,评估后择优

它把推理变成一个搜索问题。每一个 thought 都不是最终答案,而是一个中间状态。系统可以对这些状态打分,判断哪条路径更有希望,然后决定继续展开哪几条。

区别是:这里的节点不是棋盘状态或数字状态,而是模型生成的自然语言中间想法

一个策略问题的例子

假设你问:"一个面向程序员的 AI 写作工具,第一版应该做什么功能?"

❌ 线性 Agent 的回答

直接拍一个功能列表:

应该做 Markdown 编辑、AI 改写、配图生成、发布到公众号。

但这只是其中一条路,未必是最对的。

🌲 Tree of Thoughts 的做法

第 1 步:展开多条方向

路径 A:做写作编辑器 路径 B:做代码仓库到文章的自动生成 路径 C:做技术资料整理和选题库 路径 D:做公众号发布工作流

第 2 步:评估

A:竞争很激烈,差异化不够 B:程序员场景明确,输入数据天然存在 ✅ C:有价值,但短期难形成闭环 D:有用,但更像工具链末端

第 3 步:保留优胜路径继续展开

B1:从 Git commit 生成周报 B2:从 PR / Issue 生成技术文章草稿 B3:从代码目录生成项目介绍 D1:Markdown 转公众号 HTML D2:自动配图 D3:排版和发布

最终结论:

先做"从 PR / Issue / Commit 生成技术文章草稿",再接 Markdown 排版和配图。
这就比一开始拍一个功能列表靠谱多了。

搜索不是越宽越好

Tree of Thoughts 最大的问题是贵

如果每一步都生成 5 条路径,每条路径再展开 5 条,几层之后成本就爆了。

工程上必须控制的参数:
📐 Breadth
每轮最多生成几条候选
📏 Depth
最多展开几层
⭐ Evaluator
每轮给候选打分
✂️ Pruning
剪掉低分路径
🛑 Stop Rule
什么时候停止搜索

不是所有任务都值得用 ToT。它适合那些"前期路径选择很重要"的任务:

🧩 复杂规划 🔢 数学和逻辑题 🎮 游戏决策 📊 产品策略 🏗️ 架构方案比较 🔧 多步骤排错

什么时候不该用:用户只是问一个事实问题,或者任务本身路径很明确,就没有必要开一棵树。

评估器(Evaluator)是关键

Tree of Thoughts 能不能工作,很大程度取决于 Evaluator。如果评估器只会说"这个方案不错",那搜索就没有意义。

产品策略问题的评估维度

用户痛点强度
实现成本
差异化
闭环速度
风险
是否符合当前资源

代码排错问题的评估维度

是否解释了报错
是否覆盖复现条件
是否能被测试验证
修改范围是否可控
是否引入新风险
⚠️ 没有清晰评估标准,Tree of Thoughts 就会变成"多生成几份答案再挑一份看着顺眼的"。这当然也可能有帮助,但离真正的搜索还差很远。

它和多 Agent 辩论有什么区别?

Tree of Thoughts 和 Multi-Agent Debate 都会生成多个观点,但它们不一样。

💬 Multi-Agent Debate

更像多人讨论:

Agent A 提方案 Agent B 反驳 Agent C 找漏洞

观点碰撞,互相批判

🌳 Tree of Thoughts

更像一个人的深度思考:

一个模型同时想几条路 自己评估,自己剪枝 自己决定走哪条

单主体内部分支探索

它们的核心差异是主体数量。Debate 靠多个 Agent 的外部交互来收敛,ToT 靠单个 Agent 的内部搜索来收敛。

最容易翻车的地方

1. 评估器不准

ToT 依赖评估器来知道哪些路径值得展开。如果评估器本身的判断力不够,搜了半天可能都是在垃圾路径上浪费资源。

Evaluator 自身也需要够强的模型——这是一个递归问题。

2. 路径之间不够独立

如果多条路径本质上差不多,"多条思路"就变成了"同一个思路的多种说法"。分支之间应该有足够差异,搜索才有意义。

3. 搜索策略没选对

用 BFS 还是 DFS,深度设多少,剪枝阈值设多少——这些工程参数对最终效果影响很大。用错了等于白搜。

4. 成本失控

ToT 的 token 消耗远高于普通 Chain of Thought。如果任务本身不需要搜索,开 ToT 就是烧钱。

工程上怎么实现

1. 定义 Thought 节点

每个 thought 是一次 LLM 调用生成的中间结果。核心字段:

{ "content": "...", // 当前的思考内容 "parent": null, // 父节点 ID "children": [], // 子节点列表 "score": null, // 评估分数 "depth": 0 // 当前深度 }

2. 实现搜索循环

while depth < max_depth and not should_stop: 1. 对当前层的每个节点,生成子节点(多路展开) 2. 对每个子节点,用 Evaluator 评估 3. 按分数排序,剪掉低分节点 4. 保留 Top-K 进入下一层 5. 检查是否满足停止条件

3. 两种搜索策略

  • BFS(广度优先):逐层展开,适合"需要先广泛探索再深入"的任务
  • DFS(深度优先):优先深入某条路径,适合"深度优于广度"的任务

4. 关键控制参数

K 值
每层保留几条路径
深度限制
最多展开多少层
剪枝阈值
低于几分就不展开
停止条件
结果是否足够好

对 Tree of Thoughts 的理解

ToT 不是一个通用模型,而是一种推理调度策略

它解决的不是模型"想得不够深",而是"走得不够广"的问题。

用搜索对抗线性推理的盲区——这是它核心的洞察。

本质

ToT 本质上是把搜索算法语言模型结合。语言模型负责生成节点(thoughts)和评估节点(evaluator),搜索算法负责调度。

适用场景

  • 路径多、选择至关重要
  • 走错一步成本很高
  • 短 CoT 不够用
  • 评估标准可以清晰定义

局限

  • 贵(token 消耗远高于 CoT)
  • 评估器决定了效果上限
  • 搜索策略和参数需要精细调优
  • 不适合路径明确或事实性问题
🔍

搜索 + LLM

把自然语言推理变成树搜索问题

✂️

评估→剪枝

不是所有路径都值得继续走

⚖️

BFS/DFS

按任务选择搜索策略

⚠️

非通用方案

选对场景才是关键

📚 知识闪卡

{{ card.q }}
点击翻转
{{ card.a }}

✍️ 测验

{{ quizCorrect }}/{{ quizTotal }} 正确
{{ Math.round(quizCorrect/quizTotal*100) }}%
{{ qi+1 }}. {{ q.q }}
{{ opt }}
✅ 正确! ❌ 正确答案是:{{ q.options[q.correct] }}
{{ currentLesson + 1 }} / {{ lessons.length }}