第 10 章 · 思维链 Chain-of-Thought
本章目标:理解 Chain-of-Thought(CoT)提示的原理与变体,掌握 Manual-CoT、Zero-Shot-CoT 和 Auto-CoT 的使用方法,并能判断何时该用 CoT、何时不该用。
10.1 为什么需要思维链
标准提示让模型直接从问题跳到答案。对于简单任务这没问题,但遇到多步推理(数学应用题、逻辑推演、常识推理)时,模型容易在中间步骤出错,导致最终答案错误。
CoT 的核心思想:让模型把中间推理步骤显式地写出来,而不是直接给最终答案。
# 标准提示 — 直接要答案
prompt = "小明有 5 个苹果,给了小红 2 个,又买了 3 个,请问小明有几个苹果?"
# CoT 提示 — 要求展示推理过程
prompt = """小明有 5 个苹果,给了小红 2 个,又买了 3 个,请问小明有几个苹果?
请一步一步思考并写出推理过程。"""Wei et al. (2022) 在论文 Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 中首次系统验证了这一方法。实验表明,在 GSM8K 数学基准上,PaLM 540B 模型配合 CoT 提示的准确率从 17.9% 跃升至 56.9%——提升接近三倍。
适用条件
CoT 是一种推理增强技术,不是万能药。它对以下场景最有效:
- 数学计算与逻辑推理
- 多步骤规划
- 常识因果推理
对简单的分类、情感分析或事实检索任务,CoT 反而可能引入不必要的噪声。
10.2 三种 CoT 变体
Manual-CoT(手工示例)
在提示中手工编写一条包含完整推理过程的示例,让模型模仿:
prompt = """
Q: 池子里有 15 条鱼,死了 3 条,还剩几条活的?
A: 让我们一步一步思考。池子原有 15 条鱼。死了 3 条不代表离开池子,
所以池中鱼的总数不变。题目问"还剩几条活的",15 - 3 = 12。
答案是 12 条活鱼。
Q: 一家商店打折 20%,原价 80 元的商品现价多少?
A:
"""优点:可控性最高,示例质量直接影响输出质量。 缺点:人工设计成本高。
Zero-Shot-CoT(零样本思维链)
Kojima et al. (2022) 发现只需在提示末尾追加一句魔法短语 "Let's think step by step",就能激活模型的逐步推理能力:
prompt = """一家商店打折 20%,原价 80 元的商品现价多少?
Let's think step by step."""中文等价写法:"请一步一步思考" 或 "让我们逐步分析"。
import requests
resp = requests.post(
"https://api.deepseek.com/v1/chat/completions",
headers={"Authorization": "Bearer <key>"},
json={
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0
}
)
print(resp.json()["choices"][0]["message"]["content"])优点:无需设计示例,即插即用。 缺点:效果依赖模型规模——小模型(<10B)加了也没用。
Few-Shot-CoT(少样本思维链)
结合两者:提供几条带完整推理链的示例,让模型学会推理模式后自行解答新题。这是效果最好的方式。
10.3 Auto-CoT:自动构建推理链
Zhang et al. (2023) 提出 Auto-CoT,用两步自动化替代人工设计示例:
- 聚类采样:将问题集按语义向量聚类,从每簇选取代表性问题;
- 自动生成推理链:用 Zero-Shot-CoT 为每个代表问题生成推理步骤,作为 few-shot 示例。
from sklearn.cluster import KMeans
from sentence_transformers import SentenceTransformer
# 1. 向量化问题集
model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(questions)
# 2. 聚类
kmeans = KMeans(n_clusters=5)
clusters = kmeans.fit_predict(embeddings)
# 3. 从每簇选一个代表问题,生成 CoT 示例
for cluster_id in range(5):
rep_question = select_representative(questions, clusters, cluster_id)
cot_example = generate_cot(rep_question) # 用 ZS-CoT
examples.append(cot_example)10.4 何时该用 / 不该用 CoT
| 场景 | 建议 | 理由 |
|---|---|---|
| 数学/逻辑推理 | ✅ 强烈推荐 | 中间步骤显著降低错误率 |
| 多步规划 | ✅ 推荐 | 分解任务减少遗漏 |
| 简单分类 | ❌ 不推荐 | 徒增 token 开销 |
| 创意写作 | ⚠️ 视情况 | 可能限制创造力 |
| 事实验证 | ❌ 不推荐 | 推理链无法弥补知识缺失 |
成本考量:CoT 会增加输出 token 数量(推理链本身占空间),在高并发 API 场景需权衡延迟与成本。
10.5 与后续章节的关系
- 第 11 章的 Self-Consistency 是 CoT 的增强版:多次采样 + 投票;
- 第 12 章的 ReAct 在 CoT 基础上加入了行动能力(工具调用);
- 第 13 章的 ToT 将线性推理链升级为树状探索。
三者层层递进,CoT 是所有推理增强技术的基石。
本章小结
- CoT 让模型输出中间推理步骤,大幅提升复杂推理准确率;
- 三种变体:Manual-CoT(手工示例)、Zero-Shot-CoT(魔法短语)、Few-Shot-CoT(少样本+推理链);
- Auto-CoT 通过聚类+自动生成降低人工成本;
- 对简单分类任务不要滥用 CoT——徒增成本不增效。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. Chain-of-Thought 的核心思想是什么?
2. Zero-Shot-CoT 只需要在提示中加入哪句话就能生效?
3. 以下哪种任务最适合使用 CoT?
4. Auto-CoT 自动构建推理链的两个步骤是什么?
🛠️ 动手实践
- 用 Zero-Shot-CoT 解决一道数学应用题(如鸡兔同笼),对比不加 "Let's think step by step" 的结果差异。
- 手工编写一个 Few-Shot-CoT 示例(含完整推理链),解决一道逻辑推理题。
- 测试你的模型在小规模情感分类任务上加 CoT 是否有改善——记录两种方式的 token 消耗对比。