1. 定义
思维链(Chain-of-Thought, CoT)是一种通过引导模型分步推理来提升复杂问题解决能力的提示技术。与直接提问相比,CoT要求模型生成中间推理步骤,模拟人类“逐步思考”的过程,从而更准确地推导出最终答案。
1.1.CoT vs 直接提问
| 对比维度 | 直接提问 | 思维链(CoT) |
|---|---|---|
| 回答方式 | 直接输出答案 | 分步展示推理过程后给出答案 |
| 适用问题 | 简单事实性问题(如“法国的首都是哪里?”) | 需要逻辑推理、数学计算或多步分析的问题 |
| 错误率 | 易因跳跃性思考出错 | 通过验证中间步骤降低错误率 |
| 可解释性 | 低(答案无过程) | 高(答案附带推理逻辑) |
1.2. CoT与DeepSeek-R1的关系
DeepSeek-R1 核心优化之一即强化推理能力,而CoT是提升推理效果的关键技术。
- 技术整合:DeepSeek-R1通过预训练和微调(如数学、代码数据)天然支持CoT,无需额外提示即可生成分步推理。
性能对比:
- 直接提问:DeepSeek-R1在简单任务上响应速度更快。
- CoT模式:在GSM8K(数学推理基准)等任务中,准确率显著高于直接回答。
- 自定义扩展:用户可通过提示词显式调用CoT(如添加“请逐步解释”),或依赖模型自动判断是否需要分步。
2. 示例
2.1. 问题示例
示例1:数学问题
- 直接提问
输入: "若一个长方形的长是5cm,宽是3cm,面积是多少?"
输出: "15cm²" CoT提问
输入: "若一个长方形的长是5cm,宽是3cm,面积是多少?请分步解释。"
输出:1. 长方形面积公式为:面积 = 长 × 宽。 2. 已知长=5cm,宽=3cm。 3. 计算:5 × 3 = 15。 4. 因此,面积是15cm²。
示例2:逻辑推理
- 直接提问
输入: "如果所有猫都会飞,而汤姆是一只猫,汤姆会飞吗?"
输出: "会。" (可能忽略前提的荒谬性) CoT提问
输入: "如果所有猫都会飞,而汤姆是一只猫,汤姆会飞吗?请逐步分析。"
输出:1. 前提假设:所有猫都会飞。 2. 汤姆是一只猫,属于前提中的“所有猫”。 3. 根据前提,汤姆会飞。 *注:实际中猫不会飞,但在此假设下结论成立。*
2.3. 提示词模板示例
基础模板
请逐步解决以下问题:[问题描述]。
分步思考:
1. [第一步推理]
2. [第二步推理]
...
最终答案:[答案] 数学问题模板
问题:若一个圆的半径是4cm,周长是多少?
分步解答:
1. 圆的周长公式为C=2πr。
2. 已知半径r=4cm,π≈3.14。
3. 计算:2 × 3.14 × 4 = 25.12cm。
答案:周长是25.12cm。 复杂推理模板
问题:为什么夏天比冬天热?
分步分析:
1. 地球围绕太阳公转时,地轴倾斜导致季节变化。
2. 夏季时,太阳直射北半球,日照时间长且光线更集中。
3. 冬季相反,日照时间短且光线分散。
结论:夏季接收更多太阳辐射,因此更热。 3. LLM 回答的原理
CoT技术通过将大语言模型的隐式推理过程显式化,显著提升了复杂问题的解决能力。理解其工作原理和适用边界,可以帮助我们更有效地利用这一技术解决实际问题。随着模型能力的提升,CoT将继续向自动化、多模态和可验证的方向发展。
3.1 模型架构基础
现代大语言模型(如GPT-4、PaLM等)基于Transformer架构,其核心工作原理可分为以下几个阶段:
1. 输入编码阶段
- 文本分词:将输入问题分解为token序列
- 向量化:通过嵌入层(Embedding Layer)将每个token转换为高维向量(通常768-12288维)
- 位置编码:添加位置信息以保持词序
示例:
问题:"5个苹果吃掉2个还剩几个?"
→ 分词为["5","个","苹果","吃掉","2","个","还剩","几个","?"]
→ 每个词转换为512维向量
2. 注意力计算阶段
- 自注意力机制:计算token之间的相关性权重
- 多头注意力:并行多个注意力头捕获不同层面的关系
- 前馈网络:非线性变换增强表达能力
计算过程:
Attention(Q,K,V) = softmax(QK^T/√d)V
其中Q(Query)、K(Key)、V(Value)均由输入向量线性变换得到3. 输出生成阶段
- 逐token预测:基于上下文生成下一个token的概率分布
- 采样策略:使用temperature、top-p等参数控制生成多样性
- 自回归生成:将当前输出作为下一时间步的输入
示例:
生成"3"的概率:
P("3"|"5个苹果吃掉2个还剩") = 0.85
P("4"|...) = 0.05
P("2"|...) = 0.03
...
3.2 直接回答的局限性
尽管模型表现优异,直接回答存在以下问题:
1. 隐式推理的缺陷
- 黑箱操作:无法观察中间推理过程
- 错误传播:早期错误会影响后续生成
- 缺乏校验:无法验证中间步骤的正确性
错误示例:
问题:"(12×3)+5-10=?"
直接回答:"41"(正确答案应为31)
错误原因:可能先计算了12+3=15
2. 统计偏好的影响
- 频率偏差:倾向于高频答案
- 表面匹配:容易被问题表层形式误导
- 语境误解:忽略关键限定条件
错误示例:
问题:"2的50次方和50的2次方哪个大?"
直接回答:"50的2次方"(正确答案应为2^50)
原因:模型更熟悉50²=2500这个常见结果
4. CoT的原理与优势
4.1 CoT的核心机制
1. 显式推理的强制实现
CoT通过特殊提示设计,强制模型将隐式计算过程外化为语言表达:
标准流程:
1. 问题理解 → 2. 分步解决 → 3. 最终确认实现方式:
- Few-shot CoT:提供分步解答示例
- Zero-shot CoT:添加"让我们逐步思考"等指令
- Program-of-Thought:生成可执行的中间代码
2. 工作记忆的扩展
CoT通过以下方式缓解模型的记忆限制:
- 外部化工作记忆:将中间结果保留在生成文本中
- 注意力再分配:分步聚焦不同信息片段
- 错误隔离:单步错误不影响整体流程
示例对比:
直接提问:
Q: 若x+3=7,2y=10,求x+y=?
A: 10(错误)
CoT提问:
Q: 逐步求解:若x+3=7,2y=10,求x+y=?
A: 1. 由x+3=7得x=4
2. 由2y=10得y=5
3. 因此x+y=94.2 CoT提升准确性的原理
1. 分治策略(Divide-and-Conquer)
- 问题分解:将复杂问题拆解为简单子问题
- 逐步求解:降低单步认知负荷
- 结果整合:合并中间结果
数学证明:
设问题复杂度为C,直接求解错误率P(C)=1-(1-ε)^C
分n步求解时,P(C)≈1-(1-ε/n)^n → e^(-ε) (当n→∞)
2. 双重校验机制
- 前向验证:检查每步推导的合理性
- 后向验证:确认结果是否符合初始条件
案例演示:
问题:连续三个偶数之和为30,求这三个数
CoT解答:
1. 设中间数为x,则三个数为x-2,x,x+2
2. 和为(x-2)+x+(x+2)=3x=30
3. 解得x=10
4. 验证:8+10+12=30 ✓3. 知识检索增强
- 分步提示激活相关知识
- 减少语义歧义
- 避免概念混淆
示例:
直接提问:
Q: 氟利昂对臭氧层的影响是?
A: 有益的保护作用(错误)
CoT提问:
Q: 逐步分析氟利昂对臭氧层的影响
A: 1. 氟利昂是含氯氟烃
2. 在平流层紫外线分解释放氯原子
3. 氯原子催化臭氧分解
4. 因此会破坏臭氧层5. CoT的适用场景
5.1 最适合使用CoT的任务类型
1. 多步数学问题
- 特征:需要超过3步计算
- 优势:避免中间结果丢失
示例:
问题:商店有120个苹果,首日卖出1/3,次日卖出剩余的1/4,还剩多少? CoT解答: 1. 首日卖出:120×1/3=40个 2. 剩余:120-40=80个 3. 次日卖出:80×1/4=20个 4. 最终剩余:80-20=60个
2. 逻辑推理问题
- 特征:需要假设和演绎
- 优势:保持逻辑一致性
示例:
问题:如果所有A都是B,有些B是C,那么有些A是C吗? CoT解答: 1. 前提1:A⊆B 2. 前提2:B∩C≠∅ 3. 但A与C的交集不确定 4. 结论:不能确定"有些A是C"
3. 复杂决策问题
- 特征:多因素权衡
- 优势:明确评估标准
示例:
问题:应该选择哪款笔记本电脑? CoT解答: 1. 需求分析:主要用于编程和轻度游戏 2. 选项A:CPU强但GPU弱 3. 选项B:均衡配置但价格高 4. 根据需求优先选择选项A
5.2 不太适合CoT的场景
1. 简单事实查询
- 示例:"中国的首都是?"
- 原因:单步检索即可完成
试着问一下 DeepSeek R1
问题:
中国的首都是?已深度思考13.9秒
好的,我现在要回答用户的问题:“中国的首都是?”这个问题看起来挺直接的,但我还是得仔细想想,确保自己回答正确。首先,我需要确认中国现在的首都是哪个城市。根据我所学的知识,中国的首都是北京。不过,为了确保准确性,我应该回忆一下相关的知识点,避免犯低级错误。
首先,中国是一个有着悠久历史的国家,历史上多个朝代都有不同的首都。 ... ...回答:
中国的首都是北京。这也是很多人吐槽:问 DeepSeek R1 “1+1=?”,都得思考半分钟。
2. 创意生成任务
- 示例:"写一首关于春天的诗"
- 原因:分步推理可能限制创造性
3. 高度专业化问题
- 示例:"量子场论中的重整化技术"
- 原因:模型可能缺乏足够专业知识分步推导
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。