持续预训练实战_让基础模型适配垂直领域

文章目录

    • [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 的能力。

相关推荐
段一凡-华北理工大学35 分钟前
高炉炼铁机器视觉与智能识别十八讲~系列文章15:可靠性篇:防误报、容错与识别系统的鲁棒性设计
人工智能·算法·机器学习·高炉大模型·高炉机器视觉·高炉炼铁模型开发
posstos38 分钟前
用 MiniMax-H3 做 AI 短剧:一个 SKILL 把剧本自动拆成六段式提示词
人工智能·aigc·ai视频·提示词工程·minimax·ai短剧·分镜脚本
昇腾CANN39 分钟前
CANNBot PyPTO 算子编程智能体的使用,从一段 Prompt 开始
人工智能·开源·昇腾·cann·cann开源
xiaoyunxuexibiji1 小时前
企业电子招投标如何实现全流程线上管理?从招标立项到评标定标
大数据·人工智能
西木莉1 小时前
AI时代中小企业如何落地数据治理?
人工智能
汇像AI无人实验室1 小时前
植物合成生物学迎来爆发期:如何用自动化重塑基因元件筛选?
大数据·人工智能·自动化
xwz小王子1 小时前
Nature Machine Intelligence|微型机器人强化学习训练缩短至分钟级:每秒19万次交互
人工智能·机器人
某林2121 小时前
局部路径规划器 DWB:速度采样与评分权重的取值分析
人工智能·算法·架构·机器人·技术复盘