#大模型预训练与 Mid-training 数据的差距:阶段定位、数据配方与准备方法

一句话结论:预训练数据解决“模型知道世界、掌握语言和形成通用表征”的问题;mid-training 数据解决“在不破坏底座的前提下,把模型推向后训练真正需要的能力分布”的问题。

如果把大模型训练看成一条长路径:

Pretraining -> Mid-training / Annealing / Continued pretraining -> Long-context extension -> SFT / DPO / RLVR

那么 pretraining 和 mid-training 的关系不是“前者粗糙、后者高级”这么简单,而是:

Pretraining:  建底座,追求覆盖面、规模、分布稳定性
Mid-training: 调方向,追求目标能力、分布桥接、后训练可塑性
Post-training: 赋交互形态,追求人类偏好、指令遵循、安全和任务格式

所以 mid-training 最核心的定位不是“再训一点高质量数据”,而是 distributional bridge:在通用预训练分布和后训练 / 目标任务分布之间搭桥。这个说法在 2026 年的论文 Midtraining Bridges Pretraining and Posttraining Distributions 中被明确提出:midtraining 是把 specialized data 与 general pretraining data 混在一个中间训练阶段,让模型更接近 posttraining 所需的目标分布,同时减少遗忘和梯度冲突。


#1. 为什么会出现 mid-training?

早期大模型训练通常被粗略分成两段:

  1. Pretraining:在海量 web / book / code / paper 等文本上做 next-token prediction。
  2. Post-training:用 SFT、RLHF、DPO 等方法让模型会对话、听指令、符合人类偏好。

但随着模型能力目标变复杂,大家发现中间缺了一层。

#1.1 预训练太“大而散”

预训练语料必须足够大,才能支撑 trillions tokens 级训练。因此它通常包括:

  • Common Crawl / web pages;
  • books / Wikipedia / encyclopedic data;
  • academic papers / arXiv / PDFs;
  • code repositories;
  • forum / QA / StackExchange;
  • multilingual web;
  • 一些经过过滤的 math / code / domain data。

这类数据的优势是覆盖面广、规模大、分布自然。但问题是:目标能力信号被稀释了。

例如,一个模型要变强在:

  • 数学推理;
  • 代码生成;
  • 科学 QA;
  • 长上下文阅读;
  • 工具调用;
  • instruction following;
  • chain-of-thought / thinking trace;
  • agentic task decomposition。

这些能力对应的数据在通用 web 里占比很低,而且格式不一定直接适合后训练。

如果只靠预训练,模型可以获得基础知识和语言能力,但未必形成足够强的任务结构、推理格式和领域专长。

#1.2 Post-training 太“窄而晚”

后训练数据通常质量高、格式明确,但规模小得多,例如:

  • instruction-response pairs;
  • preference pairs;
  • human / model-generated conversations;
  • verifier-labeled math / code trajectories;
  • tool-use traces;
  • RLVR environments。

它适合教模型:

  • 怎么回答;
  • 怎么遵循指令;
  • 怎么拒答;
  • 怎么保持风格;
  • 怎么在特定任务上优化行为。

但它不适合从零塑造深层能力。原因是:

  1. 后训练 token 量太少,无法承担大规模表征重塑;
  2. 如果目标任务和预训练分布距离太远,SFT / RL 会面对很差的初始化;
  3. 直接用小规模高强度数据 finetune,容易过拟合或遗忘;
  4. RL 对 base model 的可探索性和先验能力要求很高。

因此,mid-training 出现的核心动机是:

在模型还具有一定可塑性时,用比预训练更目标化、比后训练更宽、更连续的语料,把模型从“通用语言模型”推向“可被后训练塑造成目标助手 / 推理模型 / 代码模型”的状态。


#2. Pretraining 数据和 Mid-training 数据的本质差距

可以从八个维度理解。

维度Pretraining 数据Mid-training 数据
核心目的建立通用语言、知识、表征底座面向目标能力做分布桥接和能力聚焦
数据规模极大,通常是 T tokens 级相对小,常见是几十 B 到几百 B tokens
数据来源web、书籍、wiki、paper、code、论坛等大规模自然语料高质量过滤 web、代码、数学、QA、instruction、thinking traces、长文档等
数据选择原则覆盖面、去重、质量过滤、语言/领域平衡、token 规模目标能力增益、后训练可塑性、低污染、格式桥接、分布不过度偏移
数据格式多为自然文本或原始文档可混入更多结构化 / 半结构化任务数据
训练作用学语言模型基础能力和世界知识增强 math/code/QA/reasoning/instruction/long-context 等目标能力
风险低质噪声、重复、污染、长尾无效 token过度 specialization、遗忘、benchmark contamination、破坏通用性
评估方式perplexity + 广泛 base eval + scaling lawcapability cluster eval + microanneal + integration test + post-trainability

最重要的是:pretraining 追求“大分布上的稳健学习”,mid-training 追求“朝目标能力方向移动但不坍缩”。


#3. 预训练数据的定位:建底座,而不是直接教模型做助手

预训练阶段的任务是 next-token prediction。它的目标不是让模型成为对话助手,而是让模型形成:

  1. 语言建模能力;
  2. 世界知识记忆;
  3. 语法、篇章、语义表征;
  4. 多领域概念结构;
  5. 代码、数学、科学等基础分布感;
  6. 跨文档、跨格式、跨语言的泛化能力。

#3.1 预训练数据为什么需要规模?

预训练的核心资源是 token。模型参数越大,需要的数据覆盖和训练 token 越多。大规模数据的作用不是简单“让模型记更多事实”,而是让模型看到足够丰富的模式:

  • 同一个概念在不同语境中的表达;
  • 同一类任务在不同文本形式中的变体;
  • 领域知识之间的共现结构;
  • 语言和世界之间的统计关联;
  • 稀有概念、长尾实体、多语言表达。

所以预训练数据往往不能只选“看起来最优质”的小数据。过窄的数据会导致底座不稳,模型泛化和知识覆盖受限。

#3.2 预训练数据为什么不适合大量任务格式?

以 OLMo 3 为例,其报告明确说:预训练阶段主要使用 Dolma 3 Mix,大约 6T token,包括 Common Crawl、学术 PDFs、GitHub code、arXiv、FineMath、Wikipedia / Wikibooks 等。报告还提出一个重要原则:如果某类数据规模太小,即使质量高,也未必适合预训练阶段;更适合留到 mid-training。

原因是:

  • 小规模任务数据在 T tokens 级训练中容易被稀释;
  • 如果过度上采样,又可能影响基础分布;
  • task data 对 benchmark 表现影响很大,容易干扰预训练数据 ablation;
  • instruction / QA / reasoning trace 这类格式更接近后训练目标,太早大量混入可能改变 base model 形态。

因此,预训练数据的正确心智是:

先建立一个宽、稳、通用、可塑的 base model,而不是提前把所有目标能力都灌进去。


#4. Mid-training 的定位:不是小型预训练,而是分布桥接

Mid-training 常常也叫:

  • continued pretraining;
  • annealing stage;
  • cooldown / final-stage pretraining;
  • late-stage curriculum;
  • domain-adaptive pretraining;
  • intermediate training。

但这些词不完全等价。

#4.1 Mid-training 和 continued pretraining 的区别

Continued pretraining 可以只是继续在某个数据上训练。例如:

原来在通用 web 上训练 -> 继续在 code 上训练

这很容易变成 domain adaptation:模型朝 code 分布偏移,但可能忘掉通用能力。

Mid-training 更强调“混合 specialized data 与 general pretraining data”,让模型逐步接近目标分布,而不是突然跳到一个窄分布。

Midtraining Bridges Pretraining and Posttraining Distributions 的核心发现是:

  • midtraining 在远离预训练分布的领域最有用,例如 code 和 math;
  • 它的收益和 midtraining 数据相对目标 posttraining 数据的 proximity advantage 相关;
  • 相比只在 specialized data 上 continued pretraining,midtraining 更能同时提升目标域表现并减少遗忘;
  • 数据引入时间和 mixture weight 强相关:越晚引入 specialized data,越不能简单靠提高比例补救,因为模型可塑性窗口可能已经变窄。

这给 mid-training 一个更精确的定位:

Mid-training 不是“最后再刷一遍高质量数据”,而是在模型仍有可塑性时,设计一条从 pretraining distribution 到 posttraining distribution 的平滑路径。

#4.2 详细解读:Midtraining Bridges Pretraining and Posttraining Distributions 到底证明了什么?

这篇论文值得单独讲,因为它把很多模型报告里“凭经验做”的 mid-training,第一次放到一个比较清楚的实验框架里解释。它的问题不是“mid-training 能不能涨 benchmark”,而是更基础的三个问题:

  1. mid-training 到底是在提前背目标域数据,还是在改变后训练的初始化?
  2. 为什么它比直接 continued pretraining 到 specialized data 更稳?
  3. 数据应该什么时候引入、以多大比例引入?

论文给出的工作定义是:

Midtraining 是 pretraining 与 posttraining 之间的中间训练阶段。它通常使用比通用预训练更专门的数据,例如 code、math、instruction-formatted data,同时仍然保留一部分 general pretraining data。

这个定义里最关键的短语是 while maintaining a mixture with general pretraining data。也就是说,mid-training 不是“预训练结束后切到数学/代码继续训”,而是把专门数据和通用数据混在一起,构造一个中间分布。论文甚至把 continued pretraining 视为一个极端特例:general data 的 mixture weight 为 0。

#4.2.1 理论直觉:mid-training 改变的是 post-training 的初始化

论文的理论 sketch 可以用一句话概括:

Mid-training 不是直接替代 SFT,而是把参数移动到一个更适合 SFT 的起点。

设预训练分布的 loss 是 J_P(θ),后训练 / SFT 目标分布的 loss 是 J_T(θ)。如果直接从 base model 做 SFT,参数会沿着 J_T 的梯度走。但这个过程中可能出现两类问题:

  1. gradient conflict:朝后训练目标下降的方向,可能会伤害预训练分布上的能力;
  2. posttraining effort 太大:如果初始点离目标分布太远,SFT 需要走很远,遗忘和不稳定都会更严重。

论文把遗忘上界拆成两个项:

  • alignment / conflict term:后训练梯度与预训练梯度是否冲突;
  • effort term:从当前初始化到目标任务最优点还需要多少后训练“力气”。

Mid-training 的作用就是改变 SFT 的初始化 θ0(t,w)t 是 specialized data 何时引入,w 是 specialized data 的比例。如果 mid-training 让模型已经更接近目标分布,那么后续 SFT 需要的梯度步更少、冲突更小,于是既提升目标域表现,也减少 forgetting。

这解释了为什么 mid-training 不应该被理解为“教会模型最后任务答案”。它更像是在参数空间里修一条缓坡,让模型从通用 web 分布走到 math / code / instruction / reasoning 分布时,不必突然转向。

#4.2.2 实验设计:控制 pretraining、midtraining、posttraining 三段

论文用 Pythia 系列 70M 到 1B 模型做受控实验。整体流程是:

pretraining:  C4 web data, 128B tokens
midtraining:  在不同时间点插入不同 specialized mix
posttraining: 对 GSM8K / SciQ / PyCode / LIMA 等目标数据做 SFT
评估:         SFT validation loss + C4 validation loss after SFT

midtraining mix 覆盖五类:

Midtrain mixtoken 规模代表来源目标能力
Starcoder196BStarCoder 代码预训练数据code
Math12BMAmmoTH、OpenMathInstructmath reasoning
FLAN3.5BFLAN instruction collectioninstruction format
KnowledgeQA9.6Bgeneral knowledge / dialogue QA mixQA / knowledge
DCLM51B高质量 webgeneral high-quality web

后训练目标则选了四类任务:GSM8K 数学、SciQ 科学问答、CodeSearchNet-Python / PyCode 代码、LIMA 指令数据。这个设计的好处是:它能区分“midtraining 数据和后训练目标对齐”与“只是多训了一些高质量 token”。

#4.2.3 发现一:收益高度 domain-specific

最直接的结论是:mid-training 的收益不是平均撒胡椒面式的。

  • Starcoder mix 对 PyCode / code 任务帮助最大;
  • Math mix 对 GSM8K / math reasoning 帮助最大;
  • 不匹配的 mix 帮助很小;
  • FLAN 这种 broad instruction data 在该设置下收益有限。

这说明 mid-training 的核心不是“越 instruction 越好”或“越高质量越好”,而是 midtraining distribution 是否真的把模型推向后续目标分布

#4.2.4 发现二:proximity advantage 可以预测收益

论文提出一个简单诊断量:proximity advantage。直觉是:如果 midtraining mix M 比原始 C4 更接近后训练目标 T,那么它就有正的 proximity advantage。

PA(M -> T) = prox(M, T) - prox(C4, T)

这里的 prox 不是复杂表征距离,而是基于 tokenizer 后 unigram token statistics 的相似度组合,包括 vocabulary Jaccard、overlap ratio、token-frequency cosine similarity、Jensen-Shannon similarity 等。

这个指标很朴素,但结论很有启发:mid-training 的收益与 proximity advantage 明显相关。换句话说,一个好的 midtraining mix 应该在 token / syntax / format / domain 层面,确实比通用预训练数据更接近后训练数据。

这对数据准备很重要:我们不应该只问“这个数据质量高不高”,还应该问:

它是否比当前 pretraining distribution 更像未来 posttraining distribution?

如果一个数据源很干净、很优雅,但和后续 SFT / RL 目标分布无关,它未必是好的 mid-training 数据。

#4.2.5 发现三:midtraining 优于 100% specialized continued pretraining

论文专门比较了两种做法:

Midtraining:             specialized data + C4 general data 混合
Continued pretraining:   100% specialized data

在 code 和 math 两个领域,混合式 midtraining 都比 100% specialized continued pretraining 更好,而且不仅目标域 validation loss 更低,SFT 后的 C4 loss 也更好。

这点非常关键,因为它直接反驳了一个常见误解:

“既然我想提升代码能力,那就预训练完直接切到纯代码继续训。”

论文显示,更稳的做法是 保留 general anchor data。specialized data 负责把模型推向目标能力,general data 负责保持语言、知识和通用表示不塌。也就是说,mid-training 的配方本质是“桥”,不是“跳崖”。

#4.2.6 发现四:timing 和 mixture weight 强耦合,存在可塑性窗口

论文还用 Starcoder code mix 做了 start time 与 mixture weight 的二维实验:

  • start time:specialized data 在预训练进程中从 12B 到 105B tokens 不同时间引入;
  • mixture weight:specialized data 比例从 10% 到 80%。

结论很有工程意义:

  • 早期引入 specialized data 时,高比例例如 80% 可能有效;
  • 晚期引入 specialized data 时,高比例反而有害,保守比例例如 10% 更稳;
  • 如果错过了早期窗口,不能简单靠后期提高比例补偿。

论文把这解释为 Plasticity Window:模型越训练到后期,表示越定型。这个时候突然灌入高比例专门数据,模型不一定能把新分布整合进通用能力中,反而可能造成不稳定或遗忘。

这给 mid-training 数据准备一个非常实际的原则:

决定数据比例之前,先决定引入时机;同一个数据源,在不同训练阶段需要不同 mixture weight。

#4.2.7 对本文主题的启发

这篇论文把 mid-training 的定位从经验配方推进到了一个更明确的机制假设:

  1. mid-training 是 distributional bridge:它连接 pretraining 和 posttraining,而不是替代二者;
  2. 数据选择要看 proximity:好数据不是绝对好,而是相对后训练目标有桥接作用;
  3. mix 比 pure shift 更重要:保留 general anchor data 能同时提升目标域与减少遗忘;
  4. 时间表和比例不能分开调:越晚加入专门数据,越需要保守混合;
  5. post-trainability 才是核心指标:midtraining checkpoint 本身涨分不够,关键是后续 SFT / RL 是否更容易、更稳、更少遗忘。

所以,如果要把这篇论文翻译成一句工程规则,就是:

Mid-training 数据不是“高质量数据篮子”,而是从 base model 到 post-trained model 的分布脚手架。

#4.3 它到底桥接什么?

它至少桥接四种差距.

#4.3.1 能力差距

预训练模型可能知道数学概念,但不擅长按步骤解题;可能见过代码,但不擅长工程化生成;可能见过 QA,但不擅长精确检索式回答。

Mid-training 用更密集的 math / code / QA / reasoning data 把这些能力提前激活。

#4.3.2 格式差距

预训练文本大多是自然文档,而后训练数据是 instruction-response、dialogue、tool-use trace、reasoning trace。

Mid-training 可以适量引入 instruction data、thinking traces、QA pairs,让模型在进入 SFT / RL 前已经熟悉这些格式。

#4.3.3 分布差距

如果后训练目标是代码、数学、长上下文或 agent 任务,和普通 web 分布距离很远。直接 SFT / RL 会导致梯度冲突或训练不稳。

Mid-training 的混合数据提供更平滑的分布过渡。

#4.3.4 可塑性差距

训练越到后期,模型参数越“定型”。如果 specialized data 引入过晚,即使比例很高,也可能难以重塑表示。

所以 mid-training 不是越晚越好,也不是越专越好,而是要找到合适的可塑性窗口。


#5. 公开案例:OLMo 2 / OLMo 3 / Llama 3 / Phi-3.5

#5.1 OLMo 2:把 Dolmino Mix 作为 late-stage curriculum

OLMo 2 报告中,base data 分成:

pretrain: olmo-mix-1124
midtrain: dolmino-mix-1124

其摘要明确说,Dolmino Mix 1124 是一个新的 specialized data mix,在预训练 annealing phase 中引入,显著提升多个下游 benchmark。

OLMo 2 的 mid-training recipe 重点包括:

  • learning rate annealing;
  • data curriculum;
  • high-quality sources;
  • math mix;
  • final midtraining mix and checkpoint soups。

它体现的是第一代比较清晰的 mid-training 工程心智:

预训练末期不是简单降学习率,而是可以有意识地换数据配方,用高质量、能力导向的数据完成 final capability shaping。

#5.2 OLMo 3:把 pretraining / midtraining / long-context extension 拆成明确阶段

OLMo 3 是目前最适合作为公开参考的案例,因为它不是只发布最终权重,而是把 model flow 中的数据、代码、中间 checkpoint、评测、训练日志尽量完整打开。对我们讨论 mid-training 来说,它的价值在于:它把 base model training 明确拆成三段。

Stage 1: Pretraining            Dolma 3 Mix,约 6T tokens
Stage 2: Midtraining            Dolma 3 Dolmino Mix,约 100B tokens
Stage 3: Long-context Extension Dolma 3 Longmino Mix,7B 用 50B tokens,32B 用 100B tokens
Post-training                   SFT / DPO / RLVR

这三个阶段的边界非常清楚:

  • Pretraining:用 Dolma 3 Mix 建立通用 base 能力;
  • Midtraining:用 Dolma 3 Dolmino Mix 定向加强 math、code、QA、instruction、thinking 等后训练关键能力;
  • Long-context extension:用 Longmino Mix 专门扩上下文,而不是把长上下文问题混在普通 midtraining 里随便解决;
  • Post-training:再训练 Think / Instruct / RL-Zero 等不同分支。

#5.2.1 OLMo 3 预训练数据仍然是“大而广”的通用底座

OLMo 3 的预训练数据 Dolma 3 Mix 包括:

  • Common Crawl web pages:约 4.51T tokens,占 76.1%;
  • olmOCR science PDFs:约 805B tokens,占 13.6%;
  • Stack-Edu / GitHub code:约 409B tokens,占 6.89%;
  • arXiv LaTeX papers:约 50.8B tokens,占 0.86%;
  • FineMath 3+:约 152B tokens,占 2.56%;
  • Wikipedia / Wikibooks:约 2.51B tokens,占 0.04%。

这说明 OLMo 3 的 pretraining 仍然以大规模 web 和文档为主体。它不是没有 code/math/science,而是这些数据在预训练阶段的角色仍然是“扩大知识与语言覆盖面”。这一阶段更重视:

  • trillion-token scale 的全局去重;
  • token-constrained mixing;
  • quality-aware upsampling;
  • 大规模 PDF / web / code / math 的覆盖;
  • 训练出宽、稳、可塑的 base。

#5.2.2 OLMo 3 midtraining 的目标:不是继续堆通用 token,而是补后训练前的关键能力

OLMo 3 在 pretraining 后继续训练 100B high-quality tokens,来自新的 Dolma 3 Dolmino Mix。报告明确说,这个阶段要改善 key fundamental capabilities,尤其是:

  • code;
  • math;
  • general knowledge QA / knowledge elicitation;
  • instruction following 预热;
  • thinking / reasoning 能力预热;
  • 为后续 Olmo 3 Think、Instruct、RL-Zero 做基础。

同时,它并没有把通用数据完全丢掉。报告中特别提到,为了保持和 pretraining 的连续性,midtraining 继续保留 web 和 PDF 数据,但会选择更高质量的子集。这个点和 Midtraining Bridges 的结论完全一致:mid-training 不是跳到纯 specialized distribution,而是用 high-quality general anchor 防止分布过度偏移。

#5.2.3 OLMo 3 的数据研发方法:microanneal + integration tests + SFT tests + decontamination

OLMo 3 最值得学习的不是某个具体数据源,而是它的数据研发闭环。它把 midtraining 数据准备变成了一个实验系统。

第一层:distributed exploration。 对每个目标能力,团队并行生成或收集候选数据源,例如 math、code、QA、instruction、thinking。然后用 microanneal 快速筛选。

一个标准 microanneal 大致是:

1. 选择一个候选数据源
2. 采样 5B tokens 目标数据
3. 匹配 5B tokens web data
4. 在 10B mix 上做 annealing
5. 与 10B web-only baseline 对比
6. 看目标能力是否有超过“继续训 web”的额外收益

这一步的关键是 compute-matched baseline。如果一个数据源在 10B anneal 后涨分,未必说明它好,可能只是多训练了 10B tokens。必须和 web-only baseline 比,才能看出该数据源的边际贡献。

第二层:centralized integration tests。 单个数据源有效,不代表放进大 mix 后仍然有效。OLMo 3 会把 microanneal 中表现好的数据源合并进候选 100B mix,做完整 midtraining integration run,观察多个数据源之间是否互相冲突、比例是否合适、整体能力是否提升。

第三层:SFT tests。 OLMo 3 还会把 integration run 得到的 checkpoint 快速 instruction-tune,再在 post-train eval suite 上评估。这个步骤非常重要,因为 mid-training 的最终目标不是 base eval 自嗨,而是提升 post-trainability:后续 SFT / DPO / RL 是否更容易、更稳、更有效。

第四层:decontamination。 Round 5 集成了新的 decontamination 流程,避免 midtraining mix 污染评测集或后续 RL 数据。对于 fully-open model flow 来说,这尤其重要,因为所有训练数据都公开,必须能解释 benchmark gains 不是 leakage。

可以把 OLMo 3 的 midtraining 数据研发抽象成:

能力目标 -> 候选数据源 -> microanneal -> integration mix -> SFT/post-trainability test -> decontamination -> final 100B mix

#5.2.4 Dolma 3 Dolmino Mix 的最终组成

OLMo 3 的最终 midtraining mix 是约 100B tokens,来自约 2.19T token 的 source pool。下面按能力类别重组 Table 5。

类别数据源100B mix 中 token占比作用
Math syntheticTinyMATH Mind898M0.9%生成类似 MATH 的题目和解释
Math syntheticTinyMATH PoT241M0.24%Python code solution / program-of-thought
Math syntheticCraneMath5.62B5.63%用 Qwen3 重写 FineMath4+,复现 SwallowMath 思路
Math syntheticMegaMatt1.73B1.73%用开源模型重写 MegaMath-Web-Pro 风格数据
Math reusedDolmino Math10.7B10.7%复用 OLMo 2 Dolmino math,额外去污染
CodeStackEdu (FIM)10.0B10.0%高质量教育代码 + fill-in-the-middle
Python syntheticCraneCode10.0B10.0%permissive recreation of SwallowCode,用于 Python code 能力
QA syntheticReddit to Flashcards5.90B5.9%从学术相关 subreddit 合成多选 QA
QA syntheticWiki to RCQA3.0B3.0%Wikipedia passage -> reading comprehension QA
QA syntheticNemotron Synth QA5.0B5.0%选用 Nemotron CC 中 diverse QA pairs 子集
Thinking synthetic多种 meta-reasoning / reasoning traces8.34B 左右8.34%为 Think / RL-Zero 打底
InstructionTulu 3 SFT1.1B1.1%instruction 格式预热
InstructionDolmino 1 Flan5.0B5.0%复用 OLMo 2 FLAN 子集
PDFsolmOCR science PDFs HQ subset4.99B5.0%高质量科学 PDF anchor
WebSTEM-Heavy Crawl4.99B5.0%STEM-heavy web anchor
WebCommon Crawl HQ subset22.4B22.5%高质量通用 web anchor
Total-99.95B100%约 236M documents

如果按大类粗略汇总:

Math:        约 19.2B tokens
Code:        约 20.0B tokens
QA:          约 13.9B tokens
Thinking:    约 8.3B tokens
Instruction: 约 6.1B tokens
PDF/Web:     约 32.4B tokens

这个比例很有代表性:OLMo 3 并没有让 synthetic reasoning / instruction 数据占主体。真正占比较大的仍然是高质量 web/PDF anchor、code、math、QA。Thinking traces 是明确加入的,但比例相对克制。

#5.2.5 数学数据怎么做:从 OLMo 2 复用到 open-model recreation

OLMo 3 的 math midtraining 很有工程细节。它总共考虑了 25 个 math sources,做了 80 个 microanneal runs,最后选 5 个 math-specific sources,其中 4 个是新合成或新复现。

关键做法包括:

  1. 复用已验证数据:保留 OLMo 2 的 10.7B Dolmino Math,但做额外 decontamination;
  2. 针对 benchmark 结构扩展:TinyMATH 对 MATH train 中 7500 个样例,每个生成 100 个类似问题,再生成 Python code solution 和 conversational explanation;
  3. 重写高质量自然数学网页:CraneMath 用 Qwen3 重写 FineMath4+,复现 SwallowMath 的思想;
  4. 处理 license 问题:对于由 Llama 系列模型生成、有额外许可限制的数据,OLMo 3 选择用开源模型重新生成 permissive recreation;
  5. 用 microanneal 量化收益:例如 CraneMath 在 microanneal 中对 MATH / GSM8K 都有明显提升。

这说明 mid-training 数学数据不是简单收集题库,而是三类数据的混合:

自然数学网页/教材 -> 高质量重写
题目/答案 -> 程序化解法与解释
已有 math mix -> 去污染后复用

#5.2.6 代码数据怎么做:教育性、可补全、可执行、可重写

OLMo 3 的 code 数据有两条主线。

第一条是 StackEdu (FIM)。 它对 Stack-Edu 做 fill-in-the-middle 转换:把代码文档拆成 prefix / middle / suffix,让模型预测中间片段。这很像为真实 IDE 场景预热,因为代码模型常常不是从头写文件,而是在已有上下文中补全、修改、插入。

同时,OLMo 3 用 educational value classifier 对不同语言子集打分,并从每种语言的上层 bucket 做加权采样,而不是只取全局 top。这能避免数据被少数高资源语言或模板化代码垄断。

第二条是 CraneCode。 它从 the-stack-v2-smol 的 Python 子集出发,先过滤 syntax errors 和 linter outputs,再复现 SwallowCode 的两阶段 rewriting pipeline:

  1. augment style;
  2. optimize code itself。

最终得到 18.8B tokens 高质量 Python code,其中 10B tokens 进入 final mix。报告中提到,5B CraneCode microanneal 对 HumanEval 有提升;当 microanneal 规模增大到 12.5B tokens,HumanEval lift 更明显。

这给 code midtraining 一个启发:仅有 GitHub 原始代码不够,mid-training 更需要接近后续 coding task 的数据形态:高教育价值、可补全、语法正确、lint 过滤、可重写优化、最好可执行验证。

#5.2.7 QA / knowledge access:不是背知识,而是把知识变成可提取格式

OLMo 3 的 QA 数据目标是提升 question-answering 和 general knowledge access。这里有三个代表:

  • Reddit-to-Flashcards:选择学术相关 subreddits,把 submission-comment pairs 用 GPT-4o-mini 重写成 multiple-choice QA,并设计 7 种 task formats 增加多样性;
  • Wiki-to-RCQA:从 Wikipedia passage 生成 reading comprehension QA,约束生成风格以贴近阅读理解标注任务;
  • Nemotron Synth QA:只选 Nemotron CC 中表现好的 diverse QA pairs 子集,其他 synth subsets 如果 microanneal 表现差就不纳入。

这里的重点是:QA midtraining 不是“再灌事实”,而是训练模型把已有知识和上下文证据以问答格式调取出来。它桥接的是从自然文档到 question-answer interface 的格式差距。

#5.2.8 Instruction 与 Thinking traces:提前铺路,但不喧宾夺主

OLMo 3 在 midtraining 中放入 instruction data 和 thinking traces,但比例相对克制。

Instruction 主要包括:

  • Tulu 3 SFT:约 1.1B tokens;
  • Dolmino 1 Flan:约 5.0B tokens。

值得注意的是,OLMo 3 对 Tulu 3 数据没有直接照搬 post-training chat syntax,而是用双换行连接 messages,避免过早绑定特定 special token / chat template。这个选择体现了 mid-training 和 SFT 的边界:它要让 base model 熟悉指令结构,但还不应该直接变成 fully aligned assistant。

Thinking traces 则包括 Math Meta-Reasoning、Code Meta-Reasoning、Program-Verifiable、QWQ / Gemini / Llama Nemotron / OpenThoughts2 等 reasoning traces。它们服务于后续 Think 和 RL-Zero:让 base 在进入 SFT / RLVR 前已经见过“中间推理轨迹”这种分布。

但从比例看,OLMo 3 很谨慎。thinking traces 总计约 8% 左右,不是整个 midtraining 的主体。这是合理的:如果过量 synthetic traces,可能带来污染、冗长、风格固化和错误推理模板。

#5.2.9 OLMo 3 给 mid-training 数据准备的核心启发

把 OLMo 3 和 Midtraining Bridges 放在一起看,可以得到一套很清晰的原则:

  1. 保留 general anchor:OLMo 3 的 Common Crawl HQ、STEM-heavy crawl、olmOCR science PDFs 加起来约三分之一,说明 mid-training 不能只堆专门数据;
  2. 目标能力要显式拆桶:math、code、QA、instruction、thinking 每类都有自己的候选源、microanneal 和评测;
  3. 合成数据要服务具体能力:TinyMATH、CraneMath、CraneCode、Reddit-to-Flashcards、Wiki-to-RCQA 都不是泛泛合成,而是围绕特定 eval cluster 设计;
  4. 数据好坏要看边际收益:通过 web-only baseline 的 microanneal 判断候选数据是否真的比继续训通用 web 更有用;
  5. 最终要看 post-trainability:integration checkpoint 还要快速 SFT,验证 midtraining gains 能否传递到 post-training;
  6. 去污染是训练流程的一部分:尤其 math、code、QA、RLVR 数据,如果不 decontaminate,mid-training 很容易把 benchmark gain 变成 leakage。

所以 OLMo 3 的 midtraining 可以被看成一个公开范例:

用高质量通用数据保持底座,用能力数据做定向提升,用 instruction / thinking traces 降低后训练分布落差,再用 microanneal 和 SFT tests 形成数据闭环。

#5.3 Llama 3:annealing 阶段上采样高质量数据,并单独做长上下文扩展

Llama 3 报告使用的术语不完全是 mid-training,但有相似阶段。它在 15T+ tokens 的大规模预训练后,做了:

  • long-context pretraining:逐步把 context length 扩展到 128K,约 800B tokens;
  • final annealing:最后约 40M tokens 线性把 learning rate 降到 0,同时调整 data mix,上采样 very high quality sources;
  • checkpoint averaging 得到 final pretrained model。

这里的启发是:mid-training / annealing 不一定只服务 math/code,也可以服务:

  • 长上下文适配;
  • 高质量数据收束;
  • 特定能力的分布偏移;
  • 最终 checkpoint 稳定化。

#5.4 Phi-3.5:用 mid-training 增强多语言和长上下文,但也暴露数据不足问题

Phi-3 技术报告提到,Phi-3.5-mini 和 Phi-3.5-MoE 为增强 multilingual 和 long-context 能力,在 mid-training 中加入更多 multilingual 和 long-text data,并用 LongRoPE 和 mixed context window 把 context length 从 4K 扩展到 128K。

但报告也说,在 RULER 等 128K long-context 任务上仍有明显下降,他们怀疑原因是 mid-training 中高质量长上下文数据不足

这个案例说明:

mid-training 的目标能力不是靠“形式上加长上下文”就能获得,必须有足够高质量、足够任务相关的长文档 / 长依赖 / 长推理数据。


#6. Mid-training 数据应该包含什么?

可以按目标能力拆。

#6.1 保底数据:高质量通用 web / paper / book / wiki

Mid-training 不能只放 specialized data,否则容易遗忘。需要保留一部分高质量通用数据:

  • 高质量 web;
  • academic PDFs;
  • encyclopedia;
  • long-form documents;
  • 高质量中英文知识文本;
  • 过滤后的 pretraining sources。

作用是:

  • 保持 general language modeling;
  • 减少 distribution shift;
  • 维持知识覆盖;
  • 让 specialized data 不至于把模型带偏。

OLMo 3 midtraining 里也保留了高质量 Common Crawl subset 和 olmOCR science PDFs。

#6.2 数学数据:从网页题目到可验证推理轨迹

数学 mid-training 数据可以分层:

  1. 普通 math web pages / textbooks;
  2. 题目 + 答案;
  3. 题目 + step-by-step solution;
  4. 可验证答案的程序化题目;
  5. synthetic reasoning traces;
  6. theorem proving / formal math 数据。

Mid-training 阶段更适合放 2-5 类,而不是只放自然数学文本。因为它要为后续 SFT / RLVR 打基础。

但要注意:

  • 不能只堆 CoT,容易学到模板化冗长推理;
  • 要区分训练模型“知道解法”和“按后训练格式输出解法”;
  • 要做 benchmark decontamination,尤其 GSM8K、MATH、AIME、GPQA 等。

#6.3 代码数据:从 repository 到任务化 code reasoning

代码数据也有层次:

  1. 原始 GitHub repositories;
  2. 高质量 cleaned code;
  3. code + docstring / comments;
  4. StackOverflow / issue / PR / commit;
  5. coding problem + solution;
  6. unit-test verifiable code tasks;
  7. repository-level long-context tasks;
  8. agentic coding traces。

预训练阶段可以大量使用 GitHub code,但 mid-training 更应该偏向:

  • 高质量代码;
  • 教学性代码;
  • algorithmic tasks;
  • repo-level understanding;
  • code QA;
  • test-driven / verifiable coding examples。

这样它才能桥接到后续 code SFT / RL / agentic coding。

#6.4 QA / knowledge elicitation 数据

很多模型不是没有知识,而是不会在特定问题格式中调取知识。Mid-training 可以加入:

  • closed-book QA;
  • open-domain QA;
  • science QA;
  • factual recall;
  • multi-hop QA;
  • retrieval-style long-form QA;
  • knowledge-intensive instruction data。

目标不是把所有事实都背一遍,而是训练模型把预训练中已有知识以问答形式激活。

#6.5 Instruction data:少量提前注入,而不是完全对齐

Instruction data 在 mid-training 中要谨慎。它和 SFT 重叠,但作用不同。

Mid-training 中的 instruction data 更像“格式预热”:

  • 让模型见过 instruction-response 结构;
  • 让模型适应任务描述;
  • 为后续 SFT 降低格式落差;
  • 让模型具备初步 instruction following。

但它不应该完全替代 SFT,因为 mid-training 仍主要是 base model training,不是对齐阶段。

#6.6 Thinking traces / reasoning traces

OLMo 3 明确在 midtraining 中包含 thinking traces,为后续 Think / RL-Zero 等模型流打基础。

这类数据的作用可能是:

  • 让模型提前熟悉长推理格式;
  • 提供 intermediate reasoning patterns;
  • 改善后续 RLVR 的初始策略;
  • 降低从 base model 到 thinking model 的分布落差。

但风险也很大:

  • synthetic traces 质量参差;
  • 可能污染 reasoning benchmarks;
  • 可能让模型学会冗长而非正确;
  • 可能和最终希望的推理风格不一致。

因此要有 verifier、去重、难度分层和 post-trainability eval。

#6.7 长上下文数据

长上下文能力不是把 RoPE 扩展一下就结束。数据需要覆盖:

  • 8K / 32K / 64K / 128K 长文档;
  • long book / paper / legal / code repo;
  • 长距离依赖;
  • 多段证据聚合;
  • long-context QA;
  • repo-level code understanding;
  • long tool trace / agent trace。

OLMo 3 的 Longmino Mix 和 Phi-3.5 的经验都说明:长上下文需要单独阶段和专门数据。


#7. 如何准备 Mid-training 数据:一套可执行流程

下面是一套比较实践化的 pipeline。

#7.1 第一步:先定义目标能力,不要先收数据

先列出模型 mid-training 后要改善什么,例如:

目标能力:
1. 数学推理
2. 代码生成与 repo-level 理解
3. 科学 QA
4. 长上下文阅读
5. instruction following 预热
6. thinking trace 预热
7. 后续 RLVR 可训练性

每个目标能力都要对应:

  • 训练数据类型;
  • 验证集;
  • proxy eval;
  • 后训练 eval;
  • 去污染规则。

不要把 mid-training 数据准备成“看到什么好数据都加一点”。那样最后很难解释效果,也很难调比例。

#7.2 第二步:建立候选数据池

候选池可以分成:

  1. 保底通用池:高质量 web、paper、wiki、book、PDF;
  2. 目标能力池:math、code、QA、science、long-context;
  3. 格式桥接池:instruction、dialogue、tool-use、thinking trace;
  4. 合成增强池:用强模型生成、改写、扩展、验证;
  5. 负样本 / anti-contamination 池:用于检测泄漏和过拟合。

每个数据源都要记录 metadata:

  • source;
  • license;
  • language;
  • domain;
  • token count;
  • document count;
  • average length;
  • quality score;
  • dedup hash;
  • benchmark overlap;
  • whether synthetic;
  • whether instruction-formatted;
  • whether contains reasoning traces。

#7.3 第三步:质量过滤不是只做 perplexity

Mid-training 数据的质量过滤要比预训练更目标化。

可以包括:

  • language identification;
  • document length filtering;
  • boilerplate / template removal;
  • exact and fuzzy dedup;
  • toxicity / PII / unsafe content filtering;
  • code parseability;
  • math answer verification;
  • QA consistency check;
  • synthetic trace verifier;
  • benchmark contamination detection;
  • source reliability score;
  • model-based quality classifier。

对于 math / code,最好有可验证机制:

  • math:答案匹配、symbolic checker、LLM judge + rule verifier;
  • code:unit tests、static analysis、execution sandbox;
  • QA:evidence support、retrieval consistency;
  • long-context:answer span / evidence chain 可追踪。

#7.4 第四步:设计 mix,而不是简单拼接

Mid-training mix 至少要包含三类比例:

general anchor data       防止遗忘,维持底座
capability data           提升目标能力
format-bridging data      贴近后训练格式

一个抽象配方可以是:

40-70% high-quality general / web / paper / book
10-25% code
10-25% math / reasoning
5-15% QA / knowledge elicitation
1-10% instruction / thinking traces
0-20% long-context, depending on whether this stage承担长上下文扩展

这不是固定比例,只是心智模型。真正比例要看:

  • base model 已有能力;
  • post-training 目标;
  • 模型大小;
  • mid-training token budget;
  • 数据质量;
  • domain distance;
  • 是否有后续 long-context stage。

关键原则:

目标域越远,越需要 mid-training;但目标域越窄,越需要 general anchor data 防止坍缩。

#7.5 第五步:用 microanneal 快速筛数据

不要直接把所有数据放进 100B token 大训练。

可以像 OLMo 3 一样做 microanneal:

  1. 从 base checkpoint 取一个较小模型或中间 checkpoint;
  2. 用 1B-10B tokens 对单个候选数据源做短训练;
  3. 评估目标能力 cluster;
  4. 同时评估通用能力和遗忘;
  5. 记录该数据源的边际贡献。

一个数据源是否进入最终 mix,不应该只看它让某个 benchmark 涨了多少,还要看:

  • 是否稳定提升同一能力簇;
  • 是否伤害其他能力;
  • 是否提升后续 SFT 后表现;
  • 是否存在 contamination;
  • 是否在不同模型尺度上趋势一致。

#7.6 第六步:做 integration test

单数据源有效,不代表混在一起有效。多个数据源之间可能:

  • 梯度冲突;
  • 格式冲突;
  • 难度冲突;
  • 语言比例冲突;
  • 重复或污染叠加。

因此要做 integration test:

candidate mix A -> 训练 10B/50B/100B -> base eval -> SFT eval -> forgetting eval
candidate mix B -> 同样流程
candidate mix C -> 同样流程

评估时不要只看 base benchmark,也要看 post-trainability。因为 mid-training 的目的之一是让后续 SFT / RL 更好训练。

#7.7 第七步:严格去污染

Mid-training 比预训练更容易污染 benchmark,因为它会加入很多 task-like 数据、synthetic data、QA、math、code problem。

必须做:

  • exact match 去重;
  • n-gram overlap;
  • embedding similarity;
  • problem statement canonicalization;
  • code problem signature matching;
  • benchmark answer leakage 检测;
  • 和 SFT / RL 数据的交叉去重。

尤其是如果后续要做 RLVR,更要保证 RL 数据不被 pretraining / midtraining 泄漏。OLMo 3 在 RL-Zero 部分就强调了要从 pretraining 和 midtraining 数据中 decontaminate RL-Zero 数据,以避免 spurious reward 或 prompt template 修复造成虚假提升。

#7.8 第八步:决定训练时机和比例

Midtraining Bridges Pretraining and Posttraining Distributions 的一个重要结论是:specialized data 的引入时间和 mixture weight 强相关。

直觉是:

  • 早一点引入,模型还有可塑性,可以接受较高比例 specialized data;
  • 太晚引入,模型已经定型,强行提高 specialized data 比例可能造成冲突或遗忘;
  • 不能指望最后短时间高比例灌数据来补救前面没学到的能力。

所以 mid-training 数据准备必须和训练 schedule 一起设计:

  • 从哪个 checkpoint 开始?
  • 学习率是否 anneal?
  • specialized data 比例是否逐渐升高?
  • 是否保留 general anchor?
  • 是否分多个 sub-stage?
  • 是否最后 checkpoint averaging / soup?

#8. Mid-training 和 Post-training 的边界

这是很容易混淆的地方。

#8.1 Mid-training 可以有 instruction,但不是 instruction tuning

Mid-training 中的 instruction data 是为了降低格式落差,不是为了完成最终对齐。

区别是:

维度Mid-training instruction dataSFT instruction data
目标让 base model 熟悉任务/指令格式让模型成为可交互助手
数据规模可以较大,混在 LM training 中较小但更精细
格式约束可弱一些,多样一些强格式、高质量、多轮、角色规范
损失通常仍是 LM objective通常对 response 部分监督更明确
风险过早 assistant 化、污染 eval过拟合风格、牺牲 base 能力

#8.2 Mid-training 可以有 thinking traces,但不是 RL reasoning

Thinking traces 在 mid-training 中主要起到“推理格式和中间过程预热”的作用。真正让模型在可验证任务上优化推理策略,通常还需要 SFT / DPO / RLVR。

所以:

Mid-training thinking traces: 让模型知道长推理长什么样
RLVR reasoning: 让模型学会什么推理路径真的有效

#8.3 Mid-training 可以有 tool data,但不是 agent training

工具调用、函数调用、浏览器轨迹、代码执行轨迹也可以作为 mid-training 格式桥接数据。但如果没有环境反馈和成功/失败信号,它只是 imitation-style pre-exposure,不等于真正 agentic RL。


#9. 一个具体的 Mid-training 数据准备模板

假设目标是训练一个面向 LLM Agent / code / reasoning 的 base model,mid-training 可以这样准备。

#9.1 数据桶设计

数据桶目标例子风险
General anchor保持通用能力高质量 web、paper、wiki、book比例太高会稀释目标能力
Code base提升代码分布cleaned GitHub、docs、StackOverflow低质 repo、license、重复
Code task任务化代码能力coding problems、unit-test tasks、repo QAbenchmark contamination
Math reasoning数学推理GSM-like、MATH-like、proof、synthetic CoT模板化、答案污染
QA / knowledge知识激活science QA、multi-hop QA、fact QA幻觉式合成问答
Instruction bridge格式预热FLAN-like、Tulu-like instruction过早 assistant 化
Thinking traces后续 reasoning 预热verified traces、teacher traces冗长伪推理
Long-context长上下文papers、books、repo、long QA只长不需要推理
Agent tracesagentic 预热tool-use、browser、code-edit tracesimitation 不等于能力

#9.2 推荐流程

1. 明确目标能力和 eval cluster
2. 收集候选源并做 metadata registry
3. 基础清洗:语言、长度、格式、去重、PII、安全
4. 能力专项过滤:math verifier / code tests / QA evidence / long-context evidence
5. decontamination:benchmark、SFT、RL 数据全链路去污染
6. microanneal:单源短训,筛掉负贡献源
7. integration test:混合配方训练,评估 base + SFT 后结果
8. 调 mixture weight 和 schedule
9. 训练正式 mid-training run
10. 保存多个 checkpoint,做 checkpoint averaging / soup 或选择最优 checkpoint

#9.3 评估指标

Mid-training 的评估要分层:

Base capability eval

  • MMLU / MMLU-Pro;
  • GPQA;
  • GSM8K / MATH / AIME;
  • HumanEval / MBPP / LiveCodeBench;
  • QA / reading comprehension;
  • multilingual;
  • long-context benchmarks;
  • held-out perplexity。

Forgetting eval

  • held-out pretraining distribution loss;
  • general QA;
  • broad language understanding;
  • multilingual regression;
  • safety / toxicity regression。

Post-trainability eval

  • 快速 SFT 后表现;
  • DPO 后偏好表现;
  • RLVR 初始 reward 和训练曲线;
  • instruction following;
  • tool-use success;
  • code agent benchmark。

这点很重要:mid-training 的好坏不能只看 mid-trained base checkpoint,还要看它后面是否更容易被 SFT / RL 塑造成目标模型。


#10. 常见误区

#10.1 误区一:Mid-training 就是把高质量数据放在最后训

不对。高质量只是必要条件,不是充分条件。

Mid-training 的关键是:

  • 数据和目标 posttraining 分布的距离;
  • 和 pretraining 分布的桥接;
  • mixture weight;
  • 引入时机;
  • general anchor;
  • 后训练可塑性。

#10.2 误区二:越 specialized 越好

过窄的 specialized data 会导致:

  • catastrophic forgetting;
  • 风格坍缩;
  • 通用能力下降;
  • 对后续 SFT / RL 不稳;
  • benchmark overfitting。

所以 mid-training 需要混合,而不是纯 domain finetune。

#10.3 误区三:Instruction data 越早越多越好

太早、太多 instruction data 可能让 base model 过早 assistant 化,影响基础语言建模和多样性。

更稳妥的是:mid-training 中少量作为格式桥接,真正的 assistant behavior 留给 SFT / DPO / RL。

#10.4 误区四:长上下文只靠 RoPE 扩展

长上下文能力需要数据。模型要看到真正长距离依赖、长文档结构、跨段证据聚合,而不是只把短文本拼长。

#10.5 误区五:只看单个 benchmark

Mid-training 很容易污染 benchmark,也很容易让某个指标涨但整体能力下降。因此要看能力簇、held-out、decontamination、post-trainability。


#11. 对研究问题的判断

我觉得 mid-training 的本质,是大模型训练从“单一大预训练”走向“分布路径设计”。

以前大家主要问:

给定模型规模,应该用多少 token、什么混合比例预训练?

现在问题变成:

模型能力形成是不是依赖一条合适的数据课程路径?什么数据应该早学,什么数据应该晚学,什么数据应该作为桥梁,什么数据应该留给后训练?

这和用户长期关心的 foundation model training mechanism 很相关。因为 mid-training 暴露了一个基础问题:

能力不是只由最终数据集合决定,也由数据出现的时间、比例和阶段位置决定。

同样的 math / code / instruction 数据:

  • 放在预训练早期,可能被稀释;
  • 放在预训练末期,可能提升目标能力但带来遗忘;
  • 混合 general anchor 做 mid-training,可能成为桥梁;
  • 放在 SFT,可能只改变输出格式;
  • 放在 RL,可能优化策略但受初始化限制。

所以真正值得研究的不是“mid-training 数据有哪些”,而是:

  1. 如何度量 pretraining distribution、midtraining distribution、posttraining distribution 之间的距离?
  2. 如何判断一个数据源是 bridge 还是 harmful shift?
  3. 什么是模型的 plasticity window?
  4. specialized data 的最佳引入时机和比例是否可预测?
  5. mid-training 是否能提升 RLVR 的探索空间和 reward learning efficiency?
  6. 对 LLM Agent,是否存在 agentic mid-training:在 RL 前先用轨迹、工具调用、代码修改、环境反馈摘要做分布桥接?

我的判断是:未来 base model recipe 的竞争,不会只在“预训练数据更大”上,而会越来越转向“训练阶段之间的数据路径设计”。

Mid-training 正是这个趋势中最清晰的一环。


#12. 最后给一个简短操作清单

如果你要准备 mid-training 数据,可以按这个 checklist:

  1. 明确后训练目标:chat、reasoning、code、agent、long-context、multilingual?
  2. 为每个目标建立 eval cluster,而不是单 benchmark。
  3. 保留 general anchor data,避免纯 specialized continued pretraining。
  4. 为 math/code/QA/long-context/instruction/thinking 分桶建库。
  5. 每条数据记录 source、license、synthetic、quality、domain、length、dedup id。
  6. 对 math/code/QA 尽量做 verifier-based filtering。
  7. 对 benchmark、SFT、RL 数据做全链路 decontamination。
  8. 用 microanneal 测单源数据边际贡献。
  9. 用 integration test 测混合配方和 post-trainability。
  10. 联合设计 mixture weight、引入时机、learning rate schedule。
  11. 不要只看 base eval,也要看 SFT / RL 后是否更好。
  12. 把 mid-training 当成分布桥接,而不是“最后补课”。

如果只记一句话:

Pretraining 数据决定模型底座的宽度,mid-training 数据决定模型往哪里长,post-training 数据决定模型如何表现出来。