17 Zero-shot-CoT:一句“Let‘s think step by step“如何唤醒沉睡的推理能力——从零样本触发式逐步推理到解码空间的概率导航
Zero-shot-CoT:一句"Let’s think step by step"如何唤醒沉睡的推理能力——从零样本触发式逐步推理到解码空间的概率导航
阅读导航:这篇文章会从一道让GPT-3栽跟头的小学数学题开始,先让你看到Zero-shot-CoT的全貌(宏观),再逐层剥开触发句如何改变模型的"思维路径"(中观),最后落到token级别的概率流转(微观)。如果你已经熟悉Transformer的自回归解码和Softmax概率分布,我们会不断用它们作为锚点。准备好了吗?我们出发。
0. 从一个让你头疼的问题开始
来看一道题:
Roger有5个网球,又买了2罐网球,每罐3个。他现在有几个网球?
如果你直接把这道题丢给早期的GPT-3(text-davinci-002),它可能会脱口而出"30"(5×2×3,错得离谱),或者"11"(碰运气)。在MultiArith数据集上,这种直接提问(Standard Prompting)的准确率只有17.7%。
但别急。你只要在问题后面加一句看起来像废话的指令:
“Let’s think step by step.”
奇迹发生了。模型突然变得像一个认真做题的小学生,开始自言自语:
“Roger starts with 5 balls. He bought 2 cans, each containing 3 balls. So 2×3=6 new balls. 5+6=11. The answer is 11.”
准确率从17.7%飙升到78.7%。在GSM8K上,从10.4%涨到40.7%。在Coin Flip任务上,从12.8%涨到91.4%。
问题来了:模型不是本来就"会"做这道题吗?为什么需要被提醒? 这句触发句到底触碰了模型内部的哪个开关?
别急,让我们先站在山顶,看看全貌。
1. 宏观视角:Zero-shot-CoT的全貌——如果画成一张地铁线路图
如果我们把模型回答问题的方式画成一张地铁线路图,会有三条并行的轨道:
如果画成图会是什么样子? Standard Prompting像一辆直达快车,从问题站一脚油门踩到答案站,中间不停靠——所以容易开过站。Zero-shot-CoT像一辆观光慢车,强制在每个推理站点停靠检查。Few-shot-CoT则像一辆有导游讲解的专车,需要提前准备导游词(示例)。
关键认知:Zero-shot-CoT不是"教"模型推理,而是"激活"模型在预训练时就已经内化的推理模式。 它位于Standard和Few-shot之间——比Standard多了一个触发信号,比Few-shot少了手工示例的成本。
2. 中观拆解:触发句内部发生了什么?
现在我们已经了解了Zero-shot-CoT的全貌,接下来看看触发句进入模型后,内部结构如何被一层层剥开。每节只解决一个认知疑点。
2.1 解码空间的"软启动"——触发句如何改变模型的"思维路径"?
我们先问一个直觉问题:LLM不是确定性计算器,它是一个概率生成器。你给它一个问题,它其实是在玩一个超级复杂的"接龙游戏"——根据前面所有token,猜下一个最可能出现的token。那么,加一句"Let’s think step by step"到底改变了什么?
锚定已知概念:如果你熟悉Transformer的自回归解码,你知道每一步生成token xt时,模型计算的是条件概率 P(xt | x1, x2, …, xt-1)。整个解码过程就像在一个巨大的概率迷宫中行走,每一步选择概率最高的岔路。
视觉化描述:把解码空间想象成一个巨大的地下迷宫。不加触发句时,模型手里拿的是"最短路径导航"——它倾向于直接跳到答案token(如"30"或"11")。加了触发句后,就像有人在迷宫入口挂了一个发光的指示牌:“请走详细说明路线,禁止抄近路。” 模型的概率分布被重新加权了。
让我们看一个toy example。假设我们的极简词表只有这几个词:
𝒱 = {Roger, has, 5, balls, bought, 2, cans, First, Then, Therefore, 30, 11}
对于问题"Roger has 5 balls…",在生成第一个回答token时:
- 无触发句:P(“30”) = 0.35, P(“11”) = 0.25, P(“First”) = 0.02
- 有触发句:P(“First”) = 0.42, P(“Then”) = 0.18, P(“30”) = 0.08
看到没有?触发句把"First"的概率从0.02硬生生拉到了0.42。模型被迫进入"逐步说明"的生成模式,而不是"直接回答"模式。
这和RNN的隐藏状态初始化有什么关系?就像你给RNN一个特定的初始隐藏状态h0,它就会在特定的动态轨迹上演化。触发句就是LLM的语义初始化向量——它不改变模型权重,但改变了整个自回归链路的起始条件。
2.2 预训练语料中的"幽灵"——触发句激活了什么沉睡的记忆?
现在我们已经了解了触发句改变概率分布,接下来看看一个更深的疑点:模型从来没被"教过"要听这句指令——没有监督信号说"听到’Let’s think step by step’就要分步回答"。为什么它这么听话?
别急,答案藏在预训练语料里。
互联网上充斥着这样的文本模式:
- 数学论坛里的"Let’s think step by step. First, we need to find…"
- 教科书里的"Show your work. Step 1: Identify the variables."
- 技术博客里的"To solve this, let’s break it down…"
- StackOverflow上的"First, check if… Then, verify that…"
这些文本在模型权重中留下了统计痕迹,就像脚印留在雪地上。触发句不是写新书,而是给图书管理员一个精确的索书号:“请把’逐步推理’那个书架上的书全部递给我。”
渐进披露:先理解小词表的情况——模型只是重新排列了8个词的概率。再推广到真实规模:在175B参数的GPT-3中,触发句激活的是一个高维权重空间中的低维流形(low-dimensional manifold)——一个专门编码"逐步说明"语义的子空间。Kojima等人的实验表明,这种激活是跨模型的:在InstructGPT(175B)和PaLM(540B)上都有效,说明这不是某个模型的巧合,而是Transformer架构的普遍特性。
2.3 两阶段流水线:为什么非要分两步走?
现在我们已经了解了触发句激活预训练记忆,接下来看看一个工程层面的疑点:为什么Zero-shot-CoT要设计成"先生成推理链,再提取答案"的两阶段?不能一次性搞定吗?
技术上可以,但分两步更可靠。原因有三:
- 解耦(Decoupling):推理链可能很长(50-200 tokens),答案 buried in text。第二阶段可以用更短的prompt专门做提取,减少干扰。
- 可观测性(Observability):你可以单独检查推理链C的质量,判断模型是在"真推理"还是"假推理"。
- 答案格式化:第二阶段可以用"Therefore, the answer is"这样的锚点文本,强制模型输出结构化答案。
视觉化描述:想象一家餐厅。第一阶段是厨房(Chef),负责把原材料(问题)加工成菜肴(推理链)。第二阶段是服务员(Waiter),负责把菜肴端出来并明确告诉你"这是主菜"(提取最终答案)。如果让厨师直接端菜,他可能把汤洒了,或者把开胃菜和主菜搞混。分工才专业。
在机票预订的类比中(如果你读了OPAR那篇文章),第一阶段就像OPAR的Plan+Act,第二阶段就像Reflect后的答案整理。Zero-shot-CoT把"思考过程"和"最终交付"分开了。
3. 微观视角:Token级别的概率流转
现在我们已经了解了中观层面的机制,接下来看看最微观的层面:单个token是如何在触发句的引导下流动的。别急,这部分我们从一个极简的toy example开始,再推广到真实规模。
3.1 Toy Example:极简数学题的token流
问题:13 - 5 = ?
不加触发句时,模型的解码路径像一条直线:
输入序列: [Q, "A:", ?]
解码步骤1: "8" (P = 0.70)
解码步骤2: " miles" (P = 0.10,如果问题来自Roger场景)
结束。
模型直接跳到答案。但如果问题稍微复杂一点,比如"13 - 5 × 2 = ?“,模型可能会直接输出"16”(从左到右算)而不是"3"(先乘后减)。
加了触发句后,解码路径变成一条阶梯:
输入序列: [Q, "A:", "Let's", "think", "step", "by", "step", ?]
步骤1: "First" (P = 0.40)
步骤2: "subtract" (P = 0.50 | "First")
步骤3: "5" (P = 0.60 | "...subtract")
步骤4: "from" (P = 0.70 | "...5")
步骤5: "13" (P = 0.80 | "...from")
步骤6: "to" (P = 0.45 | "...13")
步骤7: "get" (P = 0.55 | "...to")
步骤8: "8" (P = 0.90 | "...get")
啊哈时刻:注意步骤8!最终答案"8"的条件概率从0.70提升到了0.90。为什么?因为前面的中间步骤像锁扣一样,把模型锁定在正确的计算路径上。一旦模型说出"subtract 5 from 13",它就很难再说出"30"了——那需要推翻自己已经写下的内容。
这和全连接层有什么关系?想象输出层的Softmax是一个旋钮面板。触发句不是只拧一个旋钮,而是同时调整了一整组旋钮的联动关系——让"First"、“Then”、"Therefore"这些token的权重形成一个共振,互相增强。
3.2 推广到真实规模:注意力头的分工与"推理子网络"
在真实LLM中,上述过程涉及数百亿参数和数百层注意力头。研究表明:
- 位置头(Positional Heads):跟踪"First, Second, Third"的顺序
- 复制头(Copying Heads):把问题中的数字(13, 5)复制到推理链中
- 计算头(Arithmetic Heads):在特定层执行简单的加减运算
- 语义头(Semantic Heads):理解"subtract…from"的语义方向
触发句可能激活了一个**"顺序执行"的子网络**。这就像全连接层中的特定神经元对特定特征敏感——触发句是特征,激活了推理神经元。
但注意:这不是一个确定性的"开关",而是一个统计性的偏置(bias)。模型仍然可能出错,只是出错的概率降低了。就像给骰子加了配重——不是保证掷出6点,只是让6点的概率从1/6变成1/3。
4. 结构化伪代码:Zero-shot-CoT的精确描述
好了,现在我们已经了解了直觉和token流,接下来看看如果用结构化伪代码描述Zero-shot-CoT,会是什么样子。
4.1 Zero-shot-CoT 主流程(两阶段流水线)
算法 1: Zero-shot-CoT 推理
输入: 问题 Q, 触发句 T, 语言模型 ℳ, 答案提取模板 E
输出: 最终答案 A, 推理链 C
1: procedure ZERO_SHOT_COT(Q, T, ℳ, E)
2: ▷ ====== 阶段1: 推理链生成 ======
3: prompt_1 ← Q ⊕ "
A: " ⊕ T
4: C ← ℳ.GENERATE(prompt_1, max_tokens=L<sub>max</sub>, temperature=τ)
5: ▷ C 为自由文本,包含中间推理步骤 c<sub>1</sub>, c<sub>2</sub>, ..., c<sub>k</sub>
6:
7: ▷ ====== 阶段2: 答案提取 ======
8: prompt_2 ← Q ⊕ "
A: " ⊕ C ⊕ "
Therefore, the answer is"
9: A ← ℳ.GENERATE(prompt_2, max_tokens=l<sub>short</sub>, temperature=0.0)
10: ▷ A 通常为短文本,如数字、选项或布尔值
11:
12: return (A, C)
13: end procedure
注意看第8行。第二阶段的prompt故意把第一阶段的输出C拼接回去,再加上"Therefore, the answer is"这个锚点。这就像给模型一个填空题的下半句,让它只能完成最后那个空。
4.2 触发句的"解码偏移"机制(概念模型)
触发句到底如何在数学上改变概率?这是一个概念性伪代码,描述解码分布的偏置效应:
算法 2: 触发句对解码分布的偏置效应
输入: 问题编码 h<sub>Q</sub> ∈ ℝ<sup>d</sup>, 触发句编码 h<sub>T</sub> ∈ ℝ<sup>d</sup>, 输出词表 𝒱
输出: 条件概率分布 P(x | Q, T)
1: procedure TRIGGER_BIAS(h<sub>Q</sub>, h<sub>T</sub>, 𝒱)
2: ▷ 标准解码(无触发句)
3: z<sub>std</sub> ← W<sub>out</sub> · h<sub>Q</sub> ▷ 输出层线性投影
4: P<sub>std</sub> ← SOFTMAX(z<sub>std</sub>) ▷ 标准概率分布
5:
6: ▷ 触发句增强解码
7: h<sub>joint</sub> ← ATTENTION_FUSION(h<sub>Q</sub>, h<sub>T</sub>) ▷ 交叉注意力融合
8: z<sub>cot</sub> ← W<sub>out</sub> · h<sub>joint</sub>
9:
10: ▷ 触发句引入的隐式偏置项
11: ▷ 使"推理起始词"(First, Step, Let, Then)的概率提升
12: ▷ 抑制"直接答案词"(is, are, The answer)的过早出现
13: P<sub>cot</sub> ← SOFTMAX(z<sub>cot</sub>)
14:
15: return P<sub>cot</sub>
16: end procedure
锚定已知概念:如果你熟悉神经网络中的注意力机制(Attention),第7行的ATTENTION_FUSION就像让问题向量hQ和触发句向量hT互相"对视"——触发句告诉问题:“请按照我的风格重新编码你自己。” 融合后的hjoint携带了"逐步推理"的语义标记,这个标记通过输出层Wout传播到整个词表的概率分布上。
5. 变体与进化:触发句的"钥匙齿纹"
5.1 从"Let’s think"到"Plan-and-Solve"——触发句不是唯一的
现在我们已经了解了基础触发句的机制,接下来看看一个有趣的疑点:如果"Let’s think step by step"已经很好了,为什么学术界还在不断发明新的触发句?
因为不同任务需要不同的"认知节奏"。触发句不是万能钥匙,而是一组齿纹不同的钥匙。
视觉化描述:想象触发句是一把万能钥匙的齿纹变体。基础齿纹(Kojima)能开大多数"标准推理锁"。但面对"信息过载"的锁(数学题里塞了很多无关叙述),需要加一道"忽略无关信息"的齿纹(Shi et al.)。面对"需要战略规划"的锁(多步复杂任务),需要"先理解再计划"的齿纹(Wang et al.)。面对"容易紧张出错"的锁(模型在难题上概率分布混乱),需要"深呼吸"的情感调节齿纹(Yang et al.)。
2025年的论文"Think or Step-by-Step? UnZIPping the Black Box in Zero-Shot Prompts"甚至用ZIP统计方法分析出:在"Let’s think step by step"中,真正起关键作用的是"step-by-step"这个词组,而"think"的重要性反而因任务而异。这进一步证明触发句的每个词都是精密的齿纹,不是装饰。
5.2 任务匹配:为什么数学和逻辑任务受益最大?
问题驱动:Zero-shot-CoT在所有任务上都有效吗?
不是。Kojima等人在论文中系统测试了多个任务类别:
| 任务类别 | 代表数据集 | Standard → Zero-shot-CoT | 提升幅度 |
|---|---|---|---|
| 算术推理 | MultiArith | 17.7% → 78.7% | +61.0% |
| 算术推理 | GSM8K | 10.4% → 40.7% | +30.3% |
| 符号推理 | Coin Flip | 12.8% → 91.4% | +78.6% |
| 符号推理 | Last Letter | 0% → 57.6% | +57.6% |
| 逻辑推理 | Date Understanding | 49.3% → 67.5% | +18.2% |
| 逻辑推理 | Tracking Shuffled Objects | 29.4% → 52.4% | +23.0% |
但在**自然语言推断(NLI)**和简单事实问答上,提升有限,甚至可能变差。为什么?
渐进披露:先理解简单情况——"法国首都是哪里?"不需要逐步推理,直接回答"巴黎"即可。如果强制模型走CoT,它可能生成:“First, I need to identify the country. France is in Europe. The capital of France is Paris. Therefore…” 这反而增加了出错概率(模型可能在中间步骤 hallucinate 错误信息,比如把法国说成在欧洲以外)。
再推广到复杂情况——NLI任务(“前提:所有狗都是动物。假设:所有动物都是狗。这对吗?”)需要一次性的语义判断,而不是多步计算。CoT的"逐步拆解"在这里是认知负担而不是帮助。
6. Zero-shot-CoT的边界与陷阱
6.1 幻觉累积:多米诺骨牌效应
现在我们已经了解了触发句的强大,接下来看看它的致命弱点:如果逐步推理这么好,为什么模型还是会错?
因为每一步都是概率采样,不是确定性计算。第一步如果错了(比如把"每罐3个"看成"每罐2个"),后续步骤会在这个错误基础上"合理"地继续推导,最终得到一个自信但错误的答案。
视觉化描述:像一排多米诺骨牌。第一块倒向左边,后面的都会跟着倒向左边。而且模型在生成过程中不会回头检查(这和OPAR循环的Reflect阶段形成鲜明对比!)。在OPAR中,Reflect会打断循环并修正错误。但在Zero-shot-CoT中,模型一旦开始生成,就只能一路向前,没有内置的"刹车片"。
锚定已知概念:这就像RNN中的误差传播。如果早期时间步的隐藏状态引入了偏差,这个偏差会随着序列长度指数级放大。在Zero-shot-CoT中,第一步的幻觉就是那颗混入齿轮组的沙子,最终可能卡住整个机器。
6.2 成本与延迟:推理的代价
另一个隐蔽的约束:CoT不是免费的。生成推理链可能使输出长度增加2-5倍,直接转化为API调用成本的增加。
在继续之前,让我们算一笔账。假设:
- 标准prompting:输入100 tokens,输出10 tokens,共110 tokens
- Zero-shot-CoT:输入100 tokens + 触发句10 tokens,输出150 tokens(推理链),第二阶段再输出10 tokens,共270 tokens
成本翻了约2.5倍。对于高并发服务,这意味着要么接受更高的账单,要么对简单查询做路由判断(先尝试标准prompting,失败再fallback到CoT)。
7. 生产环境中的Zero-shot-CoT:这到底意味着什么?
好了,原理和边界都讲完了。但"这在训练/实际使用中意味着什么?"
7.1 在训练时意味着什么
重要认知:Zero-shot-CoT是纯推理时技术(inference-time technique)。它不改变模型权重,不需要微调,不需要标注数据。你拿到一个预训练好的LLM,加一句触发句,立刻生效。
但它为训练创造了新机会:
- 过程监督(Process Supervision):OpenAI的论文表明,用CoT轨迹作为中间步骤的标签,训练模型不仅答对,而且每一步都对,比只用最终答案监督更有效。
- 蒸馏(Distillation):用大模型(GPT-4)生成的Zero-shot-CoT轨迹微调小模型(Llama-3-8B),让小模型学会逐步推理。
- 强化学习(RL):用答案正确性作为奖励信号,优化推理链质量。模型学会生成"既长又对"的推理链。
7.2 在实际使用中的最佳实践
如果你明天就要在生产环境部署Zero-shot-CoT,这里有几个硬核建议:
| 生产要素 | 具体含义 | 最佳实践 |
|---|---|---|
| 两阶段调用 | 推理和提取分开 | 第一次API调用生成C,第二次调用提取A。不要混为一谈。 |
| 自一致性(Self-Consistency) | 采样多条路径投票 | 对同一问题采样5-10条CoT路径,对最终答案投票。准确率可再提升10-20%。 |
| 答案锚点 | 结构化提取 | 用"Therefore, the answer is"或"oxed{}"作为提取锚点,配合正则表达式解析。 |
| 成本路由 | 避免过度使用 | 简单查询先用Standard Prompting,置信度低时fallback到Zero-shot-CoT。 |
| 温度控制 | 多样性与确定性平衡 | 阶段1用T=0.7(产生多样推理),阶段2用T=0(确定性提取)。 |
| 幻觉检测 | 中间步骤审计 | 对推理链C做事实一致性检查(如数字是否从问题中正确复制)。 |
8. 闭环总结与延伸阅读
让我们回到开头那个Roger的网球问题。现在你应该能看懂了:
模型不是"变聪明了"——它的权重一点没变。而是走对了路。触发句像GPS导航,把模型从"抄近路"模式(直接跳到答案,容易翻车)切换到"稳扎稳打"模式(强制停靠每个推理站点)。这把钥匙不需要示例(zero-shot),因为它解锁的是预训练时就已经存在的、沉睡的逐步推理模式。
如果画成一张最终的总结图,Zero-shot-CoT就像一台自动点唱机:你投币(输入问题),按一个特定的按钮(触发句),机器就从曲库(预训练权重)中找出那首早就录好的"逐步推理之歌"播放出来。
延伸阅读
如果你想深入这个领域,以下国外文献是极佳的起点:
-
Kojima et al., 2022, “Large Language Models are Zero-Shot Reasoners” (NeurIPS) —— Zero-shot-CoT的奠基论文。核心发现:一句"Let’s think step by step"在MultiArith上将准确率从17.7%提升到78.7%,在GSM8K上从10.4%提升到40.7%。必读。
-
Wei et al., 2022, “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models” (NeurIPS) —— Few-shot CoT的源头论文。理解Zero-shot-CoT的最佳背景知识,看清两者的互补关系。
-
Wang et al., 2023a, “Plan-and-Solve Prompting” —— 从"逐步想"进化到"先计划再解决"。展示了触发句可以从被动推理升级为主动规划。
-
Zhou et al., 2023, “Large Language Models are Human-Level Prompt Engineers” (ICLR) —— 自动优化触发句的研究,让模型自己给自己写触发句。
-
Yang et al., 2024, “Take a Deep Breath and Work on This Problem Step-by-Step” —— 探索情感化、拟人化触发句的效果,证明触发句的措辞细节对性能有显著影响。
-
Shi et al., 2023, “Feel Free to Ignore Irrelevant Information” —— 针对信息过载任务的触发句变体,展示了任务特定触发句的必要性。
-
“Think or Step-by-Step? UnZIPping the Black Box in Zero-Shot Prompts” (2025) —— 用ZIP统计方法量化触发句中每个词的重要性,揭示"step-by-step"是核心引擎,"think"是辅助轮。
写在最后:Zero-shot-CoT提醒我们一个被低估的事实——大语言模型的能力边界,往往不取决于它"知道多少",而取决于我们"如何提问"。一句精心设计的触发句,就像一把正确的钥匙,能让沉睡在千亿参数中的推理能力苏醒过来。下次当你看到模型直接给出一个离谱的答案时,别急着换模型,先试试对它说:“Let’s think step by step.”
本文架构图使用 Mermaid 绘制,伪代码遵循结构化算法描述规范。数学上下标使用 HTML 标签(sub/sup)以确保跨平台兼容。如有错误,欢迎指出。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)