01. 预训练、继续预训练和 SFT 有什么区别?分别在什么阶段用?

整理预训练、继续预训练与 SFT 的区别、阶段定位与工程取舍。

简单回答

预训练是从零开始在海量语料上学语言建模能力,继续预训练(Continual Pre-Training)是在已有底座模型上用领域语料继续做 next token prediction,SFT(Supervised Fine-Tuning)则是用指令-回答对让模型学会"听懂人话、按格式回答"。三者分别对应"学语言→学领域→学交互"三个阶段,目标和数据形态完全不同。

详细解释

预训练(Pre-Training) 的核心目标是让模型获得通用的语言理解和世界知识。训练数据通常是 TB 级别的互联网文本,训练目标就是 Causal LM 的 next token prediction。这个阶段消耗的算力最大,动辄几千张 GPU 跑几个月,一般只有大厂或专门做基座模型的团队才会从头做。预训练结束后拿到的叫 base model,它能续写文本,但不会"对话",你问它问题它可能会把你的问题当成文章开头继续往下写。

继续预训练(Continual Pre-Training / Domain-Adaptive Pre-Training) 是在 base model 的基础上,用特定领域的语料继续做同样的 next token prediction。典型场景比如做医疗大模型,拿几十 GB 的医学文献、病历、药典去继续训,让模型内化领域知识。这一步的关键是数据配比——纯领域数据容易导致通用能力退化,所以一般会混入一定比例的通用语料。训练量级比预训练小很多,但比 SFT 大得多,通常是几 B 到几十 B token。

SFT(Supervised Fine-Tuning / 指令微调) 的目标不是灌知识,而是教模型"怎么回答"。数据格式是 (instruction, input, output) 或者 (system, user, assistant) 这种对话对,数据量通常在几千到几十万条,远小于预训练数据。SFT 之后模型才真正变成一个"能用的助手",知道用户问什么、该怎么组织回答、什么时候该拒绝。

三者的关系可以理解为一条流水线:预训练给底座能力 → 继续预训练补领域知识(可选)→ SFT 教交互格式 → 对齐(RLHF/DPO 等)做价值观校准。实际项目中并不是每一步都要做,比如很多应用直接拿开源 base model 做 SFT 就够了,只有领域知识严重不足时才需要继续预训练。

一个常见误区是把 SFT 当成"教模型新知识"的手段。实际上 SFT 的数据量太小,很难真正注入大量新知识,它更多是在激活和组织模型已有的知识。如果模型本身不具备某个领域的知识,光靠几万条 SFT 数据是补不上的,这时候要么做继续预训练,要么走 RAG。

另一个工程上要注意的点是 loss 的计算范围。预训练和继续预训练对所有 token 算 loss,SFT 一般只对 output 部分(assistant 回复)算 loss,instruction 部分做 mask。这个细节在用框架训练时经常被忽略,配错了会严重影响效果。

面试时可以这样答

预训练、继续预训练和 SFT 其实对应模型训练流水线里三个不同阶段,解决的问题不一样。

预训练是从头开始,在 TB 级的通用语料上做 next token prediction,目的是让模型学会语言本身和通用世界知识。这个阶段成本极高,一般只有做基座模型的团队才会碰。训完拿到的 base model 能续写文本,但还不会对话。

继续预训练是在 base model 上用领域语料继续做同样的语言建模任务。比如要做一个金融或医疗模型,拿领域文档继续训几个 B 到几十 B token,让模型内化领域知识。这一步要特别注意混入通用语料,不然通用能力会明显退化。

SFT 就是指令微调,用的是 instruction-output 对,数据量通常几千到几十万条,目的不是灌知识,而是教模型怎么跟人交互——理解指令、按格式回答、该拒绝的时候拒绝。一个关键细节是 SFT 只对 output 部分算 loss,instruction 部分 mask 掉。

实际项目中不是每步都要做。大多数场景直接拿开源底座做 SFT 就够了,只有领域知识严重不足才需要继续预训练。还有一个常见误区是想靠 SFT 给模型"教新知识",其实 SFT 数据量太小做不到这件事,知识补充要靠继续预训练或者 RAG。

常见追问

  1. 继续预训练时通用语料和领域语料的配比一般怎么定?
  2. SFT 阶段 loss mask 配错了会有什么表现?
  3. 如果领域知识不足,继续预训练和 RAG 怎么选?