思维链 (Chain-of-Thought)
High Contrast
Dark Mode
Light Mode
Sepia
Forest
5 min read1,053 words

思维链 (Chain-of-Thought)

思维链(Chain-of-Thought,简称 CoT)是提示工程中最具影响力的技术之一。由 Google Brain 的 Jason Wei 等人在 2022 年提出,它通过引导模型"展示推理过程"来显著提升复杂推理任务的准确性。

什么是思维链?

思维链的核心思想非常简单:不要直接要求答案,而是要求模型一步步展示推理过程

graph TB subgraph "标准提示(直接回答)" A1["问:一个商店有45个苹果,
卖掉了20个,又进了15个。
现在有多少个?"] --> A2["答:40个"] end subgraph "思维链提示(逐步推理)" B1["问:一个商店有45个苹果,
卖掉了20个,又进了15个。
现在有多少个?
请一步步思考。"] --> B2["1. 初始:45个苹果
2. 卖掉20个:45-20=25
3. 进了15个:25+15=40
答:40个"] end style A1 fill:#ffcdd2,stroke:#c62828,stroke-width:2px style A2 fill:#ffcdd2,stroke:#c62828,stroke-width:2px style B1 fill:#a5d6a7,stroke:#2e7d32,stroke-width:2px style B2 fill:#a5d6a7,stroke:#2e7d32,stroke-width:3px

为什么有效?

思维链之所以能提升准确率,有几个关键原因:

  1. 分解复杂性 — 将一个复杂问题拆分成多个简单步骤
  2. 暴露中间结果 — 每一步的结果都是可验证的
  3. 减少"跳跃式错误" — 直接输出答案时模型可能跳过关键步骤
  4. 类似人类思维 — 人在解决数学题时也需要写出解题步骤

学术数据:CoT 的效果

根据原始论文(Wei et al., 2022)在多个基准测试上的数据:

数据集 标准提示 Chain-of-Thought 提升幅度
GSM8K(数学) 17.7% 58.0% +40.3%
SVAMP(数学) 63.0% 79.0% +16.0%
AQuA(代数) 33.5% 50.0% +16.5%
StrategyQA(常识推理) 65.0% 73.0% +8.0%

⚠️ 注意:以上数据来自 PaLM-540B 模型。不同模型和不同任务上的提升幅度会有差异。小模型(<10B 参数)上 CoT 的效果可能不明显。

两种实现方式

1. Zero-shot CoT(零样本思维链)

最简单的实现方式——只需在提示词末尾添加一句"让我们一步步思考"

from openai import OpenAI
client = OpenAI()
# Zero-shot CoT
prompt = """
一家工厂每天生产200个零件。每个零件的成本是15元,售价是25元。
工厂每天的固定运营成本是1500元。
请问这家工厂每天的净利润是多少?
让我们一步步思考。
"""
response = client.chat.completions.create(
model="gpt-4o",
temperature=0,
messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)
# 模型会输出完整的推理过程:
# 1. 每个零件利润 = 25 - 15 = 10元
# 2. 零件总利润 = 200 × 10 = 2000元
# 3. 净利润 = 2000 - 1500 = 500元
# 答案:每天净利润500元

常用的 Zero-shot CoT 触发语

中文版本:
- "让我们一步步思考。"
- "请逐步推理并给出答案。"
- "请展示你的推理过程。"
- "在回答之前,请先分析问题。"
英文版本:
- "Let's think step by step."
- "Think through this step by step."
- "Show your reasoning process."
- "Break this down step by step."

2. Few-shot CoT(少样本思维链)

提供包含完整推理步骤的示例,让模型学习"如何思考"。

prompt = """
在解决以下数学问题时,请展示详细的推理步骤。
【示例1】
问题:一个班级有32名学生,其中60%是女生。如果有5名新女生转入,女生占总人数的百分比是多少?
推理:
第1步:计算原来的女生人数
女生人数 = 32 × 60% = 19.2,四舍五入取19人
等等,人数应该是整数。重新理解:32 × 0.6 = 19.2
这个数据可能有误,但按照题意计算:
原女生 = 32 × 60% ≈ 19人
第2步:计算转入后的人数
总人数 = 32 + 5 = 37人
女生人数 = 19 + 5 = 24人
第3步:计算新比例
女生百分比 = 24 ÷ 37 × 100% ≈ 64.9%
答案:转入后女生约占总人数的64.9%。
【示例2】
问题:一列火车以80km/h的速度行驶,从A站到B站需要2.5小时。如果速度提高到100km/h,需要多长时间?
推理:
第1步:计算A到B的距离
距离 = 速度 × 时间 = 80 × 2.5 = 200km
第2步:计算新速度下的时间
时间 = 距离 ÷ 速度 = 200 ÷ 100 = 2小时
答案:速度提高到100km/h后,需要2小时。
---
现在请解决以下问题:
问题:一家咖啡店,周一到周五每天卖出150杯咖啡,周末每天卖出220杯。每杯咖啡售价28元,原料成本8元。每月租金15000元,人工成本25000元。假设一个月有22个工作日和8个周末天。请计算这家咖啡店的月净利润。
"""
response = client.chat.completions.create(
model="gpt-4o",
temperature=0,
messages=[{"role": "user", "content": prompt}]
)

思维链在不同任务中的应用

数学和逻辑推理

math_cot = """
请使用逐步推理解决以下问题。
问题:一位投资者投入了10万元购买基金。第一年收益率为20%,
第二年收益率为-10%,第三年收益率为15%。
三年后这笔投资的总值是多少?总收益率是多少?
让我们一步步计算。
"""

代码调试

debug_cot = """
以下Python代码存在bug,请一步步分析并找出问题。
```python
def merge_sorted_lists(list1, list2):
result = []
i = j = 0
while i < len(list1) and j < len(list2):
if list1[i] <= list2[j]:
result.append(list1[i])
i += 1
else:
result.append(list2[j])
j += 1
return result

测试用例: merge_sorted_lists([1, 3, 5], [2, 4, 6]) 应返回 [1, 2, 3, 4, 5, 6] 实际返回 [1, 2, 3, 4, 5]

请逐步分析: 1. 先追踪代码执行过程 2. 找出问题所在 3. 解释为什么会出错 4. 给出修复后的代码 """


### 决策分析
```python
decision_cot = """
我需要为公司选择云服务商。请帮我做一个结构化分析。
背景:
- 公司是一家中型电商,日活用户10万
- 技术栈:Python + PostgreSQL + Redis
- 预算:每月5-8万元
- 核心需求:稳定性 > 性能 > 成本
候选方案:
A. 阿里云
B. AWS中国区
C. 腾讯云
请一步步分析:
1. 列出每个方案的关键优势和劣势
2. 按核心需求打分(1-10分)
3. 考虑潜在风险
4. 给出最终建议及理由
"""

CoT 的变体技术

自我一致性(Self-Consistency)

由 Wang et al., 2022 提出。核心思想:多次运行 CoT,取多数票

graph TB A[同一个问题] --> B[CoT 推理路径1
答案: A] A --> C[CoT 推理路径2
答案: A] A --> D[CoT 推理路径3
答案: B] A --> E[CoT 推理路径4
答案: A] A --> F[CoT 推理路径5
答案: A] B --> G[多数投票
A: 4票 vs B: 1票] C --> G D --> G E --> G F --> G G --> H[最终答案: A] style A fill:#ede7f6,stroke:#5e35b1,stroke-width:3px style G fill:#fff9c4,stroke:#f9a825,stroke-width:2px style H fill:#a5d6a7,stroke:#2e7d32,stroke-width:3px
from collections import Counter
def self_consistency(prompt: str, n: int = 5) -> str:
"""
使用自我一致性策略获取更可靠的答案。
Args:
prompt: 包含CoT指令的提示词
n: 采样次数
Returns:
多数投票得出的答案
"""
answers = []
for _ in range(n):
response = client.chat.completions.create(
model="gpt-4o",
temperature=0.7,  # 需要一定随机性以获得不同推理路径
messages=[{"role": "user", "content": prompt}]
)
# 从回复中提取最终答案(需要根据实际情况解析)
full_response = response.choices[0].message.content
# 假设答案在最后一行,格式为"答案:XXX"
answer = extract_final_answer(full_response)
answers.append(answer)
# 多数投票
counter = Counter(answers)
most_common = counter.most_common(1)[0]
print(f"采样 {n} 次的结果分布: {dict(counter)}")
print(f"最终答案({most_common[1]}/{n} 票): {most_common[0]}")
return most_common[0]
def extract_final_answer(response: str) -> str:
"""从CoT回复中提取最终答案"""
lines = response.strip().split('\n')
for line in reversed(lines):
if '答案' in line or '结果' in line:
return line.split(':')[-1].strip() if ':' in line else line.split(':')[-1].strip()
return lines[-1].strip()

思维验证链(Chain-of-Verification, CoVe)

在 CoT 的基础上增加自我验证环节,进一步减少错误。

cove_prompt = """
请解决以下问题,使用"推理-验证"方法:
问题:如果一个正方形的对角线长度为10cm,那么它的面积是多少?
步骤1:推理
请一步步推理解题过程。
步骤2:验证
推理完成后,请:
- 检查每一步计算是否正确
- 验证最终答案是否合理
- 尝试用不同方法验证答案
步骤3:最终答案
给出经过验证的最终答案。
"""

CoT 使用的注意事项

什么时候使用 CoT?

graph TB A{任务是否需要
多步推理?} -->|是| B{是否需要
高准确性?} A -->|否| C[不需要 CoT
直接提问即可] B -->|是| D[使用 CoT +
Self-Consistency] B -->|一般| E[使用 Zero-shot CoT] style A fill:#ede7f6,stroke:#5e35b1,stroke-width:3px style C fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style D fill:#a5d6a7,stroke:#2e7d32,stroke-width:3px style E fill:#c8e6c9,stroke:#43a047,stroke-width:2px

CoT 的局限性

局限 说明 应对策略
Token 消耗多 推理过程需要大量 Token 仅在必要时使用 CoT
延迟更高 输出更长,响应时间更久 异步处理,非实时场景使用
可能"推理雪崩" 早期步骤错误导致后续全部错误 使用 Self-Consistency
小模型效果差 <10B 参数的模型 CoT 效果不明显 使用 GPT-4o 等强模型
简单任务反而变差 过度推理可能引入不必要的复杂性 判断任务复杂度再决定

动手练习

练习1:设计 CoT 提示词

设计一个 Few-shot CoT 提示词来解决以下类型的问题: "判断一个论证是否存在逻辑谬误,如果存在,指出谬误类型。"

提供至少2个包含完整推理过程的示例。

练习2:Self-Consistency 实验

使用上面的 self_consistency 函数框架,对一个数学推理问题进行5次采样,观察结果分布。

本章要点


下一步高级推理技术:ToT、ReAct 与更多 🚀