人工智能实践(语言智能)
第3讲:提示词

3.2 Chain-of-Thought

CoT、Zero-shot CoT、Self-Consistency、Program-of-Thoughts,以及 CoT 何时失效

CoT 的核心直觉

链式思维(Chain-of-Thought, CoT)提示(Wei et al., NeurIPS 2022)是提示工程中影响最深远的单项进展。它的核心操作极其简单——在 Few-shot 示例里,不再只给输入-输出,而是把"中间推理步骤"也写出来

形式上,标准 ICL 估计的是:

P(yx,D)=P(yx,{(xi,yi)}i=1k)P(y \mid x, \mathcal{D}) = P(y \mid x, \{(x_i, y_i)\}_{i=1}^{k})

而 CoT 把每个示例扩展为三元组 (xi,ri,yi)(x_i, r_i, y_i),其中 rir_i 是推理过程,于是模型在解码时会先生成推理链 r^\hat{r}、再生成答案 y^\hat{y}

P(yx,DCoT)=rP(yx,r)P(rx,{(xi,ri,yi)})P(y \mid x, \mathcal{D}_{\text{CoT}}) = \sum_{r} P(y \mid x, r) \cdot P(r \mid x, \{(x_i, r_i, y_i)\})

结果是戏剧性的:540B PaLM 仅用 8 个 CoT 示例就在 GSM8K 上达到当时 SOTA,超过监督微调模型。

涌现特性(Emergence):CoT 的收益只在 ~100B+ 参数模型上显著出现。对小模型(<10B),CoT 往往起反作用——模型把思路写长了反而增加错误概率。

从 Few-shot CoT 到 Zero-shot CoT

Kojima et al.(NeurIPS 2022)给出了更简化的版本:只需在提问后附加一句 "Let's think step by step."(让我们一步步想),就能在零样本下触发推理链。

任务标准 Zero-shotZero-shot CoT
MultiArith17.7%78.7%
GSM8K10.4%40.7%
AQuA22.4%33.5%

这句"魔咒"本身后来也被自动化方法超越——APE(Zhou et al., ICLR 2023)发现的 "Let's work this out in a step by step way to be sure we have the right answer" 把 GSM8K 从 78.7% 继续推到了 82.0%。

一个"让 LLM 解数学题"的 Before / After

Prompt:
小明有 15 个苹果,给了小红 1/3,然后又买了原来数量的一半,
最后又送了 2 个给老师。请问他现在有几个苹果?

Output:
答案是 11 个。        ← 错(正确答案 15.5,因为半个苹果不合理,题本身有陷阱)

没有中间步骤,模型把心算和输出混在一起,错了也没法定位。

Prompt:
小明有 15 个苹果,给了小红 1/3,然后又买了原来数量的一半,
最后又送了 2 个给老师。请问他现在有几个苹果?

Let's think step by step.

Output:
1. 原本 15 个。
2. 给小红 1/3 = 5 个,剩下 15 - 5 = 10 个。
3. "原来数量的一半" = 15/2 = 7.5 个。由于苹果不能是半个,
   这里应理解为 7 个(取整),于是 10 + 7 = 17 个。
4. 送了 2 个给老师,17 - 2 = 15 个。
答案:15 个。         ← 正确(并且暴露了题目语义歧义)

中间步骤让错误可审计,也让模型自己发现歧义。

Prompt:
问:小红有 5 个苹果,吃了 2 个,又买了 3 个,现在有几个?
答:原来 5 个,吃了 2 个剩 3 个,买 3 个变成 6 个。答案:6 个。

问:小明有 15 个苹果,给了小红 1/3,然后又买了原来数量的一半,
最后又送了 2 个给老师。请问他现在有几个苹果?
答:

Few-shot CoT 通过示例显式"教会"模型推理格式,在结构化程度更高的任务(BIG-Bench Hard、MATH)上通常比 Zero-shot CoT 更稳定。

Self-Consistency:多路推理 + 多数投票

自一致性(Self-Consistency)(Wang et al., ICLR 2023)的直觉极其朴素——一道数学题往往有多条正确推理路径,但正确答案只有一个

算法:

  1. 对同一个 CoT prompt,使用较高温度(如 T=0.7T=0.7)采样 NN 条推理链 {r(1),,r(N)}\{r^{(1)}, \dots, r^{(N)}\}
  2. 从每条链中抽取答案 {y^(1),,y^(N)}\{\hat{y}^{(1)}, \dots, \hat{y}^{(N)}\}
  3. 众数(majority voting)作为最终答案
y^=argmaxyi=1N1[y^(i)=y]\hat{y}^* = \arg\max_{y} \sum_{i=1}^{N} \mathbb{1}[\hat{y}^{(i)} = y]

收益也很显著:相对标准 CoT,GSM8K +17.9%、SVAMP +11.0%、AQuA +12.2%

Self-Consistency 成本 = NN 倍推理开销。工程上常用 N=520N=5 \sim 20,并结合提前停止(如果前 5 条里已有 4 条同意就直接返回)。

Program-of-Thoughts:把计算外包给解释器

纯自然语言推理有一个硬伤:LLM 的算术能力脆弱。GSM-Hard(在 GSM8K 基础上把数字换大)上,标准 CoT 的准确率会断崖式下跌。

Program-of-Thoughts(PoT) / Program-aided Language Models(PAL)(Gao et al., ICML 2023;Chen et al., TMLR 2023)的解法是:

让 LLM 生成 Python 代码作为"推理步骤",计算由解释器完成。效果:在 GSM-Hard 上 PAL 比 CoT 绝对高 40%

# PoT 风格的 Prompt 示例
question = "一个游泳池每小时进水 50 升, 漏水 12 升. 800 升要多久?"

# LLM 生成的 Python:
inflow_per_hour = 50
leak_per_hour = 12
net = inflow_per_hour - leak_per_hour
target = 800
hours = target / net
print(hours)  # 21.05

CoT 何时失效

CoT 不是万能钥匙。以下是几类已知的失效模式:

失效场景原因补救
小模型(<10B)推理链长反而累积错误蒸馏或用 PoT 外包计算
强推理模型(o1/R1/QwQ)已内化 CoT,额外 prompt 收益递减直接用,不要画蛇添足
纯检索/分类任务不需要多步推理,CoT 引入噪声用 Zero-shot 或 Few-shot
长上下文干扰推理链挤占了上下文预算用外部草稿区(Scratchpad)或 Agent 的 short-term memory
算术/精确计算LLM 的数字 token 化不稳切换到 PoT / PAL

Meincke et al.(2025, Wharton)的最新研究明确指出:CoT 对专用推理模型的边际收益正在递减,暗示推理能力正在从"提示驱动"转向"训练驱动"。这也是第 3.4 节 DSPy 强调"把 prompt 当程序优化"而非"手工做 prompt 技巧"的背景。

本节小结

  • CoT = Few-shot 示例里加入中间推理,在 ≥100B 模型上涌现
  • Zero-shot CoT = "Let's think step by step",成本为零却收益巨大
  • Self-Consistency = 多次采样 + 多数投票,成本换准确率
  • PoT/PAL = 把计算外包给 Python 解释器,数值任务首选
  • 失效场景要心中有数——对推理模型和简单任务,CoT 可能反向拖累