思维链 (Chain-of-Thought)
思维链(Chain-of-Thought,简称 CoT)是提示工程中最具影响力的技术之一。由 Google Brain 的 Jason Wei 等人在 2022 年提出,它通过引导模型"展示推理过程"来显著提升复杂推理任务的准确性。
什么是思维链?
思维链的核心思想非常简单:不要直接要求答案,而是要求模型一步步展示推理过程。
卖掉了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
为什么有效?
思维链之所以能提升准确率,有几个关键原因:
- 分解复杂性 — 将一个复杂问题拆分成多个简单步骤
- 暴露中间结果 — 每一步的结果都是可验证的
- 减少"跳跃式错误" — 直接输出答案时模型可能跳过关键步骤
- 类似人类思维 — 人在解决数学题时也需要写出解题步骤
学术数据: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,取多数票。
答案: 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?
多步推理?} -->|是| 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次采样,观察结果分布。
本章要点
- ✅ Chain-of-Thought 通过引导模型展示推理过程来提升复杂任务的准确性
- ✅ Zero-shot CoT 只需添加"让我们一步步思考"即可激活
- ✅ Few-shot CoT 通过提供包含推理步骤的示例来引导模型
- ✅ Self-Consistency 通过多次采样和投票进一步提升可靠性
- ✅ CoT 在数学推理、代码调试、决策分析等复杂任务中效果显著
- ✅ CoT 也有局限:消耗更多 Token、延迟更高、小模型效果差
下一步:高级推理技术:ToT、ReAct 与更多 🚀