3.3 Tree of Thoughts 与 Graph of Thoughts
从线性链到树/图状的深思熟虑——评估器 + 搜索(DFS/BFS/MCTS)与成本-收益权衡
从"一条链"到"一棵树"
CoT 是一条线性链——从起点推到终点,一条路走到黑。人类解决难题时却不是这样:我们会同时想几条路线、评估哪条更靠谱、发现死路就回头。这正是 Kahneman 提出的"系统 2"思维。
Tree of Thoughts(ToT)(Yao et al., NeurIPS 2023)把 CoT 推广为树状结构探索——让 LLM 在每一步生成多个候选"思维节点",由 LLM 自己作为评估器打分,再结合经典搜索算法(DFS / BFS / MCTS)进行决策。
图中虚线节点因为 LLM 评估得分过低被剪枝(pruning),ToT 最终走的是 Root → t1 → t11 → Final 这条得分最高的路径。
ToT 在 24 点游戏上的统治性结果:GPT-4 配合 CoT 仅解 4% 的 24 点题;ToT 达到 74%。这 70% 的差距几乎全部来自"允许回溯"这一个结构性改变。
ToT 的三大组件
任何 ToT 风格的系统都可以分解为三件事:
| 组件 | 角色 | 由 LLM 还是代码实现 |
|---|---|---|
| Thought Generator | 在当前状态 下生成 个候选下一步 | LLM(with sampling) |
| State Evaluator | 对每个候选节点打分 | LLM(prompt "rate 1-10") |
| Search Algorithm | 决定探索顺序、剪枝、回溯 | 代码(DFS / BFS / MCTS) |
评估器有两种典型实现:
- Value prompt:"这一步对解决原问题有多大帮助?用 1-10 打分。"
- Vote prompt:让 LLM 在多个候选中选"最有希望"的那个。
三种搜索策略
思路:每一层都扩展所有高分节点,整层评估完再进入下一层。
def tot_bfs(state, depth_limit, beam_width):
frontier = [state]
for depth in range(depth_limit):
candidates = []
for s in frontier:
children = thought_generator(s, k=5)
candidates.extend(children)
# 只保留 top-beam 个节点
scored = [(state_evaluator(c), c) for c in candidates]
frontier = [c for _, c in sorted(scored, reverse=True)[:beam_width]]
return frontier[0]优点:能找到全局最优路径 缺点:每层开销恒定,成本高
思路:一路走到底,走不下去才回溯。
def tot_dfs(state, depth_limit, threshold):
if is_terminal(state) or depth_limit == 0:
return state
children = thought_generator(state, k=5)
# 按评估分数排序,从最优的开始尝试
children = sorted(children, key=state_evaluator, reverse=True)
for c in children:
if state_evaluator(c) < threshold:
continue # 剪枝
result = tot_dfs(c, depth_limit - 1, threshold)
if result is not None:
return result
return None # 全部失败,回溯上一层优点:内存占用小,首解出得快 缺点:可能陷入次优分支
思路:用 UCT 公式平衡"利用"与"探索"。AlphaGo 的思路用到了 LLM 推理上。
其中 是节点平均回报, 是访问次数, 是探索常数。
优点:长程规划最强 缺点:实现最复杂,迭代次数多
Graph of Thoughts:任意有向图
Graph of Thoughts(GoT)(Besta et al., AAAI 2024)把 ToT 再推广一步——思维节点之间可以任意连接,支持合并、反馈循环、蒸馏。
典型场景:排序任务。ToT 的做法是逐个插入并回溯;GoT 可以把序列拆成 4 段,分别排序后用 aggregation node 合并。Besta 等人的数字是:
- 排序质量 +62%
- 成本 -31%(相对 ToT)
结构对比:
| 结构 | 节点关系 | 典型算子 |
|---|---|---|
| Chain (CoT) | 线性 | 顺序推理 |
| Tree (ToT) | 父 → 多子 | 生成、评估、剪枝 |
| Graph (GoT) | 任意 DAG | + aggregation、refinement、feedback |
成本-收益分析:什么时候值得上 ToT
ToT / GoT 不是免费午餐。相对单次 CoT,开销增长是:
一个粗略的决策矩阵:
| 任务类型 | 推荐方法 | 理由 |
|---|---|---|
| 分类 / 单跳 QA | Zero/Few-shot | 推理过程简单,CoT 都可能冗余 |
| 多步数学 / 常识推理 | CoT + Self-Consistency | 线性足够,成本可控 |
| 需要回溯的规划(24 点、Crossword) | ToT (BFS/DFS) | 必须允许探索和回溯 |
| 信息融合任务(排序、长文摘要) | GoT | 需要合并多路结果 |
| 长程多步(证明、博弈) | ToT + MCTS | 需要值函数估计 |
生产环境的现实:ToT 在 24 点上碾压 CoT,但其成本也高出 10 倍以上。先用 CoT + Self-Consistency 把 baseline 拉到 80% 置信区间,再决定是否引入搜索——这是目前业界的普遍做法。
ToT 与测试时计算缩放
值得注意的是,ToT 和 2024-2025 年的测试时计算缩放(Test-time Compute Scaling)潮流一脉相承——o1、DeepSeek-R1、Qwen QwQ 都在内部执行类似 ToT 的探索,只是这种能力被训练到模型参数中而不是通过外部 prompt 实现。
换句话说:
- 2023:你显式写 ToT 的 orchestration 代码
- 2025:模型内部自己做 ToT,你只需要给它足够的
max_new_tokens
这对提示工程意味着什么?当你用的是 推理模型(reasoning model)时,手写 ToT 脚手架的必要性大幅下降;当你用的是非推理模型时,ToT 仍然是突破天花板的关键工具。
本节小结
| 概念 | 要点 |
|---|---|
| ToT | Thought Generator + State Evaluator + Search |
| GoT | 任意 DAG,支持合并与反馈循环 |
| 搜索策略 | BFS(全局)/ DFS(低内存)/ MCTS(长程规划) |
| 成本 | 相比 CoT 通常高 5–20 倍 |
| 决策原则 | 先 CoT + SC 作为 baseline,再考虑 ToT |
| 未来趋势 | 推理模型内化了 ToT 能力,外部脚手架需求下降 |