别再让 AI 直接报数了:思维链 CoT 全解------从"写步骤"到"自我拆解",把推理拆到零件级
本篇是「提示词工程系列」的第三篇(第一篇:提示词工程全解、第二篇:ICL 上下文学习全解。 它回答一个问题:为什么"让模型一步步想"就比"让它直接给答案"更准,以及------它到底靠不靠谱、怎么知道它没跑偏。 全文从一句话定义,一路拆到训练侧、推理侧、对齐裂缝、Self-Consistency、Auto-CoT、能力边界、有效性评估,最后给出变体选型决策流。底层机制优先,不堆术语。
目录
- [〇、CoT 是什么:一句话定义 + 它解决什么问题](#〇、CoT 是什么:一句话定义 + 它解决什么问题 "#%E3%80%87cot-%E6%98%AF%E4%BB%80%E4%B9%88%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%AE%9A%E4%B9%89--%E5%AE%83%E8%A7%A3%E5%86%B3%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98")
- [一、两种触发方式:few-shot CoT vs zero-shot CoT](#一、两种触发方式:few-shot CoT vs zero-shot CoT "#%E4%B8%80%E4%B8%A4%E7%A7%8D%E8%A7%A6%E5%8F%91%E6%96%B9%E5%BC%8Ffew-shot-cot-vs-zero-shot-cot")
- [二、底层实现:CoT 没有"特殊推理电路"](#二、底层实现:CoT 没有"特殊推理电路" "#%E4%BA%8C%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0cot-%E6%B2%A1%E6%9C%89%E7%89%B9%E6%AE%8A%E6%8E%A8%E7%90%86%E7%94%B5%E8%B7%AF")
- [三、zero-shot 深入:能力从哪来、为什么飘](#三、zero-shot 深入:能力从哪来、为什么飘 "#%E4%B8%89zero-shot-%E6%B7%B1%E5%85%A5%E8%83%BD%E5%8A%9B%E4%BB%8E%E5%93%AA%E6%9D%A5%E4%B8%BA%E4%BB%80%E4%B9%88%E9%A3%98")
- 四、对齐裂缝:它拆的怎么和你要的一样?怎么知道没偏?
- 五、Self-Consistency:用"多命运投票"滤掉随机歪路
- 六、Auto-CoT:示例自动化产线
- [七、推理结构谱系:CoT 不止一条链](#七、推理结构谱系:CoT 不止一条链 "#%E4%B8%83%E6%8E%A8%E7%90%86%E7%BB%93%E6%9E%84%E8%B0%B1%E7%B3%BBcot-%E4%B8%8D%E6%AD%A2%E4%B8%80%E6%9D%A1%E9%93%BE")
- [八、复杂推理边界:CoT 的能力圈](#八、复杂推理边界:CoT 的能力圈 "#%E5%85%AB%E5%A4%8D%E6%9D%82%E6%8E%A8%E7%90%86%E8%BE%B9%E7%95%8Ccot-%E7%9A%84%E8%83%BD%E5%8A%9B%E5%9C%88")
- [九、CoT 有效性评估:怎么证明确实有用](#九、CoT 有效性评估:怎么证明确实有用 "#%E4%B9%9Dcot-%E6%9C%89%E6%95%88%E6%80%A7%E8%AF%84%E4%BC%B0%E6%80%8E%E4%B9%88%E8%AF%81%E6%98%8E%E7%A1%AE%E5%AE%9E%E6%9C%89%E7%94%A8")
- [十、其他 CoT 变体补全全景](#十、其他 CoT 变体补全全景 "#%E5%8D%81%E5%85%B6%E4%BB%96-cot-%E5%8F%98%E4%BD%93%E8%A1%A5%E5%85%A8%E5%85%A8%E6%99%AF")
- [十一、下一篇预告:ReAct 与 Agent](#十一、下一篇预告:ReAct 与 Agent "#%E5%8D%81%E4%B8%80%E4%B8%8B%E4%B8%80%E7%AF%87%E9%A2%84%E5%91%8Areact-%E4%B8%8E-agent")
- 十二、自测题
- 十三、全文速记卡
〇、CoT 是什么:一句话定义 + 它解决什么问题
0.1 一句话大白话定义
CoT(Chain of Thought,思维链)= 你让模型在吐出最终答案之前,先把"中间推理过程"一步步写出来。
换成你最容易记的说法:
你让一个聪明人做题时,先让他把心里怎么算的一步一步念出来,而不是直接报数,他就不容易算错。
模型是"一个字一个字往外蹦"的(自回归)。当你要求写步骤,它先吐出中间文字,这些文字立刻被塞回上下文(全序列),变成下一步生成的"已知条件"------等于把"算账"也变成了"说话",而说话正是模型训练得最熟的本事。
0.2 概念关系图(3 个节点)
那个绿色节点就是 CoT 的全部秘密:它逼着模型把中间过程显式写出来,而不是在内部闷头算完直接蹦答案。
0.3 它为什么存在:ICL 的软肋 = 多步推理
CoT 不是凭空冒出来的,它补的是 ICL(上下文学习)的短板。结合上一篇《ICL 上下文学习全解》:
- ICL 的本质是"最近邻检索 + 模式复刻"------你贴几个示例,模型照葫芦画瓢(格式、风格、规则);
- ICL 的软肋 :它对"需要多步推理才出答案"的问题(数学、逻辑、规划)无能为力。你给它 10 个示例,它也只是复刻,每步只能"走一步",却要它一步跨到终点------跨不过去就翻车。
CoT 干的事,就是把"一步跨到终点"改成"一步步走过去":把中间推理展开成 token,每步只走一步,误差不累积。
0.4 与 ICL 同族:燃料升级
机制上,CoT 和 ICL 同族(都是往上下文喂信息),区别只是燃料不同:
- ICL 喂的是"输入→输出示例"(照葫芦画瓢);
- CoT 喂的是"推理过程"(照着想)。
而且这条过渡是顺理成章的:
- few-shot CoT 示例本质还是"输入→输出",只是输出里多了推理过程------等于把 ICL 的燃料升级成"带思考过程的示例";
- zero-shot CoT("let's think step by step")则是让模型自己生成推理链,靠的是预训练里见过的"逐步解题"文本模式。
所以你不是换赛道,是给 ICL 的燃料升了一级。
0.5 红线:CoT 是"推理组织者"不是"能力放大器"
先立这条,后面反复踩它:
| 它能做的 | 它做不了的 |
|---|---|
| 把你知道的、会算的、记得住的,理顺成步骤 | 补你不会的(知识缺口) |
| 降低每步的出错概率 | 补你算不准的(精确数值) |
| 让长推理可见、可审查 | 补你不知道的(实时事实) |
一句话:CoT 是"推理组织者",不是"能力放大器"。它把模型自身能力圈内的推理理顺;它补不了圈外的事。
一、两种触发方式:few-shot CoT vs zero-shot CoT
CoT 有两种最常见的打开方式,区别在于"推理步骤谁提供"。
1.1 few-shot CoT(人写步骤 = 导航仪)
你在示例里写"问题 → 我是这么想的:第一步...第二步... → 答案",模型照葫芦画瓢,把自己的推理过程也写出来。
text
问题:苹果 3 元一个买 5 个,香蕉 2 元一根买 4 根,一共多少?
示例推理:
第一步:苹果 5×3 = 15 元
第二步:香蕉 4×2 = 8 元
第三步:15 + 8 = 23 元
答案:23 元
适用前提:你已知正确路径,把路径写进去当导航仪,可控性最高(详见第七篇 ICL 的"三旋钮")。
1.2 zero-shot CoT(模型自拆 = 探索,人不必知步骤)
你只在结尾加一句"咱们一步步来"(let's think step by step),模型自己展开推理。
text
问题:苹果 3 元一个买 5 个,香蕉 2 元一根买 4 根,一共多少?
指令:Let's think step by step.
模型自生成:
首先算苹果:5 个 × 3 元 = 15 元......
然后算香蕉:4 根 × 2 元 = 8 元......
最后相加:15 + 8 = 23 元。
答案:23 元。
适用前提:你也不知道步骤。这正是 CoT 比"人写计划"强的地方------它不要求你先懂,只要求你触发"逐步思考"的开关(机制见第三章)。
1.3 两种触发方式对比图
1.4 实战对照:同一道题,三种 setting 内部发生了什么
任务:"把'订单已发货'翻译成英文,只给结果,不要解释。"
| Setting | 上下文里有什么 | 内部发生什么 | 结果 |
|---|---|---|---|
| Zero-shot | 只有这句指令 | 全靠权重里"翻译"模式 | 大概率对,但偶尔画蛇添足加解释(格式不稳) |
| Few-shot | 指令 + 3 个(中→英)示例 | 注意力把"翻译格式"拉得极高 | 几乎必然只给译文,更稳;但示例混错译会学到错模式 |
| Zero-shot CoT | 指令 + "一步步想" | 先吐推理(本任务不需要) | 这题用 CoT 是亏的------多耗 token,印证"太简单题加 CoT 纯亏" |
结论:CoT 是默认升级项,不是默认起点。不稳才往上加。
二、底层实现:CoT 没有"特殊推理电路"
这是最反直觉的真相,先拍出来:
CoT 没有任何专门的"推理电路",底层和普通的"直接回答"完全一样------都是 next-token prediction(预测下一个词)。
2.1 全程没有任何特殊机制
模型内部实际发生的过程(以 few-shot CoT 为例):
- 看到你的提示词 + 步骤,开始一个词一个词往外蹦(自回归);
- 先蹦出"第一步:苹果 5×3=15",这些词立刻被塞回上下文(全序列);
- 再基于"问题 + 第一步"蹦"第二步:香蕉 4×2=8";
- 最后蹦"答案:23 元"。
全程没有任何特殊机制------CoT 只是让生成序列"变长"了,把中间推理也变成了 token 流。模型并没有一个"专门思考的房间",它只是把你给的推理文字当普通上下文接着续写。
2.2 完整链路(呼应提示词篇机制层)
注意:这条链路和"直接回答"逐字节相同,唯一区别是生成序列里多了"推理文字"------而这些文字在下一轮预测时就是普通上下文。
2.3 为什么有效:三个机制(这是精髓)
既然底层一样,那 CoT 凭什么更准?三个机制:
-
拆复合函数,降低每步熵 复杂问题本质是个套娃函数:答案 = f( g( h(题目) ) )。直接报数,等于要模型一次前向传播就拟合这个三层套娃,跨度极大,条件分布很平(熵高),随便选一个都可能错。 CoT 把套娃拆开:先算 h(题目) 得中间值 a,再算 g(a) 得 b,最后 f(b)。每步都是"简单映射",条件分布更尖(熵低),选对概率高。
-
中间值可见,误差好定位 某步算错,你能直接看到中间值不对;而且因为每步简单,本身错的概率就低。直接报数则是"一步错,全盘错",且你不知道错在哪。
-
注意力减负 写步骤时,模型当前步只需盯着"上一步结论 + 当前子问题",不用一次性记住整个复杂题面(呼应 ICL 篇讲的"注意力距离衰减"------短距离关注更准)。
为什么模型"会"按步骤推?因为预训练时它读过海量"解题步骤"文本,练出了"看到问题就续写推导"的模式(ICL 篇讲的归纳头 / 复制电路)。你写步骤,就是激活这个模式。
2.4 三个反直觉坑(别迷信 CoT)
| 坑 | 说明 |
|---|---|
| ① CoT 不是万能 | 纯符号操作(如把 "hello" 反转成 "olleh")、或模型从没见过的推理套路,写步骤反而可能"一本正经地胡编"(幻觉推理) |
| ② 太简单的题加 CoT 纯亏 | 多吐一堆步骤 token,更慢更贵,准确率没提升 |
| ③ 强推理模型自己就在"想" | 如 o1 类模型内部已在推理,外部再逼它写步骤反而冗余 |
三、zero-shot 深入:能力从哪来、为什么飘
你上一节看到了 zero-shot CoT 的魔法,但"零示例 + 一句触发语"底下到底怎么运转的,值得单独拆开。先澄清概念:
- zero-shot(零样本):泛指"不给任何示例,直接下指令让模型干活";
- zero-shot CoT :是 zero-shot 的一个特例------不仅不给示例,还加一句"咱们一步步想",让模型自生成推理链。
3.1 推理时:逐环节拆解
你的指令进模型后,逐环节发生:
- Tokenizer 切块 :BPE/WordPiece 把文字切成 sub-word 整数 ID(中文更碎,"邮件"可能切成"邮"+"件")。转换即销毁------模型从头到尾只见过数字。
- Embedding + 位置编码:每个 token ID 查表取向量(如 4096 维)代表含义;位置编码(如 RoPE)告诉模型"你是第几个词"(自注意力本身不认顺序)。
- 自注意力(QKV 三件套) :每个 token 生成 Q(我想找什么)/ K(我是什么)/ V(我提供什么)。当前 token 用 Q 点乘所有 K,softmax 得注意力权重,对所有人家的 V 加权求和,得到融合表示。在 zero-shot 里上下文只有你的指令,所以生成答案时,新 token 回头注意整句指令------这是它能"对着要求答"的底层原因。
- KV Cache:前面所有词的 K/V 被缓存,生成第 N 个词不用重算(所以长上下文塞示例会吃显存变慢变贵)。
- 输出层:最后一层把表示映射到词表大小 logits,softmax 出概率,按 temperature/top-p 采样吐下一个 token,塞回上下文重复直到结束符。
3.2 训练侧:zero-shot 能力是"教"出来的,不是"天生"的
反直觉真相:zero-shot 能力不是模型天生会,是指令微调(SFT)+ 对齐(RLHF/DPO)硬训出来的。
- 预训练(base):只学语言规律 + 世界知识。原始 GPT-3 base 的 zero-shot 其实很弱,你下指令它可能答非所问。
- SFT(指令微调) :用海量 (指令, 好回答) 配对,继续做 next-token prediction,但数据格式变成"看到指令就续写有帮助的回答"。这一步把"看到指令就响应"烧进权重(FLAN 等系列证明,instruction tuning 大幅激活零样本泛化)。这是 zero-shot 能力的主要来源。
- RLHF/DPO 对齐:让回答更安全、有用、贴格式。
关键结论:你用的 chat/instruct 模型和 base 模型的 zero-shot 差距巨大,差距几乎全部来自 SFT + 对齐。所以"zero-shot 能直接用"是训练阶段硬训出来的能力,不是推理时变出来的魔法。
3.3 核心机制:它凭什么"听懂"从没见过的指令?
模型不是"理解"了你的指令,而是"延续"了 SFT 阶段见过的模式:
你在 SFT 里见过几百万次这种结构:
[指令格式] → [有帮助的回答]。于是权重里形成强先验:"当输入呈现'指令格式'时,高概率续写就是一个有帮助的回答"。你写"翻成英文",token 模式正好匹配这个格式 → 模型顺着先验把译文当最可能续写吐出来。
所以严格说,zero-shot 没有"理解",只有"格式锚定 + 模式延续"。这也解释了为什么指令写得越像 SFT 见过的规范格式(角色+任务+约束清晰),它越准------你写的"六要素"就是在主动贴近那个格式锚点。
3.4 为什么飘:失败模式
| 失败场景 | 底层原因 |
|---|---|
| 分布外任务(小语种、私有域、罕见格式) | 权重里没对应模式,softmax 分布很平,只能"猜" → 胡编或格式崩 |
| 指令歧义 | 多种续写都合理,模型自由发挥 → 飘 |
| 格式要求严(必须 JSON) | 概率性续写不保证语法 100% → 必须上 L1 软约束 + L2 约束解码(详见提示词篇) |
| 幻觉 | 分布外时为凑流畅续写,编造看似合理的细节 |
这些失败和"有没有示例"无关,是 zero-shot 自身特点------因为它只靠权重,没有 few-shot 那种"近在眼前的模板"兜底。
四、对齐裂缝:它拆的怎么和你要的一样?怎么知道没偏?
这是 zero-shot CoT 最致命、也最被忽视的软肋。先拍真相:
它根本不知道"你想要什么"。它只是在"猜"一个最像的解法。
4.1 裂缝本质
那条红色虚线 就是答案的核心:从"你的真实意图"到"模型猜的意图"之间,没有任何连线可以保证它们重合。模型永远看不到你脑子里的真实目标,它只看到你写出来的提示词(表面描述),然后基于提示词的 token 模式,从预训练里"软检索"出一个最像的解题模板。
4.2 它拆的怎么"刚好和你一样"?------靠"统计重合",不是"理解你"
常见任务(小学应用题、逻辑谜题、代码 bug 排查)在训练语料里被"标准解法"刷过无数遍。你写"小明有 5 个苹果......",模型检索到的模板几乎必然是人类的标准分步解法------因为人类也是这么写的,语料里 99% 都是这种解法。
所以"它拆的和你想要的一样",本质是:
你的意图 = 人类最常见的意图 = 训练语料里最高频的"问题→解法"模式 = 模型最有可能检索到的模板。
三者重合,于是看起来"它懂你"。但这层重合是相关性(correlation) ,不是理解(comprehension)。模型没有"你的目标"这个内部状态,它只是沿着概率最高的续写路径走。
4.3 它怎么"偏离"的:裂缝的三个来源
- 任务偏门 / 表述歧义 → 检索到"表面像、实质偏"的模板。比如你说"统计这个月异常订单",它套"数个数"模板,而你想要"按异常类型分组+归因"------意图就歪了。
- 它对问题的"假设"和你不同(最阴险):模型会默默替你做一个假设且不说出来。
- 自信地走一条逻辑断的推理(思维污染) :CoT 把推理显式写出来,但每步只是"看起来合理"的续写,不是验证过的真步骤。可能第一步就错,后面步步错但文风流畅------你一眼看过去觉得"好专业",其实早偏了。这正好呼应"语法 vs 语义"边界:CoT 保证"格式上一步步",绝不保证"语义上正确"。
4.4 具体例子:它怎么悄悄偏的
题目:"苹果 3 元一个,买 5 个送 1 个,问买 5 个苹果花多少钱?"
你想要的拆解:买 5 送 1 → 实际拿到 6 个,但只付 5 个的钱 → 5×3 = 15 元。 zero-shot CoT 可能这么拆:
ini
第一步:每个苹果 3 元
第二步:买 5 个 = 5 × 3 = 15 元
第三步:送 1 个免费
答案:15 元(还赚 1 个)
答案数字碰巧对了,但推理过程完全漏掉了"送1"这个关键约束的验证 ,只是顺手一提。换个数("买 4 送 1,问买 5 个"),它大概率直接 5×3=15,根本不会去算"5 个里该免几个"------答案就错了,但格式依然漂亮、自信。
光看它"一步步写",你根本发现不了偏没偏------这是 zero-shot CoT 最危险的地方:错误是"沉默的",披着严谨外衣。
4.5 怎么知道它没偏?四种验证法(工程里真正保命)
| 法 | 做法 | 适用 |
|---|---|---|
| ① 自检一致性 SC | 采样 k 条推理链,对答案多数投票(详见第五章) | 随机抽歪 |
| ② 工具验算(PAL/代码执行) | 让模型把计算写成代码,由解释器真正跑 | 数学/日期/字符串等确定性环节 |
| ③ 约束回查 | 把不可违反的硬约束显式写出,拿到答案逐条核 | 业务硬条件 |
| ④ 人审 | CoT 把黑盒变玻璃盒,人能在关键节点拦一道 | 高 stakes(医疗/金融/法律) |
补一句关键区别 :当你自己知道 正确步骤时,别用 zero-shot CoT 让它自由发挥------直接用 few-shot 把你的分解写进去(导航仪),把"猜意图"变成"照你的地图走",可控性立刻上一个量级。zero-shot CoT 只适合"你也不知道步骤"的开放探索场景。
五、Self-Consistency:用"多命运投票"滤掉随机歪路
这是上一节验证四法里的第一招,也是最常用的一招(Wang et al. 2022)。它正好补"对齐裂缝"里"单条链随机抽歪"那个问题。
5.1 它解决什么
上一节说了:zero-shot CoT 单条推理是随机采样 出来的,可能踩到一条歪路径,而且它自己不知道偏没偏。Self-Consistency 的思路很朴素:"我一次拿不准,就多猜几次,少数服从多数。"
5.2 核心思想 + 直觉
同一个问题,用较高的随机性(temperature)采样 k 条推理链,每条各自走到一个答案,最后对答案做多数投票,得票最多的就是最终答案。
直觉像"群体智慧",但参与者是同一个模型的不同随机命运:
- 把 temperature 调高(0.7~0.9),每次生成的推理链走不同"岔路";
- 如果问题有确定答案,这些不同岔路最终会汇聚到同一个数;
- 如果某条链走歪了,它孤零零给个不同答案,在投票里被淹没。
5.3 算法步骤(可落地)
- 固定 prompt:加 "Let's think step by step" 触发 CoT;
- 设 temperature > 0(关键!temp=0 是贪心解码,每次吐一模一样的链,k 条变 1 条,SC 直接失效);
- 循环 k 次 (k 通常 5
20,论文常用 540):每次独立调用,拿一条完整推理链 + 最终答案; - 抽取答案:用正则/结构化解析从每条链抠出最终答案(answer extraction,解析挂了整个方法就废);
- 多数投票:统计每个答案出现次数,取最高频;
- 输出:最高频答案 + 置信度(得票数 / k)。
5.4 采样投票图
5.5 为什么有效:机制层(精髓)
① 正确问题的"路径冗余" vs 错误路径的"孤例性" 对确定答案的问题,模型内部存在多条高概率推理 route,都通向同一答案;而一条走歪的链是低概率随机扰动,几乎不可能重复------正确答累积票数,错误答只有零星一两票。
② 数学直觉:边际化(marginalization) 我们真正想要 P(答案 | 问题),但模型直接给的是 P(答案 | 链, 问题) · P(链 | 问题)。Self-Consistency 干的事等价于把"推理链"这个中间变量边际掉:
css
P(答案 | 问题) ≈ Σ_所有链 P(答案 | 链, 问题) · P(链 | 问题)
采样 k 条链 + 按答案投票,就是用蒙特卡洛近似 去估这个求和。正确答案被很多条链共同"投票",拿到总概率质量大;错误答案只被少数随机链支持,质量小。投票数 = 对该答案边际概率的估计。
呼应之前讲的熵:单条 CoT 是从很平的分布抽一次(容易抽歪);多条采样把分布"摊开平均",峰值(正确答)自然浮出来。
5.6 具体例子(图上的题)
题:"林子里有 15 棵树,工人又种了 3 棵,然后砍了 4 棵,现在几棵?" 正确:15+3−4 = 14。
5 条路径可能:
- 路径1:15+3=18,18−4=14 → 14
- 路径2:15−4=11,11+3=14 → 14(换顺序仍对)
- 路径3:15+3=18,18−4=14 → 14
- 路径4:净变化 3−4=−1,15−1=14 → 14(换思路)
- 路径5(走歪):15+3=18,把"砍4"误读成"加4"=22 → 22
投票:14 得 4 票,22 得 1 票 → 选 14,置信度 4/5。路径1~4 思路各异却殊途同归,正是"正确问题路径冗余";路径5 是孤例噪声。
5.7 致命陷阱:一致性 ≠ 正确性
高一致性只说明"答案稳定",不说明"答案对"。 它消除的是"随机抽歪",消除不了"系统性误解"。
| 陷阱 | 说明 |
|---|---|
| ① 系统性偏置时全体一致但全错 | 若模型对这类题有固定错误习惯(如永远漏"赠送"),k 条一致走向同一错答,SC 照样投错 |
| ② 成本翻倍 | k 条推理 = k 倍 token + k 倍延迟;只对高风险题用或异步跑 |
| ③ 不适开放/创意任务 | 写诗、起名本无唯一答案,投票会把多样性抹平得平庸------此时要 temp 高取多样,别投票 |
| ④ 依赖答案可解析 | 最终答案不是干净数字/选项时,"投票"难做,得用语义聚类或模型互评 |
5.8 工程经验值
- temperature:0.7~0.9,太低没多样性,太高链太乱(论文常用 0.8 左右);
- k:5 起步,关键任务 10~20,20 条后性价比低;
- 答案抽取:优先让模型用固定格式输出最终答案,再用正则抠,别靠肉眼;
- 失败信号:若 k 条答案高度发散(如 5 条 5 个答案),是强危险信号------别信任何一条,转人工或换方法;
- 与其他三法关系:SC 是"横向冗余",工具验算是"外部真理",约束回查是"硬条件兜底",人审是"最后一道"。生产级关键系统常是"SC + 工具验算"双保险。
六、Auto-CoT:示例自动化产线
你前面学了 few-shot CoT 的示例是人工手写的。Auto-CoT(Zhang et al. 2022)想的是:示例能不能让模型自己造?
6.1 动机:手写示例的两个老问题
- 贵:每换任务得自己编 3~5 个带步骤的示范,还得编对(呼应 ICL 篇"差示例帮倒忙"------错标示例会被学到错规则);
- 带偏见:人写的示例往往只覆盖自己熟悉的题型,分布不均衡。
6.2 流程(可落地 5 步)
- 问题聚类:候选/训练问题用 embedding 编码,聚类成几类(4~6),确保覆盖不同题型;
- 挑代表:每类选离类心最近的代表题;
- 自动生成链:对每个代表题,用 zero-shot CoT 让模型自己写推理链 + 答案;
- 拼成示例:把"问题 + 自动生成的链 + 答案"拼成 few-shot 示例串;
- 跑新题:用这套"自动示例"去推理新题------此时它已是一个标准 few-shot CoT。
6.3 为什么有效
- 多样性:聚类覆盖多题型,避免人工只挑熟悉的(优化三旋钮里的"杂");
- 去人工偏见:自动链更"中性",不夹带人的格式偏好;
- 省人力:任务切换成本从"手写示例"降到"跑一次聚类+生成"。
6.4 生死前提 + 三个陷阱(批判性提醒)
⚠️ Auto-CoT 不是 free lunch。 它的陷阱比手写更隐蔽:
- 底座 zero-shot CoT 不能拉胯(生死前提) :自动链质量完全取决于底座自己"一步步想"的能力。若你的底座数学题 zero-shot 本身常错,Auto-CoT 就是把错链批量产线化------garbage in, garbage out,且规模化放大。底座弱则绝不可上。
- 聚类靠 embedding:第 1 步中文业务题(工单、异常订单)聚类准不准取决于 embedding 模型。拿英文训的 embedding 跑中文工单,簇可能按字面词而非语义分,"代表题"不具代表性,三旋钮的"杂"直接废。
- 错误是沉默的:Auto-CoT 生成的链你不会逐条人审(否则何必自动化),错链悄悄混进示例------比人工错示例更毒,因为人工写 3 条你能发现,自动产 50 条你不会看。
反问你自己:Auto-CoT 产出的 50 条示例里,有几条是模型自己走歪的?逐条人审(那自动化的意义何在),还是赌它全对(那和把错链当真理有什么区别)?
七、推理结构谱系:CoT 不止一条链
你之前自己提过"把计划一步步写给他"------那其实就是 Plan-and-Solve 的朴素版。但 CoT 的"推理结构"远不止单链,它是一个谱系,从弱到强:
| 形态 | 特点 | 强弱 |
|---|---|---|
| Linear CoT | 一条线从头推到尾 | 问题:边走边想、计划不固化,中途偏则全歪 |
| Self-Consistency | k 条独立采样投票 | 滤随机歪路,但滤不了系统性误解 |
| ToT(思维树) | 每步生成多候选,评估打分,走死能回溯 | 专治"一条道走到黑" |
| GoT(思维图) | 节点可聚合,更灵活 | 最强 |
关键认知:CoT 的"推理结构"是可以选的,不是只有一种。 你之前把 CoT 想成"写步骤"一个形态,是把谱系压扁了。
〇章已说"ReAct/ToT 先不展开",故 ToT/GoT 仅在此定位,详细留待下一篇。
八、复杂推理边界:CoT 的能力圈
这是判断"要不要用 CoT、用哪种变体"的地基。先钉判据:
CoT 有效 ⇔ 每一步拆分后的子任务,都落在模型自身能力圈内。 一旦某步子任务本身超出模型能力,拆也没用------整条链从那步崩。
8.1 能力圈边界图
8.2 六类失效场景详拆
- 长链 / 注意力衰减:链一长,第 1 步结论和第 100 步隔几百 token,softmax 权重被中间大量 token 稀释,长程依赖变弱------你 ICL 篇学的"注意力距离衰减"在这发作。"买5送1"例子链短尚且漏约束,链长更惨。对策:Plan-and-Solve(先浓缩计划再执行)或 Least-to-Most(拆子任务)。
- 精确符号 / 数值操作(最反直觉) :反转字符串、大数乘法、日期差、进制转换------模型"假装算"但算错。它见过搭配顺着续写,没真去逐位操作。对策:PoT/PAL(把计算写成代码让解释器跑)。
- 知识缺口 :CoT 只组织推理,不创造知识。2024 后的事、你公司内部数据、实时股价------它自信地编。对策:RAG(你正在做的 Milvus 知识库就是干这个)。
- 需环境交互 :查库、调 API、点页面------CoT 只在脑子里想。这引出 ReAct(想一步→调工具→看结果→再想),本篇先不展开。
- 大搜索空间 / 规划 :多步决策,一条链走死就完了。引出 ToT(思维树),先不展开。
- 小模型 :归纳头/复制电路在小参数模型上很弱,小模型写"步骤"常是幻觉拼接,比直接答更乱。CoT 是涌现能力,Wei et al. 2022 证明随规模出现。
一句话收束边界:CoT 是"推理组织者"不是"能力放大器"。它把你会的、算得准的、记得住的理顺;补不了你不会的、算不准的、不知道的。
九、CoT 有效性评估:怎么证明确实有用
这正好闭环我们最早定的评测铁律:一切"更好"的断言,没有评测集就不许说出口。
9.1 为什么必须评估
第四章讲了"对齐裂缝":模型拆的看起来和你想要的一样,只是因为常见任务人类解法在语料里高频重合;一旦偏门,它自信地走歪,且错误是沉默的。所以"CoT 有用"不能靠感觉,要靠评估。
9.2 评估五维度(只报准确率是最低级的评法)
- 准确率增量(Accuracy Δ):同一题,有 CoT vs 无 CoT 的准确率差。底线,但只看这个掩盖问题。
- 错误类型分析:CoT 减少了哪类错?需人工或 LLM-judge 标每步。
- 步骤质量(最关键也最常被漏) :中间值对不对?"买 5 送 1"例子------答案碰巧对、推理漏约束验证。答案对 ≠ 推理对,评估必须单独打"步骤分"。
- 一致性增益:上 Self-Consistency 后准确率提升多少、k 条答案发散度多少(发散=危险信号)。
- 成本账单:CoT 让 token ×N、延迟涨。每点准确率提升花多少 token/ms------否则生产用不起。
9.3 关键研究结论(证据不是拍脑袋)
- 任务类型强相关 (Wei et al. 2022):CoT 在需要多步推理 的任务(算术、常识推理、符号推理)上暴涨;在简单/单步任务上持平甚至略降(呼应"太简单题加 CoT 纯亏")。
- 规模阈值 :CoT 是涌现能力,只在足够大的模型(如 PaLM-540B 或强指令模型)上生效。小模型用了反而更乱。
- 反例:纯检索类、格式极敏类、或模型 zero-shot 已极强的任务,CoT 可能掉点。
9.4 评估四陷阱
| 陷阱 | 后果 |
|---|---|
| 只报最终准确率,不报步骤质量 | "答案对推理错"被掩盖,上线遇边界暴雷 |
| 评估集不覆盖边界/异常 case | 看似 90% 准,真实分布一变就垮 |
| 没有 ablation(去掉 CoT 对比) | 不知道提升来自 CoT 还是来自示例本身 |
| 用 Self-Consistency 但不报成本 | 准确率 +5% 但 token ×10,生产不可行 |
一句话:CoT 评估 = 准确率增量 + 步骤质量 + 一致性增益 + 成本账单,四样缺一不可。光看"它写得很顺"是最危险的评估方式。
十、其他 CoT 变体补全全景
这些变体本质都是"把推理变 token 流"这同一个核心机制的不同包装。
10.1 Least-to-Most(从易到难,Zhou et al. 2022)
- 做法 :把"拆"和"解"分成两轮。第一轮让模型只列子问题清单 (元级分解),第二轮把子问题逐个喂回去解。
- 机制:避免在一条长链里又拆又解、容易中途跑偏。先有"地图"再走,每步上下文更干净。
- 适用:子问题能独立解决的复合题。
10.2 Plan-and-Solve(先计划再执行)
- 做法 :先让模型输出总体计划(不解题),再按步骤执行。
- 呼应:这正是你之前自己提的"把计划一步步写给他"------Plan-and-Solve 把它变成了标准方法。
- 机制:Linear CoT 容易"边走边想、计划不周中途偏",先固化计划等于先定导航,执行时不易漂。
10.3 Complexity-CoT(Fu et al. 2022)
- 做法 :few-shot 时优先选"推理链更长"的示例。
- 机制:长链 = 更多中间步骤 = 每步映射更简单 = 最终分布更尖。发现用长链示例,模型自己生成的链也更长更准。
- 注意:这是"示例选择"策略,优化三旋钮里的"质",不是新机制。
10.4 PoT / PAL(代码辅助推理,Chen/Gao 2022)
- 做法 :让模型把推理写成 Python 代码,交给解释器真正执行,而不是自己口算。
- 机制:把"确定性计算"外包给解释器(外部真理),模型只负责"理解题意 + 写算式"------正是第四章"工具验算"的代码版。
- 适用:数学、日期差、字符串操作这类第八章第②点说的"精确符号"失效场景。CoT 在这类题该退居二线,让代码当主角。
10.5 Contrastive CoT(对比思维链,Chia et al. 2023)
- 做法:给"正确推理链 + 错误推理链"做对比示例。
- 机制:负例(错误链)激活"不要这么走"的先验------呼应你学的"负例比正例还管用"。
- 适用:模型有固定错误习惯的任务(如永远漏"赠送"约束),用错链当反面教材。
10.6 本质:同一核心的不同包装
| 变体 | 改的是 |
|---|---|
| Least-to-Most / Plan-and-Solve | 链结构(先拆后解 / 先计划后执行) |
| Complexity-CoT | 示例选择(优先长链) |
| PoT / PAL | 计算执行者(代码替代口算) |
| Contrastive CoT | 示例正负向(正链+错链) |
10.7 变体选型决策流
十一、下一篇预告:ReAct 与 Agent
CoT 让模型"会想",但它只会在脑子里想,不会"做"。当你不仅不知道步骤,还得去查资料、调工具、看结果再想 时,CoT 就升级成 ReAct(Reason + Act):
想一步 → 调工具 → 看结果 → 再想,形成一个能和环境交互的循环。
下一篇将讲:
- CoT 与 ReAct 的关系:ReAct 的"想"那段本质还是 CoT(往上下文喂推理),只是多了"行动"和"观察"两个环节;
- Zero-shot CoT 的延伸:ReAct 提示词就是把"思考/行动/观察"组织成可解析格式;
- Self-Consistency / ToT 的代价与收益:多采样、搜索树在 Agent 里的取舍;
十二、自测题
- 定义题:用一句话说明 CoT 是什么,并说清它和 ICL 在"喂什么信息"上的区别。
- 机制题:为什么说"CoT 没有特殊推理电路"?它底层和直接回答有什么相同、有什么不同?
- 边界题:给你一道业务题------"计算本季度异常订单的环比增长率,保留 2 位小数"。判断它落在 CoT 能力圈的"内"还是"外"?落在圈外的话,用哪个变体接?(提示:见第八章第②点 + 10.4)
- 评估题:你说"CoT 让模型更准"。按第九篇,你需要至少哪几个维度的证据才能下这个结论?只报最终准确率会漏掉什么?
- 批判性题:Auto-CoT 把"手写 3 条示例"换成"自动产 50 条示例",风险是消失了还是转移放大了?它的生死前提是什么?
- 验证题:zero-shot CoT 给了一串漂亮的推理步骤,答案看着也对。你怎么判断它到底偏没偏?列出至少两种验证法。
十三、全文速记卡
① 本质:CoT = 把中间推理也变成 token 流塞回上下文,让模型每步只预测一个简单映射,而不是一步跨到最终答案。与 ICL 同族,只是燃料从"示例"升级成"推理过程"。
② 两种触发:few-shot CoT(人写步骤=导航仪,已知路径);zero-shot CoT(模型自拆,人不必知步骤,只触发"逐步思考")。
③ 底层真相:无特殊电路,和直接回答底层完全一样 = next-token prediction,只是序列变长。有效的三机制:拆复合函数降熵、中间值可见、注意力减负。
④ 对齐裂缝:模型看不到你的真实意图,只从 prompt 表面软检索模板。常见任务因语料重合而"看着懂你",偏门任务会检索到"表面像实质偏"的模板。CoT 保证"格式逐步"不保证"语义正确"。
⑤ 验证四法:Self-Consistency(多命运投票)/ 工具验算(PAL)/ 约束回查 / 人审。已知步骤用 few-shot 比 zero-shot 可控。
⑥ Self-Consistency:temp>0 采样 k 条链投票,机制 = 对推理路径的边际化蒙特卡洛近似。陷阱:一致性≠正确性(只防随机抽歪,防不了系统性误解),成本 k 倍,不适创意任务。
⑦ Auto-CoT:示例自动化产线(聚类→代表→生成链→拼示例)。生死前提:底座 zero-shot 不能弱,否则错链放大。
⑧ 能力圈:CoT 有效 ⇔ 每步子任务在模型能力圈内。圈外六类:长链/精确算/知识缺/需交互/大搜索/小模型。CoT 是"推理组织者"不是"能力放大器"。
⑨ 评估五维:准确率增量 + 步骤质量(答案对≠推理对)+ 一致性增益 + 成本账单。光看"写得很顺"最危险。
⑩ 变体全家桶:Least-to-Most / Plan-and-Solve(链结构)、Complexity-CoT(示例选择)、PoT-PAL(代码执行)、Contrastive CoT(正负向)。本质都是同一核心的不同包装。