Skip to content

第 10 章 · 思维链 Chain-of-Thought

本章目标:理解 Chain-of-Thought(CoT)提示的原理与变体,掌握 Manual-CoT、Zero-Shot-CoT 和 Auto-CoT 的使用方法,并能判断何时该用 CoT、何时不该用。

10.1 为什么需要思维链

标准提示让模型直接从问题跳到答案。对于简单任务这没问题,但遇到多步推理(数学应用题、逻辑推演、常识推理)时,模型容易在中间步骤出错,导致最终答案错误。

CoT 的核心思想:让模型把中间推理步骤显式地写出来,而不是直接给最终答案。

python
# 标准提示 — 直接要答案
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(手工示例)

在提示中手工编写一条包含完整推理过程的示例,让模型模仿:

python
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",就能激活模型的逐步推理能力:

python
prompt = """一家商店打折 20%,原价 80 元的商品现价多少?

Let's think step by step."""

中文等价写法:"请一步一步思考" 或 "让我们逐步分析"。

python
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,用两步自动化替代人工设计示例:

  1. 聚类采样:将问题集按语义向量聚类,从每簇选取代表性问题;
  2. 自动生成推理链:用 Zero-Shot-CoT 为每个代表问题生成推理步骤,作为 few-shot 示例。
python
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 自动构建推理链的两个步骤是什么?

🛠️ 动手实践

  1. 用 Zero-Shot-CoT 解决一道数学应用题(如鸡兔同笼),对比不加 "Let's think step by step" 的结果差异。
  2. 手工编写一个 Few-Shot-CoT 示例(含完整推理链),解决一道逻辑推理题。
  3. 测试你的模型在小规模情感分类任务上加 CoT 是否有改善——记录两种方式的 token 消耗对比。