年份与会议
2022 · NeurIPS
用“先写中间推理步骤”的提示方式显著提升复杂推理任务表现,让 prompt 从输入模板升级为推理激活器。
年份与会议
2022 · NeurIPS
作者
Jason Wei、Xuezhi Wang、Dale Schuurmans、Maarten Bosma、et al.
主题
Prompting
阅读时长
约 4 分钟
收录时间
2022/01/28
在 Chain-of-Thought 之前,很多人对 prompt 的理解还停留在“把任务说清楚、给几个例子”这一层。CoT 论文改变的地方在于,它提出了一种更深的判断:
prompt 不只是告诉模型“做什么”,还可以诱导模型“怎么想”。
这件事之所以重要,是因为很多复杂任务并不是知识缺失,而是需要中间推理过程,例如:
CoT 的贡献,就是证明了只要 prompt 中示范了中间推理步骤,大模型在这类任务上的表现可能明显提升。
GPT-3 之后,社区已经知道 few-shot prompting 很有力量,但也很快发现一个问题:
原因通常不是模型完全不知道答案,而是它没有被引导去显式展开中间步骤。对很多推理任务来说,“中间过程”本身就是重要结构,而不是可省略噪声。
CoT 论文就是在这个背景下出现的。它问的是:如果示例里不只给答案,还给出一步步思路,会发生什么?
Chain-of-Thought prompting 的做法非常朴素:
例如不是只写:
问题:... 答案:42
而是写成:
问题:... 先分析条件 A,再结合条件 B,得到中间结论 C,因此答案是 42。
正是这类中间步骤,让模型更容易进入“逐步推”的工作模式。
CoT 看起来非常简单,但有效性背后有几层值得理解的原因:
很多复杂任务不是不会,而是需要把隐含步骤展开。CoT 让模型把这些步骤外显出来。
原来模型直接在“所有可能答案”里跳,现在它先生成一条结构化过程,再落到最终答案,搜索空间更有引导。
随着规模变大,模型在预训练里见过大量带解释、带步骤的文本。CoT 更像是在把这部分潜力激活出来,而不是凭空创造新能力。
这也是为什么 CoT 往往在较大模型上更明显,而不是在小模型上都一样强。
如果把 CoT 放在一条演化线上看,它最有价值的地方其实是把“直接答题”升级成了“先展开过程,再决定答案”:
<g>
<rect x="36" y="84" width="260" height="236" rx="24" fill="#f6f9ff" stroke="#d7e2f1" />
<text x="66" y="118" font-size="20" font-weight="700">直接回答</text>
<rect x="76" y="142" width="178" height="58" rx="16" fill="#e8f1ff" stroke="#98b7e1" />
<text x="165" y="177" text-anchor="middle" font-size="18" font-weight="700">问题</text>
<line x1="165" y1="200" x2="165" y2="238" stroke="#5b6b7f" stroke-width="3" marker-end="url(#cot-arrow)" />
<rect x="76" y="246" width="178" height="58" rx="16" fill="#fce7ef" stroke="#e2a8bd" />
<text x="165" y="281" text-anchor="middle" font-size="18" font-weight="700">直接给答案</text>
<text x="66" y="308" font-size="13" fill="#4b5563">优点:短、快</text>
<text x="66" y="327" font-size="13" fill="#4b5563">风险:复杂题容易跳步或猜错</text>
</g>
<g>
<rect x="328" y="84" width="286" height="236" rx="24" fill="#f8fbf4" stroke="#d5e4c6" />
<text x="358" y="118" font-size="20" font-weight="700">Chain-of-Thought</text>
<rect x="364" y="142" width="186" height="46" rx="14" fill="#e8f1ff" stroke="#98b7e1" />
<text x="457" y="170" text-anchor="middle" font-size="18" font-weight="700">问题</text>
<line x1="457" y1="188" x2="457" y2="214" stroke="#5b6b7f" stroke-width="3" marker-end="url(#cot-arrow)" />
<rect x="364" y="222" width="214" height="64" rx="16" fill="#eef6e8" stroke="#a8c48e" />
<text x="471" y="249" text-anchor="middle" font-size="18" font-weight="700">显式推理链</text>
<text x="471" y="271" text-anchor="middle" font-size="13" fill="#4b5563">分解条件 -> 中间结论 -> 最终判断</text>
<line x1="471" y1="286" x2="471" y2="302" stroke="#5b6b7f" stroke-width="3" marker-end="url(#cot-arrow)" />
<rect x="400" y="300" width="142" height="40" rx="14" fill="#fff4dc" stroke="#e2c36f" />
<text x="471" y="325" text-anchor="middle" font-size="17" font-weight="700">答案</text>
</g>
<g>
<rect x="646" y="84" width="298" height="236" rx="24" fill="#fff8ef" stroke="#eed6a0" />
<text x="676" y="118" font-size="20" font-weight="700">Self-Consistency</text>
<rect x="678" y="142" width="160" height="46" rx="14" fill="#e8f1ff" stroke="#98b7e1" />
<text x="758" y="170" text-anchor="middle" font-size="18" font-weight="700">同一个问题</text>
<g>
<rect x="674" y="212" width="80" height="42" rx="12" fill="#eef6e8" stroke="#a8c48e" />
<text x="714" y="237" text-anchor="middle" font-size="14" font-weight="700">链路 A</text>
<rect x="770" y="212" width="80" height="42" rx="12" fill="#eef6e8" stroke="#a8c48e" />
<text x="810" y="237" text-anchor="middle" font-size="14" font-weight="700">链路 B</text>
<rect x="866" y="212" width="58" height="42" rx="12" fill="#eef6e8" stroke="#a8c48e" />
<text x="895" y="237" text-anchor="middle" font-size="14" font-weight="700">...</text>
</g>
<line x1="758" y1="188" x2="714" y2="212" stroke="#5b6b7f" stroke-width="2.5" marker-end="url(#cot-arrow)" />
<line x1="758" y1="188" x2="810" y2="212" stroke="#5b6b7f" stroke-width="2.5" marker-end="url(#cot-arrow)" />
<line x1="758" y1="188" x2="895" y2="212" stroke="#5b6b7f" stroke-width="2.5" marker-end="url(#cot-arrow)" />
<line x1="714" y1="254" x2="804" y2="292" stroke="#5b6b7f" stroke-width="2.5" marker-end="url(#cot-arrow)" />
<line x1="810" y1="254" x2="804" y2="292" stroke="#5b6b7f" stroke-width="2.5" marker-end="url(#cot-arrow)" />
<line x1="895" y1="254" x2="804" y2="292" stroke="#5b6b7f" stroke-width="2.5" marker-end="url(#cot-arrow)" />
<rect x="734" y="292" width="140" height="40" rx="14" fill="#fff4dc" stroke="#e2c36f" />
<text x="804" y="317" text-anchor="middle" font-size="17" font-weight="700">投票后答案</text>
</g>
</g>
CoT 论文有一个很重要、也经常被忽略的结论:
它并不是说“任何模型只要写思维链都会变强”,而是更接近:
当模型规模足够大时,给出链式推理示例会显著提升复杂推理能力。
这说明 CoT 与 GPT-3 路线是强相关的。它并不是孤立提示技巧,而是大模型规模化之后一种非常自然的能力触发方式。
换句话说,CoT 不是替代规模,而是在规模出现后,成为能力释放接口。
对产品来说,CoT 的价值是:
对研究来说,CoT 的价值是:
因此,CoT 不只是一个技巧,而是一整类“让模型显式展开过程”的方法起点。
CoT 虽然有效,但也带来一个重要警惕:
这意味着 CoT 有双重属性:
这也是为什么后续会出现 self-consistency、verifier、tool use、program execution 等工作,试图进一步提高过程的可信度。
CoT 论文本身已经很重要,但真正把这条线继续推进的,是后来一系列配套工作。最典型的就是 self-consistency:
这说明行业很快就意识到:链条显式化 很好,但 单条链条不一定可靠。因此 CoT 是起点,而不是终点。
从更大的视角看,CoT 还对后来的 agent 与工具调用有深远影响。因为一旦你接受:
模型需要先展开过程,再完成任务
那么下一步就很自然会变成:
这也是为什么很多 agent 系统的“思考-行动-观察”框架,某种意义上都是 CoT 思路的外部化和系统化。
虽然 CoT 很强,但并不是所有场景都适合:
并不是每个请求都需要长推理链。
如果第一步方向错了,后面整条链可能越写越自洽,却越走越偏。
链条写得漂亮,不代表答案一定对。
是否暴露完整推理链,常常不是纯技术问题。
因此,CoT 很适合做能力激发和问题拆解,但在真实产品里仍要和评测、安全与成本一起权衡。
到 2026 年看,CoT 留下的最大遗产并不是某组 benchmark,而是它彻底改变了大家对 prompt 的理解:
这三点对今天的 Prompt Engineering、Agent、Tool Use、Verifier、Reasoning Model 全都有深远影响。
如果你只想抓住主线,请记住:
理解这三点后,你再去看 self-consistency、ReAct 或 reasoning model,就会知道它们分别是在 CoT 的哪一层继续往前走。
沿着相近主题继续阅读,加深对方法边界与实践场景的理解。
从 GPT 的生成式预训练,到 GPT-2 的无监督多任务能力,再到 GPT-3 的 few-shot 涌现,这条路线定义了现代通用大模型的主舞台。
把显式推理链和外部行动结合起来,让模型不只“想”,还会在需要时查资料、调工具、再继续推理,成为 Agent 设计的经典起点。
从任务定义、消息分层、few-shot、结构化输出到工具调用与评测回归,建立一套可复用的提示词工程方法。
从工具 schema 设计、调用循环、失败处理到评测闭环,建立一套可落地的 Agent 与工具调用实践框架。