最近读到两篇和大语言模型推理能力有关的经典论文:
- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models Jason Wei et al., 2022 arXiv: https://arxiv.org/abs/2201.11903
- Large Language Models are Zero-Shot Reasoners Takeshi Kojima et al., 2022 arXiv: https://arxiv.org/abs/2205.11916
这两篇论文讨论的是一个很有意思的问题:
大语言模型是不是可以通过 prompt 被诱导出更强的推理能力?
答案是:一定程度上可以。
1. Chain-of-Thought 是什么?
Chain-of-Thought,简称 CoT,直译是“思维链”。在大语言模型里,它通常指:
让模型在给出最终答案之前,先生成一串中间推理步骤。
普通 few-shot prompt 可能是这样:
Q: 小明有 3 个苹果,又买了 2 个,现在有几个?
A: 5
而 Chain-of-Thought prompt 会写成:
Q: 小明有 3 个苹果,又买了 2 个,现在有几个?
A: 小明一开始有 3 个苹果,又买了 2 个,所以 3 + 2 = 5。答案是 5。
区别在于,CoT 不是只给答案,而是给出:
问题 → 中间推理过程 → 最终答案
这样模型在遇到新问题时,也更容易模仿这个格式,先分解问题,再一步步推到答案。
2. CoT 论文的核心发现
Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 这篇论文的主要观点是:
对足够大的语言模型来说,在 prompt 里提供几个带推理过程的示例,可以显著提升它在复杂推理任务上的表现。
这里的任务包括:
- 数学文字题
- 常识推理
- 符号推理
- 多步逻辑推理
一个关键点是:CoT 对小模型的帮助不一定明显,但对大模型帮助更明显。
论文里把这种现象描述成一种随着模型规模变大而出现的能力。也就是说,小模型即使看到 “step-by-step” 的例子,可能也推不动;但足够大的模型可以利用这些示例,学会生成类似的中间推理过程。
CoT 的本质不是重新训练模型,而是一种 prompting 技巧。
3. Zero-shot-CoT 是什么?
后来另一篇论文 Large Language Models are Zero-Shot Reasoners 进一步提出:
也许我们不需要给模型 few-shot 示例,只要加一句简单的话,就可以诱导模型进行逐步推理。
这句话就是著名的:
Let's think step by step.
普通 zero-shot prompt 是:
Q: ...
A:
Zero-shot-CoT prompt 是:
Q: ...
A: Let's think step by step.
这篇论文的核心发现是:
只要在答案开头加上 “Let’s think step by step”,模型就更容易生成中间推理步骤,从而在数学、符号推理、逻辑推理任务上表现更好。
所以 CoT 和 Zero-shot-CoT 的区别可以简单理解为:
| 方法 | Prompt 里需要什么 | 形式 |
|---|---|---|
| 普通 zero-shot | 只问问题 | Q: ... A: |
| Few-shot CoT | 给几个带推理过程的例子 | Q: ... A: step-by-step reasoning ... answer |
| Zero-shot-CoT | 不给例子,只加一句触发语 | Q: ... A: Let's think step by step. |
4. 为什么 “Let’s think step by step” 要放到 prompt 里?
一开始我有个疑问:
为什么不直接让模型以 “Let’s think step by step” 作为回答开头,而是要把它放在 prompt 里?
其实这两者本质上很接近。
在 Zero-shot-CoT 论文里,他们的格式是:
Q: ...
A: Let's think step by step.
也就是说,这句话已经放在了 A: 后面。它相当于是模型回答的起始前缀。
对语言模型来说,prompt 就是它接下来生成内容的上下文。模型的生成过程是根据前面的 token 预测后面的 token。
如果 prompt 是:
Q: ...
A:
模型可能直接输出最终答案。
但如果 prompt 是:
Q: ...
A: Let's think step by step.
那么后面最自然的 continuation 就变成了:
First, ...
Then, ...
Therefore, the answer is ...
所以 “Let’s think step by step” 不是给模型新的知识,而是改变模型接下来生成内容的轨迹。它是一种 style / behavior trigger。
类似于:
Explain carefully.
或者:
Use a formal tone.
这些指令本身不提供答案,但会改变模型回答的方式。
5. 为什么 Zero-shot-CoT 要分成两个阶段?
另一个问题是:
为什么论文里要分成两个阶段?一个阶段直接让模型 “Let’s think step by step” 然后输出答案不就可以了吗?
答案是:实际使用时,一个阶段通常就可以。论文分成两个阶段,主要是为了实验评测更稳定。
Zero-shot-CoT 论文里的流程是:
第一阶段:Reasoning extraction
先让模型生成推理过程:
Q: ...
A: Let's think step by step.
模型会输出一段中间推理。
第二阶段:Answer extraction
然后把第一阶段生成的推理过程再喂给模型,让它抽取最终答案:
Therefore, the answer is ...
这样做的主要原因有三个。
5.1 方便自动打分
很多 benchmark 的答案是一个数字、一个选项或者一个短词。
如果模型第一阶段输出:
We need to add 5 and 6. That gives 11, so Roger has 11 balls.
人当然能看出来答案是 11。
但自动评测脚本不一定能稳定识别最终答案。因为输出里可能有很多数字:
He bought 2 cans with 3 balls each, so 2 × 3 = 6. Starting with 5, total is 11.
这里有 2、3、6、5、11。自动系统要知道哪个是 final answer,并不总是简单。
所以第二阶段的 answer extraction 是为了让模型把最终答案规范化地抽出来。
5.2 减少格式噪音
一步输出的时候,最终答案可能藏在中间,也可能表述不规范。
比如模型可能写:
So it should be around eleven.
或者:
The result is probably 11 balls.
对于人来说没问题,但对于自动评测来说会增加噪音。
第二阶段可以强制模型用更稳定的格式输出:
The answer is 11.
5.3 把“推理生成”和“答案提取”拆开分析
论文真正想证明的是:
加上 “Let’s think step by step” 之后,模型能生成有用的中间推理。
第二阶段不是核心创新,而是为了把推理结果转成更容易评测的最终答案。
所以可以理解为:
第一阶段:让模型思考
第二阶段:让模型把答案说清楚
6. 实际使用时需要两阶段吗?
一般不需要。
日常使用时,我们可以把两阶段压缩成一个 prompt:
Think step by step, then give the final answer in the format:
Final answer: ...
也就是同时要求模型:
- 先分步骤分析;
- 最后用固定格式给出答案。
这种写法兼顾了推理过程和答案格式控制。
例如:
Please solve the problem step by step.
At the end, write the final answer as:
Final answer: <answer>
这相当于把论文里的 reasoning extraction 和 answer extraction 合并到了一个阶段里。
7. 这说明模型真的会“推理”吗?
这个问题要谨慎。
CoT 和 Zero-shot-CoT 说明的是:
通过合适的 prompt,大语言模型可以生成更有用的中间步骤,并且这些中间步骤常常能提升复杂任务的准确率。
但这不等于证明模型像人一样推理。
原因包括:
- 模型生成的推理步骤可能是错的;
- 推理过程看起来合理,但最终答案仍然可能错;
- 有时候模型可能先“猜到答案”,再生成一个看似合理的解释;
- CoT 更像是一种可观察的文本行为,不一定完全等同于模型内部真实计算过程。
所以更稳妥的说法是:
Chain-of-Thought 是一种能提升复杂任务表现的 prompting 方法,但不能简单等同于人类意义上的推理。
8. 总结
这两篇论文可以放在一起理解:
Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 说明:
如果给大模型几个带推理过程的示例,它可以学会用类似的中间步骤解决复杂问题。
Large Language Models are Zero-Shot Reasoners 进一步说明:
即使不给示例,只要加一句 “Let’s think step by step”,也可以诱导大模型生成推理过程,并提升一些推理任务的表现。
最核心的 insight 是:
对大语言模型来说,prompt 不只是提问方式,也是在改变模型生成答案的路径。
“Let’s think step by step” 之所以有用,是因为它把模型从“直接给答案”的轨迹,推向了“先分解、再计算、最后回答”的轨迹。
而论文里分成两阶段,并不是因为模型必须这样工作,而是为了让实验评测更稳定、更容易自动提取最终答案。
实际使用时,一个阶段通常就够:
Think step by step, then give the final answer in a fixed format.
这就是 CoT 和 Zero-shot-CoT 最实用的 takeaway。
References
- Wei, J., Wang, X., Schuurmans, D., Bosma, M., Ichter, B., Xia, F., Chi, E., Le, Q., & Zhou, D. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. arXiv:2201.11903. https://arxiv.org/abs/2201.11903
- Kojima, T., Gu, S. S., Reid, M., Matsuo, Y., & Iwasawa, Y. (2022). Large Language Models are Zero-Shot Reasoners. arXiv:2205.11916. https://arxiv.org/abs/2205.11916