一个 LLM 解数学题,直接给答案常错;让它「一步一步想」再给答案,准确率却大幅上升。这个看似魔法的现象,就是思维链(Chain of Thought)。它不是让模型变聪明,而是让模型把推理过程展开——展开后,模型能分配更多算力到中间步骤,错误率自然下降。
先看一个对比例子。问题是「食堂里有 23 个苹果,用了 20 个做午餐,又买了 6 个,食堂还有多少苹果?」
直答(Direct Prompting):
Q: 食堂里有 23 个苹果,用了 20 个做午餐,又买了 6 个,还有多少? A: 27 个。
分步答(Chain of Thought):
Q: 食堂里有 23 个苹果,用了 20 个做午餐,又买了 6 个,还有多少? A: 起初有 23 个。用了 20 个后剩 23 - 20 = 3 个。 又买了 6 个,所以是 3 + 6 = 9 个。答案是 9。
直答错了(27),分步答对了(9)。这不是个例。Wei 等人 2022 年的论文发现:在 GSM8K 等数学推理基准上,CoT 能把大模型的准确率提升 10-20 个百分点。
CoT 的有效性有几个互补的解释:
LLM 的计算量与输出 Token 数大致成正比。直答时,模型只在生成「最终答案」的几个 Token 上花费算力;CoT 时,模型在生成「每一步推理」上都花费算力——等于把一道难题的算力预算放大了几十倍。
| 方式 | 输出长度 | 算力开销 | 推理空间 |
|---|---|---|---|
| 直答 | 几个 Token | 低 | 几乎没有展开 |
| CoT | 几十到几百 Token | 高 | 充分展开 |
💡 类比人类:你心算 23-20+6 也会在脑子里过一遍「先减再加」。LLM 一样——直接给答案等于让它「心算」,分步写等于让它「列竖式」。CoT 的本质是强制模型把内部推理外化为显式步骤。
直答时,一个错误就会让最终答案全错;CoT 时,错误被局部化在某一步,后续步骤仍可能纠正或至少让错误可被调试。
[直答] 一错全错。 [CoT] 步骤1 ✓ → 步骤2 ✗ → 步骤3 ✓(基于步骤2) 错误被定位在步骤2,可追溯可调试。
很多问题的复杂度是非线性的——三步推理的难度远大于三个单步推理之和。CoT 把高复杂度问题分解成多个低复杂度子问题,每个子问题在模型能力范围内。
CoT 不是一种「算法」,而是一类「Prompt 策略」。按触发方式分三种:
在 Prompt 里给出几个带推理过程的示例,让模型学会「该这样分步想」。
Q: 示例问题 1 A: 步骤 1... 步骤 2... 所以答案是 X。 Q: 示例问题 2 A: 步骤 1... 步骤 2... 所以答案是 Y。 Q: 真实问题 A: (模型模仿上面的格式,分步推理)
不给示例,只在问题后加一句魔法咒语「Let's think step by step」(让我们一步一步思考)。
Q: 真实问题 A: Let's think step by step. (模型自动开始分步推理)
💡 「Let's think step by step」是 Prompt Engineering 史上最著名的发现之一。Kojima 等人 2022 年发现,仅仅加上这一句话,就让 LLM 在一系列推理任务上大幅提升。这揭示了 LLM 的一个深刻特性:它的能力一直都在,只是需要被「唤醒」。
CoT 的推理有随机性——同一问题采样多次,可能得到不同的推理路径与答案。Self-Consistency 的思路:采样多次,取多数答案。
| 方式 | 调用次数 | 准确率 | 成本 | 可控性 | 适用 |
|---|---|---|---|---|---|
| Few-shot CoT | 1 | 中高 | 低 | 高 | 生产、需稳定风格 |
| Zero-shot CoT | 1 | 中 | 低 | 低 | 快速原型、通用场景 |
| Self-Consistency | N(5-20) | 高 | 高 | 中 | 高难度推理、不计成本 |
⚠️ Self-Consistency 的代价:采样 10 次意味着 10 倍的 Token 成本与延迟。它适合「准确率优先、成本不敏感」的场景(如医疗诊断、关键决策),不适合高频低价值任务。生产中要权衡准确率与成本的边际收益——采样数从 1 到 5 提升明显,从 10 到 20 提升就有限了。
CoT 不是万能的。它的有效性有明确的边界:
| 场景 | 为什么有效 |
|---|---|
| 多步数学推理 | 每步可独立验证 |
| 逻辑推理题 | 推理链清晰、可分解 |
| 常识推理 | 需要中间假设 |
| 代码调试 | 需要追溯执行流程 |
| 决策分析 | 需要权衡多个因素 |
| 场景 | 为什么无效 |
|---|---|
| 简单事实问答 | 「法国首都是哪」不需要分步 |
| 纯记忆任务 | 分步反而引入噪声 |
| 小模型 | 参数量不够时,CoT 反而让模型更易出错 |
| 超过模型能力的问题 | CoT 不能凭空创造能力 |
⚠️ CoT 的模型规模门槛:研究发现 CoT 对参数量小于约 60B 的模型几乎无效,甚至会降低性能。CoT 是大模型的能力,小模型用 CoT 是东施效颦。这与「算力分配假说」一致——只有模型本身够大,分配更多算力才有意义;模型太小,算力再多也算不出来。
把 CoT 用到生产中,要注意几点:
Few-shot CoT 的示例必须与目标任务同类。给数学题配代码示例,效果会很差。
简单问题配长 CoT 是浪费;复杂问题配短 CoT 是失效。推理长度应匹配问题难度。
优秀的 CoT 让中间步骤可被自动验证(如每步都算出数字、可校验),便于调试与 Self-Consistency。
有些模型学会了「写一堆看起来像推理的废话,最后给个错答案」。真正的 CoT 是中间步骤对、答案也对;伪 CoT 是中间步骤像、答案错。后者比直答更危险,因为它看起来很自信。
💡 工程经验:在关键场景,应当对 CoT 的中间步骤做验证(如让另一个 LLM 或规则检查器复核),而不仅看最终答案。这是对抗「伪 CoT」与幻觉的重要手段。
本节结束前,先给一个对比预告,为下一节思维树铺垫:
CoT 是一条线——一旦某步走错,整条链就废了。ToT 是一棵树——可以探索多条路径,走错了能回溯。这是 3.2 节的主题。
下一节《3.2 思维树与思维图》将把推理从「线」推广到「树」与「图」,讨论多路径探索与回溯机制。