提示工程 | | 约 16 分钟 | 6,084 字

思维树提示 (Tree-of-Thought)

让 AI 探索多条推理路径,适合复杂决策和规划问题

从链到树:推理的进化

我们已经学过 Chain-of-Thought(CoT),它让 AI 沿着一条线性路径推理。Self-Consistency 让 AI 走多条路径然后投票。但这两种方法有一个共同的局限:它们不会回头

一旦某一步推理出了问题,后面的步骤只能在错误的基础上继续。就像走迷宫时只能一直往前走,不能回头换条路。

Tree-of-Thought(ToT)解决了这个问题:它让 AI 在每一步都探索多个可能的方向,评估每个方向的前景,然后选择最有希望的继续,必要时还能回退


CoT vs Self-Consistency vs ToT

特性CoTSelf-ConsistencyToT
推理路径1 条N 条独立路径树状分支路径
是否回退不能不能可以
中间评估没有没有每步都评估
搜索策略BFS / DFS
适用问题简单推理有唯一答案的推理复杂规划和决策
成本

用一个比喻来理解:

  • CoT:走迷宫时只走一条路,走到底看结果
  • Self-Consistency:走迷宫 5 次,每次随机走,看哪个出口被走到最多
  • ToT:走迷宫时在每个岔路口都派人探索,评估哪条路更有希望,集中力量走最好的路

ToT 的核心组件

1. 思维分解(Thought Decomposition)

把问题分解为多个中间步骤,每个步骤生成多个候选”思维”:

问题:设计一个用户注册流程

步骤 1 的候选思维:
├── 思维 A:先验证邮箱格式
├── 思维 B:先检查用户名是否存在
└── 思维 C:先收集所有信息再统一验证

步骤 2 的候选思维(基于步骤 1 的选择):
├── 思维 D:发送验证码
├── 思维 E:发送确认链接
└── 思维 F:使用 OAuth 跳过验证

2. 思维评估(Thought Evaluation)

对每个候选思维进行评估,判断它是否值得继续探索:

评估标准:
- 这个思维是否朝着解决问题的方向前进?
- 从这个思维出发,能否到达最终答案?
- 这个思维是否引入了矛盾或错误?

评估结果:
- 有希望(继续探索)
- 不确定(暂时保留)
- 没希望(剪枝放弃)

3. 搜索策略(Search Algorithm)

BFS(广度优先搜索)

每一层都保留最好的 K 个思维,然后同时展开下一层:

第 1 层:生成 5 个思维 → 保留最好的 3 个
第 2 层:每个思维生成 5 个子思维(共 15 个)→ 保留最好的 3 个
第 3 层:每个思维生成 5 个子思维(共 15 个)→ 保留最好的 3 个
最终:从 3 个候选中选最好的

适合:步骤数较少但每步选择较多的问题。

DFS(深度优先搜索)

沿着一条路径深入探索,遇到死胡同就回退:

思维 A → 思维 A1 → 思维 A1a → 评估:没希望 → 回退
思维 A → 思维 A1 → 思维 A1b → 评估:有希望 → 继续
思维 A → 思维 A1 → 思维 A1b → 思维 A1b1 → 找到答案!

适合:搜索空间很大但正确路径较深的问题。


Prompt 模板实现

方法一:单 Prompt 模拟 ToT

最简单的方式是在一个 Prompt 中让 AI 模拟树搜索:

请用思维树方法解决以下问题。

问题:[你的问题]

请按以下步骤操作:

1. 将问题分解为 3-4 个关键步骤
2. 对每个步骤,生成 3 个不同的思路
3. 评估每个思路的可行性(好/一般/差)
4. 选择最好的思路继续
5. 如果某条路走不通,回退到上一步尝试其他思路
6. 最终给出最佳解决方案

格式要求:
## 步骤 1:[步骤描述]
- 思路 A:[描述] → 评估:[好/一般/差]
- 思路 B:[描述] → 评估:[好/一般/差]
- 思路 C:[描述] → 评估:[好/一般/差]
→ 选择:[选中的思路]

## 步骤 2:[步骤描述]
...

## 最终方案
[综合最佳路径的完整方案]

方法二:多轮对话实现 ToT

更精确的方式是通过多轮 API 调用实现:

import anthropic

client = anthropic.Anthropic()

def tree_of_thought(problem: str, breadth: int = 3, depth: int = 3) -> str:
    """BFS 方式的 Tree-of-Thought"""

    # 第一步:分解问题
    decompose_prompt = f"""将以下问题分解为 {depth} 个关键步骤,每个步骤用一句话描述。

问题:{problem}

输出格式(JSON):
["步骤1描述", "步骤2描述", "步骤3描述"]"""

    steps = call_api(decompose_prompt)

    current_thoughts = [""]  # 初始状态

    for step_idx, step in enumerate(steps):
        all_candidates = []

        for thought in current_thoughts:
            # 生成候选思维
            generate_prompt = f"""问题:{problem}
当前进度:{thought if thought else "刚开始"}
当前步骤:{step}

请生成 {breadth} 个不同的思路来完成这一步。
每个思路要具体、可执行。

输出格式(JSON):
["思路1", "思路2", "思路3"]"""

            candidates = call_api(generate_prompt)

            for candidate in candidates:
                new_thought = f"{thought}\n步骤{step_idx+1}{candidate}"
                all_candidates.append(new_thought)

        # 评估并选择最好的 K 个
        evaluate_prompt = f"""问题:{problem}

以下是 {len(all_candidates)} 个候选方案,请评估每个方案的质量(1-10分),
选出最好的 {breadth} 个。

候选方案:
{format_candidates(all_candidates)}

输出格式(JSON):
[{{"index": 0, "score": 8}}, ...]"""

        scores = call_api(evaluate_prompt)
        top_indices = sorted(scores, key=lambda x: x["score"], reverse=True)[:breadth]
        current_thoughts = [all_candidates[s["index"]] for s in top_indices]

    # 最终选择
    return current_thoughts[0]

def call_api(prompt: str) -> any:
    """调用 API 并解析 JSON 响应"""
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        temperature=0.7,
        messages=[{"role": "user", "content": prompt}]
    )
    import json
    return json.loads(response.content[0].text)

实战案例:24 点游戏

24 点游戏是 ToT 论文中的经典案例。给定 4 个数字,用加减乘除得到 24。

问题

数字:4, 7, 8, 8
目标:用 +, -, ×, ÷ 得到 24

CoT 的做法(线性推理)

让我试试:
4 × 7 = 28
28 - 8 = 20
20 + 8 = 28  ← 不对

再试:
8 × 8 = 64
64 ÷ 4 = 16
16 + 7 = 23  ← 不对

放弃...

ToT 的做法(树搜索)

步骤 1:选择两个数字进行运算
├── 4 + 7 = 11(剩余:11, 8, 8)→ 评估:一般
├── 4 × 7 = 28(剩余:28, 8, 8)→ 评估:有希望(28 接近 24)
├── 8 - 4 = 4(剩余:4, 7, 8)→ 评估:一般
├── 8 ÷ 4 = 2(剩余:2, 7, 8)→ 评估:一般
└── 8 × 8 = 64(剩余:64, 4, 7)→ 评估:有希望

选择继续探索:28,8,8 和 64,4,7

步骤 2(路径 A:28, 8, 8):
├── 28 - 8 = 20(剩余:20, 8)→ 20 + 8 = 28 ✗
├── 28 + 8 = 36(剩余:36, 8)→ 36 - 8 = 28 ✗
└── 8 - 8 = 0(剩余:28, 0)→ 28 + 0 = 28 ✗
→ 这条路走不通,回退

步骤 2(路径 B:8 ÷ 4 = 2, 剩余 2, 7, 8):
├── 7 - 2 = 5(剩余:5, 8)→ 5 × 8 = 40 ✗
├── 7 + 2 = 9(剩余:9, 8)→ 9 + 8 = 17 ✗
└── 2 × 7 = 14(剩余:14, 8)→ 14 + 8 = 22 ✗

重新探索:8 × (7 - 4) = 8 × 3 = 24 ✓ 找到了!

ToT 通过系统性搜索和回退,找到了 CoT 可能错过的答案。


适用场景

适合 ToT 的问题

  1. 规划问题:旅行规划、项目排期、资源分配
  2. 创意写作:故事大纲设计、多线叙事
  3. 数学谜题:24 点、数独、逻辑谜题
  4. 架构设计:系统设计中的方案对比
  5. 策略游戏:需要前瞻性思考的决策

不适合 ToT 的问题

  1. 简单问答:直接回答即可,不需要搜索
  2. 翻译任务:路径单一,没有分支
  3. 信息提取:从文本中提取信息,不需要推理
  4. 实时场景:ToT 耗时较长,不适合需要快速响应的场景

简化版 ToT Prompt

如果你不想写代码,可以用这个简化版 Prompt 在对话中使用 ToT:

我需要你用"思维树"方法来解决问题。

规则:
1. 在每个决策点,列出 3 个可能的方向
2. 简要评估每个方向的优劣
3. 选择最有前景的方向深入
4. 如果走入死胡同,明确说"回退"并尝试其他方向
5. 用缩进表示思维的层级关系

问题:[你的问题]

请开始探索:

实际效果

问题:为一个电商平台设计促销系统

第 1 层:促销类型设计
├── 方向 A:基于规则引擎的促销系统
│   优势:灵活、可配置  劣势:复杂度高
│   评估:★★★★☆
├── 方向 B:硬编码促销逻辑
│   优势:简单直接  劣势:难以扩展
│   评估:★★☆☆☆
└── 方向 C:基于 DSL 的促销描述语言
    优势:表达力强  劣势:学习成本高
    评估:★★★☆☆

→ 选择方向 A,继续深入

第 2 层:规则引擎设计(基于方向 A)
├── 方向 A1:使用现有规则引擎(如 Drools)
│   评估:★★★☆☆(引入外部依赖)
├── 方向 A2:自研轻量级规则引擎
│   评估:★★★★☆(可控性强)
└── 方向 A3:基于策略模式的规则组合
    评估:★★★★★(简单且灵活)

→ 选择方向 A3...

成本分析

ToT 的成本比 Self-Consistency 更高,因为它在每一步都需要多次 API 调用:

假设:3 层深度,每层 3 个分支,保留 top-2

第 1 层:生成 3 个思维 + 评估 = 2 次调用
第 2 层:2 × 3 个思维 + 评估 = 3 次调用
第 3 层:2 × 3 个思维 + 评估 = 3 次调用

总计:约 8 次 API 调用
方法API 调用次数适用场景
单次 CoT1简单推理
Self-Consistency (5次)5有唯一答案的推理
ToT (3层×3分支)8-15复杂规划和决策

建议:只在问题确实需要探索和回退时才使用 ToT。大多数日常任务用 CoT 或 Self-Consistency 就够了。


总结

Tree-of-Thought 是目前最强大的提示工程技巧之一,它把 AI 的推理从”线性思考”升级为”系统性搜索”。

核心要点:

  1. 在每个决策点生成多个候选方向
  2. 评估每个方向的前景
  3. 选择最好的继续,必要时回退
  4. BFS 适合浅而宽的问题,DFS 适合深而窄的问题

好的思考不是一条直线,而是一棵树。每个分支都是一种可能,每次回退都是一次学习。ToT 让 AI 学会了”三思而后行”。

评论

加载中...

相关文章

分享:

评论

加载中...