目录
- [1. 为什么需要思维树](#1. 为什么需要思维树)
- [2. 思维树的基本原理](#2. 思维树的基本原理)
- [2.1 生成(Generate)](#2.1 生成(Generate))
- [2.2 评估(Evaluate)](#2.2 评估(Evaluate))
- [2.3 搜索(Search)](#2.3 搜索(Search))
- [3. 一个完整的示例](#3. 一个完整的示例)
- [4. 思维树在提示中的实现](#4. 思维树在提示中的实现)
- [4.1 基础级:多路径生成 + 自我评估](#4.1 基础级:多路径生成 + 自我评估)
- [4.2 进阶级:多轮对话中的迭代回溯](#4.2 进阶级:多轮对话中的迭代回溯)
- [4.3 高级级:代码框架实现完整 BFS/DFS](#4.3 高级级:代码框架实现完整 BFS/DFS)
- [4.4 关键设计考量](#4.4 关键设计考量)
- [5. 适用场景与局限性](#5. 适用场景与局限性)
- [5.1 适用场景](#5.1 适用场景)
- [5.2 局限性](#5.2 局限性)
- [5.3 何时使用 ToT 的决策框架](#5.3 何时使用 ToT 的决策框架)
- [6. 与其他提示技术的对比](#6. 与其他提示技术的对比)
- [7. 实践建议](#7. 实践建议)
- [8. 总结](#8. 总结)
1. 为什么需要思维树
大语言模型在复杂推理任务中常常会陷入"一条路走到黑"的困境:当模型沿着某个错误方向推理时,缺乏回溯和探索其他分支的能力。思维链(Chain-of-Thought,CoT)虽然能展示推理步骤,但本质上仍是线性推进,无法在多个可能的推理路径之间进行比较和选择。
具体来说,思维链存在以下局限性:
- 单向依赖:每一步推理都依赖前一步的结果,一旦中间某步出错,后续所有步骤都会偏离轨道,且没有机制自我纠正。
- 缺乏全局视角:CoT 只能看到"当前这条路径",无法同时对比"如果换一种解法会怎样",导致在解空间较大的问题中表现不稳定。
- 对初始方向敏感:模型第一次生成的思路往往决定了最终结果的质量,而第一次思路的质量高度依赖随机性,缺乏系统性探索。
举个典型例子:在解决"用数字 1、3、4、6 通过四则运算得到 24"这类问题时,CoT 可能沿着 1+3=4 → 4*4=16 → 16+6=22 这个方向走,发现走不通后只能草草收场。而实际上,正确的解法是 6/(1-3/4)=24,这条路径需要在初期就识别出"分数运算"这种非直觉方向。
思维树(Tree of Thoughts,ToT)正是为了解决这一问题而提出。它让模型在推理时像人类一样,先发散出多个候选思路,再评估每条路径的可行性,最终选择最优解。这种方法在数学推理、创意写作、规划任务等场景中显著提升了准确率和输出质量。例如,在 Game of 24 任务中,ToT 的成功率达到了 74%,而标准 CoT 仅约 4%------这是一个巨大的飞跃。
2. 思维树的基本原理
思维树的核心思想可以概括为三个步骤:生成 (Generate)、评估 (Evaluate)、搜索(Search)。这三个步骤构成一个循环,在每个推理节点上重复执行,直到找到满意的答案或达到预设的搜索深度。
2.1 生成(Generate)
在每一个推理节点,模型生成多个可能的下一步思考方向,而不是只输出一个。这些方向可以是不同的解题思路、不同的段落大纲,或者不同的行动方案。
生成的方式通常有两种:
- 独立采样:使用相同的提示多次调用模型,利用温度参数(temperature)引入随机性,得到不同的候选答案。这种方式最简单,但候选之间的多样性不可控。
- 顺序提议:在提示中明确要求模型"请提出 3 个不同的下一步思路",让模型在单次生成中主动发散。这种方式能更好地控制候选数量,且模型自身会倾向于生成有区分度的选项。
关键参数是分支因子(branching factor),即每个节点生成的候选数量。分支因子过小则探索不充分,过大则计算成本急剧上升。实践中通常设为 3~5 个候选。
2.2 评估(Evaluate)
对每个候选方向进行打分或判断。模型可以自我评估每个思路的合理性、连贯性,或者通过规则、外部工具进行验证。
评估方式主要分为两类:
- 价值评估:直接给每个候选思路打分(如 1~10 分),判断它"有多好"。这种方式快速但较为主观,模型可能偏好表面流畅的答案而非真正正确的答案。
- 投票评估:对候选思路进行两两比较或排序,选出最被"看好"的方向。这种方式更适合多个候选质量接近时使用。
在实际应用中,还可以结合前瞻模拟(lookahead):不仅评估当前候选本身,还让模型快速模拟该候选执行几步后的状态,预估最终结果。这类似于人类下棋时的"多想几步"。
2.3 搜索(Search)
基于评估结果,采用广度优先(BFS)或深度优先(DFS)策略选择最有希望的路径继续探索,必要时回溯到之前的节点尝试其他分支。
两种搜索策略的对比:
| 策略 | 做法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| BFS(广度优先) | 每层保留 b 个最优候选,同步扩展 | 不会错过全局最优 | 内存和计算成本高 | 每步评估可靠、需全局最优 |
| DFS(深度优先) | 沿一条路走到底,走不通再回溯 | 内存占用小,能快速到达终点 | 可能陷入局部最优 | 解空间深、分支多但评估准确 |
ToT 论文中更推荐 BFS 变体,因为语言模型的自我评估虽然不够完美,但通常能有效区分"明显好"和"明显差"的路径,保留 top-k 策略在实践中表现稳健。
这种方式将传统的"单线程推理"变成了"多线程探索",使模型能够在解空间中更系统地寻找答案,而不是依赖随机运气。
3. 一个完整的示例
为了让思维树的工作方式更加直观,我们以"用数字 1、3、4、6 通过四则运算得到 24,每个数字只能用一次"为例,逐步展示完整过程。
第一步:生成初始候选
模型在提示的引导下,生成所有可能的初始运算:
节点1: 尝试所有可能的初始运算
├── 1+3=4 → 剩余 4,4,6
├── 1*3=3 → 剩余 3,4,6
├── 6-1=5 → 剩余 3,4,5
├── 6/3=2 → 剩余 1,2,4
├── 4-1=3 → 剩余 3,3,6
└── 6/1=6 → 剩余 3,4,6
第二步:评估每条路径
模型对每个分支进行打分评估:
评估结果:
├── 1+3=4 → 剩余 4,4,6 | 评分: 8/10 --- 4,4,6 容易凑 24,6*4=24 已很接近
├── 1*3=3 → 剩余 3,4,6 | 评分: 6/10 --- 数字较分散,组合可能性多但不够直接
├── 6-1=5 → 剩余 3,4,5 | 评分: 5/10 --- 5,4,3 组合较难直接得到 24
├── 6/3=2 → 剩余 1,2,4 | 评分: 7/10 --- 2,4,1 可尝试 2*4*? 或 4*6(=24) 的变体
├── 4-1=3 → 剩余 3,3,6 | 评分: 4/10 --- 重复数字 3,灵活性较低
└── 6/1=6 → 剩余 3,4,6 | 评分: 6/10 --- 与分支2类似
第三步:BFS 搜索------优先探索最高分路径
选择评分最高的分支(1+3=4,剩余 4,4,6)继续探索:
节点2(沿分支1): 对剩余数字 4,4,6 尝试所有运算
├── 4+4=8 → 剩余 6,8
├── 4*4=16 → 剩余 6,16
├── 6*4=24 → 剩余 4,4 ← 成功!
└── 6/4=1.5 → 剩余 1.5,4
在第 3 个子分支中,6*4=24 正好得到目标值,且剩余的两个 4 可以通过 4-4=0 消除(或直接作为"已使用"处理)。至此,完整路径为:1+3=4 → 6*4=24。
对比:传统思维链的表现
如果使用传统思维链,模型可能只生成一条路径,且没有回溯机制:
CoT 尝试:1+3=4 → 4*4=16 → 16+6=22 (失败,结束)
这个例子清楚地展示了思维树的核心优势:通过系统性地探索多条路径并择优,而不是依赖单次随机尝试。
扩展示例:创意写作场景
除了数学推理,思维树在创意写作中同样有效。假设任务是"为一个科幻小说写开头",ToT 的工作流程如下:
节点1: 生成多个开篇方向
├── 方向A:"公元2187年,人类在火星殖民地发现了外星文明的遗迹..."
├── 方向B:"当她醒来时,发现自己被困在一个无限循环的虚拟现实中..."
├── 方向C:"信号是从比邻星方向传来的,但解码后所有人都沉默了..."
└── 方向D:"基因编辑技术让人类实现了永生,但代价是什么?..."
评估:
├── 方向A: 评分 8/10 --- 经典科幻设定,容易展开世界观
├── 方向B: 评分 7/10 --- 悬疑感强,但容易落入俗套
├── 方向C: 评分 9/10 --- 悬念设置巧妙,兼具硬科幻与情感张力
└── 方向D: 评分 6/10 --- 哲学意味浓厚,但开篇缺乏画面感
选择方向C继续发展...
通过这种树状探索,模型能够更高效地找到高质量的解,而不是依赖单次运气。
4. 思维树在提示中的实现
在实际应用中,我们不一定要从头实现完整的搜索算法,而是可以通过提示工程来模拟思维树行为。以下是几种实用的实现方式,按复杂度从低到高排列。
4.1 基础级:多路径生成 + 自我评估
最简单的 ToT 模拟只需在单次提示中完成"生成 → 评估 → 选择":
- 多路径生成指令:在提示中明确要求模型给出多个候选答案或思路,例如"请列出三种可能的解决方案,并分析各自的优缺点"。
- 自我评估提示:让模型对每个候选路径进行评分,例如"对以上每个方案打分(1-10分),说明理由,并选出最优方案"。
- 结构化输出:要求模型以树状结构(如 Markdown 列表、JSON)输出思考过程,便于后续解析和人工审查。
下面是一个基础级提示模板:
markdown
你是一个善于多角度思考的助手。请针对以下问题,生成三个不同的解决思路,并分别评估它们的可行性,最后推荐最优方案。
问题:如何在一周内快速提高代码阅读能力?
请按以下格式输出:
思路1:[描述]
评分:[1-10] 理由:[...]
思路2:...
思路3:...
推荐:[选择某思路并说明原因]
4.2 进阶级:多轮对话中的迭代回溯
在需要更深探索的场景中,可以利用多轮对话实现类似 DFS 的回溯机制:
-
迭代回溯提示:当模型遇到困难时,提示它"回到上一步,尝试另一个方向"。例如:
第一轮:请生成 3 个解决思路。
第二轮:思路 1 似乎走不通,请回到第二步,尝试思路 2。同时,重新评估思路 3 的可行性。
第三轮:思路 2 进展顺利,但发现了一个分支问题。请基于思路 2 生成 2 个子方向,继续探索。
这种方式适合在 Chat 界面中交互式使用,用户可以在关键节点介入,引导模型探索特定方向。
4.3 高级级:代码框架实现完整 BFS/DFS
对于需要精确控制搜索过程的场景,可以编写代码框架,通过 API 调用 LLM 实现完整的 ToT 算法。以下是 Python 伪代码,展示了核心逻辑:
python
import openai
from typing import List, Tuple
class TreeOfThoughts:
def __init__(self, max_depth: int = 5, branch_factor: int = 3, beam_width: int = 2):
self.max_depth = max_depth
self.branch_factor = branch_factor
self.beam_width = beam_width # BFS 保留的候选数
def generate_candidates(self, state: str, problem: str) -> List[str]:
"""生成多个候选下一步"""
prompt = f"""问题:{problem}
当前状态:{state}
请提出 {self.branch_factor} 个不同的下一步思路,每个思路应简洁明确。"""
response = openai.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
# 解析响应,提取候选列表
return self._parse_candidates(response.choices[0].message.content)
def evaluate(self, state: str, candidate: str, problem: str) -> float:
"""评估候选路径的得分"""
prompt = f"""问题:{problem}
当前状态:{state}
候选方向:{candidate}
请评估这个方向的成功可能性,给出 1-10 的分数,并简要说明理由。
格式:分数: X/10, 理由: ..."""
response = openai.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
return self._parse_score(response.choices[0].message.content)
def bfs_solve(self, problem: str) -> str:
"""BFS 搜索求解"""
queue = [("", 0)] # (当前状态, 深度)
best_path = None
while queue:
state, depth = queue.pop(0)
if self._is_solved(state, problem):
return state
if depth >= self.max_depth:
continue
# 生成候选
candidates = self.generate_candidates(state, problem)
# 评估并排序
scored = []
for c in candidates:
score = self.evaluate(state, c, problem)
new_state = state + "\n→ " + c
scored.append((score, new_state))
# 保留 top-k(beam search)
scored.sort(reverse=True, key=lambda x: x[0])
for _, new_state in scored[:self.beam_width]:
queue.append((new_state, depth + 1))
return best_path or "未找到解"
def _parse_candidates(self, text: str) -> List[str]:
# 实现解析逻辑
pass
def _parse_score(self, text: str) -> float:
# 实现解析逻辑
pass
def _is_solved(self, state: str, problem: str) -> bool:
# 实现判断逻辑
pass
4.4 关键设计考量
- 温度参数:生成候选时建议使用较高的 temperature(0.7~1.0),以增加多样性;评估时建议使用较低的 temperature(0~0.3),以保证一致性。
- 停止条件:除了达到最大深度,还可以设置"找到满意解"或"所有候选分数低于阈值"作为停止条件。
- 状态表示:每个节点的状态应包含已完成的推理步骤和当前的中间结果,格式应简洁以控制 token 消耗。
5. 适用场景与局限性
5.1 适用场景
思维树提示在以下场景表现尤为突出:
- 数学与逻辑推理:需要尝试多种解法的问题,如 24 点、数独、几何证明、逻辑谜题。ToT 在 Game of 24 任务中达到 74% 成功率,远超 CoT 的 4%。
- 创意生成:写作大纲、广告文案、故事发展等需要发散性思维的任务。ToT 可以同时探索不同风格、不同切入点,最终选择最吸引人的方向。
- 规划与决策:旅行计划、项目排期、策略制定等需权衡多个方案的任务。例如"设计一个三天的北京旅行计划",ToT 可以分别探索文化路线、美食路线、亲子路线,再综合评分。
- 代码生成与调试:当有多种算法或实现方式时,可并发生成几个版本再择优。例如在解决 LeetCode 题目时,ToT 可以同时探索动态规划、贪心、回溯等不同思路,减少"走错方向"的风险。
- 跨领域推理:需要结合多个领域知识的问题,如"用经济学原理分析一个社会现象",ToT 可以分别从供需、博弈论、行为经济学等角度展开,再综合成最优分析。
5.2 局限性
但同时也要注意其局限性:
- 成本较高:生成多个路径会消耗更多 token 和计算资源。以分支因子 3、深度 5 的 BFS 为例,最坏情况下需要调用模型 3^5 = 243 次,成本远高于单次 CoT 调用。即使使用 beam search 剪枝,成本仍可能是 CoT 的 5~10 倍。
- 评估困难:模型自我评估的准确性有限,可能偏向表面流畅而非真正正确的答案。研究表明,LLM 的自评分数与真实正确率的相关性并不总是很高,尤其在需要精确计算的场景中。对此,可以引入外部验证器(如代码执行器、数学计算器)来辅助评估。
- 实现复杂度:完整的搜索算法(如 BFS/DFS)需要额外代码框架,纯提示难以完全模拟。对于大多数开发者来说,编写和维护 ToT 框架的学习成本较高。
- 不适用于简单任务:对于简单的问答或翻译,单路径思维链已足够,多路径反而增加冗余和延迟。ToT 的投入产出比在"问题有明确验证标准且解空间较大"时最高。
- 搜索空间爆炸:当问题复杂度上升时,即使有剪枝策略,搜索空间仍可能指数级增长。例如在开放式创意写作中,"最好的开头"是高度主观的,很难通过简单的评分机制有效剪枝。
5.3 何时使用 ToT 的决策框架
一个简单的判断标准:如果问题的解空间较大、有明确的验证标准、且单次 CoT 的成功率不稳定,那么 ToT 值得一试。反之,如果问题简单或验证困难,CoT 或标准提示可能是更务实的选择。
6. 与其他提示技术的对比
| 技术 | 推理方式 | 适用场景 | 复杂度 |
|---|---|---|---|
| 标准提示 | 直接输出答案 | 简单问答 | 低 |
| 思维链 | 线性步骤推理 | 多步推理 | 中 |
| 思维树 | 树状多路径探索+回溯 | 复杂推理、规划 | 高 |
| 自一致性 | 多次采样+投票 | 需稳定答案的推理 | 中 |
| 反思 | 输出后自我修正 | 需要迭代改进的任务 | 中高 |
可以看出,思维树在"探索深度"和"路径多样性"上具有明显优势,但实现成本也更高。实际应用中,常将思维树与其他技术结合,例如先用思维树生成多个候选,再用自一致性投票选出最终答案。
7. 实践建议
如果你希望在项目中引入思维树提示,可以遵循以下建议:
- 从简到繁:先尝试在提示中要求"多个候选思路",观察效果,再逐步引入评分和回溯机制。
- 明确评估标准:为模型提供清晰的评分维度,如正确性、简洁性、创新性,避免模糊评价。
- 控制分支数量:每个节点的分支数不宜过多(建议3-5个),否则搜索空间过大,成本陡增。
- 结合外部工具:在需要精确计算或验证的场景,引入代码执行器、搜索引擎等外部工具辅助评估。
- 记录思维过程:将树状探索过程输出为结构化日志,便于调试和优化提示。
8. 总结
思维树提示为AI推理提供了一种更接近人类思考的方式:不急于给出唯一答案,而是先发散、再评估、最后收敛。尽管在成本和实现上存在一定挑战,但它在复杂任务中的潜力已经得到广泛验证。随着模型能力的提升和提示工程的发展,思维树有望成为AI高级推理的标配技术之一。
希望本文能帮助你理解思维树提示的核心思想,并尝试将其应用到自己的项目中,让AI的思考更加深入和全面。