[paper] Chain-of-Thought 和 Zero-shot-CoT:为什么一句 “Let’s think step by step” 会有用?

最近读到两篇和大语言模型推理能力有关的经典论文: 1. Chain of Thought Prompting Elicits Reasoning in Large Language Models Jason Wei et al., 2022 arXiv: https://arxiv.org/abs/2201.11903 2. Large Language M

最近读到两篇和大语言模型推理能力有关的经典论文:

  1. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models Jason Wei et al., 2022 arXiv: https://arxiv.org/abs/2201.11903
  2. 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: ...

也就是同时要求模型:

  1. 先分步骤分析;
  2. 最后用固定格式给出答案。

这种写法兼顾了推理过程和答案格式控制。

例如:

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