适合读者:写提示词的工程师、需要判断"这个任务该不该用 CoT"的人;以及被"推理过程看起来很合理,但答案是错的"坑过的人。
核心收获 :① CoT 生效的四层机制,从计算量、外部记忆、误差结构到训练分布;② 三类不适合 CoT 的任务,以及判断标准;③ 四个进阶变体与各自的适用边界;④ 一个必须警惕的陷阱------CoT 会撒谎,以及三种可操作的验证方法。
有一类实验曾经让很多人震惊:同一个模型、同一个问题,只把提问方式从"直接给答案"改成"让我们一步步思考",某些数学应用题的正确率能提升一大截。
更让人意外的是------这不需要训练、不需要改模型、不需要额外工具,只是加了一句话。
于是"思维链"(Chain-of-Thought,CoT)成了一个流行技巧,几乎出现在每一份提示词模板里。
但也有人发现,加上这句话之后,有些任务毫无变化,甚至更差------模型认真地写了一段推理,然而答案依然错,而且错得更有说服力。
这篇文章要讲清三件事:
- CoT 在机制上到底做了什么(为什么它有效)?
- 什么任务上它完全无效(什么时候别用)?
- 为什么"写出推理过程"不等于"推理是正确的"(它什么时候在骗你)?
第一部分:CoT 生效的四层机制
理解机制的意义在于:它让你能预测什么任务上有效,而不是靠试。
1.1 第一层:给了模型更多计算
这是最本质的一层。
自回归模型有一个硬约束:
生成多少 token,就做多少次前向计算。
它没法"在心里多想一会儿"。它的思考能力,直接等于它被允许写出来的 token 数量。
对比一下两种方式:
| 提问方式 | 输出 token 数 | 相当于 |
|---|---|---|
| "答案是?" | 几个人 | 一次极难的映射 |
| "让我们一步步思考" | 几百个 | 多次较容易的映射 |
CoT 的本质是:把"一次很难的映射"拆成"多次容易的映射"。
一个类比:让你心算三位数乘三位数,你会错;给你一张草稿纸写竖式,你就能算对。
模型的草稿纸,就是它自己生成的中间 token。
这一层解释还顺带回答了另一个问题:为什么"让模型多想"这件事,后来演化成了"测试时计算"(test-time compute)这条路。
推理模型并不是有了新的魔法,而是把"写草稿"这件事训练成了能力------它不再需要你在提示词里要求,而是默认就会先写一大段思考。
1.2 第二层:把中间结果变成外部记忆
第二层常被忽略,但工程价值很大。
注意力机制只看得到上下文里的内容------模型没有可写的内部变量。
它要"记住"上一步算出的结果,唯一可靠的办法是把这个结果写出来。
CoT 强制模型把每一步的中间结果落在文本里,比如:
设总数为 x
先算出单价是 12 元
所以 3 件的价格是 36 元
后续步骤就能通过注意力读到"12 元"和"36 元"这些值。这相当于给模型接了一块外部工作记忆。
这一层解释了一个实用技巧的由来:
"要求列出关键中间量"往往比"要求一步步想"更有效。
因为真正的收益来自那些被写下来的、后续要用到的量------而不是"思考"这个动作本身。让模型写三段无关的感慨,和写三个关键数字,效果完全不同。
1.3 第三层:分解降低了单步难度
第三层是误差结构上的好处。
假设一个任务需要五次判断,每次判断的难度都很高:
- 直接做:一次"五件事同时做对"的高难度映射;
- 拆成五步:每一步都是"一件相对简单的事"。
单步难度降低,意味着每一步的正确率提高。
不过这里有个重要的边界,必须说清楚:
分解并不会自动纠错。
如果第一步就错了,后面每一步都建立在错误前提上,最终答案只会错得更"合理"------看起来很严谨,但基础是歪的。
这引出了后面第六部分要专门讲的那类失败模式。
1.4 第四层:训练数据里本来就有推理过程
第四层是关于分布的。
代码、解题步骤、教程、问答社区------这些训练语料里天然包含大量"先分析、再推导、最后给结论"的文本。
所以模型见过这种模式 ,你要求它照着写,它是在模仿一个它熟悉的分布,而不是在"启用"某种新能力。
这一层解释了一个现象:为什么不同模型的 CoT 效果差异明显?
| 模型类型 | CoT 效果 | 原因 |
|---|---|---|
| 语料里推理文本多 | 收益大 | 分布熟悉,能顺着写下去 |
| 被训练成"短回答优先" | 收益小,甚至发散 | 与训练目标冲突,强行 CoT 容易跑偏 |
所以,CoT 不是一个普适开关,而是一个和模型训练方式强相关的技巧。 换模型之后,原来调好的 CoT 提示词可能需要重新验证。
1.5 四层机制的小结
| 层次 | 机制 | 直接推论 |
|---|---|---|
| 计算层 | 输出 token 数 = 计算步数 | 需要推导的任务才受益 |
| 记忆层 | 中间结果写出来才能被复用 | 要求列关键中间量 |
| 结构层 | 分解降低单步难度 | 不自动纠错,前提错则全错 |
| 分布层 | 训练语料里有推理文本 | 效果与模型训练方式强相关 |
前两层解释了"为什么有效",后两层解释了"什么时候无效"。
第二部分:什么时候 CoT 完全没用
这是最需要记住的一节。三类任务上,CoT 基本是负收益。
2.1 第一类:纯知识检索型任务
问"某条款规定多少天""某函数的参数有几个""这个 API 的默认超时时间是多少"。
这类任务的答案是取出来 ,不是推出来。信息本身就在上下文或模型知识里。
加上推理步骤只会:
- 增加成本(输出 token 成倍);
- 引入错误(推理过程可能"想多了",把正确的记忆改坏)。
不会提高正确率。
2.2 第二类:模型能力本身不足的重推理任务
如果模型不具备 做某类推理的基础能力,CoT 会让它把每一个错误步骤都写出来。
后果是答案反而更不可信------因为错误被包装得更像样了。
CoT 放大的是已有能力,不是无中生有。
这个边界很重要:CoT 不是"解锁能力"的工具,而是"利用能力"的工具。
2.3 第三类:对延迟和成本敏感的高并发场景
这个后面第五部分会详细算账,先给结论:输出 token 会成倍增长,而输出通常比输入更贵、也更慢。
具体影响:
- 首字延迟:因为要先生成一堆推理才给答案,用户等得更久;
- 总耗时:成倍增长;
- 成本:成倍增长。
在高并发客服、实时对话这类场景,CoT 的代价往往超过收益。
2.4 一句话判断标准
问自己:"这个任务需要推导,还是需要取用?"
需要推导,才考虑 CoT。
这句话可以直接用在架构评审里,比"看看效果"高效得多。
第三部分:四个进阶变体
基础 CoT 之上,有几个被反复验证有效的变体。它们分别解决不同的短板。
3.1 变体一:自洽性(Self-Consistency)
要解决的问题 :单条推理路径会被随机性影响。温度 > 0 时,同一个问题两次运行可能给出不同答案。
做法:采样多次(比如 5 次),取出现频率最高的答案。
代价与收益:
| 维度 | 变化 |
|---|---|
| 成本 | 成倍上升(采样 5 次就是 5 倍) |
| 收益 | 在"有明确唯一答案"的任务上最明显 |
注意"有明确唯一答案"这个限定:选择题、数值计算、分类任务收益大;开放写作、创意类任务收益很小,因为答案本来就该多样。
3.2 变体二:由易到难(Least-to-Most)
要解决的问题:复杂问题直接做,容易在中途迷失。
做法:分两步------
- 先让模型把大问题拆成子问题列表;
- 再逐个解决,每个子问题的答案作为后续的输入。
额外的好处 :拆解结果可以人工检查 。很多时候你一看子问题列表,就能发现模型对问题的理解错了------这时候及时纠正,成本远低于等它算完再返工。
适合:可以清晰分解的复合问题(多步计算、多条件筛选、复杂规则判断)。
3.3 变体三:思维树 / 思维图
要解决的问题:一条路走到底,走进死胡同也不回头。
做法 :不沿单一路径走,而是探索多条路径并评估,选最好的继续。
代价:成本和复杂度都很高(路径数可能指数增长)。
适用:解空间大、容易走进死胡同的任务(搜索规划、需要试错的设计问题)。
实践建议 :一般只在离线场景用(批量处理、非实时任务)。在线高并发场景基本用不起。
3.4 变体四:用程序代替计算
要解决的问题:模型算不准。
做法 :让模型把推理转写成可执行的表达式或查询语句(SQL、Python 表达式、正则),交给工具算。
为什么这是最可靠的一招:它把"不确定的语言模型计算"变成了"确定的程序执行"。
适用:凡是"算得准"比"会推理"更重要的场景------金额计算、日期推算、数据统计、规则匹配。
3.5 选择的优先级
text
能查 → 用检索(知识型任务)
能算 → 用工具(计算型任务)
真正需要推理的 → 才上 CoT 及其变体
这个顺序的价值在于:它把最不可靠的手段(语言模型推理)留给了最少的任务。
3.6 四个变体的对照
| 变体 | 解决什么 | 主要代价 | 适用场景 |
|---|---|---|---|
| 自洽性 | 单路径随机性 | 成本成倍 | 有唯一答案的任务 |
| 由易到难 | 复杂问题迷失 | 需要两轮交互 | 可清晰分解的复合问题 |
| 思维树/图 | 走进死胡同 | 成本与复杂度高 | 离线、解空间大的任务 |
| 用程序代替 | 算不准 | 需要工具支持 | 精确计算、规则匹配 |
第四部分:成本账,别只看效果
CoT 很有效,但它是用 token 换准确率。这笔账必须算清楚。
4.1 输出 token 的倍数关系
以一个问答任务为例(示意值):
| 方式 | 输出 token 量级 | 相对成本 |
|---|---|---|
| 直接回答 | 约 10 | 1× |
| 加一句"一步步来" | 约 300~800 | 30~60× |
| CoT + 自洽性(5 次采样) | × 5 | 150~300× |
注意这个数量级:不是涨了 20%,是涨了几十倍。
4.2 为什么输出 token 特别贵
因为输出是串行的------每一个 token 都依赖前一个,没法并行。
回顾前面讲过的预填充/解码分野:输入可以并行处理,输出必须一个一个来。 所以:
- 成本上:输出 token 的单价通常显著高于输入;
- 延迟上:输出 token 直接决定用户等待时间。
两个维度都在惩罚长输出。
4.3 一个实用的优化手法
如果你的 CoT 提示词让成本涨了三倍、效果只涨一点,先做任务分层:
- 按"需要推理 / 不需要推理"把请求分开,只对前者开 CoT;
- 压缩输出------不要求它写完整推理,只要求"列出三个关键中间量"。
第二招通常能拿到大部分收益,而成本只涨一点。 因为它保留了最有价值的那部分(外部记忆层),砍掉了冗长的叙述。
具体对比:
要求:请一步步详细推理,展示你的完整思考过程。
→ 输出 600 token,其中可能只有 60 个是有用的中间量
要求:请在给出答案前,先列出三个关键中间量及其数值。
→ 输出 120 token,中间量全在
后者的"信息密度"高得多。
第五部分:必须警惕的陷阱------CoT 会"撒谎"
这一节是全篇最重要的一段。
模型写出来的推理过程,不一定是它得出答案的真实依据。
这是一个反直觉但对工程影响极大的事实。
5.1 三个被观察到的现象
现象一:结论先于理由。
模型可能先由某种内部倾向得出答案,再"补写"一段看起来合理的推理。
怎么发现? 如果推理里出现了错误的中间步骤,而最终答案依然正确------那说明这段推理并不是它真正的决策路径(因为按它写的推理,答案本该是错的)。
现象二:理由会被无关因素改变。
在提示里加入一些不相关的信息(比如"我更喜欢选项 A""请仔细考虑,这道题很重要"),模型的最终答案会改变。
但关键在于:它写出来的推理过程依然自洽,看不出被影响。
这说明推理文本的"解释力"是有限的------它是一段生成出来的文本,不是一份日志。
现象三:错误推理 + 正确答案并存。
这最能说明问题:如果推理真的有效,那错误推理不该导向正确答案。
反过来也一样:推理正确但答案错误(常见于最后一步的格式或汇总出错)。
5.2 两条工程结论
第一,不要用"推理过程看起来合理"来验证答案。
要独立校验:
| 校验方式 | 适合验证什么 |
|---|---|
| 用工具复核计算 | 数值、统计、日期 |
| 用检索核对事实 | 引用的条款、数据、出处 |
| 用规则校验格式 | 结构化输出、必填字段、取值范围 |
核心原则是:校验不应该依赖模型自己的输出。
第二,CoT 的价值在于提升准确率这个结果,而不是提供可解释性。
想拿它当审计依据,需要额外设计:
- 强制引用来源(每个结论标注出处段落);
- 要求列出每个结论对应的依据(让它把依据明确分开写);
- 对关键结论做独立复核。
把 CoT 当成"提升正确率的手段",而不是"说明它为什么这么想"的解释,是使用它时最重要的心态。
5.3 三种可操作的验证方法
方法一:换措辞重问。
把同一个问题换一种说法再问一遍。
- 如果答案漂移,而两次推理都自洽 → 说明推理的解释力有限,它更像是"生成出来的合理解释";
- 如果答案稳定,推理也一致 → 说明这条路径比较可靠。
方法二:篡改前提。
把条件里的一个数改掉(比如把"3 件"改成"5 件"),看推理是否跟着变。
- 如果推理跟着变、结论也对 → 说明它真的在用这个条件;
- 如果结论变了但推理几乎照旧 → 说明这个条件可能压根没进入它的决策。
方法三:独立复核。
用工具或检索校验最终结论。这是工程上唯一的定心丸。
前两种是"探测",只有第三种是"保证"。
第六部分:CoT 与推理模型的关系
这两年出现了"推理模型"(长思维链模型),一个常见的问题是:这些模型出来了,CoT 提示词技巧是不是就过时了?
6.1 两者的关系
| CoT 提示词 | 推理模型 | |
|---|---|---|
| 本质 | 提示层技巧 | 把"先长思考再给答案"训练进了模型 |
| 触发方式 | 靠提示词引导 | 模型自带,默认就会 |
| 可控性 | 可以随时开关、调整 | 通常只能设"思考预算" |
推理模型并没有推翻 CoT 的原理,而是把原理固化成了模型行为。
6.2 为什么工程侧的判断仍然必需
因为即使模型自带长思考,下面这些事仍然要你来决定:
- 该不该思考 ------ 查一个条款的编号,不需要思考;
- 思考多少 ------ 简单问题给足预算就是浪费;
- 哪些环节要外部校验 ------ 计算要验、引用要查;
- 什么时候关掉 ------ 高并发场景下思考成本可能无法接受。
换句话说:推理模型解决的是"能不能想",工程要解决的是"值不值得想"。
6.3 一个实用的分层策略
按任务难度路由:
text
简单任务(分类、抽取、格式转换) → 小模型,不开思考
中等任务(多步、需要一点推理) → 大模型,短思考
困难任务(复杂推理、规划、数学) → 推理模型,长思考 + 独立校验
这样既拿到了困难任务上的收益,又不会在简单任务上浪费成本。
常见误区
误区一:"CoT 能提升所有任务的表现。"
对知识型、简单分类、格式转换类任务,CoT 通常只增加成本。
先判断任务类型,再决定要不要开。
误区二:"推理过程对,答案就一定对。"
推理对但答案错,常见于最后一步的格式或汇总出错;反过来,推理错答案对也是存在的。
必须独立校验结论。
误区三:"CoT 是万能提示词,无脑加到系统提示里就行。"
在闲聊、客服、创作类场景里,强制"一步步思考"会让输出变得僵硬、冗长、失去自然感。
用户能明显感知到这种变化,而它带来的收益往往是零。
误区四:"推理模型出来了,CoT 提示词技巧就没用了。"
恰恰相反。推理模型是把"长链思考"训进了模型,但"该不该思考""思考多少""哪些环节要外部校验"这些判断,仍然要靠工程侧设计。
而且推理模型也有它自己的代价:输出 token 更多,成本和延迟更高。不是所有任务都值得。
误区五:"CoT 写出的推理过程可以用来做审计。"
这是最危险的一条。推理过程是生成的文本 ,不是运行日志。
想用它做审计,必须额外设计:强制引用来源、要求分别列出依据、对关键结论独立复核。否则你拿到的可能是一段"事后补写的合理解释"。
误区六:"步骤拆得越细越好。"
拆得过细有两个问题:
- 乘积效应:步骤越多,"全对"的概率越低(前面讲过 pⁿ);
- 成本上升:每一小步都要输出。
拆解的合理粒度是"每一步都足够简单,但步骤数不要爆炸"。
误区七:"加了 CoT 效果变差,说明 CoT 没用。"
也可能是这三种情况:
- 模型不擅长这个分布(有些模型训练时偏短回答);
- 任务本来不需要推导;
- 提示词写得太长反而干扰了。
先排除这三种,再下结论。
实战问答
Q1:面试被问"CoT 为什么有效",怎么答得不像背书?
A:给两层就够。
第一层是计算层 :自回归模型生成多少 token 就做多少计算,CoT 相当于给它一张草稿纸,把一次难映射拆成多次易映射。
第二层是记忆层 :模型没有可写的内部变量,把中间结果写进上下文,才能被后续步骤读到。
最后补一句边界收尾:
它在需要推理的任务上有效,在只需要取用知识的任务上是纯成本。
这个"两层机制 + 一句边界"的结构,比背四条机制更有层次,因为它同时展示了机制理解和判断力。
Q2:我们的 CoT 提示词上线后,成本涨了三倍,效果只涨一点,怎么办?
A:分两步。
第一步,做任务分层:把请求按"需要推理 / 不需要推理"分开,只对前者开 CoT。
很多线上系统里,真正需要推理的请求可能只占 20%------剩下的 80% 白付了 CoT 的成本。
第二步,压缩输出:不要求它写完整推理,只要求"列出三个关键中间量"。
这一招通常能拿到大部分收益,而成本只涨一点------因为保留的是最有价值的外部记忆,砍掉的是叙述性内容。
如果这两步做完收益还是很小,那就说明这个任务本来就不需要 CoT。
Q3:怎么判断模型的推理过程是真的还是编的?
A:三个可操作的检查,从弱到强。
① 换措辞重问------如果答案漂移而推理都自洽,说明推理的解释力有限。
② 篡改前提 ------把条件改一个数,看推理是否跟着变。如果结论变了但推理照旧,那这个条件大概率没进入决策。
③ 独立复核------用工具或检索校验最终结论。
第三条是工程上唯一的定心丸。 前两条只能帮你"怀疑",第三条才能帮你"确认"。
Q4:CoT 和推理模型(长思维链模型)是什么关系?
A:
CoT 是提示层技巧,推理模型是把这种"先长思考再给答案"的行为训练进了模型。
前者靠提示词引导,后者是模型自带。
但工程上仍然需要你判断------哪些任务值得花这笔思考成本。 因为推理模型的输出 token 更多、延迟更高、成本更贵,在简单任务上用它就是浪费。
Q5:怎么控制步骤拆解的粒度?
A:给两个判据。
判据一:看乘积效应。 如果用"全对才算对"来评估,步骤数 n 越多,整体正确率越低(约等于单步正确率的 n 次方)。步骤数爆炸会直接吃掉收益。
判据二:看每一步是否都值得写出来。 中间结果的意义是"后续要用到"。如果某一步的结果后面根本不再引用,那就不该单独成步。
实践上的常用粒度是 3~7 步:足够分解难度,又不至于让乘积效应失控。
Q6:怎么判断一个任务到底该用 CoT 还是该加检索?
A :问一个更基础的问题:"这个任务的标准答案是唯一的吗?"
| 情形 | 判断 |
|---|---|
| 答案是唯一的、可验证的(数值、日期、条款号) | 先看能不能检索或计算 |
| 答案需要组合多个信息点推出来 | CoT 或 拆解 |
| 答案是开放的(写一段分析、给建议) | 谨慎用 CoT,先给提纲 |
核心逻辑是:如果答案"存在"于某个地方,去找比去推更可靠;如果答案"不存在"、必须算出来,那才需要推理。
Q7:加了 CoT 之后,模型输出变得很啰嗦,产品经理不满意,怎么办?
A :这是个真实且常见的矛盾------CoT 在内部需要,但对用户来说是噪音。
三种处理方式:
- 结构化分离:让模型先输出推理(用特定标记包裹),再单独输出"给用户看的答案"。程序只取后者。
- 只要求中间量:用"列出三个关键中间量"替代"完整推理",输出短、信息密度高。
- 双模型分工:小模型直接回答,只在置信度低时调用带 CoT 的大模型。
第一种最常用:它既保留了 CoT 的收益(推理过程在上下文里),又让最终展示给用户的内容保持干净。
术语表
| 术语 | 含义 |
|---|---|
| 思维链(CoT) | 要求模型在给出答案前先输出推理步骤的提示方法 |
| 自洽性(Self-Consistency) | 多次采样取多数答案,用成本换稳定性 |
| 由易到难(Least-to-Most) | 先拆子问题列表,再逐个求解 |
| 测试时计算 | 在推理阶段投入更多计算(更长的思考)以换取更高准确率 |
| 忠实性(Faithfulness) | 模型给出的推理过程是否真实反映其得出答案的依据 |
| 外部工作记忆 | 把中间结果写入上下文,供后续步骤复用 |
| 推理模型 | 把长链思考训练进权重的模型,默认会先思考再回答 |
结语
把这篇压缩成三句话:
第一,CoT 的本质是"给模型一张草稿纸"。 它靠消耗更多 token 换来更多计算步数,并把中间结果变成可被后续步骤读到的工作记忆。这两层机制,解释了它为什么有效。
第二,它在需要推导的任务上收益显著,在需要取用知识的任务上纯属浪费。 判断标准只有一句:需要推导,还是需要取用? 而且在这个判断之外,还要算一笔账------输出 token 的成倍增长,意味着成本和延迟的成倍增长。
第三,也是最容易被忽略的一点:
它写出的推理过程并不总是可信的。
推理文本是生成出来的 ,不是运行日志。它可能结论先于理由,可能被无关信息影响而依然自洽,可能错误推理与正确答案并存。
所以结论必须独立校验。 把 CoT 当"提高正确率的手段",而不是"解释它为什么这么想的依据"------这个心态的转变,比任何提示词技巧都更重要。
而如果只允许你带走一个动作,那就是:下次看到一段漂亮的推理过程时,先别急着信,换一种措辞再问一遍。