一、什么是 Chain of Thought
Chain of Thought(CoT,思维链)是一种让大语言模型在给出最终答案前,先展示中间推理步骤的提示技术。由 Wei et al. (2022) 在论文 “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models” 中首次提出。
1.1 核心思想
传统 Prompt 要求模型直接输出答案——这相当于让人不假思索地回答复杂问题。而 CoT 通过引导模型"自言自语"地推理,显著提升复杂推理任务的准确率。
# 标准 Prompt(直接输出)
Q: 小明有 23 个苹果,吃了 3 个,又买了 12 个。他有多少个苹果?
A: 32
# CoT Prompt(展示推理步骤)
Q: 小明有 23 个苹果,吃了 3 个,又买了 12 个。他有多少个苹果?
A: 小明开始有 23 个苹果。吃了 3 个之后,剩余 23 - 3 = 20 个。又买了 12 个后,总数为 20 + 12 = 32 个。所以答案是 32。
1.2 为什么 CoT 有效
| 因素 | 说明 |
|---|---|
| 分解复杂度 | 将多步推理拆解为可管理的子步骤 |
| 中间监督 | 错误定位到具体步骤,而非全盘错误 |
| 计算复用 | 中间结果可作为后续推理的上下文 |
| 注意力聚焦 | 每一步聚焦当前子问题,减少信息丢失 |
二、CoT 的核心方法
2.1 Zero-shot CoT
通过简单短语 “Let’s think step by step” 触发推理链。无需示例,对大多数模型有效。
Prompt: 如果 5 个工人 5 小时能挖 5 个洞,那么 10 个工人 10 小时能挖多少个洞?让我们一步步思考。
模型输出: 5 个工人 5 小时挖 5 个洞 → 每个工人每小时挖 5/(5×5)=0.2 个洞。
10 个工人 10 小时能挖 10×10×0.2 = 20 个洞。答案是 20。
适用场景: 数学计算、逻辑推理、常识判断。
2.2 Few-shot CoT
在 Prompt 中提供 2-3 个带推理步骤的示例。示例质量直接影响效果。
# Few-shot CoT Prompt 结构
prompt = """Q: 一个篮球 120 元,一个足球比篮球贵 30 元,一副羽毛球拍比足球便宜 50 元。羽毛球拍多少钱?
A: 篮球价格 = 120 元。足球价格 = 120 + 30 = 150 元。
羽毛球拍价格 = 150 - 50 = 100 元。答案是 100。
Q: 图书馆有 3 层书架,每层 120 本书。周一借出 45 本,周二还回 28 本,周三借出 67 本。还剩多少本?
A: 总书数 = 3 × 120 = 360 本。
剩余 = 360 - 45 + 28 - 67 = 276 本。答案是 276。
Q: 一条绳子对折 3 次后每段长 15 厘米,绳子原来多长?
A: 对折 1 次 = 2 段,对折 2 次 = 4 段,对折 3 次 = 8 段。
原长 = 15 × 8 = 120 厘米。答案是 120。"""
2.3 自动 CoT(Auto-CoT)
当不愿手工编写示例时,让模型自己生成推理链示例:
- 将问题按难度聚类
- 每类选代表性样本,用 Zero-shot CoT 生成推理链
- 筛选高质量推理链作为 Few-shot 示例
import json
from openai import OpenAI
client = OpenAI()
def auto_cot(question: str) -> str:
# Step 1: 生成演示示例
demo_questions = [
"小明有 10 元,花了 3 元买笔,又得到 5 元零花钱,现在有多少元?",
"一个正方形周长 36 厘米,面积是多少?",
]
demonstrations = []
for q in demo_questions:
resp = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "user", "content": f"{q}\n让我们一步步思考。"}
]
)
demonstrations.append(f"Q: {q}\nA: {resp.choices[0].message.content}")
# Step 2: 用生成的示例回答目标问题
full_prompt = "\n\n".join(demonstrations) + f"\n\nQ: {question}\nA:"
final_resp = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": full_prompt}]
)
return final_resp.choices[0].message.content
三、CoT 的高级变体
3.1 Self-Consistency(自一致性)
多次采样推理路径,通过投票选取最一致的答案。显著提升可靠性的技术。
def self_consistency(question: str, n_samples: int = 5, temperature: float = 0.7):
answers = []
for _ in range(n_samples):
resp = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": f"{question}\n让我们一步步思考。"}],
temperature=temperature
)
# 提取最终答案(简化版)
full_text = resp.choices[0].message.content
# 假设最后一行包含答案
final_ans = full_text.strip().split("\n")[-1]
answers.append(final_ans)
# 多数投票
from collections import Counter
most_common = Counter(answers).most_common(1)[0][0]
return most_common
# 示例
result = self_consistency("从 1 到 100 中,所有能被 3 或 5 整除的数之和是多少?")
print(f"最终答案: {result}")
3.2 思维树(Tree of Thoughts - ToT)
将线性推理扩展为树状搜索,探索多条推理路径并评估。
| 方法 | 结构 | 评估方式 | 适用场景 |
|---|---|---|---|
| CoT | 链式 | 无中间评估 | 步骤固定的问题 |
| ToT | 树状 | BFS/DFS + 自评估 | 需要探索的开放问题 |
| Self-Consistency | 多链 | 投票 | 答案空间有限的问题 |
3.3 思维链与工具调用结合
让 CoT 在推理过程中调用外部工具(计算器、搜索引擎、代码执行器)。
import math
def cot_with_calculator(question: str) -> str:
"""
CoT + 计算器:模型生成推理步骤,实际计算由代码完成
"""
system_prompt = """你是一个带计算器的推理助手。请遵循以下格式:
推理: <你的推理过程>
计算: <需要计算的表达式>
...
最终答案: <数值结果>"""
resp = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": question}
],
temperature=0
)
text = resp.choices[0].message.content
# 提取所有计算步骤并验证
import re
calculations = re.findall(r"计算:\s*(.+)", text)
for calc in calculations:
try:
result = eval(calc, {"__builtins__": {}}, {"math": math})
print(f"验证: {calc} = {result}")
except:
print(f"计算失败: {calc}")
return text
| 工具类型 | 结合方式 | 典型应用 |
|---|---|---|
| 计算器 | 解析表达式 → eval | 数学题、财务计算 |
| 代码解释器 | 生成代码 → 执行 | 数据分析、图表生成 |
| 搜索引擎 | 推理中插入搜索 | 实时信息问答 |
| 知识图谱 | 推理中查询实体 | 多跳知识推理 |
四、CoT 的最佳实践
4.1 Prompt 模板设计
你是一个逐步推理的助手。对于每个问题:
1. **理解**:用自己的话重述问题,确认理解正确
2. **分解**:将问题拆解为独立的子问题
3. **推理**:逐一解决每个子问题,展示中间结果
4. **整合**:汇总所有子问题的结果
5. **验证**:反向验证答案是否合理
6. **答案**:给出最终结论
请遵循以下格式:
问题: <用户问题>
理解: ...
分解: ...
推理: ...
整合: ...
验证: ...
答案: <最终结果>
4.2 常见陷阱
| 陷阱 | 表现 | 解决方案 |
|---|---|---|
| 过早收敛 | 模型跳过关键推理步骤 | 明确要求"每一个步骤都不能省略" |
| 虚假推理 | 推理正确但答案错误 | 添加验证步骤 + Self-Consistency |
| 上下文稀释 | 长推理链中丢失早期信息 | 定期总结中间状态 |
| 过度推理 | 简单问题也深度推理 | 根据问题复杂度动态选择策略 |
4.3 复杂度动态选择
def adaptive_cot(question: str) -> str:
"""根据问题复杂度自动选择推理策略"""
# 判断复杂度
word_count = len(question)
has_numbers = any(c.isdigit() for c in question)
has_conditions = any(kw in question for kw in ["如果", "假设", "条件", "unless", "if"])
# 简单问题 → 直接回答
if word_count < 20 and not has_numbers and not has_conditions:
return direct_answer(question)
# 中等问题 → Zero-shot CoT
if word_count < 60 and has_numbers:
return zero_shot_cot(question)
# 复杂问题 → Few-shot CoT + Self-Consistency
return self_consistency(question, n_samples=3, temperature=0.5)
五、效果评估
| 任务类型 | 标准 Prompt | CoT | Self-Consistency CoT | 提升幅度 |
|---|---|---|---|---|
| 小学数学 | 58% | 78% | 86% | +28pp |
| 符号推理 | 35% | 65% | 72% | +37pp |
| 常识推理 | 72% | 81% | 84% | +12pp |
| 多步复合 | 42% | 67% | 76% | +34pp |
六、总结
Chain of Thought 是 Prompt 工程中最重要的推理增强技术之一。它简单、有效、普适。最关键的实践要点:
- Zero-shot CoT 是零成本提升 — 任何时候都可以先加"让我们一步步思考"
- Few-shot 示例质量决定上限 — 精心设计 2-3 个代表性示例远胜 10 个随意示例
- Self-Consistency 是最佳搭档 — 与 CoT 组合,效果提升最显著
- 工具集成是下一阶段 — CoT + 代码/搜索/计算器 = 可靠推理
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
