小明是王老师班上典型的“感觉型选手”——数学卷子上永远只写一个孤零零的答案,对了不知道自己怎么对的,错了更不知道错在哪。有一次算 23×47,他大笔一挥写下“1091“,离正确答案只差十位上的一点点。王老师问他怎么想的,他只能挠头:”凭感觉。“于是王老师立了条规矩:”所有应用题,必须把演算过程一步一步写在卷子上——先拆数、再分步算、最后汇总。”不到一个学期,小明算对的概率明显提高,王老师还能一眼指出他错在第几步。 这个“试卷上的规矩”,正是大模型推理增强技术——思维链(Chain-of-Thought,简称 CoT)的缩影:通过设计提示词,让大模型在给出最终答案之前,先“把推理过程说出来”,就像小明在草稿纸上一步步演算。这个过程不需要重新训练模型、不需要改模型结构,只需在 Prompt 里加一句“请一步一步思考”,或给模型看几个带推理过程的示范,模型的数学、逻辑、多跳推理能力就会“像开了窍”一样提升。接下来,我们就从这个故事出发,把思维链的原理、触发方式和应用场景一次讲透。
对 AI 从业者来说,思维链是 Prompt 工程里成本最低、见效最快的“推理增强器”:不训练、不调参,只改提示词就能让大模型在数学和逻辑任务上大幅提分,是你增强 AI 应用推理能力时的第一件趁手工具。
目录
可视化演示
展示Chain-of-Thought逐步推理链、Zero-shot与Few-shot CoT对比,以及在GSM8K数学推理任务上的准确率提升效果。
本节配有交互动效(进入视口后自动加载,约 3KB)。
CoT推理链:step by step逐步推理 Q=问题输入,A=最终答案 S1-S3=中间推理步骤 触发短语:Let us think step by step Q -> S1 -> S2 -> S3 -> A
思维链概念:从“报答案”到“写过程”
王老师批改试卷时最头疼的不是学生答错,而是只看到答案、看不到思路。小明以前就爱“报答案”——对了不知道为什么对,错了更不知道错在哪。王老师立下“必须写演算过程”的规矩后,小明的错误率肉眼可见地降了下来。道理很简单:把步骤写到纸上,每一步都被迫接受检查,思路自然就清晰了。
大模型也面临同样的困境。当你直接问 GPT“23×47 是多少”,它会一口气“报答案”——因为语言模型本质上是在预测下一个最可能的字词,它没有强制自己“先算中间步骤”的机制。遇到需要多步计算的问题,答案经常是“感觉对但实际错”,就像小明凭感觉写下的 1091。这就是所谓“隐式推理不足”:推理过程藏在模型内部的注意力权重里,既不受约束,也无法检查。
思维链(Chain-of-Thought, CoT)正是针对这个弱点提出的提示方法:在给出最终答案之前,显式地生成一串中间推理步骤 \(s_1, s_2, \ldots, s_n\),再给出最终答案 \(a\)。从概率角度看,它把“一步猜出答案”变成了“一步步推出答案”:
所以思维链的本质,就是把“隐式推理”变成“显式过程”。王老师的规矩之所以有效,是因为过程逼着每一步都落在纸面上;CoT 提示之所以有效,是因为它逼着模型把“心里的小算盘”逐字打出来。知道了这一点,下一步的问题就变成了:怎么自然地把这个过程“逼”出来?
- 直接报答案\(P(a \mid x)\) 表示给定问题 \(x\) 时直接输出答案 \(a\) 的概率,就像小明不写过程直接报数。
- 写过程的答案\(P(s_1, s_2, \ldots, s_n, a \mid x)\) 表示模型先输出中间步骤 \(s_1\) 到 \(s_n\),再输出答案 \(a\) 的联合概率。
- 链条的本质每一步步骤都被显式建模,答案不再是“凭空冒出来”的独立事件,而是建立在可见的中间过程之上。
Step-by-step 触发:怎么让模型“写过程”
王老师想让小明写过程,其实有两种办法:一是直接下命令“每一步都写出来”;二是先给他看一道带完整过程的例题,让他照着葫芦画瓢。前者省事但略显生硬,后者费点口舌但更稳。两种办法背后是同一个要求——step by step,一步一步来。
对应到大模型上,这就是思维链的两种触发方式。指令式引导是指在 Prompt 里直接写“请一步一步地思考”(step by step),用一句指令切换模型的输出模式;演示式引导是指在上下文中给出带推理过程的示例(demonstrations),让模型模仿示例的格式作答。开发者可以根据任务复杂度和手里的资源,灵活选择其中一种或组合使用。
为什么“要求一下”就管用?因为大模型是自回归生成器:每个新 token 的生成都取决于之前已经生成的所有 token。一旦提示词里出现了“让我们一步一步思考”,后续生成就更倾向于输出步骤序列,而不是直接跳到结论。这种逐 token 接龙的条件关系可以写成:
两条触发路径各有所长:指令式零成本、一句话就上;演示式更可控、适合复杂任务。接下来两节,我们分别看看这两条路径的代表——Zero-shot CoT 和 Few-shot CoT。
- 第 k 步\(s_k\) 表示整条推理链中的第 \(k\) 个步骤,例如"23×40=920"。
- 已写出的前文\(s_1, s_2, \ldots, s_{k-1}\) 是模型之前已经生成的步骤,它们构成生成第 \(k\) 步时的上下文。
- 逐字接龙整个式子表示“在题目和前面所有步骤的条件下生成当前步骤”的概率——每步都受上一步约束,链条因此连贯。
Zero-shot CoT:一句魔法短语
王老师先在班上试了最省事的办法——不发任何例题,只丢下一句“把过程写出来!”。结果大部分学生都能照做,尤其对那些中等难度的题,有过程比没过程强得多。这就是零样本(Zero-shot)情境:不靠示例,只靠一句话触发思维链。
2022 年,研究人员发现了一个惊人的现象:只要在问题后面加上一句“Let's think step by step“(让我们一步一步思考),大模型的推理准确率就能大幅提升。原因在于,模型在训练语料里见过大量”先思考后作答“的文本,这句话就像一个开关,把模型拨到了”推理模式“:它不再试图直接蹦结论,而是先输出一段像模像样的推理过程。从形式上看,Zero-shot CoT 只是把 Prompt 从单纯的问题 \(x\),变成了”问题 + 触发短语”的组合:
但 Zero-shot CoT 并非万能:对只需一步推理的简单任务,这句话纯属多余,还白白增加 token 开销;对需要领域知识的复杂推理,它又常常“带不动”。王老师的班里有几个基础弱的学生,光喊“写过程”也写不出像样的过程——这时候就需要掏出几道例题示范了,这正是下一节的主角。
- 最终答案\(\hat{a}\) 表示模型最终输出的答案。
- 触发短语\(c_{\text{step}}\) 即“Let's think step by step“,它被拼在问题后面,充当”推理模式开关”。
- 条件概率\(P(a \mid x, c_{\text{step}})\) 表示在问题与触发短语共同条件下答案 \(a\) 出现的概率。
- 取最大\(\arg\max\) 表示在所有候选答案中挑选概率最高的那个作为输出。
Few-shot CoT:用示范带出推理
王老师发现光喊口号不管用后,改成在黑板上先写两道示范题:第一题完整写出“拆数→分步→汇总”的全过程,第二题写到一半,留给学生补完。这叫少样本(Few-shot):例子的说服力,永远比一句空泛的要求强。
Few-shot CoT 就是在 Prompt 里放入若干组「题目 + 带推理过程的作答」作为示例,再附上真正要解决的新题目。模型看到示例里的推理模式后,会在新题上“照着写”。和标准 Few-shot 的关键差别在于:普通示例只给“题目→答案”,CoT 示例给的是“题目→推理步骤→答案”。研究表明,真正起作用的是推理步骤本身,而不是示例里的答案——模型学的是“如何写过程”的格式,而非死记硬背结果。形式化地看:
把两种方式摆在一起看:Zero-shot CoT 是“空口要求”,Few-shot CoT 是“以身作则”。当任务越复杂、模型规模越小,示范的价值就越明显。实操中还有个技巧:示例的推理过程也要用 CoT 风格,且宁缺毋滥——放三五个高质量示范,远比堆一大堆残缺示范效果好。
- 示例题目\(e_i\) 表示第 \(i\) 个示例的问题文本,例如“小明有 23 个苹果,每箱装 47 个”。
- 示例推理\(r_i\) 是与 \(e_i\) 配对的推理过程与答案,Few-shot CoT 的关键就是把 \(r_i\) 写完整。
- 示范数量\(m\) 是示例的个数,实践中通常 3~5 个即可,并非越多越好。
- 模仿生成整个条件列表让模型“照着示例的格式”完成新问题 \(x\) 的推理。
数学推理应用:过程的力量
王老师最欣慰的是,养成写过程的习惯后,小明的应用题正确率肉眼可见地提高了。数学题是思维链最肥沃的土壤:它有明确的步骤、可复算的中间量,而且“看起来会做”和“真能做对”之间差距巨大——这正是大模型最容易翻车的地方。
直接问大模型“23×47 等于多少”,它可能给出 1091 这种接近但错的答案;改用 CoT 提示后,模型会先做乘法分配律拆解、再分步计算、最后汇总,错误率显著下降。在 GSM8K 等数学基准上,思维链常常能带来数倍于标准 Prompt 的准确率提升。一个典型的思维链推理过程长这样:
思维链在数学应用中还有两个额外赠品:结果验证与错误定位。因为每一步都暴露在文本里,下游程序可以复算每个中间值——就像王老师能指着试卷说“你错在 920+161 这一步”,而不是笼统地打一个大红叉。这种“可审计的推理”,正是金融、教育等严肃场景最看重的能力。
- 拆数\(23 \times (40 + 7)\) 利用乘法分配律,把 47 拆成 40 和 7。
- 分配\(23 \times 40 + 23 \times 7\) 把乘法拆成两个独立的子问题。
- 分步计算\(920 + 161\) 得到两个中间结果,各自都能独立验算。
- 汇总验证\(1081\) 相加得到最终答案,同时整条链路可被下游程序复算。
效果评估:用数据说话
学期结束时,王老师拿出成绩单做了个对比:小明写了完整过程的题目,正确率比“空手答题”时高出近三倍。数据一摆出来,全班都服了“写过程”的价值。评估思维链的效果,同样要拿出硬指标。
主要看三个方面。第一是准确率:在同一批基准题(如 GSM8K 数学题、多跳问答)上,分别用标准 Prompt 和 CoT Prompt 测试,对比正确率;第二是成本:思维链会生成更多 token,推理延迟和 API 费用同步上升,必须权衡;第三是一致性:同一道题跑多次,看答案是否稳定——如果每次推理过程都不一样,可信度就要打折扣。其中准确率提升可以量化成:
评估也要看清适用边界:当任务本身只需一步推理时,CoT 的提升趋近于零;当模型太小、或训练语料与任务领域差距过大时,CoT 甚至可能“带偏”推理方向。王老师最终意识到,写过程是手段不是目的——合适的学生配上合适的题目,这剂良药才真正见效。这也是 Prompt 工程最朴素的真理:先小规模实验,用数据说话,再决定是否全线启用。
- 基线准确率\(\text{Acc}_{\text{base}}\) 是使用标准 Prompt 时的准确率,作为对照组。
- CoT 准确率\(\text{Acc}_{\text{CoT}}\) 是使用思维链提示后的准确率。
- 绝对提升分子 \(\text{Acc}_{\text{CoT}} - \text{Acc}_{\text{base}}\) 是准确率的绝对增幅。
- 相对提升除以基线再乘 100%,得到消除任务难度差异后的相对提升率。
AI 应用场景
智能数学辅导助手
阶段:推理增强 / 应用开发
解决的问题:传统搜题 App 只给答案,学生看不懂过程,遇到同类题照样不会做。用 CoT Prompt 让模型分步解析,还能在中间步骤上做错因分析,真正实现“讲思路”而不是“报答案”。
具体案例:拍照搜题后,系统把题目拼进 Prompt 模板:“请按以下步骤解这道应用题:1) 列出已知条件;2) 写出解题思路;3) 分步计算;4) 给出最终答案。”模型输出的推理步骤直接渲染成解题过程的逐步动画,学生可以逐帧对照。
金融合规多跳问答助手
阶段:RAG 检索增强 + 推理增强
解决的问题:金融合规问答往往需要跨多个条款进行多跳推理,直接问模型很容易答错或答非所问。使用 Few-shot CoT,把合规专家写好的“判断路径”作为示例,让模型按同样的路径逐步分析。
具体案例:给模型 3 条“提问→定位相关条款→逐条比对→中间结论→最终判定”的示范,再输入新案例“客户逾期三天的违约金怎么算”。模型会先引用条款、再分步计算,最后给出可追溯的答复,合规审核人员可以直接核对每一步。
数据分析报告生成
阶段:结果可信度提升
解决的问题:数据分析结论必须可复算,但模型直接给结论时,读者无法验证数字怎么来的。用 CoT 强制模型“先列公式、再代入数值、最后给结论”,让报告具备审计性。
具体案例:Prompt 要求模型“对以下指标做同比分析:先写出计算公式,再代入本期与上期数值,分步计算增长率,最后给出结论”,生成的报告每一步都有据可查,分析师只需复核中间量即可。
Python 演示
# -*- coding: utf-8 -*-# 思维链演示:用规则算术模拟 CoT 的"分步推导"结构import re class RuleBasedCoT: """小型分步算术推理器,模拟思维链提示下的输出结构""" def __init__(self): self.steps_log = [] # 记录每一步中间结果 def chain_of_thought(self, expr): """CoT 模式:先输出推理步骤,再给出最终答案""" m = re.match(r"^(\d+)\s*\*\s*(\d+)$", expr) if not m: return {"error": "仅支持形如 23*47 的乘法表达式"} a, b = int(m.group(1)), int(m.group(2)) if not (10 <= b <= 99): return {"error": "请让第二个因数在 10-99 之间,便于展示拆数"} b10, b1 = (b // 10) * 10, b % 10 r1, r2 = a * b10, a * b1 # 每一步对应模型生成的一段推理文本 self.steps_log = [ "拆数:把 {} 拆成 {} 和 {}".format(b, b10, b1), "分步:先算 {} x {} = {}".format(a, b10, r1), "分步:再算 {} x {} = {}".format(a, b1, r2), "汇总:{} + {} = {}".format(r1, r2, a * b), ] return {"steps": list(self.steps_log), "answer": a * b} def direct_answer(self, expr): """标准模式:不展示过程,只返回最终结果""" m = re.match(r"^(\d+)\s*\*\s*(\d+)$", expr) if not m: return {"error": "仅支持乘法表达式"} a, b = int(m.group(1)), int(m.group(2)) return {"answer": a * b, "steps": []} def main(): solver = RuleBasedCoT() print("=== 标准提示:计算 23*47 ===") direct = solver.direct_answer("23*47") print("模型输出(只有答案):", direct) print("\n=== 思维链提示:请一步一步推理 ===") cot = solver.chain_of_thought("23*47") for line in cot["steps"]: print(" ", line) print(" 最终答案:", cot["answer"]) # 校验:分步推导的答案与直接计算一致 assert cot["answer"] == direct["answer"], "答案不一致!" print("\n校验通过:思维链的最终答案正确且过程可复算") if __name__ == "__main__": main()
def chain_of_thought(self, expr):定义 CoT 模式的入口,所有分步推理逻辑都在这里完成m = re.match(r"^(\d+)\s*\*\s*(\d+)$", expr)用正则解析“数*数”形式的乘式,提取两个因数b10, b1 = (b // 10) * 10, b % 10把第二个因数拆成整十和个位,模拟思维链第一步“拆数”r1, r2 = a * b10, a * b1分步计算两个子乘法,得到可独立验算的中间量self.steps_log = [...]按“拆数→分步→汇总”的顺序拼接推理链,对应模型输出的中间步骤序列return {"steps": list(self.steps_log), "answer": a * b}返回带完整过程的输出,正是 CoT 提示词要求的格式assert cot["answer"] == direct["answer"]校验分步推导与直接计算一致,体现思维链“可验证”的优势
常见误区
误区以为给任何问题加上“请一步一步思考”就等于上了双保险,模型一定会答对,甚至把这句话当成长辈口中的“多喝热水”,哪儿都能用。
正解Zero-shot CoT 只在中等复杂度的任务上显著有效。对简单问题它是浪费 token 的废话;对需要领域知识的难题,它“带不动”;对模型本身就会算错的计算,它只是把错误过程写得更长而已。它改变的是输出结构,不是计算能力本身。
为何常见:网上传播的案例几乎都是成功样本,让人误以为一句魔法短语就能点石成金,却忽略了失败案例和适用条件。
误区认为思维链输出的推理文字,等价于模型内部真的在进行逻辑推理,步骤内容一定可信。
正解大模型本质是文本生成器,它生成的是“看起来像推理”的文本,而不是因果推理的忠实记录。步骤可能前后矛盾、数值可能算错,但它提供了可校验的中间量——我们可以用外部工具复算,却不能默认它内部“真的想了”。
为何常见:人类看到连贯的推理文字,就会本能地联想到“思考过程”,这是强烈的拟人化倾向造成的误判。
误区既然 Few-shot CoT 靠示例引导,那在 Prompt 里塞十几个带推理的示例,效果肯定比三五个强。
正解示例会挤占上下文窗口、推高成本,而且低质量或风格不一的示例反而会干扰模型的模式识别。3~5 个高质量、推理风格一致的示范通常就足够了——Prompt 是“模式引导”,不是“量变引起质变”的训练数据。
为何常见:直觉上“数据越多越好”,但这是把机器学习训练的经验错误类比到了提示词设计上。
误区一说思维链就想到"23×47",以为它只是算术题的专属技巧,其他任务用不上。
正解凡是答案依赖多步推导的任务都能受益:常识推理、符号逻辑、多跳问答、代码调试、结构化分析等。数学只是最好展示的舞台,不是唯一的舞台。
为何常见:思维链论文和教程里最经典的演示案例都是数学题,形成了强烈的印象偏差。
误区把 CoT 当成无条件向上兼容的改进,任何任务直接套用就好,不用测。
正解对一步推理任务,CoT 与基线持平甚至略低——多余步骤可能引入幻觉或偏离指令。正确做法是先在验证集上做 A/B 对比,用准确率、成本、一致性三个指标决定是否启用。
为何常见:基准榜单上“全面碾压”式的分数对比,让人忽视了任务分布不同带来的结论差异。
面试题
Q1. 思维链(CoT)提示的核心思想是?
- A.增加模型的参数量
- B.让模型输出推理中间步骤← 正确答案
- C.更换底层的模型架构
- D.用更多数据微调模型
答案:B。CoT 通过让模型先生成中间推理步骤再给最终答案,把隐式推理变成显式过程。A、C、D 都涉及训练或架构层面,而 CoT 是纯提示层面的方法,不训练、不改架构。
Q2. 以下哪个是典型的 Zero-shot CoT 触发短语?
- A.请直接给出最终答案
- B.让我们一步步按序思考← 正确答案
- C.用代码实现这个算法
- D.请概述一下问题背景
答案:B。标准 Zero-shot CoT 在问题后追加“让我们一步一步思考”之类的指令短语,引导模型按步骤输出。A 是反方向指令,C、D 与推理链触发无关。
Q3. GSM8K 数据集主要用来评测哪类能力?
- A.小学数学应用题解答能力← 正确答案
- B.图像分类识别标注能力
- C.语音转写文字处理能力
- D.机器翻译语言转换能力
答案:A。GSM8K 是小学数学应用题数据集,答案需要多步推导才能得到,因此成为衡量思维链效果最常用的基准之一,也是前面效果评估示例的数据来源。
Q4. Few-shot CoT 与标准 Few-shot 的关键区别是?
- A.示例的来源必须是训练集
- B.示例包含完整的推理过程← 正确答案
- C.示例数量一定超过十个
- D.示例的格式必须用图片
答案:B。标准 Few-shot 示例是“题目→答案”,CoT 示例是“题目→推理步骤→答案”。真正引导模型写出过程的正是推理步骤本身,而不是示例里的答案。
Q5. Zero-shot CoT 与 Few-shot CoT 的根本区别是?
- A.所使用的提示模型参数规模不同
- B.是否提供了带推理过程的示例← 正确答案
- C.模型的预训练阶段数据不同
- D.用来评测的下游任务类型不同
答案:B。Zero-shot CoT 只加触发短语、不给示例;Few-shot CoT 在上下文中放入带推理过程的示范,让模型模仿格式。二者区别在于“有没有示范”,而非模型或数据本身。
Q6. 思维链一般用什么方式引出最终答案?
- A.用“答案:”或“因此”来承接← 正确答案
- B.用完全随机的特殊符号来做分隔
- C.用插入的图片标识来给出答案
- D.只写出推理过程不输出答案
答案:A。实践中通常在推理步骤末尾用“答案:”“Therefore“等承接词收尾,既帮助模型稳定输出格式,也方便程序解析最终结果,这与逐字解析中”汇总验证”的步骤设计一致。
Q7. 为什么思维链能降低大模型的推理错误?
- A.增加模型参数数量减少方差
- B.把长程计算拆成可逐项校验的步骤← 正确答案
- C.修改注意力机制来强化记忆
- D.提升上下文窗口的大小限制
答案:B。多步推理的误差会累积,模型一步到位很难算对。CoT 把长计算链拆成多个短步骤,每步只做局部计算,整体错误率下降,且中间步骤可被外部程序复算校验,错误还能定位到具体步骤。
Q8. 下列哪些任务适合使用思维链?
- A.数学应用题的求解← 正确答案
- B.多跳常识问答的推理← 正确答案
- C.图片滤镜效果的调整
- D.符号逻辑推理的验证← 正确答案
答案:ABD。凡是依赖多步语言推导的任务都能从 CoT 受益——数学、多跳问答、符号逻辑都在此列。图片滤镜属于图像处理流水线,不经过语言多步推理,不属于思维链的适用范围。
Q9. 关于 Few-shot CoT 示例设计,正确的说法是?
- A.示例最好包含完整的分步推理← 正确答案
- B.示例数量并非越多越有效← 正确答案
- C.示例必须全部来自标注数据集
- D.推理过程的风格与目标一致← 正确答案
答案:ABD。示例质量、推理完整度和风格一致性远比数量重要,手工编写三五个高质量示范即可。示例并非必须来自标注数据集,业务专家手写的思路示例往往效果更好。
Q10. 关于思维链的机理与边界,学界认同的判断是?
- A.思维链能力随模型规模增大而增强← 正确答案
- B.模型可能在模仿记忆而非真正推理← 正确答案
- C.思维链对任意规模模型都同样有效
- D.提示词改动完全不影响推理效果
答案:AB。研究表明思维链类似“涌现能力”,与模型规模正相关;同时模型可能是在按训练语料中的文本模式“背答案”,输出步骤不一定是因果推理的忠实记录。C 与规模相关性矛盾,D 与 CoT 的基本前提矛盾,均不正确。