
文章目录
-
- [1. 先把问题讲清楚:继续训练不是默认答案](#1. 先把问题讲清楚:继续训练不是默认答案)
- [2. CPT、DAPT、TAPT 分别是什么](#2. CPT、DAPT、TAPT 分别是什么)
- [3. 什么时候值得做 CPT](#3. 什么时候值得做 CPT)
- [4. CPT 的训练目标仍然是 next-token loss](#4. CPT 的训练目标仍然是 next-token loss)
- [5. 数据准备:领域语料不是直接丢进去](#5. 数据准备:领域语料不是直接丢进去)
- [6. 数据配比:不要只喂领域数据](#6. 数据配比:不要只喂领域数据)
- [7. 用重复轮数检查过拟合风险](#7. 用重复轮数检查过拟合风险)
- [8. 学习率要比从零预训练更保守](#8. 学习率要比从零预训练更保守)
- [9. CPT 后为什么通常还要 SFT](#9. CPT 后为什么通常还要 SFT)
- [10. CPT 与 RAG 如何选择](#10. CPT 与 RAG 如何选择)
- [11. 评估体系:领域提升和通用回归要同时看](#11. 评估体系:领域提升和通用回归要同时看)
- [12. 一个最小 CPT 决策流程](#12. 一个最小 CPT 决策流程)
- [13. 常见误区](#13. 常见误区)
- [14. 小结](#14. 小结)
- 大模型视角
- 下一篇
摘要:持续预训练(Continual Pretraining, CPT)是在已有基础模型上继续用领域语料做语言模型训练,让模型更熟悉某个行业、组织或任务分布。它不是万能知识注入工具,也不能替代 RAG 和 SFT。CPT 适合有大量稳定高质量领域文本、且基础模型对领域语言分布明显不适应的场景;如果数据少、知识更新快或只是想改变回答格式,RAG/SFT 往往更合适。本文会讲清 CPT、DAPT、TAPT 的区别,给出数据配比、通用回放、学习率、训练配置和评估清单。
- 前置知识:专栏一的过拟合、优化器、Transformer;专栏二预训练、数据配比和 Chinchilla Law
- 阅读时间:50-60 分钟
- 代码环境:Python 3.10+,示例只依赖标准库;配置示例使用 JSON
- 读完目标:能判断一个场景是否适合 CPT,能设计领域数据与通用回放配比,能理解 CPT 后为什么通常还需要 SFT/RAG
1. 先把问题讲清楚:继续训练不是默认答案
很多团队拿到一个基础模型后,会自然想到:"我们有一堆行业文档、内部制度、客服工单和技术手册,能不能继续训练,让模型更懂我们?"
这就是持续预训练常见动机。它听起来直接:把领域文本喂给模型,让参数吸收领域知识。问题是,CPT 是重手段。它会改变模型参数,可能增强领域适应,也可能造成过拟合、灾难性遗忘、安全边界变化和事实记忆风险。
在动手前,要先区分三类需求:
| 需求 | 更常见方案 | CPT 是否合适 |
|---|---|---|
| 知识经常更新,需要引用来源 | RAG | 通常不是首选 |
| 想让模型按固定格式回答 | SFT | CPT 不是主工具 |
| 有大量稳定领域文本,基础模型不熟悉术语和表达 | CPT/DAPT | 可能合适 |
| 只有几十篇 FAQ 或制度 | RAG/SFT | 不建议重度 CPT |
| 想让模型遵守安全边界 | SFT/DPO/RLHF/规则 | CPT 只能辅助 |
CPT 可以改变模型对领域语言分布的熟悉程度,但它不会自动让模型成为好助手。一个做过 CPT 的模型,通常还需要 SFT 教它如何回答用户问题,需要 RAG 提供最新事实,需要安全评估控制边界。
2. CPT、DAPT、TAPT 分别是什么
几个术语经常混用,先建立清晰边界。

它们本质上通常还是语言模型训练,也就是 next-token prediction。数据可以是领域论文、手册、合同、工单、日志、代码和结构化文档转换文本。
与 SFT 的区别在于:
text
CPT/DAPT/TAPT:让模型更熟悉某类文本分布。
SFT:教模型在指令场景下如何回答。
RAG:把外部知识检索出来,作为上下文供模型使用。
如果你想让模型"知道公司最新假期安排",RAG 更合适;如果你想让模型"用固定 JSON 输出工单分类",SFT 更合适;如果你想让模型"更熟悉大量医学病历和术语表达",DAPT 可能有价值。
3. 什么时候值得做 CPT
做 CPT 前可以用下面条件判断:
text
适合条件:
1. 有大量、稳定、合法授权的高质量领域文本;
2. 领域语言和通用语料差异明显;
3. 基础模型对领域术语、文体或结构理解不足;
4. 目标能力不是只靠检索就能解决;
5. 团队能承担训练、评估、回滚和安全审查成本;
6. 有独立领域评估集和通用能力回归评估集。
不适合条件:
1. 数据很少或重复严重;
2. 知识频繁更新,且需要可引用来源;
3. 只是想改变回答格式或语气;
4. 没有评估集;
5. 没有能力监控通用能力下降;
6. 数据包含大量隐私或权限边界复杂信息。
这里最容易踩坑的是"数据量"。领域数据少时,CPT 往往会把模型训练得更像那些文档,但不一定更会解决真实问题。它可能只是记住文档风格,甚至记住具体段落。
4. CPT 的训练目标仍然是 next-token loss
CPT 通常沿用预训练目标。给定领域文本 token 序列:
x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn
模型继续学习:
P ( x t ∣ x < t ) P(x_t \mid x_{<t}) P(xt∣x<t)
loss 仍然可以写成:
L = − 1 T ∑ t = 1 T log P ( x t ∣ x < t ) \mathcal{L} = -\frac{1}{T}\sum_{t=1}^{T}\log P(x_t \mid x_{<t}) L=−T1t=1∑TlogP(xt∣x<t)
这意味着 CPT 训练模型"续写领域文本",而不是直接训练"回答用户问题"。
这个区别非常重要。比如你用大量法律合同做 DAPT,模型可能更熟悉合同条款、法律术语和文档结构。但用户问"这份合同有什么风险?"时,模型是否能列出风险、引用条款、区分不确定性,还需要 SFT/RAG 和评估。
所以 CPT 的收益通常体现在:
- 领域术语表示更稳定;
- 领域文体更自然;
- 对领域上下文的续写 loss 降低;
- 后续 SFT 可能更容易学好领域任务;
- 少量领域问答的泛化可能更好。
它不保证事实准确,也不保证回答格式。
5. 数据准备:领域语料不是直接丢进去
CPT 数据处理要比通用预训练更谨慎,因为领域数据常常更敏感、更少、更容易重复。
至少要检查:
| 检查项 | 说明 |
|---|---|
| 授权和权限 | 是否允许用于训练,是否包含内部权限数据 |
| PII 和敏感信息 | 客户信息、合同编号、病历、账号、日志 token |
| 重复和模板 | 制度、合同、报表常有大量重复段落 |
| 过期内容 | 旧制度、旧 API、旧流程可能误导模型 |
| 文档结构 | 表格、标题、编号、代码块是否保留 |
| 数据分层 | 领域文档、工单、FAQ、日志、代码要分开统计 |
| 评估隔离 | 评估集不能进入训练数据 |
领域数据特别适合保留元信息,例如:
json
{
"doc_id": "policy_2026_001",
"source": "hr_policy",
"created_at": "2026-01-10",
"permission_level": "internal",
"language": "zh",
"tokens": 1832,
"pii_flag": false,
"quality_score": 0.91
}
训练时不一定把这些元信息都喂给模型,但数据治理和排查需要它们。比如模型输出过期制度时,你要能追溯训练数据里是否存在旧版本。
6. 数据配比:不要只喂领域数据
只用领域数据继续训练,最直接的风险是灾难性遗忘:模型在领域文本上更熟,但通用语言、代码、数学、安全边界可能下降。
常见做法是混入一部分通用高质量数据,叫 replay。直觉是:让模型学习领域分布的同时,不要忘掉原来的通用能力。
一个简化配比计算:
python
# Python 3.10+
def mix_budget(total_tokens, domain_ratio):
domain = int(total_tokens * domain_ratio)
general = total_tokens - domain
return {"domain_tokens": domain, "general_replay_tokens": general}
for ratio in [0.5, 0.7, 0.9]:
print(ratio, mix_budget(10_000_000_000, ratio))
领域比例怎么选?没有固定答案,但可以按风险判断:
| 情况 | 领域比例建议 |
|---|---|
| 领域数据少、重复高 | 保守,增加通用 replay |
| 通用能力很重要 | 保守,必须做回归评估 |
| 领域差异大且数据充足 | 可提高领域比例,但分阶段验证 |
| 只做短程适配 | 可以稍高,但严格监控过拟合 |
| 模型只服务窄领域 | 可更激进,但仍要保留安全和通用边界 |
领域比例不是越高越专业。它是在领域提升和通用遗忘之间做交换。
7. 用重复轮数检查过拟合风险
领域数据少时,即使训练 token 总量不大,也可能对领域数据反复训练很多轮。可以估算预期 epoch:
e p o c h s = t r a i n _ t o k e n s × d o m a i n _ r a t i o d o m a i n _ t o k e n s epochs = \frac{train\_tokens \times domain\_ratio}{domain\_tokens} epochs=domain_tokenstrain_tokens×domain_ratio
代码:
python
# Python 3.10+
def domain_epochs(train_tokens, domain_ratio, domain_tokens):
return train_tokens * domain_ratio / domain_tokens
cases = [
{"train_tokens": 5_000_000_000, "ratio": 0.8, "domain_tokens": 500_000_000},
{"train_tokens": 5_000_000_000, "ratio": 0.5, "domain_tokens": 5_000_000_000},
]
for c in cases:
e = domain_epochs(c["train_tokens"], c["ratio"], c["domain_tokens"])
print(c, "domain epochs≈", round(e, 2))
如果预期 epoch 很高,就要警惕:模型可能不是学会领域规律,而是在记忆具体文档。解决方法包括降低训练 token、降低领域比例、增加通用回放、改用 RAG 或增加数据多样性。
8. 学习率要比从零预训练更保守
CPT 从一个已经训练好的模型开始,不是随机初始化。模型已有能力是资产,学习率太大可能破坏它。
常见策略:
text
1. 使用比预训练更小的学习率;
2. 使用 warmup,但不宜过激;
3. 控制总训练 token;
4. 开启 gradient clipping;
5. 保存密集 checkpoint;
6. 定期做领域和通用评估;
7. 出现通用能力下降时及时回滚。
一个简化训练配置骨架:
json
{
"training_stage": "continual_pretraining",
"learning_rate": 0.00001,
"warmup_ratio": 0.03,
"max_seq_length": 4096,
"global_batch_size": 512,
"gradient_clipping": 1.0,
"domain_data_ratio": 0.7,
"general_replay_ratio": 0.3,
"save_steps": 500,
"eval_steps": 500
}
这些数字不是通用答案。重点是配置思想:CPT 要保守、可回滚、可评估,而不是像从零预训练那样大幅改动参数。
可以把 CPT 想成给已经建好的楼做改造。你可以重新装修某些房间,但不能随便拆承重墙。
9. CPT 后为什么通常还要 SFT
CPT 学的是领域文本分布。SFT 学的是指令到回答的行为模式。两者解决的问题不同。
假设你用大量医疗指南做 DAPT。模型可能更熟悉术语"禁忌症""适应证""不良反应"。但真实用户问:
text
我这种情况能不能吃某某药?
一个合格助手需要:
- 识别这是医疗高风险问题;
- 不直接给诊断或处方;
- 建议咨询医生;
- 如果有证据上下文,要基于证据回答;
- 对不确定信息说明边界。
这些行为通常来自 SFT、偏好优化、安全策略和产品规则,不是 CPT 自动产生的。
常见流水线:
text
基础模型
-> CPT/DAPT:熟悉领域语言和知识分布
-> SFT:学习指令、格式、拒答、引用和任务行为
-> DPO/RLHF:优化偏好和边界
-> RAG:提供最新和可引用知识
-> 评估与上线监控
如果预算有限,建议先做 RAG 和 SFT 验证收益,再决定是否 CPT。
10. CPT 与 RAG 如何选择
CPT 和 RAG 经常被拿来比较。更准确地说,它们不是替代关系,而是适合不同知识形态。
| 维度 | CPT | RAG |
|---|---|---|
| 知识位置 | 写进模型参数 | 放在外部知识库 |
| 更新成本 | 高,需要重新训练或继续训练 | 低,更新索引和文档 |
| 引用来源 | 不天然支持 | 容易提供引用 |
| 适合内容 | 稳定术语、文体、领域分布 | 最新事实、制度、产品文档 |
| 风险 | 记忆、遗忘、难回滚 | 检索失败、上下文注入 |
| 评估重点 | 领域能力和通用回归 | 检索质量、引用准确、答案忠实 |
如果知识频繁变化、需要可解释引用、权限复杂,优先 RAG。 如果领域语言和任务分布长期稳定,且基础模型明显不熟悉,CPT 才更有价值。
很多企业最终会使用组合方案:CPT 让模型更懂领域表达,RAG 提供最新事实,SFT 规定回答方式。
11. 评估体系:领域提升和通用回归要同时看
CPT 不能只看领域 validation loss。领域 loss 下降可能只是模型更会续写领域文档,不一定更会解决用户问题。
评估应至少包含:
| 评估项 | 目的 |
|---|---|
| 领域 validation loss | 是否更熟悉领域文本分布 |
| 领域术语解释 | 是否理解专业概念 |
| 领域问答 | 是否能解决真实业务问题 |
| 文档续写 | 是否掌握文体和结构 |
| 通用问答 | 是否遗忘常识 |
| 代码/数学 | 是否损害基础能力 |
| 安全拒答 | 是否边界退化 |
| RAG 任务 | 是否能基于证据回答 |
| 人工样例 | 风格、事实、可用性检查 |
建议每个 checkpoint 都跑同一套评估,画出领域能力和通用能力的曲线。如果领域能力继续上升,但通用能力持续下降,就要判断是否已经过训练。
12. 一个最小 CPT 决策流程
你可以用下面流程判断是否开始 CPT:

这个流程看似慢,但比直接训练几天后发现模型变差更便宜。
13. 常见误区
误区一:CPT 可以替代 RAG。 CPT 适合稳定分布,RAG 适合更新快、需要引用和权限控制的知识。二者常常组合使用。
误区二:领域数据越多比例越高越好。 比例过高会导致通用能力下降、过拟合和风格变窄。
误区三:CPT 后模型会自动按业务格式回答。 格式、拒答、引用和任务流程通常要靠 SFT 和产品约束。
误区四:只看领域 loss 下降。 必须同时看领域任务、通用能力、安全边界和人工样例。
误区五:内部数据都适合训练。 内部数据可能包含权限、隐私、过期信息和敏感内容,必须做治理。
14. 小结
持续预训练是让基础模型适配领域分布的强手段,但它不是默认答案。它适合大量稳定、高质量、合法授权的领域语料,目标是让模型更熟悉领域语言、术语和文本结构。CPT 的主要风险是过拟合、灾难性遗忘、隐私记忆和边界退化,因此需要保守学习率、通用数据 replay、密集 checkpoint、领域评估和通用回归。
工程上更务实的判断是:先用 RAG 和 SFT 解决知识和行为问题,只有当基础模型确实存在领域分布适配缺口,并且数据和评估都准备好时,再做 CPT。
大模型视角
从大模型技术主线看,CPT 回答了一个很现实的问题:通用基础模型和行业需求之间的分布差距,到底该用训练、检索还是行为约束去补。理解 CPT 的边界,就能理解为什么企业级大模型方案通常是 CPT、SFT、RAG 三者的组合,而不是单选。
下一篇
下一篇会讲模型合并。和 CPT 不同,模型合并不继续训练,而是尝试在权重空间里组合多个模型或 adapter 的能力。