这两天我专门把《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》又过了一遍。原因很简单:这个词后来被讲得太泛了,几乎只要涉及“分步推理”,大家都会顺手叫它 CoT。但如果回到原论文,会发现很多今天挂在 CoT 名下的东西,其实并不是这篇论文本身提出的。

我这次重读的目标也很明确,不是为了抄一个 prompt 模板,而是想把方法谱系理清楚:原论文到底贡献了什么,zero-shot CoT 是怎么接上的,self-consistency 又是在改哪一层。这个问题如果不分清,后面读相关工作时很容易把“原始贡献”和“后续延伸”混成一团。

我为什么会去读这篇论文

前两天我刚写过一篇偏实践向的 prompt 笔记,里面顺手提到了 zero-shot、few-shot、CoT、self-consistency 这些常见套路。但写完之后我反而有点不踏实,因为我意识到自己在“工程上会用”和“论文上读懂”之间,其实还隔着一层。

尤其是 CoT 这个词,后来传播得太成功了,成功到很多人默认它等于一句“Let’s think step by step”。可那其实已经是后续工作的表达方式,不是原论文的核心设定。所以我想回头确认一件事:这篇论文真正打开的门,到底是哪一扇。

这篇论文真正提出了什么

如果只用一句话概括,我觉得原论文真正提出的是:在 few-shot prompt 里,不只给任务输入和最终答案,还给出中间推理过程,把“如何从题目走到答案”也作为示例的一部分交给模型模仿。

这听起来像一句废话,但它的分量其实不小。因为在这之前,大家对 few-shot prompting 的直觉通常还是“给几个输入输出样例”。而这篇论文做的事情,是把样例从“答案示范”升级成“推理轨迹示范”。模型不是单纯学会答案长什么样,而是学会面对某类问题时,应该先拆什么、再算什么、最后如何落到结论。

所以我现在更愿意把原论文理解成一种提示范式的改变。它不是泛泛地说“让模型一步步想”,而是说:对复杂推理任务,示例里应该把中间 reasoning trace 明确暴露出来,并把它当成 few-shot 学习的一部分。

这里有个边界必须说清楚。

  • 原论文贡献:few-shot CoT prompting,也就是带推理链示例的 few-shot 提示。
  • 不是原论文贡献:zero-shot CoT、self-consistency、Auto-CoT 这一类后续扩展。

把这条线先画清楚,后面很多概念都会顺很多。

few-shot CoT 的方法机制

few-shot CoT 的机制,关键不在“多写一点字”,而在示例结构变了。

传统 few-shot 更像这样:给你几道题,直接配上标准答案。原论文里的 few-shot CoT 则是在每个示例里加上一段中间推理,让模型看到一条完整路径:先识别条件,再做分解,再得到结果。

我觉得它能起作用,至少包含两层含义。

第一层是任务分解被显式示范了。很多复杂题目不是模型完全不会,而是它默认的生成方式倾向于直接跳答案。few-shot CoT 相当于告诉模型,这类任务的正确接口不是“立刻作答”,而是“先展开一条中间过程”。

第二层是推理格式被对齐了。一旦示例里反复出现“列条件、做中间计算、再下结论”的模式,模型会更倾向于延续这种结构。这里起作用的不是某句神奇咒语,而是示例本身构成了一个可模仿的解题轨迹。

所以我现在看 few-shot CoT,更像是在 prompt 里临时搭了一个“弱版 scratchpad 接口”。它没有改模型参数,也没有外接工具,只是通过示例把中间推理这件事显式化了。

为什么论文强调这是大模型上的 emergent ability

原论文一个很重要的判断是,CoT prompting 的效果不是所有模型都稳定具备的,它更像一种只在足够大模型上才明显出现的能力

这件事非常关键。因为它意味着 CoT 不是一个放之四海而皆准的小技巧,而是一个和模型规模强相关的现象。作者想强调的不是“大家以后都多写几步就好了”,而是“当模型大到某个阶段后,它开始能真正利用这些中间推理示例”。

换句话说,小模型看到 reasoning trace,不一定真能沿着那条轨迹走下去;大模型则开始表现出这种能力。这个判断背后的意味很重:CoT 的成功,不只是 prompt 写法变了,也依赖模型本身已经长出了足够的表示和推理容量。

我觉得这也是这篇论文后来影响这么大的原因。它把 prompt engineering 从“措辞微调”往前推了一步,推进到了“能力和规模如何通过提示被激活”这个层面。

论文怎么说明收益不是“只是输出更长”

如果只看表面,很容易有一种质疑:CoT 之所以效果更好,会不会只是因为模型被迫多输出了一些 token,相当于“想久一点”,所以碰巧更容易答对?

原论文并没有停在一个粗糙的 standard prompting 对比上,而是做了几类很有代表性的对照。我觉得它们的意义就在于排除这种“只是变长了”的解释。

第一类对照可以概括成 variable compute only。也就是只让模型多消耗一点“计算长度”,但不给真正有内容的中间推理。论文给出的结论是,这样几乎没有带来像样的提升。这个结果很重要,因为它说明收益不来自空转,不来自把回答拖长,而来自中间步骤本身承载了有效信息。

第二类对照是 reasoning after answer。也就是把推理放到答案后面。这个设定如果也同样有效,那就说明“多写一段解释”本身就够了。但论文显示这样并不能带来同样的收益。换句话说,中间推理必须在答案之前参与求解,而不是在事后补一段说明书。

第三类对照是 equation only。只给更压缩的公式化过程,不给完整的自然语言推理。它在某些更简单的算术任务上会有帮助,但面对更复杂的问题时,不如完整 CoT 稳定。我的理解是,原论文想说明的不是“公式没用”,而是复杂推理里,纯粹的短式计算并不总能替代自然语言对问题的逐步拆解。

把这几组对照放在一起看,结论就比较清楚了:CoT 的收益不是“更长”,而是“更有结构的中间过程”。

这篇论文和 zero-shot CoT 到底是什么关系

这是最容易被混淆的一点。

今天很多人一提 CoT,脑子里冒出来的其实是那句很有名的话:Let’s think step by step。但严格说,这不是原论文的核心方法,而是后续工作《Large Language Models are Zero-Shot Reasoners》把 CoT 思路进一步简化后的产物。

原论文的设定是 few-shot CoT。你要先给模型看若干个带中间推理的示例,再让它在同类任务上模仿这种解题方式。

zero-shot CoT 则是后续工作的关键推进:它试图去掉这些示例,只靠一句触发语,在零样本条件下把模型拉进“先推理再回答”的模式里。也就是说,它继承了 CoT 的核心直觉,但改了激活方式。

所以两者关系最好这样记:

  • 原论文:提出 few-shot CoT 这条路。
  • 后续 zero-shot CoT:把这条路从“靠示例示范”推进到“靠单句触发”。

如果把 zero-shot CoT 直接说成原论文贡献,严格来说是不对的。

它和 self-consistency 又是什么关系

self-consistency 也不是原论文本体的一部分,而是另一篇后续工作在 CoT 基础上做的 decoding 扩展。

原始 CoT prompting 关心的是:怎样让模型走出一条更像样的推理路径。 self-consistency 关心的则是:既然模型可以走出不止一条推理路径,那能不能不要只贪心地取第一条,而是采样多条路径,再看哪个最终答案更一致。

这两者作用的层次不一样。

  • CoT 主要改的是 prompt 形式
  • self-consistency 主要改的是 解码策略

前者是在提示里把中间推理示范出来,后者是在推理已经能生成的前提下,不急着相信单一路径,而是让多条路径“投票”收敛。

这也是为什么我觉得 self-consistency 更像一层增强器。它不是重新定义 CoT,而是在 CoT 已经成立之后,进一步利用“同题可有多条合理推理链”这件事来提稳定性。

如果回到论文史,这三者应该怎么摆位置

我自己现在会这样排:

  1. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models:提出 few-shot CoT,是原点。
  2. Large Language Models are Zero-Shot Reasoners:把 CoT 从 few-shot 推向 zero-shot,是激活方式的延伸。
  3. Self-Consistency Improves Chain of Thought Reasoning in Language Models:在 CoT 基础上改解码,是推理时的后处理增强。

这么看,谱系就很清楚了。原论文负责“把门打开”,后两者负责“让门更容易进”和“进去之后走得更稳”。

一点工程启发

对工程实践来说,这篇论文给我的启发反而不是“以后 prompt 都要写很长”。真正有用的提醒是:复杂任务里,最值钱的不是多写约束,而是把中间结构设计出来。

如果一个任务本身需要分解、筛选、比较、计算,那 prompt 最容易失效的地方,往往不是结论写得不够明确,而是中间过程根本没有接口。原论文的价值在于提醒我,很多时候应该先问一句:这个任务的关键中间状态是什么,我有没有把它显式暴露出来?

但与此同时,我也不想把它过度神化。CoT 不是万能钥匙。第一,它对模型能力有前提,不是所有小模型都能被这套方式“点醒”;第二,推理链写出来不等于推理就真的可靠,后续 zero-shot CoT、self-consistency,乃至更后面的各种 reasoning work,本质上都在继续补这块短板。

所以如果只保留一个最朴素的结论,那就是:原论文最重要的贡献,不是发明了一句流行口号,而是把“中间推理可以作为示例的一部分被提示出来,并在大模型上显著起作用”这件事讲明白了。

我觉得,把这一点看懂,再去看后面的 zero-shot CoT 和 self-consistency,很多概念就不会乱了。