人工智能实践(语言智能)
第3讲:提示词

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在当前状态 ss 下生成 kk 个候选下一步LLM(with sampling)
State Evaluator对每个候选节点打分 v(s)[0,1]v(s) \in [0, 1]LLM(prompt "rate 1-10")
Search Algorithm决定探索顺序、剪枝、回溯代码(DFS / BFS / MCTS)

评估器有两种典型实现:

  1. Value prompt:"这一步对解决原问题有多大帮助?用 1-10 打分。"
  2. 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 推理上。

UCT(s)=vˉ(s)+clnNparentN(s)\text{UCT}(s) = \bar{v}(s) + c \sqrt{\frac{\ln N_{\text{parent}}}{N(s)}}

其中 vˉ(s)\bar{v}(s) 是节点平均回报,N(s)N(s) 是访问次数,cc 是探索常数。

优点:长程规划最强 缺点:实现最复杂,迭代次数多

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,开销增长是:

Cost(ToT)ddepth×kbranching×(cg+ce)gen + eval cost\text{Cost}(\text{ToT}) \approx \underbrace{d}_{\text{depth}} \times \underbrace{k}_{\text{branching}} \times \underbrace{(c_g + c_e)}_{\text{gen + eval cost}}

一个粗略的决策矩阵:

任务类型推荐方法理由
分类 / 单跳 QAZero/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 仍然是突破天花板的关键工具。

本节小结

概念要点
ToTThought Generator + State Evaluator + Search
GoT任意 DAG,支持合并与反馈循环
搜索策略BFS(全局)/ DFS(低内存)/ MCTS(长程规划)
成本相比 CoT 通常高 5–20 倍
决策原则先 CoT + SC 作为 baseline,再考虑 ToT
未来趋势推理模型内化了 ToT 能力,外部脚手架需求下降