推理模型解析-o1和DeepSeek-R1的思考机制
> **本文适合谁**
推理模型解析:o1 和 DeepSeek-R1 的思考机制
本文适合谁
想搞清楚"o1 和 GPT-4o 有什么区别"、"推理模型适合哪些场景"、"为什么推理模型更贵更慢"的开发者。选型指导:什么时候该用推理模型,什么时候不该用。
2024 年 9 月,OpenAI 发布 o1。推理模型(Reasoning Model)与普通 LLM 在架构上没有本质差别,都是 Transformer,区别在于生成策略:普通 LLM 直接输出答案,推理模型在输出答案之前先进行大量内部"思考"。
理解推理模型的核心隐喻是:给了模型一张草稿纸。
1.1 推理模型与普通 LLM 的根本区别
1.1.1 测试时计算扩展:能力不再完全固化在训练里
在推理模型出现之前,提升模型能力的方式主要是两条路:训练更大的模型,或者使用更多、更高质量的训练数据。这两种方式都发生在训练阶段——模型一旦训练完成,能力就固化了,无论对简单问题还是复杂问题,消耗的计算量是相同的。
图 6.13:普通 LLM 与推理模型的本质区别——直接回答 vs 链式思考再回答
推理模型打开了第三条路:在推理阶段(模型生成答案时)消耗更多计算,换取更好的答案质量。同一个模型,对简单问题快速回答,对复杂问题花更多时间深度思考,计算资源可以动态分配。
这个思想来自人类的认知习惯:做简单的加法题不需要打草稿,但解复杂的数学证明需要一步步推导、验证、可能还要回头修正。推理模型把这个"打草稿"的过程给了语言模型。
1.2 普通 LLM vs 推理模型
本质区别不在架构,在于 Token 的使用方式。 普通 LLM 用有限的 Token 直接给答案,推理模型用大量 Token 进行中间推导,最终答案只是推理过程的最后几行。
1.3 测试时计算扩展(Test-time Compute Scaling)
1.3.1 为什么这是一个范式转移
传统范式:能力 = f(模型规模, 训练数据),能力固化在训练权重里,推理时无法动态提升。
推理模型范式:能力 = f(模型规模, 训练数据, 推理时计算量),通过在答题时消耗更多计算来提升特定任务的表现。
这个转变意味着:同一个基础模型,通过调整"思考预算",可以在不同任务上展现出不同水平的能力。这比训练一个更大的模型灵活得多,也便宜得多——不需要重新训练,只需要多花一些推理时的算力。
传统的"更强模型"需要更大参数、更多训练算力(Training-time Compute,训练时的计算量)。推理模型引入了另一个维度:在推理(Inference,模型生成答案时)花费更多计算,换取更好的答案质量。
这一现象称为 Test-time Compute Scaling(推理时计算扩展,即通过增加答题时的计算量来提升准确率),是 o1 系列最重要的洞见之一。
准确率 ∝ f(推理 Token 数量)
在 AIME(美国数学邀请赛,一种高难度数学竞赛考试,常被用于评测推理模型能力)数学竞赛题上,增加推理 Token 数量,模型正确率持续提升,直到某个饱和点。这意味着:
- 困难问题值得多花推理成本
- 简单问题无需开启推理模型(高延迟、高成本)
1.4 内部推理链:think 标签里在做什么
以 DeepSeek-R1 和 Claude(Extended Thinking 系列)为代表的推理模型会用特殊标签(如 <think>...</think>)包裹内部推理过程。这段内容对用户可选可见,但本质上是模型的"草稿纸"。
推理链中实际发生的行为模式:
1. 问题分解(Problem Decomposition)
原题:证明 √2 是无理数
思考:假设 √2 = p/q(最简分数)→ 2 = p²/q² → p² = 2q²
→ p 是偶数 → p = 2k → 4k² = 2q² → q² = 2k²
→ q 也是偶数 → 与最简分数矛盾
2. 假设验证(Hypothesis Testing)
思考:先试 x = 2,代入方程检验...
不对,再试 x = -1...
方向错了,换个思路...
3. 回溯(Backtracking)
思考:等等,上面的假设有问题,忽略了边界条件...
重新来,当 n = 0 时...
4. 自我验证(Self-Verification)
思考:得到答案 42,反过来验算:6 × 7 = 42 ✓
单位对吗?米/秒² ✓
符合物理直觉吗?✓
1.5 DeepSeek-R1:从零发现 CoT 的强化学习训练
1.5.1 为什么思维链(CoT)能有效提升推理能力
思维链(Chain of Thought,CoT)让模型先展示推理步骤,再给出最终答案。这为什么有效?有几个互补的解释:
第一,中间步骤作为上下文。Transformer 的每个 token 都会被后续 token 关注。把推理步骤写出来,相当于为后续计算提供了更丰富的上下文,模型在每个步骤都可以"看到"之前的所有推导,避免了在"脑中"同时维护太多状态。
第二,纠错机会。在连续推理时,一旦某步出现错误,写出来的中间步骤给了模型发现并修正的机会。如果直接跳到结论,错误就没有被捕捉的机会。
第三,分解复杂问题。难题往往可以分解成一系列较简单的子问题。思维链迫使模型做这个分解,每个子问题相对简单,组合起来解决整体问题。
DeepSeek-R1 的训练过程是推理模型领域最值得关注的研究成果之一,其核心训练方法是 GRPO(Group Relative Policy Optimization)。
1.5.2 GRPO 的基本思路
# GRPO 的核心思路(伪代码,非完整实现)
def grpo_training_step(model, question):
"""
对每道题生成多个答案,以组内相对表现作为奖励信号。
避免了 PPO 需要独立价值函数(Critic)的复杂性。
"""
# 步骤 1:对同一道题采样多个答案(通常 8-16 个)
answers = [model.generate(question) for _ in range(8)]
# 步骤 2:用规则验证每个答案是否正确
# 数学题:直接对比最终数值;代码题:运行测试用例
rewards = [verify_answer(question, ans) for ans in answers]
# 步骤 3:计算组内基线(去中心化)
baseline = mean(rewards)
advantages = [r - baseline for r in rewards]
# 步骤 4:用相对优势更新策略
# 比平均水平好的答案 → 提高其概率
# 比平均水平差的答案 → 降低其概率
loss = policy_gradient_loss(model, question, answers, advantages)
return loss
1.5.3 CoT 的涌现:无监督发现推理
DeepSeek-R1-Zero(无任何 SFT,纯 RL)的训练过程中出现了一个意外现象:模型自发学会了思维链推理(CoT,Chain of Thought,即让模型一步步展示推理过程而不是直接给答案)。在训练早期,模型直接给答案;随着训练推进,模型开始在答案前生成越来越长的中间步骤,且这些步骤是有逻辑意义的推理过程。
这一发现意义重大:CoT 不需要人工标注,可以从强化学习信号中涌现,只要任务有清晰的正确/错误奖励信号(如数学验证)。
| 训练阶段 | 方法 | 作用 |
|---|---|---|
| DeepSeek-R1-Zero | 纯 GRPO RL(无 SFT) | 证明 CoT 可以涌现 |
| DeepSeek-R1 | 冷启动 SFT + GRPO RL | 推理格式更规范,可读性更好 |
| 蒸馏(Distillation) | 用 R1 生成数据训练小模型 | R1-7B 保留了大量推理能力 |
1.6 Budget Tokens:推理长度与准确率的权衡
推理模型的输出长度不是固定的,可以通过 Budget Tokens(预算 Token)参数控制。
from openai import OpenAI
client = OpenAI()
# 控制推理深度:max_completion_tokens 限制总输出(含推理链)
# reasoning_effort 是更高级的控制(low/medium/high)
response = client.chat.completions.create(
model="o3-mini",
messages=[{"role": "user", "content": "证明黎曼假设"}],
# reasoning_effort 控制模型在推理上投入多少计算
# "low" → 快速浅层思考;"high" → 深度长链推理
reasoning_effort="high",
max_completion_tokens=16000 # 包含推理链的总 token 上限
)
# 查看实际使用的推理 token 数量
usage = response.usage
print(f"提示 Token: {usage.prompt_tokens}")
print(f"推理 Token: {usage.completion_tokens_details.reasoning_tokens}")
print(f"输出 Token: {usage.completion_tokens}")
调用 DeepSeek-R1(通过兼容 OpenAI 的 API)并获取推理内容:
import openai
client = openai.OpenAI(
api_key="your_deepseek_api_key",
base_url="https://api.deepseek.com"
)
response = client.chat.completions.create(
model="deepseek-reasoner",
messages=[
{"role": "user", "content": "用 Python 实现快速排序,并分析时间复杂度"}
],
# DeepSeek-R1 通过 reasoning_content 字段暴露推理过程
)
# 提取推理链(think 标签内容)
if hasattr(response.choices[0].message, 'reasoning_content'):
reasoning = response.choices[0].message.reasoning_content
print("推理过程:", reasoning[:500], "...")
# 提取最终答案
answer = response.choices[0].message.content
print("最终答案:", answer)
1.7 适合 vs 不适合推理模型的任务
| 任务类型 | 适合推理模型? | 原因 |
|---|---|---|
| 竞赛数学(AIME、AMC) | 非常适合 | 需要多步推导,有明确正确答案可验证 |
| 算法题(LeetCode Hard) | 非常适合 | 需要规划、实现、调试迭代 |
| 逻辑推理谜题 | 非常适合 | 需要穷举假设和回溯 |
| 代码 Debug(复杂逻辑错误) | 适合 | 需要系统性分析调用栈和状态 |
| 简单问答("法国首都是?") | 不适合 | 延迟高、成本高,结果一样 |
| 创意写作 | 不适合 | 推理链无助于提升创意质量 |
| 实时对话(客服、聊天) | 不适合 | 首 Token 延迟数秒不可接受 |
| 文档摘要 | 不适合 | 不需要推理,直接提取即可 |
1.8 推理模型的局限性
1. 延迟问题
推理模型首 Token 出现时间(TTFT)可达数十秒,总响应时间可达数分钟。这使其不适合任何需要实时响应的场景。
2. 成本倍增
推理 Token 与输出 Token 计费相同,一道数学题可能产生 2000 Token 的推理链,成本是普通 LLM 的 10-50 倍。
3. 思考过程不透明
尽管 <think> 标签让推理可见,但这并不等于模型的"真实思考过程"——模型没有显式的规划机制,推理链是自回归生成的,与最终答案有时并不完全一致。
4. 过度推理(Overthinking)
简单问题上,推理模型会进行无谓的冗长分析,浪费 Token 且可能引入错误("想太多")。
1.9 小结
推理模型的核心贡献在于将"计算预算"从训练时转移到推理时,使得同一个模型在不同任务上可以动态分配计算资源。
| 维度 | 普通 LLM | 推理模型 |
|---|---|---|
| 生成策略 | 直接输出答案 | 先推理,再输出 |
| 推理时计算 | 固定(O(n) tokens) | 可动态扩展(数十倍) |
| 数学/代码能力 | 中等 | 显著提升 |
| 延迟 | 低(秒级) | 高(数十秒至数分钟) |
| 成本 | 低 | 高(10-50 倍) |
| 训练方式 | SFT + RLHF | SFT + 规则奖励 RL(GRPO 等) |
| 代表模型 | GPT-4o、Claude Sonnet 系列 | o3、DeepSeek-R1、Claude 3.7 Extended Thinking 及之后版本 |
选择推理模型的判断标准只有一个:这道题用普通 LLM 答不对,且答案的正确性值得支付 10 倍以上的成本和延迟。