--- title: "03-推理模型详解:当AI学会慢思考" created: 2026-05-15 tags: - 博客 --- # 推理模型详解:当AI学会慢思考 前面讲过 CoT(思维链)——让模型在 Prompt 里一步步写出推理过程,提高复杂问题的准确率。当时提到"一些模型内置了深度思考能力",但没展开。 2025 年下半年开始,AI 领域最大的变化之一,就是**推理模型(Reasoning Models)** 的崛起。OpenAI 的 o1、o3,DeepSeek 的 R1,Anthropic 的 extended thinking……这些模型和传统 LLM 有着根本性的不同。 > 如果传统 LLM 像"快思考"——凭直觉直接给答案,那推理模型就像"慢思考"——停下来仔细琢磨,想清楚了再说。 这篇文章咱们就来深入聊聊这个改变 AI 能力格局的新范式。 ## 传统 LLM 的"快思考"困境 你还记得大模型是怎么工作的吗?给定上文,预测下一个 Token,一个接一个,直到完成回答。这个过程是**逐 Token 自回归生成**——每生成一个 Token,就根据之前的内容决定下一个。 这个机制有一个天生的弱点:**它没法"回头想"**。Token 一旦生成就确定了,不能回头修改。就像一个人说话,说了就收不回来。 ### 一个真实的问题 让传统 LLM 算这道题: > 小明有 15 个苹果,他给小红分了 3 个,给小李分了小红的 2 倍,又给小王分了剩下的 1/3。小明最后还剩几个? 传统模型可能会这样算: ``` 15 - 3 = 12 小红的 2 倍 = 3 × 2 = 6 12 - 6 = 6 6 - 6/3 = 6 - 2 = 4 答案是 4 个 ``` 看起来思路清晰,但实际上你仔细验算一下:小红 3 个,小李 6 个,一共分出去 9 个,剩 6 个。小王分剩下的 1/3 = 2 个。小明最后剩 6 - 2 = 4 个。答案倒是对的。 但是如果把数字换得复杂一点,或者增加几步推理,传统模型很容易在"预测下一个 Token"的过程中跑偏——某一步生成错了,后面就一路错下去。这在数学、逻辑、代码等需要精确多步推理的领域特别致命。 ### "一步错,步步错"的根本原因 把问题说得更技术一点。传统 LLM 在推理时: 1. 每个 Token 只计算一次,用固定的计算量 2. 模型不知道自己会犯错(没有自我纠错机制) 3. 错误会累积——第 3 步算错了,第 4 步基于错误结果继续算 这就是所谓的 **System 1(快思考)**——直觉式的、自动的、不怎么费脑子的思考方式。这在日常聊天、简单问答中完全够用,但在需要深度推理的场景下就显得不够可靠。 ## 推理模型的"慢思考"革命 2024 年 9 月,OpenAI 发布了 o1(当时代号 Strawberry),标志着 AI 推理能力的质变。随后 DeepSeek 在 2025 年 1 月开源了 R1,把推理模型的竞争推向了高潮。 ### o1/o3 的核心创新:Test-time Compute Scaling > **Test-time Compute(推理时计算)**,也叫 Inference-time Scaling,是推理模型最核心的理念:**在推理阶段投入更多计算资源,让模型有"时间"去思考。** 传统模型的推理过程是固定的——给定输入,模型以固定的计算量生成输出。每个 Token 的花费是一样的。 推理模型打破了这个限制。面对复杂问题时,它会在内部进行大量的"隐藏推理": ``` 用户:请证明根号2是无理数。 传统模型(快思考): 假设根号2是有理数,则存在互质的整数p,q使(p/q)^2=2... 直接输出证明过程(可能中间有跳跃或小错误) 推理模型(慢思考): [内部:我需要用反证法。先假设根号2是有理数…… 等等,这里互质条件很重要,要明确说明…… p^2=2q^2,这说明p是偶数…… 设p=2k代入……那么q也是偶数…… 矛盾!因为p和q应该互质,但都被2整除…… 没问题,逻辑通顺。可以输出了。] 假设根号2是有理数,则存在互质的整数p和q使得根号2=p/q…… (输出经过充分验证的证明过程) ``` 方括号里的部分是"内部推理"——用户看不到,但它消耗了大量的计算资源。 ### Token 消耗的对比 同一个问题,不同模型的 Token 消耗: | 问题 | 传统模型输出 | o1 内部推理 | o1 可见输出 | | --- | --- | --- | --- | | 解一道微积分题 | ~200 Token | ~2000 Token | ~300 Token | | 分析一个法律条款 | ~500 Token | ~3500 Token | ~400 Token | | 写一段 Python 代码 | ~300 Token | ~800 Token | ~350 Token | 大部分 Token 消耗在"内部思考"上。这些思考过程对于 API 使用者来说是要付费的(虽然你看不到内容),但换来的是准确率的大幅提升。 ### 内部推理的内容特征 虽然 OpenAI 没有公开 o1 的完整内部推理过程(原因是安全和竞争),但 DeepSeek-R1 开源了它的完整思考链。看一个真实例子: ``` 用户:一个 10L 的容器装满了水,还有一个 7L 和一个 3L 的空容器。 如何得到 5L 水? R1 思考过程: 好的,这是一个经典的倒水问题。让我一步步分析。 初始状态:10L满(10),7L空(0),3L空(0) 目标:得到 5L 我需要考虑倒水的各种可能性。从大容器往小容器倒是最自然的。 方案1:从10L倒到7L... 10L倒满7L → (3,7,0) 7L倒满3L → (3,4,3) 3L倒回10L → (6,4,0) 7L倒满3L → (6,1,3) 3L倒回10L → (9,1,0) 7L倒入3L → (9,0,1) 10L倒满7L → (2,7,1) 7L倒满3L → (2,5,3) ← 7L容器中正好是5L! 验证:2+5+3=10✓ 目标达成。 这个路径是正确的。让我想想还有没有更短的路径... 可以通过以下步骤得到5L水: 1. 将10L容器的水倒入7L容器 → (3,7,0) 2. 将7L容器的水倒入3L容器 → (3,4,3) ... ``` 你能看到 R1 在思考过程中做了这些事: - **拆解任务**:识别出这是"倒水问题" - **穷举探索**:尝试不同的倒水路径 - **自我验证**:每一步都验证状态是否正确 - **寻找最优解**:思考完一个路径后,还问"有没有更短的" - **错误修正**:如果某条路走不通,它会注意到并切换 这种"自言自语"式的内部推理,是人类解决复杂问题时的自然方式。现在 AI 也能这样做了。 ### R1 的"啊哈时刻" DeepSeek-R1 训练过程中有一个著名的"啊哈时刻"(Aha Moment)。研究人员发现,R1 在强化学习训练中自然而然地学会了: - **自我质疑**:"等等,上一步可能有问题……" - **回溯修正**:"让我重新检查一下第三步的计算……" - **策略切换**:"这种方法行不通,换个思路试试……" 这些行为**没有被人为编程进去**——它们是模型在训练中自然涌现的。这让研究人员自己都感到震惊。 ## GRPO:让 R1 学会思考的训练方法 R1 能涌现推理能力,很大程度上归功于它的训练算法——**GRPO(Group Relative Policy Optimization,群体相对策略优化)**。 ### 传统 RLHF 的局限 之前的大模型训练主要用 RLHF(基于人类反馈的强化学习)。流程是: 1. 训练一个奖励模型(Reward Model)来模拟人类偏好 2. 用这个奖励模型来强化学习微调 LLM 问题在于:**奖励模型也是训出来的,有偏差,且训练成本高。** ### GRPO 的思路 GRPO 是 DeepSeek 团队提出的新方法。它的核心思想很简洁: > **不训练单独的奖励模型,而是让模型自己生成多个答案,通过组内比较来评估每个答案的好坏。** 具体做法: ``` 对同一道题: 模型生成 4 个不同的答案 → [答案A, 答案B, 答案C, 答案D] 对每个答案: - 用规则评分器打分(数学题看最终答案对不对) - 计算组内平均分 - 高于平均分的答案 → 强化这种行为 - 低于平均分的答案 → 抑制这种行为 ``` 这种方式有几个精妙之处: **1. 不需要奖励模型**。用规则(数学题对错)直接打分,避免了奖励模型的偏差。 **2. 组内相对比较**。不是跟某个绝对标准比,而是跟同一批答案的平均水平比。这天然处理了难度差异——难题大家都分低,简单题大家都分高,相对排名才是关键。 **3. 推动了"思考习惯"的形成**。那些得分高的答案往往是经过了更仔细推理的。模型在训练中逐渐学到:多想想、多检查,更可能得到高分。 ### GRPO 和 PPO 的区别 | 维度 | PPO(传统 RLHF) | GRPO | | --- | --- | --- | | **奖励来源** | 训练单独的奖励模型 | 规则打分 + 组内比较 | | **参考基线** | 需要 Value 网络评估优势 | 组内平均分作为基线 | | **计算开销** | 高(需训练和运行多个模型) | 低(只需 LLM 本身) | | **奖励偏差** | 受奖励模型质量影响 | 受规则设计影响 | | **涌现能力** | 有限 | 自我质疑、回溯等行为自然涌现 | ## 主流推理模型对比 截至 2026 年 5 月,主流的推理模型包括: | 模型 | 发布方 | 参数量 | 开源 | 特点 | | --- | --- | --- | --- | --- | | **o3** | OpenAI | 未公开 | 否 | 最强推理能力,支持 low/medium/high 三档推理量 | | **o4-mini** | OpenAI | 未公开 | 否 | 高性价比,推理能力接近 o3 | | **DeepSeek-R1** | DeepSeek | 671B (MoE) | 是 | 开源标杆,完整思考过程可见,API 价格低 | | **DeepSeek-R1-Distill** | DeepSeek | 1.5B-70B | 是 | R1 蒸馏到小模型,本地可部署 | | **Claude 4.5 extended thinking** | Anthropic | 未公开 | 否 | Claude 的扩展思考模式,可按需开启 | | **Gemini 3.1 Deep Think** | Google | 未公开 | 否 | 支持更多推理步骤的增强模式 | | **Qwen3** | 阿里 | 0.6B-235B | 是 | 双模式:思考模式和非思考模式可切换 | ### DeepSeek-R1 的两种用法 R1 有个特别方便的设计:它支持思考模式和非思考模式切换: ``` from openai import OpenAI client = OpenAI( api_key="your-api-key", base_url="https://api.deepseek.com" ) # 方式1:直接使用 R1(内置思考,会自动进行内部推理) response = client.chat.completions.create( model="deepseek-reasoner", # 即 R1 messages=[{ "role": "user", "content": "证明:在任意6个人中,必存在3个人两两认识或两两不认识。" }] ) # 方式2:V3 + "深度思考"模式(控制是否思考) response = client.chat.completions.create( model="deepseek-chat", # V3 messages=[{ "role": "system", "content": "遇到需要推理的问题时,请先仔细思考再回答。" }, { "role": "user", "content": "证明:在任意6个人中,必存在3个人两两认识或两两不认识。" }] ) # 两种方式的结果区别: # R1:输出中有 ... 包含完整思考过程 # V3+提示:思考过程更简略,可能在复杂推理上不如 R1 稳定 ``` ### Spring AI 中使用推理模型 ```java @RestController public class ReasoningController { private final ChatClient reasonClient; public ReasoningController(ChatClient.Builder builder) { // 配置推理模型(以 DeepSeek-R1 为例) this.reasonClient = builder .defaultSystem("你是一个擅长数学和逻辑推理的助手。") .defaultOptions(OpenAiChatOptions.builder() .model("deepseek-reasoner") .temperature(0.6) // 推理模型建议用稍低的温度 .maxTokens(8000) // 给内部推理留足空间! .build()) .build(); } @PostMapping("/solve") public ResponseEntity solve(@RequestBody String problem) { // 注意:如果 API 返回了思考过程,R1 的 标签会包含在内 String response = reasonClient.prompt() .user(problem) .call() .content(); return ResponseEntity.ok(response); } // 流式输出:可以看到模型的"思考过程"逐步流出 @PostMapping(value = "/solve-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux solveStream(@RequestBody String problem) { return reasonClient.prompt() .user(problem) .stream() .content(); } } ``` ## 什么时候用推理模型 推理模型不是万能的。它的"慢思考"有代价: ### 代价 1. **更贵**:o1 内部的隐藏 Token 也要付费,一个复杂问题可能消耗 10 倍于普通模型的 Token 2. **更慢**:生成思考过程需要额外时间,一个数学证明可能需要 30 秒甚至更久 3. **输出不可控**:你不能精确控制思考过程的长度和方向(虽然 o3 提供了 low/medium/high 三档) 4. **对简单问题过度思考**:问它"1+1 等于几",它也可能"深思熟虑"一番 ### 场景选择指南 | 场景 | 推荐模型类型 | 原因 | | --- | --- | --- | | 数学证明、复杂计算 | **推理模型** | 需要多步严格推导 | | 逻辑推理(逻辑谜题、智力题) | **推理模型** | 需要系统化穷举和验证 | | 竞赛编程(ACM/LeetCode Hard) | **推理模型** | 需要算法设计和正确性验证 | | 法律条款分析 | **推理模型** | 需要精确的逻辑推导和条件判断 | | 日常对话、闲聊 | 传统模型 | 不需要深度推理,推理模型浪费 | | 事实问答、知识查询 | 传统模型 + RAG | 答案在文档中,不需要深度推理 | | 创意写作、头脑风暴 | 传统模型 | 推理可能限制创意 | | 翻译 | 传统模型 | 翻译不需要复杂推理 | | 企业客服、常规查询 | 传统模型 | 任务模式固定,不需要深度推理 | | 代码补全、简单代码生成 | 传统模型 | 速度快更重要 | | 复杂系统架构设计 | **推理模型** | 需要权衡多种方案,多步推理 | **实用策略:先用传统模型,失败了再升级。** 大多数场景下,传统模型就够了。遇到它反复搞不定的复杂问题时,再切换到推理模型。这样既省成本又省时间。 ## 推理模型和 RAG 的关系 一个常见的问题是:RAG 和推理模型怎么配合? 答案是:**它们解决的是不同层面的问题,可以叠加使用。** ``` 用户问题 ↓ RAG 检索相关文档 ──→ 获得上下文知识 ↓ 推理模型拿到"知识 + 问题" ↓ 内部深度推理(基于提供的知识进行逻辑推演) ↓ 输出经过验证的答案 ``` RAG 解决了"知识从哪里来"的问题(补充了训练数据中没有的最新知识和私有数据),推理模型解决了"知识怎么用"的问题(需要逻辑推导才能得出答案的场景)。 比如问:"基于公司去年的财报数据,预测今年 Q3 的营收趋势,并说明预测依据。" - RAG 负责:检索去年的财报数据,提供给模型 - 推理模型负责:分析数据规律、考虑季节性因素、给出有逻辑链条的预测 ### Java 实现示例 ```java @Service public class RAGReasoningService { private final VectorStore vectorStore; private final ChatClient reasonClient; public RAGReasoningService(VectorStore vectorStore, ChatClient.Builder builder) { this.vectorStore = vectorStore; this.reasonClient = builder .defaultOptions(OpenAiChatOptions.builder() .model("deepseek-reasoner") // 推理模型 .build()) .build(); } public String analyzeWithReasoning(String question) { // Step 1: RAG 检索相关文档 List docs = vectorStore.similaritySearch( SearchRequest.query(question).withTopK(5) ); String context = docs.stream() .map(Document::getContent) .collect(Collectors.joining("\n\n")); // Step 2: 推理模型基于上下文进行深度分析 return reasonClient.prompt() .user(""" 请基于以下参考材料,回答用户的问题。 在进行推理时,请: 1. 先列出问题中涉及的关键数据 2. 逐步推导你的分析过程 3. 每一步都要基于材料中的具体数据 4. 如果材料信息不足,明确指出 ===参考材料=== %s ===用户问题=== %s """.formatted(context, question)) .call() .content(); } } ``` ## 推理模型的未来趋势 推理模型的发展远未停止。几个值得关注的方向: **1. 推理量可控(如 o3 的 low/medium/high)** 用户可以根据任务复杂度选择推理深度。简单问题用 low(快且便宜),复杂问题用 high(慢但精确)。这解决了"简单问题也过度思考"的问题。 **2. 推理 + 工具调用** 让推理模型在思考过程中自己决定调用什么工具。比如做数据分析时,它推理到"需要先计算标准差",就自己调用 Python 执行器算出来,然后基于结果继续推理。 ``` # 推理模型 + 工具调用的典型模式 # 思考过程: # # 我需要先得到数据集的描述性统计... # → 调用 calculate_stats(data) # 结果:均值=45.2, 中位数=43.7, 标准差=12.8 # 标准差较大说明数据离散度高。接下来我需要做一个假设检验... # → 调用 t_test(data, mu=40) # 结果:p-value=0.032 # p<0.05,拒绝原假设。结论是显著偏离40。 # ``` **3. 推理蒸馏** 把大推理模型(如 R1 671B)的推理能力蒸馏到小模型中(如 R1-Distill-Qwen-7B)。这让消费级设备也能跑推理模型。 **4. 推理可视化** 让用户看到模型的思考过程不只是为了"炫技",而是为了**建立信任**。你能看到它是怎么得出答案的,就知道该不该信。 ## 小结 这篇文章咱们搞清楚了推理模型的几个核心问题: **传统 LLM 的局限**:逐 Token 生成,没有"回头想"的机制,容易在复杂推理中"一步错步步错" **推理模型的创新**:Test-time Compute Scaling——在推理阶段投入更多计算,进行内部深度推理 **DeepSeek-R1 和 GRPO**: - R1 是开源推理模型的标杆,完整展示思考过程 - GRPO 用组内相对比较代替奖励模型,让思考行为自然涌现 - "啊哈时刻"——自我质疑、回溯修正是模型自己学会的 **使用策略**:不是所有场景都需要推理模型。日常任务用传统模型(快、便宜),复杂推理用推理模型(慢、精确、贵)。先默认用传统模型,搞不定再升级。 **与 RAG 配合**:RAG 提供知识,推理模型负责逻辑推演,两者可叠加使用。 下一篇文章咱们来聊 **A2A(Agent-to-Agent)协议**——当多个 AI 智能体需要互相通信和协作时,它们之间怎么"对话"。