思维链:从直觉到推理的跨越
大语言模型在简单问答上表现惊艳,但面对数学推导、逻辑推理、多步决策等复杂任务时,直接给出答案往往出错。原因很简单:模型在单次前向传播中压缩了所有推理过程,信息瓶颈导致中间步骤丢失。
思维链(Chain-of-Thought, CoT)的核心思想是:强制模型显式输出中间推理步骤,再得出最终答案。 这不是让模型"思考更深",而是为模型提供额外的 token 预算来承载中间计算。
Zero-shot CoT vs Few-shot CoT
Zero-shot CoT
最简单的 CoT 触发方式——在 Prompt 末尾追加一句话:
问题:一个商店有 23 个苹果,卖了 17 个,又进货了 12 个。现在有多少个苹果?
让我们一步一步思考。
模型输出:
1. 初始有 23 个苹果
2. 卖出 17 个:23 - 17 = 6
3. 进货 12 个:6 + 12 = 18
4. 现在有 18 个苹果
关键点: “让我们一步一步思考”(Let’s think step by step)这句话在 GSM8K 基准上将准确率从 17.7% 提升到 78.7%(GPT-3.5)。这个魔法的本质是引导模型进入"推理模式"的 token 分布。
Few-shot CoT
在 Prompt 中提供带推理过程的示例:
问题:小明有 5 个球,小红给了他 3 个,他送给小华 2 个。小明现在有几个球?
推理:小明初始有 5 个球,小红给他 3 个后变为 5+3=8 个,送给小华 2 个后变为 8-2=6 个。
答案:6
问题:一辆公交车上有 28 人,到站下了 13 人,上了 9 人。现在车上有多少人?
推理:
模型会模仿示例中的推理格式,逐步推导。
对比
| 维度 | Zero-shot CoT | Few-shot CoT |
|---|---|---|
| 实现复杂度 | 极低(一句话) | 中等(需构造示例) |
| 推理格式控制 | 弱(模型自由发挥) | 强(示例定义格式) |
| Token 消耗 | 低 | 高(示例占用 context) |
| 适用任务 | 通用推理 | 特定格式/领域任务 |
| 准确率提升 | 显著但波动大 | 更稳定可控 |
Self-Consistency:多路径投票
单一 CoT 路径存在随机错误。Self-Consistency 的策略是:
- 对同一问题采样多条 CoT 推理路径(temperature > 0)
- 提取每条路径的最终答案
- 对答案进行多数投票
import openai
def self_consistency_answer(question, n_samples=5):
answers = []
for _ in range(n_samples):
prompt = f"{question}\n\n让我们一步一步思考。"
resp = openai.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.7, # 关键:非零温度引入多样性
max_tokens=512
)
# 提取最终答案(需根据任务设计解析逻辑)
answer = extract_answer(resp.choices[0].message.content)
answers.append(answer)
# 多数投票
from collections import Counter
return Counter(answers).most_common(1)[0][0]
效果: 在 GSM8K 上,Self-Consistency 将 GPT-3.5 的准确率从 78.7% 提升到 ~85%,代价是 N 倍的 API 调用。
适用条件: 答案空间离散且可比较(数学题、分类任务)。对开放生成任务效果有限。
Tree-of-Thought (ToT):探索与回溯
CoT 是线性推理链。但真正的问题解决往往需要探索多条路径、评估、回溯。Tree-of-Thought 将推理结构化为搜索树:
根问题
├── 思路 A
│ ├── 子思路 A1 → 评估:3/5
│ └── 子思路 A2 → 评估:5/5 → 继续
│ └── 子思路 A2a → 答案 ✓
├── 思路 B
│ └── 子思路 B1 → 评估:1/5 → 剪枝
└── 思路 C
└── 子思路 C1 → 评估:2/5 → 剪枝
ToT 的四个核心操作:
- 思维分解(Decomposition):将问题拆为可独立评估的子问题
- 思维生成(Generation):为每个节点生成 K 个候选下一步
- 状态评估(Evaluation):对每个状态打分,决定是否继续/剪枝
- 搜索算法(Search):BFS 或 DFS 遍历思维树
def tot_solve(problem, max_depth=3, breadth=3):
"""简化版 Tree-of-Thought 求解器"""
frontier = [{"state": problem, "path": [], "score": 1.0}]
for depth in range(max_depth):
candidates = []
for node in frontier:
# 生成 breadth 个候选思路
thoughts = generate_thoughts(node["state"], n=breadth)
for thought in thoughts:
new_state = thought["next_state"]
score = evaluate_state(new_state)
if score < 0.3: # 剪枝
continue
candidates.append({
"state": new_state,
"path": node["path"] + [thought["description"]],
"score": score
})
# 保留 top-K
frontier = sorted(candidates, key=lambda x: -x["score"])[:breadth]
return frontier[0]["path"] if frontier else []
代价: ToT 的 API 调用次数是 O(breadth × depth),成本显著高于 CoT。适合高价值、低频率的复杂推理任务。
Graph-of-Thought (GoT):拓扑推理
GoT 进一步泛化 ToT——推理不限于树结构,而是有向图:
- 聚合(Aggregation):多条推理路径的结果合并为一个节点
- 回溯(Backtracking):任意节点可回指之前的状态
- 循环(Refinement):对同一节点迭代优化
典型场景:论文综述写作——多线程收集文献,聚合要点,发现矛盾后回溯修正。
| 特性 | CoT | Self-Consistency | ToT | GoT |
|---|---|---|---|---|
| 推理结构 | 线性链 | 多条独立链 | 树 | 有向图 |
| 回溯能力 | 无 | 无 | 有(剪枝) | 有(任意回溯) |
| 路径合并 | 无 | 投票 | 无 | 有 |
| API 调用 | 1 | N | O(b×d) | O(节点数+边数) |
| 适用复杂度 | 低-中 | 中 | 中-高 | 高 |
适用场景与限制
适合 CoT 的场景
- 数学推理:多步计算、应用题
- 逻辑推理:三段论、条件推断
- 常识推理:因果关系、时序判断
- 代码调试:错误分析、修复推导
- 规划任务:旅行规划、资源分配
不适合或效果有限的场景
- 简单事实检索:直接知识问答,CoT 反而引入噪声
- 模式识别:图像分类、情感分析等直觉型任务
- 创意写作:推理链限制创造力
- 极长推理链:超过模型有效 context 时,CoT 退化
核心限制
- CoT ≠ 真推理:模型并不真正"推理",而是生成统计上合理的推理文本。中间步骤可能看似正确但逻辑有误。
- 错误传播:链中任一步出错,后续步骤基于错误前提继续。
- 格式敏感:不同的推理格式引导效果差异大,需要实验调优。
- 成本倍增:推理 token 增加输出长度,直接推高 API 成本和延迟。
实战建议
- 从 Zero-shot CoT 开始:最简方案先试,效果不够再加复杂度
- 格式约束:用结构化格式(如编号列表、JSON)约束推理过程,便于解析和验证
- 验证机制:在推理链中加入自检步骤——“让我验证一下:18 + 5 = 23 ✓”
- 组合策略:高价值任务用 ToT,常规任务用 CoT + Self-Consistency
- 监控成本:推理 token 通常占总输出 60-80%,做好预算管理
思维链技术的本质是给模型"思考的带宽"。它不是万能药,但在需要结构化推理的任务上,是目前最有效的 Prompt 工程技术之一。随着模型原生推理能力(如 o1/o3 系列)的提升,CoT 的部分功能将被内化为模型能力,但在可预见的未来,显式的推理引导仍然是 Prompt 工程的核心技能。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
