让大模型“先想再答”:Chain-of-Thought Prompting 论文精读——CoT 为什么能激发多步推理?

论文:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

作者:Jason Wei、Xuezhi Wang、Dale Schuurmans 等

会议:NeurIPS 2022

博文作者:千天夜


摘要

大语言模型在文本生成、问答等任务上已经表现出了很强的能力,但面对数学文字题、常识推理和符号操作等需要多步推理的任务时,直接让模型输出答案往往效果并不好。

《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》提出了一种非常简单的方法:在 few-shot Prompt 的示例中,不再只给出"问题---答案",而是加入完整的"问题---中间推理过程---答案"。这样,在面对一个新问题时,模型也会模仿示例,先生成一段自然语言推理链,再生成最终答案。

这篇论文真正重要的地方,不只是提出了 CoT 这个 Prompt 模板,而是通过大量实验说明:

  1. CoT 的效果会随模型规模增大而涌现;
  2. 问题越需要多步推理,CoT 的收益通常越明显;
  3. 推理链必须出现在答案之前,答案才能真正利用前面的中间状态;
  4. CoT 增加的不只是输出文字,而是自回归生成过程中的序列计算深度;
  5. 但输出了看似合理的推理过程,并不能证明这些文字完全忠实于模型内部的真实计算。

本文将从方法、公式、推理机制、实验、消融实验和局限性几个方面,对这篇论文进行完整梳理。

关键词: 大语言模型;Chain of Thought;思维链;Prompt Engineering;In-context Learning;推理能力


目录

  • 一、论文要解决什么问题
  • 二、CoT Prompting 的核心方法
  • 三、为什么 CoT 能表现出多步推理能力
  • 四、什么是"可变计算量"
  • 五、KV Cache 与 CoT 的关系
  • 六、算术推理实验
  • 七、消融实验:到底是什么在起作用
  • 八、Prompt 鲁棒性实验
  • 九、常识推理实验
  • 十、符号推理与长度泛化
  • 十一、论文局限
  • 十二、几个容易混淆的问题
  • 十三、我的理解与总结

一、论文要解决什么问题

在 GPT-3 的 few-shot prompting 中,我们通常会在 Prompt 里给模型几个输入输出示例:

text 复制代码
问题1 → 答案1
问题2 → 答案2
问题3 → 答案3
测试问题 → ?

模型不需要更新参数,只需要根据上下文中的示例理解任务,然后继续生成答案。

这种方式在情感分类、文本补全、简单问答等任务上很好用,但遇到多步推理问题时,模型经常会直接猜答案。

例如:

text 复制代码
食堂原来有23个苹果,用掉20个做午餐,后来又买了6个。
现在一共有多少个苹果?

普通 few-shot Prompt 只告诉模型最终答案长什么样:

text 复制代码
Q: ...
A: The answer is 9.

模型需要直接完成:

x → y x \rightarrow y x→y

其中, x x x 是问题, y y y 是答案。

但是这个问题实际上包含两步:

23 − 20 = 3 23-20=3 23−20=3

3 + 6 = 9 3+6=9 3+6=9

如果模型没有显式保存"还剩3个"这个中间结果,就很容易把题目里的几个数字直接拼成错误算式。

在本文之前,让模型学习自然语言推理过程,通常需要收集大量带有推理步骤的数据,再对模型进行训练或微调。问题在于,高质量推理过程比普通答案昂贵得多。

因此,论文把两个已有思路结合了起来:

思路 优点 问题
带推理过程的监督训练 可以学习分步解题 高质量推理标注成本高
GPT-3 式 few-shot prompting 不更新模型参数,使用方便 复杂推理任务效果较弱
本文 CoT prompting 只提供少量推理示例 希望同时获得分步推理和上下文学习能力

论文的出发点可以概括为:

自然语言中间推理 + Few-shot In-context Learning = Chain-of-Thought Prompting \boxed{ \text{自然语言中间推理} + \text{Few-shot In-context Learning}= \text{Chain-of-Thought Prompting} } 自然语言中间推理+Few-shot In-context Learning=Chain-of-Thought Prompting


二、CoT Prompting 的核心方法

2.1 什么是 Chain of Thought

论文将 Chain of Thought 定义为:

一系列能够引导模型得到最终答案的自然语言中间推理步骤。

普通 Prompt 的示例是:

( x i , y i ) (x_i,y_i) (xi,yi)

CoT Prompt 的示例则变为:

( x i , z i , y i ) (x_i,z_i,y_i) (xi,zi,yi)

其中:

  • x i x_i xi:第 i i i 个问题;
  • z i z_i zi:该问题的推理链;
  • y i y_i yi:最终答案。

给模型若干个带 CoT 的示例后,再输入测试问题:

( x 1 , z 1 , y 1 ) , ... , ( x k , z k , y k ) ⏟ ∗ Prompt中的CoT示例 + x ∗ test ⟶ z ^ test ⟶ y ^ test \underbrace{(x_1,z_1,y_1),\ldots,(x_k,z_k,y_k)}*{\text{Prompt中的CoT示例}} +x*{\text{test}} \longrightarrow \hat z_{\text{test}} \longrightarrow \hat y_{\text{test}} (x1,z1,y1),...,(xk,zk,yk)∗Prompt中的CoT示例+x∗test⟶z^test⟶y^test

需要注意的是,测试问题没有现成的推理链。模型需要模仿 Prompt 中的示例,自己生成 z ^ test \hat z_{\text{test}} z^test,再根据它生成答案。

2.2 Standard Prompting 与 CoT Prompting

图源:论文作者发布的 Google Research 介绍文章

两者的差异并不在模型结构,而在示例输出:

普通 Few-shot

text 复制代码
Q: Roger有5个网球,又买了2罐,每罐3个。现在有多少个?
A: 答案是11。

Few-shot CoT

text 复制代码
Q: Roger有5个网球,又买了2罐,每罐3个。现在有多少个?
A: 两罐网球一共有2×3=6个。
   Roger原来有5个,所以现在有5+6=11个。
   答案是11。

模型参数没有更新,Transformer 结构也没有改变。改变的是模型在上下文中看到的任务范式:

问题 → 答案 \boxed{\text{问题}\rightarrow\text{答案}} 问题→答案

变为:

问题 → 中间推理步骤 → 答案 \boxed{\text{问题}\rightarrow\text{中间推理步骤}\rightarrow\text{答案}} 问题→中间推理步骤→答案

2.3 CoT 的四项性质

论文总结了 CoT 的四个主要特点:

1. 可以分解多步问题

模型不再要求一次性完成复杂映射,而是先解决中间子问题。需要更多步骤的问题,也可以生成更长的推理链,从而获得更多序列计算过程。

2. 推理过程具有一定可观察性

我们可以阅读模型生成的推理步骤,观察它是理解错了题意、漏掉了一步,还是只发生了计算错误。

不过,这只是一个可观察窗口,并不能证明输出文字就是神经网络内部真实、完整的计算过程。

3. 适用范围比较广

因为 CoT 使用的是自然语言,所以原则上可以用于数学、常识推理、符号操作和动作规划等任务。

4. 不需要重新训练模型

对于足够大的现成语言模型,只需要在 few-shot Prompt 中加入少量 CoT 示例,就可以激发这种分步输出行为。


三、为什么 CoT 能表现出多步推理能力

我一开始容易把 CoT 理解成:"模型看到分步示例以后,就突然学会了多次思考。"

更准确地说,CoT 没有给模型增加一个新的推理模块,而是把一次直接映射:

x → y x\rightarrow y x→y

改造成一系列连续的条件生成:

x → z 1 → z 2 → ⋯ → z m → y x\rightarrow z_1\rightarrow z_2\rightarrow\cdots\rightarrow z_m\rightarrow y x→z1→z2→⋯→zm→y

其联合概率可以写成:

p ( z 1 , ... , z m , y ∣ x ) = p ( z 1 ∣ x ) ∏ t = 2 m p ( z t ∣ x , z < t ) p ( y ∣ x , z 1 : m ) p(z_1,\ldots,z_m,y\mid x)= p(z_1\mid x) \prod_{t=2}^{m}p(z_t\mid x,z_{<t}) p(y\mid x,z_{1:m}) p(z1,...,zm,y∣x)=p(z1∣x)t=2∏mp(zt∣x,z<t)p(y∣x,z1:m)

例如模型先生成:

z 1 = "23-20=3,因此还剩3个苹果" z_1=\text{"23-20=3,因此还剩3个苹果"} z1="23-20=3,因此还剩3个苹果"

下一步的生成条件就变成:

p ( z 2 ∣ x , z 1 ) p(z_2\mid x,z_1) p(z2∣x,z1)

因为 z 1 z_1 z1 已经成为上下文的一部分,模型可以读取"还剩3个",继续生成:

z 2 = "又买了6个,所以3+6=9" z_2=\text{"又买了6个,所以3+6=9"} z2="又买了6个,所以3+6=9"

最后答案的生成条件是:

p ( y ∣ x , z 1 , z 2 ) p(y\mid x,z_1,z_2) p(y∣x,z1,z2)

所以,CoT 的关键并不是模型在同一个 token 上"多想了几遍",而是:

text 复制代码
生成中间状态
→ 把中间状态写入上下文
→ 后续token重新读取它
→ 在此基础上继续计算

这很像给模型提供了一张外部草稿纸。

3.1 两种不同的"计算深度"

大模型中可以区分两种深度:

计算深度 含义 CoT 是否改变
网络深度 每个新 token 经过多少层 Transformer 不改变
时间/序列深度 连续生成多少个中间 token 增加

假设模型有 L L L 层 Transformer。无论是否使用 CoT,每生成一个 token,当前 token 都要经过这 L L L 层。

CoT 不会临时把模型从 32 层变成 64 层,但它会让同一套 Transformer 参数在更多自回归时间步上被重复调用。

因此可以理解为:

固定的网络深度 + 可扩展的序列计算深度 \boxed{ \text{固定的网络深度} + \text{可扩展的序列计算深度} } 固定的网络深度+可扩展的序列计算深度

这就是 CoT 能表现出多步推理行为的一个重要原因。

但要注意:本文仍然只生成一条连续推理链,并不是对同一道题进行多次独立推理。如果前面一步推错了,错误的中间状态也会进入上下文,并继续影响后面的结果。


四、什么是"可变计算量"

论文提出,CoT 可以让需要更多推理步骤的问题获得更多计算。

这里的"更多计算"并不是:

  • 增加模型参数;
  • 增加 hidden size;
  • 临时增加 Transformer 层数;
  • 动态训练新的权重。

它指的是:模型生成了更多中间 token,因此执行了更多次自回归解码。

设:

  • Prompt 长度为 n n n;
  • CoT 推理链长度为 m m m;
  • 最终答案长度为 a a a。

普通 Prompt 只生成答案:

C standard = C prefill ( n ) + ∑ t = 1 a C decode ( n + t ) C_{\text{standard}}= C_{\text{prefill}}(n) + \sum_{t=1}^{a}C_{\text{decode}}(n+t) Cstandard=Cprefill(n)+t=1∑aCdecode(n+t)

CoT 需要先生成 m m m 个推理 token:

C CoT = C prefill ( n ) + ∑ t = 1 m + a C decode ( n + t ) C_{\text{CoT}}= C_{\text{prefill}}(n) + \sum_{t=1}^{m+a}C_{\text{decode}}(n+t) CCoT=Cprefill(n)+t=1∑m+aCdecode(n+t)

显然:

C CoT > C standard C_{\text{CoT}}>C_{\text{standard}} CCoT>Cstandard

每多生成一个 token,当前 token 都需要:

  1. 经过全部 Transformer 层;
  2. 在每层计算 Attention;
  3. 经过 FFN;
  4. 通过 lm_head 得到下一个 token 的概率分布。

因此,推理链越长,解码步数越多,总推理时间和计算量通常也越大。

4.1 难题一定会自动获得更多计算吗

不一定。

原始 CoT 并没有一个专门的难度判断器来决定"这道题应该思考10步"。它只是允许模型继续生成中间步骤:

  • 简单题可能很快输出答案;
  • 复杂题可能生成更长的推理链;
  • 模型也可能过早停止;
  • 还可能生成很长但没有意义的内容。

所以更准确的说法是:

CoT 允许模型使用可变长度的序列计算,但不保证模型一定能为每道题分配最合适的计算量。

而且:

更多token ≠ 更好的推理 \boxed{\text{更多token}\neq\text{更好的推理}} 更多token=更好的推理

真正有价值的是携带语义的中间状态,而不是单纯把输出拉长。


五、KV Cache 与 CoT 的关系

理解可变计算量时,还需要区分一个推理加速机制:KV Cache

KV Cache 的作用是:

缓存历史 token 在每一层 Self-Attention 中已经计算好的 Key 和 Value,使模型生成新 token 时不必重复计算全部历史 token。

Self-Attention 的基本形式是:

Q = X W Q , K = X W K , V = X W V Q=XW_Q,\qquad K=XW_K,\qquad V=XW_V Q=XWQ,K=XWK,V=XWV

Attention ⁡ ( Q , K , V ) = softmax ⁡ ( Q K ⊤ d k ) V \operatorname{Attention}(Q,K,V)= \operatorname{softmax} \left( \frac{QK^\top}{\sqrt{d_k}} \right)V Attention(Q,K,V)=softmax(dk QK⊤)V

生成第 t t t 个 token 时,模型只需要计算当前 token 在每一层对应的:

q t , k t , v t q_t,\quad k_t,\quad v_t qt,kt,vt

然后把新的 k t , v t k_t,v_t kt,vt 拼接到缓存中:

K 1 : t = K cache ; k t K_{1:t}=K_{\\text{cache}};k_t K1:t=Kcache;kt

V 1 : t = V cache ; v t V_{1:t}=V_{\\text{cache}};v_t V1:t=Vcache;vt

当前 token 再使用自己的 Query 查询全部历史 Key:

h t = softmax ⁡ ( q t K 1 : t ⊤ d k ) V 1 : t h_t= \operatorname{softmax} \left( \frac{q_tK_{1:t}^{\top}}{\sqrt{d_k}} \right)V_{1:t} ht=softmax(dk qtK1:t⊤)V1:t

5.1 为什么只缓存 K 和 V

向量 作用 是否需要缓存
Q Q Q 当前 token 想查找什么 通常不需要
K K K 历史 token 可以和哪些查询匹配 需要
V V V 匹配后实际读取的内容 需要

过去 token 的 Query 只服务于它当时的计算,后续 token 通常不会再使用;但后续 token 需要不断查询历史 token 的 Key 和 Value,因此需要保存 K、V。

5.2 KV Cache 省掉了什么

KV Cache 省掉的是:

历史 token 再次经过全部 Transformer 层的重复计算。

它并没有让新 token 不需要计算。每生成一个新 token,它仍然要经过全部层,并和不断增长的历史 K、V 进行 Attention。

因此,CoT 与 KV Cache 的关系是:

CoT生成更多token ⇒ 更多解码步数 ⇒ 更长的KV Cache \boxed{ \text{CoT生成更多token} \Rightarrow \text{更多解码步数} \Rightarrow \text{更长的KV Cache} } CoT生成更多token⇒更多解码步数⇒更长的KV Cache

同时:

KV Cache ⇒ 历史推理token的K/V不必反复计算 \boxed{ \text{KV Cache} \Rightarrow \text{历史推理token的K/V不必反复计算} } KV Cache⇒历史推理token的K/V不必反复计算

所以 CoT 仍然会增加推理时延、Attention 计算和显存占用,只是 KV Cache 避免了更严重的历史序列重复计算。

还要注意,KV Cache 不是聊天记录:

  • 聊天记录是原始 token;
  • KV Cache 是这些 token 在每一层产生的 K、V 张量;
  • 模型参数是训练得到的 W Q , W K , W V W_Q,W_K,W_V WQ,WK,WV 等权重。

六、算术推理实验

6.1 数据集

作者首先在五类数学文字题数据集上验证 CoT:

数据集 任务特点
GSM8K 多步小学数学文字题,语义和推理步骤较复杂
SVAMP 题目结构和语言表达变化较多
ASDiv 数学题型较为多样
AQuA 代数类多项选择题
MAWPS 包含单步、双步和多步数学题子集

6.2 Prompt 与模型设置

实验的主要设置如下:

  • 大多数数学任务共用同一组人工编写的 8 个 CoT 示例
  • AQuA 是多选题,因此单独使用4个示例;
  • 对比 Standard Prompting 与 CoT Prompting;
  • 使用 greedy decoding;
  • 测试 GPT-3、LaMDA、PaLM、UL2 和 Codex;
  • 整篇论文只进行 prompting-based inference,没有微调模型参数。

这一点非常重要:实验中的性能变化主要来自 Prompt 形式,而不是作者重新训练了一个专门的数学模型。

6.3 核心结果一:CoT 具有规模涌现现象

图源:论文作者发布的 Google Research 介绍文章

以 GSM8K 为例:

模型 Standard CoT 变化
PaLM 8B 4.9% 4.1% -0.8
LaMDA 137B 6.5% 14.3% +7.8
GPT-3 175B 15.6% 46.9% +31.3
PaLM 540B 17.9% 56.9% +39.0

如果额外使用外部计算器校正基本算术运算,PaLM 540B 可以达到 58.6%。

这个结果说明:

小模型 + CoT示例 ⇏ 正确推理 \text{小模型}+\text{CoT示例} \not\Rightarrow \text{正确推理} 小模型+CoT示例⇒正确推理

小模型也可能生成非常流畅的"所以......因此......",但这些句子在逻辑上并不成立。也就是说,它可能只学会了推理文本的形式,没有形成足够强的语义理解、符号映射和多步组合能力。

随着模型规模增加,这些基础能力逐渐增强,CoT 示例才更容易把它们组织成有效的分步推理过程。

不过,"约100B参数"只是本文在当时所测试模型上的经验现象,不应该把它理解成所有模型都必须跨过的固定物理门槛。模型结构、训练数据、训练计算量和优化方法都会影响结果。

6.4 核心结果二:问题越复杂,CoT 收益越明显

作者进一步把 MAWPS 按题目复杂度拆分。

PaLM 540B 的代表性结果如下:

子任务 Standard CoT
SingleOp:单步运算 94.1% 94.1%
SingleEq 86.5% 92.3%
AddSub 93.9% 91.9%
MultiArith:多步运算 42.2% 94.7%

单步题本身就可以直接映射到答案,CoT 没有太多发挥空间。

多步题需要保存和组合多个中间结果:

x → z 1 → z 2 → z 3 → y x\rightarrow z_1\rightarrow z_2\rightarrow z_3\rightarrow y x→z1→z2→z3→y

此时 CoT 的收益非常明显。

所以,不能简单地说"CoT 对所有问题都有效"。更准确的结论是:

问题越依赖多步中间状态,CoT越可能带来明显收益 \boxed{ \text{问题越依赖多步中间状态,CoT越可能带来明显收益} } 问题越依赖多步中间状态,CoT越可能带来明显收益

6.5 模型生成的推理链真的正确吗

作者人工检查了 LaMDA 137B 在 GSM8K 上的输出。

在最终答案正确的50道题中:

  • 48道题的推理链在逻辑和数学上也正确;
  • 2道题的推理过程存在错误,只是碰巧得到了正确答案。

在最终答案错误的50道题中:

  • 8% 只有计算错误;
  • 16% 只有数字或符号映射错误;
  • 22% 只漏掉了一个推理步骤;
  • 合计46%的推理链接近正确;
  • 其余54%存在较严重的语义理解或逻辑连贯性错误。

这说明 CoT 确实为错误分析提供了一个很有价值的窗口。我们可以区分:

  • 题意理解错误;
  • 中间步骤缺失;
  • 符号映射错误;
  • 单纯计算错误;
  • 推理错误但答案碰巧正确。

但是,"能被阅读和分析"仍然不等于"完全忠实地反映模型内部机制"。


七、消融实验:到底是什么在起作用

我认为这篇论文最值得看的部分之一就是消融实验。

如果只比较:

text 复制代码
Standard Prompting < CoT Prompting

我们只能知道 CoT 有效,但还不知道究竟是以下哪一种因素带来了提升:

  • 输出了数学算式;
  • 生成了更多 token;
  • Prompt 激活了更多预训练知识;
  • 还是答案真的依赖前面的自然语言推理步骤。

因此,作者设计了三个对照变体。

以 LaMDA 137B 在 GSM8K 上的结果为例:

方法 准确率
Standard Prompting 6.5%
Equation Only 5.4%
Variable Compute Only 6.4%
Reasoning After Answer 6.1%
完整 CoT Prompting 14.3%

7.1 Equation Only:只输出算式

模型只需要先生成:

text 复制代码
23 - 20 + 6 = 9

然后再输出答案。

结果表明,这种方式在简单的一两步问题中可能有效,但在 GSM8K 上提升很小。

原因是 GSM8K 的难点经常不只是计算,而是如何把自然语言语义转化成正确操作。例如模型需要先判断:

text 复制代码
"用掉20个"意味着减法;
"后来又买6个"意味着在剩余数量上继续加6。

自然语言推理链可以先解决语义映射,再得到算式。直接要求模型一次性把整道题压缩成一个方程,仍然可能在语义理解阶段出错。

7.2 Variable Compute Only:只增加无意义内容

作者让模型先输出一串点号,点号字符数与解题所需方程长度相近:

text 复制代码
............

这相当于增加生成步骤,却不给这些步骤任何有效语义。

结果为6.4%,与普通 Prompt 的6.5%几乎相同。

因此:

增加解码步骤本身 ≠ 获得有效推理 \boxed{ \text{增加解码步骤本身} \neq \text{获得有效推理} } 增加解码步骤本身=获得有效推理

有用的是"还剩3个""随后增加6个"这类能够被后续 token 读取的中间状态,而不是无意义地消耗更多计算。

7.3 Reasoning After Answer:先回答,再解释

这种变体的格式是:

text 复制代码
答案是9。因为原来有23个......

结果也接近普通 Prompt。

从 Decoder-only 模型的因果 Attention 可以直接解释。

正常 CoT 的生成顺序是:

p ( z , y ∣ x ) = p ( z ∣ x ) p ( y ∣ x , z ) p(z,y\mid x)= p(z\mid x)p(y\mid x,z) p(z,y∣x)=p(z∣x)p(y∣x,z)

推理链 z z z 在答案 y y y 之前,因此答案可以读取推理链。

如果先回答后解释:

p ( y , z ∣ x ) = p ( y ∣ x ) p ( z ∣ x , y ) p(y,z\mid x)= p(y\mid x)p(z\mid x,y) p(y,z∣x)=p(y∣x)p(z∣x,y)

模型生成 y y y 时,后面的 z z z 还不存在。因果 Attention 不能查看未来 token,所以后面的解释不可能反过来帮助已经生成的答案。

因此,关键结构必须是:

问题 → 推理 → 答案 \boxed{ \text{问题}\rightarrow\text{推理}\rightarrow\text{答案} } 问题→推理→答案

而不是只要最终输出中出现了"解释"两个字就可以。

7.4 什么样的实验可以叫消融实验

消融实验的核心是:

在尽量控制其他变量不变的情况下,删除、替换或单独保留方法中的某个组件,观察性能如何变化,从而判断该组件的贡献。

因此,在 LoRA 实验中分别比较 Attention 矩阵、Gated-FFN 矩阵以及二者组合,也可以称为 LoRA 注入位置消融实验

不过,如果不同配置的可训练参数量差异很大,那么结果同时混合了"注入位置"和"参数量"两个因素。更严格的消融还需要报告可训练参数量、保持训练设置一致,并进行多随机种子实验。


八、Prompt 鲁棒性实验

Prompt 方法经常会受到示例选择、排列顺序和语言风格的影响。因此作者进一步更换了:

  • CoT 的标注者;
  • 推理链的表达方式;
  • 详细或简洁的推理风格;
  • 从 GSM8K 随机选择的示例;
  • 示例排列顺序;
  • 示例数量。

在 LaMDA 137B 的 GSM8K 实验中:

Prompt 版本 准确率
Standard 6.5%
原始 CoT 14.3%
标注者 B 15.5%
标注者 C 17.6%
刻意简洁的 CoT 11.1%
三组随机 GSM8K 示例 12.6%~12.7%

不同 Prompt 的效果确实存在波动,但大部分 CoT 版本仍然明显优于普通 Prompt。

这说明 CoT 不是依赖某一句固定的"魔法咒语",真正重要的是示例展示了:

  1. 如何理解问题;
  2. 如何把问题分解成中间步骤;
  3. 如何根据中间状态继续生成;
  4. 如何在最后明确给出答案。

不过,论文也没有否认 Prompt Engineering 的重要性。某些任务对示例内容和顺序仍然非常敏感,所以"CoT具有一定鲁棒性"和"Prompt怎么写都无所谓"是两回事。


九、常识推理实验

为了证明 CoT 不只适用于数学,作者又测试了五类常识推理任务:

数据集 主要能力
CSQA 世界常识与复杂语义选择
StrategyQA 多跳常识推理
Date Understanding 日期和时间推理
Sports Understanding 判断体育事件描述是否合理
SayCan 将自然语言指令分解成机器人动作序列

PaLM 540B 的结果如下:

任务 Standard CoT 提升
CSQA 78.1% 79.9% +1.8
StrategyQA 68.6% 77.8% +9.2
Date 49.0% 65.3% +16.3
Sports 80.5% 95.4% +14.9
SayCan 80.8% 91.7% +10.9

这里可以进一步修正一个容易过度概括的说法:

CoT 并不是对所有"看起来很难"的任务都同样有效。

例如,StrategyQA、日期推理和动作规划需要显式组合多个中间状态,因此提升明显。

CSQA 中不少问题更接近常识知识检索和选项匹配。如果模型本身不知道某个事实,CoT 也不能凭空创造正确知识,所以提升只有1.8个百分点。

换句话说:

CoT擅长组织和组合已有知识,但不能保证补齐模型不知道的知识 \boxed{ \text{CoT擅长组织和组合已有知识,但不能保证补齐模型不知道的知识} } CoT擅长组织和组合已有知识,但不能保证补齐模型不知道的知识

注:论文正文对 PaLM 540B 的 StrategyQA 结果写为75.6%,补充材料 Table 4 给出77.8%;本文采用完整结果表中的77.8%。


十、符号推理与长度泛化

作者最后设计了两个可以严格检查每一步的符号推理任务。

10.1 Last Letter Concatenation

任务要求提取每个单词的最后一个字母并拼接:

Amy Brown → yn \text{Amy Brown}\rightarrow\text{yn} Amy Brown→yn

10.2 Coin Flip

模型需要持续跟踪硬币是否被翻转。

例如,硬币初始正面朝上:

  • 第一个人翻转;
  • 第二个人不翻转;
  • 最终硬币应该反面朝上。

训练示例都只有2步,测试时分为:

  • 2步:in-domain;
  • 3步或4步:OOD。

这里的 OOD 主要表示测试序列比 Prompt 示例更长,而不是任务领域完全改变。

PaLM 540B 的代表性结果如下:

任务 Standard CoT
字母拼接,2词 7.6% 99.4%
字母拼接,4词 OOD 0.0% 63.0%
硬币跟踪,2步 98.1% 100.0%
硬币跟踪,4步 OOD 54.8% 90.2%

这说明,CoT 示例不仅让大模型记住最终答案格式,还可以展示一种可重复执行的操作过程:

2 步操作 → 3 步操作 → 4 步操作 2\text{步操作} \rightarrow 3\text{步操作} \rightarrow 4\text{步操作} 2步操作→3步操作→4步操作

但作者也很谨慎地说明,这些仍然是 toy tasks。正确的算法结构已经写在 few-shot CoT 示例中,模型主要是在新的符号和更长序列上重复相同操作。

所以,这个实验能够说明 CoT 有助于长度泛化,但不能仅凭它就证明模型获得了完全通用的算法推理能力。


十一、论文局限

11.1 可读推理不等于真实内部推理

模型生成的文字看起来像人的思考过程,但这不能直接回答神经网络是否真的以相同方式完成了计算。

CoT 提供的是:

  • 可阅读的中间输出;
  • 可以进行错误分析的窗口;
  • 对最终答案有实际帮助的上下文状态。

它并不等价于对模型内部计算机制的完整解释。

11.2 推理链不保证正确

模型可能出现:

  • 早期步骤错误;
  • 漏掉关键步骤;
  • 数字映射错误;
  • 事实性幻觉;
  • 推理错误但答案碰巧正确。

由于后续 token 会读取前面的错误状态,错误还可能沿整条推理链传播。

11.3 标注与使用成本

Few-shot 场景只需要人工编写少量 CoT 示例,成本相对可控。

但如果想收集大规模 CoT 数据进行微调,高质量推理过程的标注成本会远高于普通答案标注。

11.4 推理部署成本更高

CoT 需要生成更多 token,因此会增加:

  • 解码次数;
  • 推理时延;
  • Attention 计算量;
  • KV Cache 显存占用;
  • 输出 token 成本。

而本文发现有效 CoT 主要出现在大规模模型上,这进一步提高了现实部署成本。


十二、几个容易混淆的问题

12.1 CoT Prompting 不是 CoT 微调

本文只在 Prompt 中放入少量带推理过程的示例,没有使用这些样本更新模型参数。

因此:

项目 本文 CoT Prompting
是否训练模型
是否更新权重
是否需要大量 CoT 数据
改变了什么 上下文中的 few-shot 示例

12.2 本文不是只加入一句"请逐步思考"

本文研究的是 few-shot CoT:

text 复制代码
问题1 → 完整推理链1 → 答案1
问题2 → 完整推理链2 → 答案2
测试问题 → 模型生成推理链和答案

它的关键是给模型展示若干完整的分步推理示例,而不是只在测试问题后面追加一句固定指令。

12.3 一个推理 token 不等于一个逻辑步骤

自然语言中的一个逻辑步骤通常由多个 token 组成。

因此,"生成了30个推理 token"不能直接解释成"模型进行了30次完整逻辑推理"。token 是自回归生成和计算的基本时间步,逻辑步骤则是更高层的语义单元。

12.4 CoT 不是多条独立推理

本文的原始 CoT 通常使用 greedy decoding 生成一条连续路径:

x → z 1 → ⋯ → z m → y x\rightarrow z_1\rightarrow\cdots\rightarrow z_m\rightarrow y x→z1→⋯→zm→y

它不是同时生成多条互相独立的解法再进行比较。

12.5 规模涌现不是固定参数门槛

论文观察到,在其测试的模型中,CoT 的明显收益主要出现在约100B参数量级。

这个结论应该理解为当时实验范围内的经验规律,而不是"99B一定不会推理,100B一定会推理"的硬阈值。


十三、我的理解与总结

读完这篇论文以后,我认为 CoT 最核心的价值不是"让答案变长",而是改变了模型解决问题时的信息流。

普通 Prompt 要求模型直接完成:

x → y x\rightarrow y x→y

CoT 则把任务拆成:

x → z 1 → z 2 → ⋯ → z m → y x\rightarrow z_1\rightarrow z_2\rightarrow\cdots\rightarrow z_m\rightarrow y x→z1→z2→⋯→zm→y

每个中间状态都会被写进上下文,后续 token 可以通过 Attention 继续读取这些信息。这样,固定结构的 Transformer 就可以通过更多自回归时间步,形成更长的序列计算过程。

但消融实验又证明:

更多计算步骤本身 ≠ 有效推理 \text{更多计算步骤本身} \neq \text{有效推理} 更多计算步骤本身=有效推理

真正起作用的是:

  1. 推理步骤包含有效自然语言语义;
  2. 中间结果可以被后续步骤继续使用;
  3. 推理链位于最终答案之前;
  4. 模型本身已经具备足够的语义理解、算术和符号组合能力;
  5. 问题确实需要多步分解,而不是简单知识检索或一步映射。

因此,我最终把本文的核心结论概括为:

大模型已有的基础能力 + CoT示例激发分步模式 + 自回归生成提供外部草稿空间 = 更强的多步推理表现 \boxed{ \text{大模型已有的基础能力} + \text{CoT示例激发分步模式} + \text{自回归生成提供外部草稿空间}= \text{更强的多步推理表现} } 大模型已有的基础能力+CoT示例激发分步模式+自回归生成提供外部草稿空间=更强的多步推理表现

这篇论文没有修改模型结构,也没有训练新的参数,却证明了一个很重要的问题:

普通 Prompt 测到的能力,可能只是大语言模型能力的下限。改变模型生成答案的过程,就可能激发出原本难以观察到的推理行为。

当然,CoT 输出是否忠实、推理链如何避免错误传播、怎样降低长推理带来的计算成本,仍然是需要继续研究的问题。


参考资料

  1. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models --- NeurIPS 2022
  2. 论文 arXiv 页面
  3. 论文正文 PDF
  4. 论文补充材料
  5. Google Research:Language Models Perform Reasoning via Chain of Thought
相关推荐
Elastic 中国社区官方博客1 小时前
不到 5 分钟完成本地部署:Jina embedding 模型现已支持本地部署
大数据·人工智能·elasticsearch·搜索引擎·embedding·jina
2601_963282771 小时前
极寒专网技术拆解:黑龙江零下 40℃场景数字对讲组网全方案|黑龙江移远科技寒地通信底层技术解析
运维·网络·人工智能·科技
程序员cxuan1 小时前
Loop 还没玩明白,Graph Engineering 又火了。
人工智能·后端·程序员
wh_xia_jun1 小时前
基于 Hi3861 的 PWM 与彩灯综合实践指南
人工智能
To_OC1 小时前
别再被跑分骗了:大模型 Benchmark 到底在考什么?
人工智能·llm·agent
qyz_hr1 小时前
待岗人员如何安置?国企末等调整制度下的分流通道设计与合规要点
人工智能
成都被卷死的程序员2 小时前
AI的Tools与Skills详解
人工智能
橙臣程2 小时前
深度学习9——transformer之注意力机制
人工智能·深度学习·transformer
网络工程小王2 小时前
【HCIE-AI】10.pytorch模型迁移分析
人工智能·学习·华为·llama