推理策略详解:Chain-of-Thought 与 Tree-of-Thought
难度:中级 分类:Planning & Reasoning
简短回答
Chain-of-Thought (CoT) 和 Tree-of-Thought (ToT) 是两种主流的 LLM 推理策略。CoT 是线性推理——通过引导模型"一步步思考"而非直接给出答案,显著提升复杂推理任务的准确率,核心类比人类解题时列出中间步骤。CoT 有两种形式:Few-shot CoT(提供带推理步骤的示例)和 Zero-shot CoT(在 prompt 末尾加 "Let's think step by step")。ToT 是探索式推理——在每一步生成多个候选思路,用搜索算法(BFS/DFS)探索不同分支,通过评估函数剪枝和回溯。Wei et al. (Google, NeurIPS 2022) 证明 CoT 在算术、常识和符号推理上带来显著提升;Yao et al. (Princeton, NeurIPS 2023) 表明 ToT 在 Game of 24 上将成功率从 CoT 的 4% 提升到 74%。选择原则:任务有明确解题路径 → CoT;任务需要探索、回溯或创造性思考 → ToT;兼顾成本与准确率 → CoT + Self-Consistency。
详细解析
一、Chain-of-Thought (CoT)
CoT 的工作原理
代码块
Plain Text
标准 Prompting(直接回答):
Q: 小明有 5 个苹果,给了小红 2 个,又买了 3 个,现在有几个?
A: 6
CoT Prompting(逐步推理):
Q: 小明有 5 个苹果,给了小红 2 个,又买了 3 个,现在有几个?
A: 让我一步步分析:
1. 小明初始有 5 个苹果
2. 给了小红 2 个:5 - 2 = 3
3. 又买了 3 个:3 + 3 = 6
所以小明现在有 6 个苹果。
看似结果一样,但在更复杂的问题上,有中间步骤的推理会大幅减少错误。
Few-shot CoT
在 prompt 中提供带推理步骤的示例:
代码块
Python
few_shot_cot_prompt = """
问题:一个商店有 15 箱苹果,每箱 20 个。卖掉了 120 个,还剩多少?
推理:
1. 总共有 15 × 20 = 300 个苹果
2. 卖掉了 120 个
3. 剩余 300 - 120 = 180 个
答案:180 个
问题:一辆车以 60km/h 的速度行驶了 2.5 小时,然后以 80km/h 行驶了 1.5 小时。总距离是多少?
推理:
1. 第一段距离:60 × 2.5 = 150 km
2. 第二段距离:80 × 1.5 = 120 km
3. 总距离:150 + 120 = 270 km
Zero-shot CoT
不需要示例,只需在 prompt 末尾加一句话:
代码块
Python
# Zero-shot CoT:最简单的形式
prompt = f"""
{user_question}
Let's think step by step.
"""
# 变体
prompts = [
Kojima et al. (2022) 发现这个简单的添加将 MultiArith 准确率从 17.7% 提升到 78.7%。
为什么 CoT 有效?
代码块
JSON
reasons_cot_works = {
"问题分解": (
"复杂问题被拆分为更小的子问题,"
"每个子问题对 LLM 来说更容易处理"
),
"更多推理计算": (
"生成中间步骤 = 更多的 token = 更多的计算。"
"模型获得了更多'思考时间'来处理信息"
CoT 在 Agent 系统中的应用
代码块
Python
# ReAct 模式就是 CoT 的 Agent 化应用
react_prompt = """
用户问题:{question}
CoT 的变体与扩展
代码块
Plain Text
CoT (Chain-of-Thought)
├── Few-shot CoT:提供示例
Self-Consistency:CoT 的增强版
代码块
Python
async def self_consistency(question, num_samples=5):
"""多次采样 + 多数投票"""
answers = []
for _ in range(num_samples):
# 每次独立生成一条推理链(temperature > 0)
response = await llm.invoke(
f"{question}\nLet's think step by step.",
temperature=0.7
)
CoT 的局限性
#TpFpOnsZtZbp text{white-space:pre}.fb0{stroke:var(--N900-FG, 0.15)}.fx0{stroke-miterlimit:10}.fa1{fill:#bbbfc4}.fx1{font:normal 400 12px MonospacedNumber,LarkHackSafariFont,LarkEmojiFont,LarkChineseQuote,-apple-system,BlinkMacSystemFont,Helvetica Neue,Tahoma,PingFang SC,Microsoft Yahei,Arial,Hiragino Sans GB,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.fx2{text-anchor:middle}.fx3{dominant-baseline:central}.fx4{stroke:none}.fc0{fill:var(--text-caption)}.fa2{fill:var(--text-link-disabled)}.fx5{font:400 normal 16px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}.fx6{text-anchor:start}.fx7{dominant-baseline:alphabetic}.fc1{fill:rgb(31, 35, 40)}.fb1{fill:var(--N900-FG, 0.15)}.fb2{fill:rgb(209, 217, 224)}.fa3{fill:var(--bg-body)}AB123456局限模型规模要求成本增加推理链质量不保证不适合所有任务可被攻击说明Wei et al. 2022 原论文中 CoT 在 PaLM 540B 等大模型上才出现质变;但 2025-2026 蒸馏技术已极大下放门槛:DeepSeek-R1 完整开源了 1.5B / 7B / 8B / 14B / 32B / 70B 六个 SKU 的蒸馏推理模型,1.5B 也能跑出可观的 CoT;"100B+ 门槛"在 2026 已不再适用,但未经蒸馏的小模型仍易产生错误推理链中间步骤消耗更多 output token模型可能生成"看似合理实则错误"的推理步骤简单任务加 CoT 反而增加不必要的复杂度对抗样本可以诱导错误的推理链
二、Tree-of-Thought (ToT)
CoT 与 ToT 的核心区别
CoT 一条链走到底不回头,ToT 每步生成分支、评估打分、剪枝回溯。
ToT 的工作原理
代码块
Python
class TreeOfThoughts:
"""ToT 的核心实现:生成、评估、搜索"""
async def solve(self, problem, max_depth=3, breadth=3):
# 初始化根节点
root = ThoughtNode(state=problem, depth=0)
if self.search_strategy == "BFS":
return await self.bfs(root, max_depth, breadth)
else:
return await self.dfs(root, max_depth, breadth)
async def bfs(self, root, max_depth, breadth):
"""广度优先搜索:每层保留最优的 k 个节点"""
current_level = [root]
两种搜索策略对比
代码块
Python
# BFS(广度优先):适合解空间较浅但较宽的问题
# - Game of 24:每步可选的运算组合多
# - 创意写作:需要比较多种风格方向
# DFS(深度优先):适合解空间较深的问题
# - 数独求解:需要深入推导
实际应用中的 ToT 简化版
代码块
Python
# 生产环境中的 ToT 通常不需要完整实现
# 用 Prompt 模拟即可
tot_prompt = """
问题:{problem}
请用以下方式推理:
1. 生成 3 种不同的解题思路
2. 对每种思路评估可行性(1-10分)
3. 选择最佳思路,展开详细推理
4. 如果遇到矛盾,回到步骤1尝试其他方向
三、对比分析与选择指南
关键性能对比
任务:Game of 24(用四个数字通过加减乘除得到 24)
注:CoT 的线性推理在需要回溯搜索的问题上反而成为限制。
任务:创意写作(Coherent Passage)
何时选择哪种?
代码块
JSON
decision_guide = {
"使用 CoT": [
"数学计算:有明确的解题步骤(算术、代数)",
"逻辑推理:前提 → 结论的线性推导",
"信息提取:从文本中逐步提取关键信息",
方法谱系总结
代码块
Plain Text
简单 ←─────────────────────────────────→ 复杂
成本低 成本高
IO → Zero-shot CoT → Few-shot CoT → Self-Consistency → ToT → GoT
│ │ │ │ │ │
│ "逐步思考" 提供示例 多次采样+投票 树搜索 图搜索
│ │
│ 包含评估+回溯
1次调用 1次 1次 k次 O(b^d)次
常见误区 / 面试追问
误区:"CoT 只是让模型输出更长" — CoT 的核心不是长度,而是结构化的中间推理步骤。重要的是推理的质量而非数量。一条简洁但正确的推理链比冗长但偏题的推理更有效。
误区:"Zero-shot CoT 总是有效的" — 只在足够大的模型上有效。小模型使用 CoT 反而会因为生成错误的推理链而降低准确率。另外,对于简单任务,CoT 增加成本但不提升质量。
误区:"ToT 总是比 CoT 好" — 在简单任务上 ToT 不仅成本高,甚至可能因为过度思考而降低准确率。CoT 在 GSM8K 等标准数学推理上已经足够好。ToT 的优势主要体现在需要全局搜索和回溯的问题上。
误区:"ToT 就是多次调用 CoT" — ToT 的关键不是"多次",而是"结构化搜索"——包括生成候选、评估打分、剪枝和回溯。Self-Consistency 也是多次调用但没有搜索结构。
追问:"CoT 和 Reasoning Models(o1/o3/R1)是什么关系?" — Reasoning Models 将 CoT 内化到了模型的推理过程中(internal chain-of-thought),不需要用户显式提示。模型自动生成"思考 token",然后再输出答案。本质上是 CoT 的模型级实现。同样,Reasoning Model 也将类似 ToT 的搜索和回溯内化到模型内部——ToT 是外部搜索(在 API 层面实现),Reasoning Model 是内部搜索(在模型训练层面实现)。
追问:"Self-Consistency 比 CoT 好多少?" — Self-Consistency 通过多次采样 + 投票显著提升准确率,特别是在数学推理上。但代价是成本增加 N 倍(N 次 LLM 调用)。适合准确率要求高且成本不敏感的场景。
追问:"Graph-of-Thought 比 ToT 好在哪里?" — GoT 允许非线性推理——不同推理分支可以合并、交叉引用。比如"思路 A 的结论可以帮助思路 B"。但实现复杂度更高,实际应用较少。