老周师傅的面点铺里,来了个叫小智的新学徒。小智把店里的菜谱背得滚瓜烂熟,可只要客人点“三鲜包配蛋花汤”这类需要多步操作的菜,他就手忙脚乱——因为他有个坏习惯:只管把成品端上桌,从不说自己是怎么做的。直到有一天,师傅给他立了条规矩:“从今天起,每做一道菜,把每一步都报出来——称多少面、和几分钟、馅怎么调、蒸多久。” 神奇的事情发生了:小智一边口播一边操作,不仅少放错料,客人还能在他出错时立刻指出“胡椒放多了”。这个“边做边报”的秘诀,就是今天的主角:思维链(Chain-of-Thought,简称CoT)。它让大模型在回答复杂问题前,先写出一串中间推理步骤,而不是直接蹦出一个孤零零的答案。接下来,我们会用这间面点铺的故事,看懂CoT是什么、怎么触发它、它强在哪,以及它失效的时刻。
掌握思维链CoT,等于拿住了大模型推理能力的“开关”——无论你做Prompt工程、应用开发还是模型研究,这都是从“会用大模型”走向“用好大模型”的分水岭。
目录
可视化演示
展示CoT逐步推理与直接回答的对比、Zero-shot与Few-shot两种触发方式,以及CoT在不同任务上的性能提升效果。
本节配有交互动效(进入视口后自动加载,约 3KB)。
CoT vs 直接回答 直接回答:问题直接映射到答案,无中间步骤 CoT:生成4步推理链后再得出答案 GSM8K: 17.7% → 56.9% (+39.2%) CoT通过逐步推理显著提升复杂任务准确率
认识思维链:从“报答案”到“报过程”
师傅发现,小智的问题不只是“不报步骤”,而是他脑子里的推理像“跳房子”——一步恨不得跨三个格子,跨不过去就摔。第一次独立做水晶虾饺时,他想同时在脑子里算好烫面水温、馅料比例和蒸制时间,结果三件事搅成一团,端出来的饺子皮破馅散。师傅叹口气说:“你记着,复杂活儿别在脑子里抢跑,把每一步落到嘴边、落到手上。”
思维链(Chain-of-Thought,CoT)正是这个道理:让大模型在给出最终答案之前,先输出一串中间推理步骤。提出这一方法的是 Wei 等人 2022 年的论文,他们发现,仅仅在提示词里引导模型“先写推理过程”,大模型在数学应用题、常识推理等任务上的表现就大幅提升,而且完全不需要训练模型,只改提示词即可。
推理链的形态很直观:输入问题 x 后,模型依次生成步骤 s1、s2……直到 sn,最后才给出答案 a。对比直接回答的“一步到位”,CoT 多了一段可读的中间产物,这也是它一切优点的来源。
就像口播里的每一句“称多少面粉”都是看得见的操作,CoT 的每一步也都是可读的中间结论。从这天起,小智不再“跳房子”,而是一级一级爬楼梯——虽然慢了点,但每一步都踩得稳稳当当。
- 输入 x这是用户提出的原始问题,比如“笼子里有35个头和94条腿,鸡兔各几只?”。大模型的第一步是读取这段输入。
- 中间步骤 s1..sn模型像口播做菜一样,依次生成 n 条中间推理,如“设鸡 x 只、兔 y 只”“列出方程 x+y=35”等。每一步都建立在前面步骤之上。
- 最终答案 a走完全部台阶后,模型才写出结论“鸡23只、兔12只”。箭头表示整个过程是串行展开的。
工作原理:为什么“说过程”能变聪明
小智开始口播后有了意外收获:他切完葱会下意识闻一闻,发现不对劲立刻换料;面团揉到一半,他会捏一下软硬,太硬就补点水。口播逼着他把注意力落在当下这一步,每一步都成了一个小检查点,错误在萌芽时就被揪出来。
大模型的推理也是如此。复杂任务之所以难,是因为“一步到位”要求模型同时处理太多信息;而 CoT 把大任务拆成多个子任务后,每一步只需做一件小事。更关键的是,每一步生成的结论会留在上下文里,成为下一步的“工作台”——第3步能直接看到第1步和第2步写下的内容,相当于小智把“称好的面粉”摆在案板上,伸手就能拿到。
从概率角度看,CoT 对应着条件概率的链式展开:直接回答是“一次猜对整道题”,而思维链是“每步只猜一小步,且猜下一步时会看到前面所有步骤”。拆小了,单步难度自然下降。
口播的本质,是把“一次豪赌”变成“一串小赌”——而且每一把都摊在桌面上,错了随时止损。小智的每一步都被自己和客人盯着,大模型的每一步也都被上下文和提示词约束着,这就是“说过程”让模型变聪明的深层原因。
- P(a|x)给定问题 x,模型直接产出答案 a 的概率。直接回答模式的短板就在这一步——一步到位,中间没有任何缓冲。
- 第一步条件概率 P(s1|x)模型先只生成第一步推理。问题被“拆小”后,单步生成的难度显著降低。
- 后续条件概率第二步的概率要“看过第一步之后再算”,即条件于 x 和 s1。上下文越长,信息越足,单步越简单。
- 连乘整体成功率由各步条件概率相乘近似。步骤间的依赖把大问题化成了小问题,这正是 CoT 有效的概率解释。
零样本触发:一句口诀启动推理
师傅后来发现一个省事的诀窍:不用示范,也不用讲解,只要在小智手忙脚乱时喊一句“别急,一步一步来!”,他马上就像被按了开关一样,自动进入口播模式。这句口诀,就是零样本(Zero-shot)CoT 的全部秘密。
Kojima 等人在 2022 年发现,只要在问题末尾追加一句“让我们一步一步地思考”(Let's think step by step),大模型就会自发地生成一长串推理步骤,再给出答案。整段提示里没有任何例题,全靠这句口诀把模型“调”到推理状态——这就是它叫“零样本”的原因。
一句口诀能唤起老手艺,是因为本领早就在身上;同理,CoT 唤起的也是模型在预训练阶段已经习得、只是平时“懒得展开”的推理能力。不过口诀也有失灵的时候——如果模型本身很小,这句口诀往往不奏效,这点我们后面会细说。
- p_zs拼装好的零样本提示词,整串输入给模型,模型便知道要“边做边报”。
- x 与拼接 ⊕原始问题放在前面,符号 ⊕ 表示字符串拼接——这是提示工程里最常见的操作。
- 口诀 c这句话本身不含任何例题,却能“唤醒”模型的推理行为,类似师傅对徒弟喊一声“别急,一步步来”。
少样本触发:示范菜谱照猫画虎
口诀对小智只对了一半:遇到熟悉的菜品,他一听“一步步来”就稳了;可碰上完全没见过的新菜,他还是容易跑偏。师傅想了个更稳妥的办法——先亲手示范一道完整菜:称料、和面、调馅、蒸制,每一步都报出来,再让小智照着做一道新菜。这就是少样本(Few-shot)CoT。
少样本 CoT 的做法是:在提示词里先放 k 个“题目 + 推理链 + 答案”的完整示例,然后把真正要解的新问题接在后面。示例在这里不只是“参考答案”,更是在定义输出格式与推理节奏——模型会像一个学徒一样,照着师傅的套路走。
示范菜谱决定新菜的口味上限——示例里推理写得含糊,模型学到的就是含糊;示例里格式统一、步骤清晰,模型输出的就是同样清晰的推理链。小智现在明白,师傅的示范不只是“给答案”,更是“给套路”。
- 示例三元组 e_i每个示例由题目 x_i、推理链 s_i、答案 a_i 组成,相当于一份完整的“口播菜谱”。
- 拼接多个示例k 个示例按顺序排好,构成示范区块;k 在实操中通常取 2~8 个,质量比数量重要。
- 追加新问题最后拼上真正要解决的问题,让模型模仿示例输出同样的“推理-答案”格式。
效果提升:数学与代码的利器
自从学会了“口播做菜”,小智在店里的“数学套餐”(算账、算料)和“代码小炒”(记录配方、排班表)好评率暴涨。账房先生夸他:“以前让你算一笔三桌客人的总账,你报个数常对不上;现在你一步一步报,错了也能立刻揪出来。”
数据同样惊人:在 GSM8K 小学数学应用题集上,PaLM 540B 模型用普通提示直接回答,准确率只有 17.9%;改用少样本 CoT 后,准确率一跃达到 58.3%。代码任务的逻辑也类似:让模型先推理“输入有哪些情况、条件要怎么分支”,再写实现,比直接甩出一段代码稳定得多。
需要强调:不是口播本身创造了新手艺,而是口播把已有的手艺稳稳发挥了出来。CoT 从不给模型灌输新知识,它只是“激发”了参数里沉睡的推理能力,这正是它属于“涌现能力”的原因——模型不够大时,再怎么喊口诀也无济于事。
- acc准确率(accuracy),即测试集上答对的题目占比。两个下标分别代表思维链与直接回答两种模式。
- 两个基线数字在 GSM8K 上,PaLM 540B 直接回答只有 17.9%,而 few-shot CoT 达到 58.3%。
- 差值提升约 40 个百分点,说明“把步骤说出来”对复杂推理增益可观——但前提是模型规模足够大。
对比直接回答:过程的价值
有位老顾客问小智:“你这包子为什么这么鲜?” 以前小智只会挠头答“就是鲜”,客人追问哪里鲜、怎么调的,他一句也答不上来。现在他会说:“放了虾皮、鸡汤和胡椒粉,顺序是先调馅再拌葱,胡椒最后放。” 客人一听,立刻知道哪一步是关键,甚至能给出改进建议。
技术上的对比同样清晰。直接回答是一个“黑箱映射”:问题进去,答案出来,中间发生了什么无人知晓;CoT 则把同一问题映射成“一串推理 + 答案”,过程完整摊开在输出里。可解释性带来两个直接好处:一是答案错了能定位到具体是哪一步错的,二是调试时只需修改那一步的提示,不必推翻重来。
能复盘的菜谱才是好菜谱。对 Prompt 工程师和 AI 应用开发者来说,“能定位到盐放多了”的推理链,远比一个“看起来挺对”的最终答案更值得在生产环境里信任。
- f_direct 一步映射直接回答把问题 x 一步变成答案 a,中间过程完全不可见,像一台说不出原理的黑箱机器。
- f_cot 多步映射思维链把同一问题映射成“一串推理再加答案”,过程完整保留在输出里。
- 可审计性来源因为中间步骤出现在输出中,人和程序都能逐条回看——可解释性与误差定位的数学基础就在于此。
局限挑战:口诀不是万能药
口播也有翻车的时候。小智第一次独立做满汉全席式的宴客菜时,嘴皮子都磨干了:步骤一多,他说着说着就说串——“这步放盐?哦不对,上一步已经放过了。” 师傅在旁边摇头:“口播救不了没练熟的菜,也救不了太长的流程。”
CoT 的局限主要有三。第一是误差累积:推理链是串行的,任何一步出错都会被后续步骤放大,而且模型可能“自信地胡说”,把错误藏在看似合理的过程中。第二是计算成本:输出 token 数翻倍,延迟和费用同步上升,简单任务用它纯属浪费。第三是依赖模型规模与提示设计:小模型难以稳定涌现思维链,提示词设计不当反而让效果更差。
师傅最后总结了一句大实话:“口诀只管该管的事。” 简单菜不需要口播,复杂菜才值得花时间;流程工程师的结论如出一辙:按任务复杂度决定是否启用 CoT,别让“步步为营”变成“步步惊心”。
- 每步成功率第 i 步不出错的概率是 1-ε_i。步骤越难,ε_i 越大,这一步就越容易翻车。
- 连乘整条链成功要求每一步都成功,所以总成功率是各步成功率的乘积——一步错,步步错。
- 数值感受若每步成功率是 95%,20 步之后 $0.95^{20}\approx 35.8\%$——看着每一步都很稳,链一长整体成功率还是崩了,这就是误差累积的代价。
AI 应用场景
财务助手的多步计算模板
阶段:Prompt 工程 / 推理提示设计
解决的问题:传统财务助手直接回答报销金额时,遇到“多笔费用加总、超额度部分打折、税费减免”这类嵌套计算经常算错,而且错了找不到原因。用 few-shot CoT 在提示里放入“题目-推理-答案”模板,让模型逐步输出每笔金额和减免逻辑,准确率大幅提升,每一步还能回看核对。
具体案例:某公司报销助手原先对“3笔差旅费+1笔餐费,每笔超过500元的部分打八折”这类复合题目,直接回答准确率约 60%;接入 few-shot CoT 模板后提升到 90% 以上,财务复核时间缩短一半。
代码助手“先推理再编码”
阶段:推理调用 / 代码生成
解决的问题:AI 编程助手直接生成代码时,遇到多分支条件或复杂算法常出现漏判、逻辑混乱。让模型先输出“需求理解→解题思路→伪代码→最终代码”的推理链,相当于用 CoT 约束代码生成过程,输出更稳定、更易审查。
具体案例:在生成“根据订单状态决定退款流程”的函数时,模型先展开条件分支的推理链再写实现,单测通过率比直接生成提高了约 25 个百分点。
智能客服的复合诉求拆解
阶段:推理增强 / 任务拆解
解决的问题:客服机器人面对“退货+换货+补差价”的复合诉求,直接回答往往东拉西扯、漏掉条件。用 zero-shot CoT 在用户问题后追加“请分步判断”,让模型先列出条件再给结论,答复更规范。
具体案例:某电商客服机器人对复合售后问题,启用 CoT 后首问解决率(用户第一个问题就被完全解决的比例)提升了约 15%。
Python 演示
"""思维链CoT演示: 从"直接报答案"到"一步步写出推理过程" """ def build_zero_shot_prompt(question): """零样本触发: 只在问题后追加一句思考口诀""" return question + "\n让我们一步一步地思考,并写出中间步骤。" def build_few_shot_prompt(question): """少样本触发: 先给一个完整推理链示例,再提出新问题""" example = ( "题目: 小明有12颗糖,吃掉5颗,又买了8颗,现在有几颗?\n" "推理: 12 - 5 = 7; 7 + 8 = 15。\n" "答案: 15颗。\n\n" ) return example + f"题目: {question}\n推理: " def compute_trace(goods): """模拟模型按CoT输出: 每步打印中间结论, 形成可检查的推理链""" trace, total = [], 0 for name, price, count in goods: subtotal = price * count total += subtotal trace.append(f"{name}: {price}元 x {count}件 = {subtotal}元, 累计 {total}元") return trace def direct_answer(goods): """模拟直接回答: 跳过中间过程, 只返回最终数字""" return sum(price * count for _, price, count in goods) if __name__ == "__main__": question = "李阿姨买3斤苹果(每斤6元)和一个8元的西瓜,一共花多少元?" goods = [("苹果", 6, 3), ("西瓜", 8, 1)] print("== Zero-shot CoT 提示词 ==") print(build_zero_shot_prompt(question)) print("\n== Few-shot CoT 提示词 ==") print(build_few_shot_prompt(question)) print("\n== 直接回答模式 ==") print("答案:", direct_answer(goods), "元") print("\n== CoT 模式: 逐步推理链 ==") for line in compute_trace(goods): print(line) print("最终答案:", direct_answer(goods), "元")
def build_zero_shot_prompt(question):零样本入口,一个函数就拼出完整的触发提示return question + "\n让我们一步一步地思考,并写出中间步骤。"这句“口诀”是零样本 CoT 的全部秘密example = (用三引号字符串构造“题目+推理+答案”的示范样例return example + f"题目: {question}\n推理: "把示范拼在最前面,让模型照格式续写推理链for name, price, count in goods:逐件商品累计金额,对应 CoT 的“每步只做一件小事”trace.append(f"{name}: {price}元 x {count}件 = {subtotal}元, 累计 {total}元")每一步都留痕,形成可检查的推理链sum(price * count for _, price, count in goods)直接回答模式“一步到位”,省 token 但过程不可见
常见误区
误区很多人以为 CoT 是一句万能咒语,只要在提示词末尾加上“让我们一步一步思考”,任何题目都能答对,答不对就一定是代码 bug。
正解这句口诀本质是“触发机制”,它唤醒的是模型已经具备的推理能力。如果模型参数不够大(例如几十亿参数的小模型),口诀往往失灵;如果任务本身是简单常识,口诀还会让回答变得又啰嗦又慢。口诀有用,但不是魔法。
为何常见:零样本 CoT 的实现太简单——只需在提示词末尾加一句话,容易让人产生“一句咒语解决一切”的错觉。
误区用了 CoT 之后模型明显变聪明了,所以思维链是一种训练方法,相当于给模型补了一门推理课。
正解CoT 不修改任何参数、不做训练,它属于推理时的提示技巧。它把大模型在预训练中习得、但未被激活的推理能力“引导”出来。这正是它被称为“涌现能力”的原因——只有模型规模足够大,思维链才稳定出现。
为何常见:效果提升太显著,让人误以为模型被“重新训练”了;实际上提示词只是改变了输出的组织方式,权重一个都没动。
误区既然逐步推理有效,那我让模型写尽量多、尽量细的步骤,这样一定更准。
正解步骤过长会带来三个问题:一是误差累积,一步错步步错;二是生成 token 变多,延迟和成本上升;三是模型可能为了“凑步骤”而编造中间内容。合适的做法是“按任务复杂度给足步骤”,而不是盲目堆砌。
为何常见:人们习惯把“更多=更好”的直觉套用在推理链长度上,忽略了串行链的误差会连乘放大。
误区思维链是“算数专用技巧”,写代码、做逻辑判断、写文案都用不上。
正解CoT 的核心价值是“分解复杂任务”,凡是需要多步条件判断的任务都受益:代码生成(先分析需求再写实现)、逻辑推理(真假判断链)、规划类任务(先列计划再执行)等。但对于“直接抽取信息”这类简单任务,CoT 几乎没有增益。
为何常见:CoT 论文最出圈的数据是数学基准 GSM8K,让大家误以为它只服务数学。
误区模型每一步都写出来了,肯定不会再胡编乱造,推理链里的内容可以放心信。
正解步骤本身可能是“自信地胡说”。模型在中间步骤里同样可能编造不存在的条件或计算,而且错误被藏在“看似合理”的过程中更难发现。生产环境中仍需要校验工具或人工复核,不能盲目信任推理链。
为何常见:人倾向于相信“过程详细=认真靠谱”,这是把人类的信任习惯投射到了模型输出上。
面试题
Q1. 思维链CoT的核心思想是什么?
- A.让模型先写出中间推理步骤再给出最终答案← 正确答案
- B.让模型一次性生成多个不同的完整答案
- C.用更大的训练集重新训练模型的全部参数
- D.把用户的问题翻译成多种语言后再回答
答案:A。CoT 的本质是“先展示推理过程再给结论”,把输出从“一步到答案”变成“多步推理链+答案”。B 描述的是多次采样的做法,和 CoT 不是一回事;C 是训练方法,而 CoT 不需要训练;D 与推理无关。就像师傅让小智“报出每一步再做菜”,核心是过程可见、可查。
Q2. 零样本(Zero-shot)CoT 的典型触发方式是?
- A.在问题后追加“让我们一步一步地思考”← 正确答案
- B.提供十条带详细推理的示例再提问
- C.把答案选项改为“对/错/不确定”三选一
- D.让模型反复生成答案直到结果相同
答案:A。零样本 CoT 不需要任何示例,只需在提示词末尾加一句“让我们一步一步地思考”即可启动。B 描述的是少样本方式;C 是答案格式变换;D 是多次采样策略,都不是零样本 CoT 的触发方式。
Q3. 少样本(Few-shot)CoT 与零样本 CoT 相比,主要区别是?
- A.提示中加入了带推理过程的示例作为示范← 正确答案
- B.少样本能让模型把输出格式统一换成英文
- C.少样本彻底消除了思维链对模型参数的依赖
- D.少样本必须使用至少一百个训练示例
答案:A。few-shot CoT 在提示词里放入若干“题目+推理链+答案”的示例,让模型照着格式推理;零样本则不带示例,只用口诀触发。B 与推理无关;D 是夸张说法,通常 2~8 个示例即可;C 说“彻底消除参数依赖”是错误的,小模型即便给了示例也未必稳定。
Q4. 从“直接回答”切换到 CoT 后,输出最明显的变化是?
- A.多出了可检查的中间推理步骤← 正确答案
- B.输出变短且生成速度显著加快
- C.模型不再需要读取用户的完整问题
- D.模型不再产生任何错误的计算结果
答案:A。CoT 的输出从“只给答案”变为“推理链+答案”,中间步骤人人可见、可检查。B 恰好相反——CoT 输出更长、速度更慢;C 荒谬,模型当然还要读完整问题;D 是夸大,CoT 仍可能出错,只是过程更透明。
Q5. 下列哪些任务适合使用思维链CoT?
- A.多步数学应用题(如鸡兔同笼)← 正确答案
- B.简单常识填空(“中国的首都是?”)
- C.需要多条件判断的代码生成← 正确答案
- D.逐字复制一段固定文案
答案:AC。CoT 适合需要“分解+多步推理”的任务,数学应用题和复杂代码生成都在此列。B 是单步常识检索,加了 CoT 只会更啰嗦;D 是机械复制,不需要推理,用 CoT 纯属浪费。
Q6. 关于 CoT 的误差累积,下列说法正确的是?
- A.链越长,任一步出错导致整体失败的风险越大← 正确答案
- B.链越长,每步之间的错误会自动相互抵消
- C.只要最后一步正确,前面所有错误都无影响
- D.误差只累积在数学题,代码任务不受影响
答案:A。CoT 是串行链,整体成功率约等于各步成功率的乘积,步骤越多,任何一步出错都会传导到后续。B 违背链式依赖,错误不会自动抵消;C 忽略了中间步骤是后续步骤的输入;D 是错误认知,代码推理链同样会传导错误。可用“0.95 的 20 次方”来感受累积的威力。
Q7. “CoT 是涌现能力”这句话的含义是?
- A.只有模型规模足够大时思维链才稳定出现← 正确答案
- B.只要训练数据足够多小模型也能稳定使用
- C.思维链效果与模型规模没有任何关联
- D.任何参数量下思维链的表现都是一样的
答案:A。论文观察发现,CoT 的效果随模型规模增大而显著提升,小模型几乎不涌现这种能力,因此被称为“涌现能力”。B、C、D 都与这一观察相反——如果与规模无关,也就不叫涌现了。
Q8. 在少样本 CoT 中,“示例质量”主要体现在哪里?
- A.示例的推理步骤是否清晰且格式统一← 正确答案
- B.示例的题目文字是否足够短小精悍
- C.示例的数量是否超过一百条
- D.示例的答案是否包含多个备选
答案:A。模型会模仿示例的“推理节奏”与格式,示例推理清晰、格式统一(如“推理:… 答案:…”),新问题就越容易被按相同方式处理。B 不是核心;C 数量不是越多越好;D 只会让模型学会输出多个答案,反而混乱。
Q9. CoT 相比直接回答的不足之处包括?
- A.生成 token 变多,延迟和成本上升← 正确答案
- B.推理链很长时错误会逐步累积放大← 正确答案
- C.效果依赖提示词设计与模型规模← 正确答案
- D.彻底失去对输出内容的人工审查能力
答案:ABC。CoT 要输出更多中间内容,成本更高;串行链会累积误差;提示词与模型规模决定它能否生效。D 说反了——CoT 恰恰提升了可审查性,因为中间步骤可见,人工可以逐条核对。
Q10. 若每步推理成功率为 90%,一条 30 步的推理链整体成功率约为?
- A.90% 的 30 次方,约等于 4% 左右← 正确答案
- B.90% 乘以 30,约等于 27 倍成功率
- C.90% 加上 30%,约等于 120%
- D.90% 减去 30%,约等于 60%
答案:A。串行链的整体成功率等于各步成功率连乘:$0.9^{30}\approx 0.042$,约 4%。这直观展示了误差累积的残酷:每步都很稳,链一长整体成功率就崩。B、C、D 分别是乘、加、减的误用,概率连乘不是这样算的。