论文: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 模板,而是通过大量实验说明:
- CoT 的效果会随模型规模增大而涌现;
- 问题越需要多步推理,CoT 的收益通常越明显;
- 推理链必须出现在答案之前,答案才能真正利用前面的中间状态;
- CoT 增加的不只是输出文字,而是自回归生成过程中的序列计算深度;
- 但输出了看似合理的推理过程,并不能证明这些文字完全忠实于模型内部的真实计算。
本文将从方法、公式、推理机制、实验、消融实验和局限性几个方面,对这篇论文进行完整梳理。
关键词: 大语言模型;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 都需要:
- 经过全部 Transformer 层;
- 在每层计算 Attention;
- 经过 FFN;
- 通过
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 不是依赖某一句固定的"魔法咒语",真正重要的是示例展示了:
- 如何理解问题;
- 如何把问题分解成中间步骤;
- 如何根据中间状态继续生成;
- 如何在最后明确给出答案。
不过,论文也没有否认 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{有效推理} 更多计算步骤本身=有效推理
真正起作用的是:
- 推理步骤包含有效自然语言语义;
- 中间结果可以被后续步骤继续使用;
- 推理链位于最终答案之前;
- 模型本身已经具备足够的语义理解、算术和符号组合能力;
- 问题确实需要多步分解,而不是简单知识检索或一步映射。
因此,我最终把本文的核心结论概括为:
大模型已有的基础能力 + CoT示例激发分步模式 + 自回归生成提供外部草稿空间 = 更强的多步推理表现 \boxed{ \text{大模型已有的基础能力} + \text{CoT示例激发分步模式} + \text{自回归生成提供外部草稿空间}= \text{更强的多步推理表现} } 大模型已有的基础能力+CoT示例激发分步模式+自回归生成提供外部草稿空间=更强的多步推理表现
这篇论文没有修改模型结构,也没有训练新的参数,却证明了一个很重要的问题:
普通 Prompt 测到的能力,可能只是大语言模型能力的下限。改变模型生成答案的过程,就可能激发出原本难以观察到的推理行为。
当然,CoT 输出是否忠实、推理链如何避免错误传播、怎样降低长推理带来的计算成本,仍然是需要继续研究的问题。