R1后范式最佳实践:Seed-Thinking和Qwen3

本文介绍两个R1后新范式最佳实践的模型(系列):Seed-Thinking-v1.5和Qwen3,感受一下R1后新范式的实践情况。

Seed-Thinking-v1.5

DeepSeek R1后LLM新范式 | Yam[1]中,我们提到了R1带来的一些新范式。Seed-Thinking-v1.5就是其中经典的范式:SFT+RL。Seed-Thinking-v1.5采用MoE,总参数200B,激活20B。我们重点关注它的数据、SFT和RL相关部分。

Data

数据可以分为两大类:有确定并可验证答案的问题和没有确定答案的问题。这两类其实对应的就是推理类数据和非推理类数据,推理能力主要来自第一部分。

可验证问题

STEM:数学、物理、化学,数学占80%以上。共100k高质量竞赛级问题。其中数学数据表现出较强的泛化能力。

数据处理:

  • 剔除题目陈述不完整、符号不统一或要求不清晰的问题。
  • 使用Doubao-Pro 1.5生成多个回复,剔除模型在WoN(worst of N)得分为1的问题(过于简单)。
  • 用SOTA模型为每个问题生成多个候选回复,如果模型输出与参考但不一致,但模型内部输出高度一致,或者只有极少量推理步骤。这些问题参考答案可能有误,后续由人工专家审核。
  • 数据增强:
    • 将选择题转换为填空题或简答题,消除猜测带来的影响。
    • 对部分数学题目进行修改,尽可能确保答案为整数。

Code:优先选取高质量且具有挑战性的算法任务,主要来源于知名的竞赛编程赛事。

数据处理:

  • 规范性过滤。确保每道题包含完整的规范说明:清晰的问题描述、一组单元测试、检查脚本。
  • 难度过滤。确保题目具有适当的复杂性,并且能够适用于真实世界的算法推理任务。

Logical Puzzle Data:22个常见任务,包括24点,迷宫、数独等共10k问题。该数据对性能提升贡献显著。

数据处理:

  • 针对每个任务构建数据生成器和答案验证器。

无确定答案问题

包括需要基于人类偏好进行质量评估的非推理任务,如创意写作、翻译、知识问答、角色扮演等内容,覆盖各个领域。

数据处理:

  • 剔除得分方差低、难度低的数据。具体做法是,用SFT模型给每个问题生成多个候选回复,并用奖励模型打分。
  • 剔除奖励分数提升超过设定阈值的问题(过于简单),过度优化此类样本会导致模型探索空间过早收缩。

采用成对(pairwise)比较的奖励方法打分和RL训练。

Benchmark

因为AIME规模有限,方差大,构建了新的基准数据集:BeyondAIME,共100道。

纯人工构建,与数学专家合作,基于既有竞赛形式开发的原创题目。所有题目的答案均为整数,题目的答案不会是显而易见的数值,每道题难度均不低于 AIME 中最难题目的水平。

Reward

同R1,Reward针对推理和非推理类数据也分两种。

可验证问题

设计了两种解决方案:

  • Seed-Verifier:基于人工编写的规则,LLM评估(问题、参考答案、模型答案),如果参考答案和模型答案本质上等价(非形式),则返回Yes,否则返回No。
  • Seed-Thinking-Verifier:受人类判断过程的启发,训练了一个能够为评估提供详细推理路径的验证器,验证器可以剖析参考答案与模型答案的相似性和差异,提供精确且细致的判断结果。

Seed-Thinking-Verifier缓解了Seed-Verifier的几个问题:

  • 奖励Hacking:无思维模型可能会利用漏洞获取奖励,而不是真正理解问题。
  • 预测结果的不确定性:参考答案和模型答案本质上等价的情况下,格式可能不同,Seed-Verifier返回不稳定。
  • 边界Case失败。

完全可以把Seed-Thinking-Verifier看作是另一个推理模型,它的格式也是先<think>再输出<answer>。根据实验结果看,还是有一定提升的。

无确定答案问题

训了一个成对生成奖励模型,它可以评估两个回答的优劣,并使用“Yes”或“No”的概率作为最终奖励分数。这种直接比较回答之间差异的方法,提高了RL训练的稳定性,尤其是在涉及可验证和不可验证问题的混合训练场景中,最大限度地减少了两种不同奖励建模范式之间的冲突。

Training

主要是SFT+RL范式。

SFT

SFT为后续的RL阶段奠定基础,与从Base启动RL相比,SFT启动的模型生成的输出更具可读性,幻觉现象较少,危害性降低。

数据400k,初步实验发现过多的非CoT SFT 数据会显著降低模型的探索能力,因此推理类数据占了大头,共300k,从RL训练集中随机抽样得到。非推理类数据100k,来自Doubao-Pro 1.5的SFT数据,涵盖创意写作、基于知识的问答、安全性和函数调用等领域。

生成高质量CoT数据流程(模型合成、人工标注和拒绝采样):

  • 人类专家使用提示工程技术或与内部模型进行交互对话,生成具有多种推理模式的响应。
  • 积累数十个高质量的冷启动样本后,训练一个具备长链式思考的推理模型。
  • 使用Seed-Verifier对这个推理模型进行拒绝采样。

这一过程不仅应用于数学数据,还可以推广到其他领域,比如编程、逻辑谜题,甚至创意写作。这一步其实就是搞Long CoT数据。

每个样本最大长度32000,2个Epoch,LR=2 × 10^−5,cosine decay到2 × 10−6。

RL

统一的RL训练框架,无缝融合不同类型数据:

  • 可验证数据。通过验证器直接根据标准验证答案。
  • 通用数据。由对齐人类偏好的奖励模型进行评分。
  • 混合数据。同时使用验证器和奖励模型。

算法结合了之前的DAPO[2]VAPO[3],具体包括:

  • Value-Pretraining:通过MC回报提供无偏奖励信号,避免自举导致的偏差累积(尤其在长序列中),为后续RL阶段提供一个高质量的价值函数初始化(价值和策略对齐),减少训练不稳定。
  • Decoupled-GAE:policy和value模型使用不同λ,价值模型能够以无偏的方式更新,策略模型也可以独立调节自身的偏差与方差。
  • Length-adaptive GAE:处理训练时的异构序列长度。λ=1-1/αL,L是响应长度,确保不同长度的序列中TD误差分布均匀,提升对不同长度序列的处理能力。
  • Clip-Higher:clip的上限会限制Policy的探索能力,提高上限有效提升了Policy的熵,为低概率Token的概率上升创造更大空间,可以促进更多样化样本的生成。
  • Token-level Loss:解决了Token级损失贡献不均的问题,确保训练过程中每个Token的影响都被合理地考虑。
  • Positive Example LM Loss:提升强化学习训练过程中正样本的利用效率。

上面这些优化点缓解了推理模型的 RL 训练不稳定(两次运行可能相差10分)和崩溃问题,这些问题对没有 SFT 的模型尤为明显。

在线数据分布自适应

主要解决在融合来自不同领域的数据并引入多样化评分机制时不同数据域之间的干扰问题。具体来说,不同类型的数据会互相影响,导致模型某些能力提升了,但另一些反而退步或者提升不明显。这种干扰可能源于:

  • 不同数据的难度不一样,有的简单有的复杂。
  • 奖励机制可能被模型“钻空子”,导致模型学到的不是我们真正想要的。
  • 不同领域的数据本身可能目标就不一致。
  • 其他潜在因素等。

在线数据分布自适应将强化学习过程中静态的提示词分布转变为一种自适应分布,使其更贴合模型在训练阶段的实际需求。具体做法是:在训练过程中,根据模型当前表现,动态调整喂给模型的数据类型或比例。

Qwen3

这几天,Qwen3发布了,虽然还没有看到技术报告,但是我们从Qwen3: Think Deeper, Act Faster | Qwen[4]这篇Blog上还是能大概看出一些端倪。个人感觉和Seed-Thinking一样,都可以看作是R1后新范式的大规模实践。

亮点

Qwen3的核心亮点一共三个:

  • 两种思考模式:就是手动控制这一次推理用什么模式。
  • 多语言:无需多说。
  • 增强Agent:除了Agent和代码能力,还增加了MCP的支持。

值得一提的是两种思考模式的切换,Qwen3支持两种切换方法。

  • 硬切换:通过enable_thinking参数控制。
  • 软切换:enable_thinking=True时,可以通过在消息后添加/think/no_think使用不同模式。enable_thinking=False那就是正常无思考模式。这种方法一般用在轮次间。

示例如下(Qwen3-0.6B):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# enable_thinking=True + /no_think
user_msg = "<|im_start|>user\n你是谁?/no_think<|im_end|>\n<|im_start|>assistant\n"
bot_msg = "<think>\n\n</think>\n\n我是AI助手,你可以随意和我交流。有什么问题或需要帮助吗?"

# enable_thinking=True + /think
user_msg = "<|im_start|>user\n你是谁?/think<|im_end|>\n<|im_start|>assistant\n"
bot_msg = "<think>\n好的,我现在需要处理用户的问题“你是谁?”。首先,我要确定用户的需求是什么。用户可能想了解我的身份,或者他们可能对我的能力感兴趣。作为AI助手,我需要提供准确且友好的回答,同时保持自然的对话方式。\n\n接下来,我应该考虑如何回答这个问题。通常,我会简要介绍自己,说明我是由人工智能系统生成的,但也要保持一定的专业性和亲切感。可能需要提到我具备多样的功能,比如回答问题、提供帮助等。\n\n另外,用户可能没有明确表达出来,但可能想测试我的反应或者了解更多信息。因此,回答时要保持开放,鼓励用户继续提问,同时确保信息准确无误。\n\n还要注意用户的身份和背景,可能他们是在使用我的功能,或者需要帮助。因此,回答时要避免过于技术性的术语,确保用户容易理解。\n\n最后,检查回答是否符合所有要求,包括清晰、准确和友好,确保没有遗漏任何关键点,并且保持对话的连贯性和自然。\n</think>\n\n我是由人工智能系统生成的助手,可以回答问题、提供帮助或分享知识。如果您有任何问题,欢迎随时问我! 😊"

# enable_thinking=True
user_msg = "<|im_start|>user\n你是谁?<|im_end|>\n<|im_start|>assistant\n"
bot_msg = "<think>\n嗯,用户问我是谁。首先,我需要确定回答的意图。用户可能是在测试我的反应,或者想了解我的背景。作为AI助手,我应该保持专业和友好的态度,同时提供有用的信息。\n\n接下来,我应该回忆一下之前的对话记录,确保回答内容准确。同时,考虑到用户可能对我的身份感兴趣,可以简要介绍我的功能和用途,比如帮助解决问题、提供信息等。但要注意不要过于冗长,保持简洁明了。\n\n另外,用户可能希望得到一些个性化的回应,比如询问他们的需求,或者提供其他帮助。因此,在回答中可以加入开放式的结尾,鼓励用户提供更多信息,这样可以促进进一步的互动。\n\n最后,检查回答是否符合中文表达习惯,确保没有语法错误,并且语气自然,不会显得生硬或突兀。\n</think>\n\n我是你的AI助手,帮助你解答问题、提供支持或提供信息。如果你有任何问题或需要帮助,请随时告诉我!有什么我可以帮你的吗?"

# enable_thinking=False
user_msg = "<|im_start|>user\n你是谁?<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\n"
bot_msg = "我是AI助手,我不会说“我是谁”,但可以帮你解决问题或提供帮助。如果你有任何问题或需要帮助,请随时告诉我!"

# enable_thinking=False + /no_think
user_msg = "<|im_start|>user\n你是谁?/no_think<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\n"
bot_msg = "我是一个AI助手,专注于帮助用户解决问题和提供支持。如果您有任何问题或需要帮助,请随时告诉我!"

# enable_thinking=False + /think
user_msg = "<|im_start|>user\n你是谁?/think<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\n"
bot_msg = "我是你的智能助手,我的名字是小智。我是一台基于人工智能技术的虚拟助手,能够帮助你解答各种问题,提供各种服务,与你交流,帮助你解决问题。如果你有任何问题或需要帮助,随时告诉我,我将尽力为你服务。"

通过user_msg可以很明显发现,enable_thinking=False 时会在 assistant开始时直接结束思考(</think>),提示词自然就不生效了。硬切换没啥好说的,软切换应该是SFT时融合进去的指令,相对稍微有意思一些。但总的来说还没有做到自动控制思考长度,以及自动根据上下文确定是否需要思考等功能。

训练

整个训练遵循R1后的常见做法,我们在DeepSeek R1深度技术解析及其影响 | Yam[5]DeepSeek R1后LLM新范式 | Yam[1]中均有提及。

首先看预训练,分3个阶段:

  • S1:30万亿Token,4k长度预训练,学习基本的语言技能和通用知识。
  • S2:增加知识密集型数据比例, 5万亿Token,使Base模型具备一定推理能力。
  • S3:上下文长度扩充到32K。

这个过程恐怕早已经是预训练的标配了。R1后S2尤为重要。

然后是后训练,主要有4个阶段:

  • S1:LongCoT冷启动。微调,涵盖数学、代码、逻辑推理和 STEM 问题等多种任务和领域,旨在让模型具备基本的推理能力。
  • S2:LongCoT RL。利用基于规则的奖励来增强模型的探索和钻研能力。
  • S3:两种思考模式融合。LongCoT数据和常用的指令微调数据的组合对模型微调,将非思考模式整合进思考模式。
  • S4:通用RL对齐。在指令遵循、格式遵循和 Agent 能力等在内的 20 多个通用领域的任务上应用强化学习。

如果没有S3那就是R1的流程,只是不知道用的是R1的少量高质量数据,还是Seed-Thinking的比较大量的数据。另外,S2本身要做好也不容易,Seed-Thinking的数据分布影响可能也是存在的。不过看描述,Qwen3在S2这一步貌似不包含非推理类数据。也就是说,S1和S2主要用来提升推理能力,后训练核心还是S3的SFT。

模型

Qwen3还有个模型(Dense)层面的变化,就是使用了QK-norm,这玩意儿来自Scaling Vision Transformers to 22 Billion Parameters[6]OLMo 2[7]用在LLM训练上,主要作用是避免 attention logits 太大而导致损失发散(注意力机制中的 logits数值变得非常大时, softmax的输出趋近于one-hot,造成信息丢失,从而导致训练不稳定或 loss 发散)。代码体现在Self Attention的计算中:

1
2
3
# From https://github.com/huggingface/transformers/blob/main/src/transformers/models/qwen3/modeling_qwen3.py
query_states = self.q_norm(self.q_proj(hidden_states).view(hidden_shape)).transpose(1, 2)
key_states = self.k_norm(self.k_proj(hidden_states).view(hidden_shape)).transpose(1, 2)

不过如果抛开LLM继续追溯,其实早在2020年就有了Query-Key Normalization for Transformers[8],它摘要里如是说:

we propose QKNorm, a normalization technique that modifies the attention mechanism to make the softmax function less prone to arbitrary saturation without sacrificing expressivity.

有点意思~

另外,Qwen3去掉了Qwen2.5的qkv attention偏置项。总的来说,模型层面变化不大,还是大家熟悉的配方。Qwen3MoE也是比较常见的稀疏专家模型,没有共享专家,

Agent

主要说一下MCP的支持,当时看到GitHub上的qwen3到底怎么原生支持的MCP,没有人给我说明白 · QwenLM/Qwen3 · Discussion #1328[9],于是稍微回答了一下(hscspring的回复)。简单总结来说就是:Qwen3训练时应该使用了MCP 规范格式的工具调用相关语料(Prompt格式和 MCPServer工具注册系统兼容、可以生成MCPServer 可识别的调用指令等),使其对MCP的支持比较好。这应该归属于Agent范畴。

最后,其实我个人不太喜欢追热点,甚至会刻意回避热点。对于MCP我应该算是国内最早知道的一批人,因为个人一直在关注LLM之间的通用通信协议。看到MCP后,说实话,从技术层面并没有觉得它有什么。尤其像我这种喜欢自己造轮子的,Agent基本都是自己手撸了(放心+灵活可控),也觉得不太会在工作中用这个东西。不过后面和开放源子基金会一个朋友(非技术)沟通,看到了它对生态的影响。那次沟通完一个月后,MCP火了。不过个人依然无感。

小结

Seed-Thinking给了比较规范的数据获取流程,实际中我们可以收集已有的Long CoT数据,或让SOTA模型帮忙生成。它的SFT可以看成是一种冷启动,只不过数据量比较大,也可以看成是一种Long CoT的继续训练。Seed-Thinking是一个纯思考模型,和R1比较像,也可以看成是Qwen3后训练的S1+S2。

Qwen3的重点感觉是数据,数据量更多(预训练几乎是Qwen2.5的两倍)、质量更高、多样性也更丰富。比如直观能看到的:推理类数据、Agent工具数据、多语言数据等。但不管怎么说,能整合最前沿技术并将模型做出来,而且目前看起来效果还不错,那都是非常不容易的。

总的来看,Seed-Thinking和Qwen3都给我们实践新范式提供了指导,个人认为可称其为最佳实践。

References

[1] DeepSeek R1后LLM新范式 | Yam: https://yam.gift/2025/03/15/NLP/LLM-Training/2025-03-15-R1-New-Paradigm/
[2] DAPO: https://yam.gift/2025/03/19/NLP/LLM-Training/2025-03-19-LLM-PostTrain-DAPO/
[3] VAPO: https://yam.gift/2025/04/19/NLP/LLM-Training/2025-04-19-VAPO/
[4] Qwen3: Think Deeper, Act Faster | Qwen: https://qwenlm.github.io/blog/qwen3/
[5] DeepSeek R1深度技术解析及其影响 | Yam: https://yam.gift/2025/02/17/NLP/LLM-Training/2025-02-17-DeepSeek-R1/
[6] Scaling Vision Transformers to 22 Billion Parameters: https://arxiv.org/abs/2302.05442
[7] OLMo 2: http://arxiv.org/abs/2501.00656
[8] Query-Key Normalization for Transformers: https://arxiv.org/abs/2010.04245
[9] qwen3到底怎么原生支持的MCP,没有人给我说明白 · QwenLM/Qwen3 · Discussion #1328: https://github.com/QwenLM/Qwen3/discussions/1328