模型是怎么学会思考的

模型是怎么训练出来的 的结尾说,推理模型的训练值得单独写一篇。这就是那一篇。

上一篇讲到,拿「对错」当奖励做强化学习,模型自己就能学出先想后答的习惯,训练中途还冒出了「Wait, wait. Wait.」的反思瞬间。这个故事只讲了惊喜的一半,这篇把另一半补上,顺便解开几个新问题:

  • 你在 App 里看到的「思考过程」到底是什么?「深度思考」开关按下去,模型内部发生了什么变化?
  • 既然纯强化学习就能训出推理能力,正式版的 DeepSeek-R1 为什么还要做两轮 SFT?
  • 思考按什么价格计费?什么任务值得开思考,什么任务纯属浪费钱?

老规矩,不需要机器学习背景,我们出发。

思考过程只是普通的 token

先破除神秘感:思考过程不是模型的「内心活动」被什么特殊仪器观测到了,它就是模型输出的普通文本。

LLM 是怎么预测下一个 token 的 讲过,模型只会做一件事:根据前文接龙出下一个 token。思考模式的全部实现就是:模型先接龙出一段思考,再接龙出正式回答,中间用一对标签隔开。原始的输出流长这样:

<think>用户问 9.11 和 9.9 哪个大。先比较整数部分,都是 9;再比较小数部分……</think>9.9 更大。

<think></think> 是一对控制 token,和上一篇 chat template 里的 <|im_start|> 是同类角色:不是说给用户听的话,只用来标记文本结构。服务端解析输出流,把标签里的内容拆出来放进响应的独立字段,App 再把这个字段渲染成可折叠的「思考过程」面板。

亲眼看一次。用 Ollama 在本地运行大模型 里我们在本地跑过 qwen3:0.6b,当时请求里带着 think: false,现在把它改成 true

curl http://localhost:11434/api/chat -d '{
  "model": "qwen3:0.6b",
  "messages": [{"role": "user", "content": "9.11 和 9.9 哪个大?"}],
  "think": true,
  "stream": false
}'

响应节选:

{
  "message": {
    "role": "assistant",
    "content": "9.11 和 9.9 中,9.9 更大。……",
    "thinking": "好的,我现在要解决的问题是:9.11 和 9.9 哪个大?……接下来,小数部分分别是1和9,所以第一个数是0.11,第二个数是0.99。……不过,我刚才的思考过程中有没有哪里出错了呢?比如,有没有可能把小数点后的位数搞错了?……所以答案应该是9.9更大。"
  },
  "eval_count": 844
}

Ollama 把 <think> 标签里的内容拆到了 thinking 字段,正式回答放在 content 字段。留意思考里那句「我刚才的思考过程中有没有哪里出错了呢」:没人要求它检查,它自己回头验算了一遍,这就是上一篇说的反思行为。

这道题是有意挑的,「9.11 和 9.9 哪个大」是出了名容易翻车的问题。把 think 改回 false 再问一遍:

{
  "message": {
    "role": "assistant",
    "content": "两者都是数字,但需要明确它们的具体数值才能比较。……如果它们是同一个数的两位小数,比如 9.11 和 9.9,那么:9.9 > 9.11。但如果没有明确的数值,无法直接比较。……"
  },
  "eval_count": 103
}

不让思考,这个 0.6B 的小模型就开始说胡话了。两次实验的 eval_count(输出 token 数)也值得留意:思考版 844,不思考版 103,差了 8 倍,这笔账后面还要算。

那「关闭思考」又是怎么实现的?是不是切换到了另一套推理逻辑?

比你想的简单得多。Qwen3 的 chat template 里写着:如果请求关闭思考,就在 assistant 起手的位置,直接替模型填好一个空的思考块:

<|im_start|>assistant
<think>

</think>

模型接龙时一看,思考块已经闭合了,只好直接写答案。所谓开关,不过是在接龙的开头做了点手脚。

反方向的手法也存在。DeepSeek 在 R1 的 使用建议 里说,R1 偶尔会偷懒跳过思考,输出一个空的 <think></think>,官方给的对策是部署时强制让模型的输出以 <think> 开头,逼它把思考写出来。

所以思考模式没有引入任何新机制,从头到尾还是那个文字接龙游戏。真正的问题是:怎么训练,才能让模型接龙出一段真正有用的思考,而不是装模作样的车轱辘话?这是接下来的主线。

会推理,但不说人话

上一篇讲过 RLVR 的思路:数学题对不对、代码过不过测试用例,机器自动判分,模型就能没日没夜地刷题,答对强化,答错惩罚。

DeepSeek 在 R1 论文 里做的第一个实验极其激进:拿 DeepSeek-V3 的 Base 模型,跳过所有 SFT,直接上大规模强化学习。注意这个起点,Base 模型是只做过预训练的「文档补全器」,连怎么聊天都没学过。这个实验版本叫 R1-Zero,Zero 指的就是全程零 SFT 数据。

结果上一篇已经剧透了:推理能力真的自己长出来了。反思、验算、换思路重来,这些行为没人教,模型在刷题过程中自己悟了出来。

但论文毫不讳言实验的另一面:R1-Zero 的输出可读性很差,还经常中英文混杂。

想想也不奇怪。奖励信号只看最终答案对不对,思考过程写成什么样,根本没人管;而它的底子是个 Base 模型,「好好说话」这门课压根没上过。一个只在乎答案对错的裁判,加一个没学过礼仪的学生,训出来就是个说话半中半英、格式稀碎的解题狂人。

推理能力是真的,但这样的模型没法当产品用。一边是纯 RL 训出的真实推理能力,一边是没法见人的表达,怎么两全?DeepSeek 的答案是把上一篇讲过的训练手段重新排列组合,这就是正式版 R1 的训练流水线。

四阶段流水线

正式版 R1 的训练分四步走。

第一步,冷启动 SFT。收集几千条人工整理的高质量推理数据(带着完整思考过程的问答),先给 Base 模型做一轮 SFT。几千条数据教不会推理,这一步的目的只是打底子:让模型先学会说人话、按格式写思考。

第二步,推理强化学习。和 R1-Zero 一样的大规模 RL,主攻数学、代码这些能自动判分的任务。为了治中英文混杂的老毛病,这一阶段的奖励里加了一项语言一致性奖励:思考过程里目标语言的词占比越高,分越高。论文坦承这一项会轻微牺牲推理性能,但换来了可读性,值得。

第三步,拒绝采样再 SFT。等 RL 快收敛时,用这个中间模型批量做题,只保留答对的、质量好的回答,筛出约 60 万条推理样本;再配上约 20 万条写作、问答之类的非推理数据,共约 80 万条,回炉做一轮新的 SFT。

有意思的是,这轮 SFT 不是接着中间模型继续训,而是回到最初的 DeepSeek-V3-Base 重新微调。前两个阶段辛辛苦苦训出的模型,最终角色是个数据生成器。这个套路你上一篇就见过:老师做题,学生刷题,蒸馏的思想在这里被用成了「模型自己当自己的老师」。

第四步,全场景强化学习。最后再做一轮覆盖所有场景的 RL:推理任务继续用规则判分,通用对话任务则用奖励模型评估人类偏好,也就是上一篇讲的 RLHF 那一套,负责把有用、无害这些对齐目标补上。

数一数,SFT 用了两次,RL 也用了两次。上一篇把预训练、SFT、RLHF 讲成一条直线流程,R1 的流水线告诉你实情:这些手段是一个工具箱,高手是按需组合、反复套用的。顺带一提,第三步攒下的那 80 万条数据后来还被拿去微调 Qwen 和 Llama,就是上一篇讲的 R1 蒸馏小模型的原料。

奖励怎么设计

流水线里两轮 RL 的成败,全系在奖励信号上。上一篇把 RLVR 概括成「拿对错当奖励」,实际操作里的讲究值得展开说说。

对错之外,还有格式

R1-Zero 的奖励其实有两部分。

准确性奖励看结果:数学题要求把最终答案写在指定格式里(比如一个方框中),程序按规则提取出来和标准答案比对;编程题直接跑测试用例。格式奖励看形式:思考过程必须写在 <think></think> 标签之间,写对了才有分。

第一节那对标签的来历,答案就在这:它不是 API 层的发明,是训练时用真金白银的奖励刻进模型习惯里的。模型天生并不知道思考要打标签,是「不打标签拿不到分」逼出来的肌肉记忆。

为什么不用奖励模型当裁判

你可能会问:上一篇 RLHF 不是专门训了一个奖励模型来打分吗?这里为什么弃用,换成死板的规则判分?

论文给了明确理由:在大规模强化学习里,神经网络奖励模型会遭遇 reward hacking(奖励作弊)。被训练的模型迟早会找到裁判的漏洞,生成一些能骗到高分、实际质量很差的回答,训练越久跑偏越远。

裁判是个神经网络,就有空子可钻;裁判是「答案对不对」的硬规则,空子就少得多、也难钻得多。RLVR 能让模型这样没日没夜地刷上数千步,靠的正是这个难以作弊、全自动的裁判。

GRPO:一组回答互相比较

奖励之外还有一个工程上的成本大头。

经典的 RL 算法(比如 RLHF 常用的 PPO)除了被训练的模型本身,还要额外跑一个价值模型(critic),负责估计「这道题正常水平能拿几分」,模型的实际得分和这个预期一比,才知道该强化还是该抑制。注意它和上面的奖励模型不是一回事:奖励模型是打分的裁判,价值模型是预测基准线的参谋。麻烦在于,这个参谋的个头通常和被训练的模型一样大。训一个 671B 的模型,旁边还得供着另一个 671B 的陪练,显存和算力直接翻倍。

DeepSeek 训练 R1 用的 GRPO(Group Relative Policy Optimization,组相对策略优化) 把这个陪练裁掉了。思路很直观:同一道题让模型生成一组回答,组内平均分就是基准线,高于平均的强化,低于平均的抑制。「正常水平能拿几分」不再需要一个 671B 的模型来预测,一组回答互相一比就出来了。

想得越久,答得越好

R1 论文里最耐人寻味的是一条曲线:随着训练推进,R1-Zero 的平均回答长度稳步增长,从几百 token 涨到几千 token。

要知道,奖励信号里没有任何一项鼓励它写长。是模型自己发现「多想几步更容易答对」,于是越想越长;反思、验算这些行为也是在这个过程中自然冒出来的。论文特别强调,这不是外部调整的结果,而是模型在训练环境里的自发演化。

这条曲线的意义超出了 R1 本身。以前提升模型性能只有一条路:堆参数、堆数据、砸钱重训。现在多了正交的第二条路:让模型在回答时多算一会儿,业界管它叫 test-time compute(推理时算力)。OpenAI 在 o1 的介绍 里说得很直白:o1 的性能既随训练算力增加而提升,也随思考时间增加而提升。前一条路要几百万美元起步,后一条路只要你多等几秒、多付一点 token 钱。

但硬币还有另一面:思考是要花钱的。前面那道 9.11 的题,思考版答得又对又清楚,代价是 8 倍的输出 token。而且模型一旦养成思考习惯,再简单的问题它也要走一遍完整流程,这个现象有个专门的名字叫 overthinking(过度思考)。质量和成本怎么平衡,就是最后一个话题。

思考模式该开还是该关

回到用的视角,几件事想清楚,这个功能就算用明白了。

思考要花钱,而且花的是最贵的钱。 思考内容走的是输出通道,按输出 token 计价,而 LLM 是怎么预测下一个 token 的 讲过,输出 token 是价格表上最贵的一档。DeepSeek API 响应的 usage 明细里专门有一项 reasoning_tokens,归在输出 token 之下,就是这部分开销。除了钱,还有等待:正式回答要等思考写完才开始出现,对话式产品里体感很明显。

思考内容不进下一轮上下文。 上下文是什么?token 怎么计费? 讲过,多轮对话就是把历史消息重发一遍。但思考过程默认不算历史的一部分:DeepSeek 的 思考模式文档 写明,上一轮的 reasoning_content 不需要传回,传了也会被忽略;Qwen3 的 chat template 干脆在拼接历史时自动把旧思考丢掉。道理很简单:思考是草稿纸,结论已经写进正式回答里了,草稿没必要一直占着上下文。唯一的例外是带工具调用的请求,DeepSeek 要求这种场景必须把 reasoning_content 传回去,等后面讲 Agent 开发时你会碰到它。

按任务决定开关。 DeepSeek V4 的思考默认就是开的,上下文是什么?token 怎么计费? 里所有 curl 示例带的 "thinking": {"type": "disabled"},就是在显式关掉它;想留着思考但控制力度,用 reasoning_effort 参数调档位(low / high / max)。经验上,数学、代码、多步规划这类「差一步都不行」的任务,思考带来的质量提升实打实;翻译、摘要、格式转换、闲聊这类任务,开思考纯属多花钱多等待。拿不准就保持默认,对成本和延迟敏感的批量简单任务显式关掉。后面 动手实现一个 Coding Agent 时你会看到,我们会给 Agent 开着思考模式,复杂任务的规划质量明显不一样。

最后说个有意思的现象:思考模式的产品形态,行业到今天也没定型。

Qwen3 在 2025 年 4 月 发布时 走的是融合路线:训练的后段用长思维链数据和普通指令数据混在一起微调,让同一个模型既会思考也会秒答,甚至支持在对话里用 /think/no_think 指令逐轮切换。三个月后,Qwen 官方 宣布放弃混合模式,把 Instruct 和 Thinking 拆成两个模型分开训练,理由是融合损害了质量。又过了半年,2026 年 2 月的 Qwen3.5 再次回归单模型:默认思考,砍掉 /think 软开关,只留 API 参数控制。

DeepSeek 这边你已经知道了:独立的 deepseek-reasoner 在 2026 年退役,思考变成 V4 请求里的一个开关。分分合合背后,唯一稳定的趋势是:思考能力本身成了新模型的标配,变来变去的只是开关长什么样。

总结

这篇把思考模式从外皮讲到了训练。

思考过程就是夹在 <think> 标签里的普通 token,开关思考只是在接龙开头做手脚;纯 RL 的 R1-Zero 证明了推理能力可以自己长出来,但不说人话,正式版 R1 用两轮 SFT 加两轮 RL 的组合拳两全了能力和表达;奖励设计上,规则裁判防住了 reward hacking,GRPO 用组内互比省掉了同尺寸的陪练模型。

最值得记住的是那条自然增长的曲线:没人教模型多想,它自己发现了想得越久答得越好。test-time compute 从此和堆参数并列,成了提升模型能力的第二根性能轴。

用的时候记住三件事:思考按最贵的输出价计费、草稿不进下一轮上下文、按任务类型决定开关。

到这里,LLM 基础知识这一章就完整了:从预测下一个 token,到本地跑起一个模型,到看懂模型文件,到训练和思考的来龙去脉。下一章 动手实现一个 AI 聊天机器人,我们开始写代码,把这些知识真正用起来。