
1. 别急着微调先搞清楚Continued Pre-Training到底解决什么问题最近大模型圈子里有个现象特别有意思很多企业拿到ChatGPT、Llama、Qwen这类通用大模型第一反应就是赶紧搞微调觉得只要喂点业务数据模型就变成自己的了。结果呢微调完发现模型在通用对话上变傻了业务能力也没见提升多少甚至出现幻觉更严重的情况。我见过太多类似的案例了问题往往不在微调本身而是漏掉了更关键的一步——Continued Pre-Training持续预训练。先说个最直白的类比。通用大模型像一个读了万卷书的名校毕业生知识面很广但你要让他直接去你们公司财务部做账他连你们行业的黑话都听不懂。微调是什么是给他上了一堂短期的岗位培训课教他具体的业务流程和应答话术。而Continued Pre-Training是什么是送他去大学里系统性地读了一个学期的专业课程把行业的底层知识、术语体系、思维方式全部内化。这两件事看起来都在教模型但层次完全不同。微调Supervised Fine-TuningSFT改变的是模型的行为方式——让它学会怎么回答问题、遵循指令、格式化输出。它用的数据通常是问题-答案对量级一般在几万到几十万条。而Continued Pre-Training改变的是模型的知识结构——让它在原有世界知识的基础上吸收你行业特有的术语、背景知识、逻辑关系、文本风格。它用的数据是纯文本量级动辄上亿token不需要标注只需要收集整理。打个更具体的比方。你是一家医疗器械公司的技术负责人手里的通用模型知道CT是计算机断层扫描但它不知道你们公司内部的CT-2000型号、影像重建算法V3.2、辐射剂量控制规范这些具体概念之间的关联。你用SFT教它这些它只能死记硬背换个问法可能就懵了。但你用Continued Pre-Training喂它几千万token的行业文献、产品手册、临床报告这些知识就真正长在模型里了。所以什么时候必须上Continued Pre-Training我总结了三类场景第一类行业术语密集通用模型认知薄弱。比如医疗、法律、金融、能源、半导体这些专业领域通用模型虽然知道一些皮毛但遇到细分的专业词汇、缩写、行话很容易一本正经地胡说八道。第二类企业内部有大量非公开的领域知识。通用模型训练时根本没见过你们公司的技术文档、产品规格、历史项目复盘这些知识是买不来的只能自己喂。第三类模型需要处理特殊的文本风格。比如古文献整理、法律条文分析、代码仓库理解这些文本的格式、语法、逻辑跟普通互联网文本差异巨大直接微调效果很差。搞清楚这个前提你才不会把Continue Pre-Training和SFT混为一谈。我在实际项目中见过太多团队省掉了持续预训练直接上SFT结果就是模型在行业问题上答非所问——不是模型笨是它的知识底座里根本没有这些东西你光教它话术有什么用2. 数据是天花板行业语料的采集、清洗与配比策略很多技术负责人找到我开口第一句话就是我们的数据准备好了开始训练吧。结果一看数据基本都是几百MB的PDF、Word文档甚至还有一堆扫描件。说实话这个体量做SFT勉强凑合做Continued Pre-Training是远远不够的。那到底需要多少数据我给出一个经验区间这是我在多个行业项目里验证过的模型规模建议数据量token大致文本量训练预算参考7B2亿 - 10亿约1.5 - 7亿汉字8卡A100约3-7天13B5亿 - 20亿约3.5 - 14亿汉字8卡A100约5-12天70B20亿 - 50亿约14 - 35亿汉字需多节点或H800集群注意这个数字不是拍脑袋定的而是跟模型的知识容量和遗忘效应有关。数据太少行业知识根本不足以在模型中形成稳定的表征训完等于没训数据太多模型会严重偏移通用能力出现灾难性遗忘。我见过一个团队给7B模型喂了50亿token的行业数据结果模型连基本的数学计算都做不对了这就是过犹不及。数据清洗环节我一般按这个优先级处理第一步格式统一与降噪。PDF、扫描件要转成纯文本去掉页眉页脚、目录、图表说明、水印。这一步看起来简单但坑最多。我踩过最大的坑是PDF解析后出现的乱码和缺失空格——两个相邻的词被粘连在一起模型根本没法正确切分token。处理办法是用正则表达式配合专业解析工具做一次全面体检重点检查标点符号是否完整、英文单词是否粘连、全角半角是否统一。第二步去重。行业数据里重复内容特别多尤其是同一份文档的多个版本、官网页面的镜像副本、新闻稿的转发。我用SimHash加MD5双重去重先粗去重再细去重一般能去掉20%-40%的冗余数据。别小看这一步重复数据太多会严重浪费训练预算还会让模型产生重复输出的毛病。第三步质量过滤。用规则加模型打分的方式筛掉低质量文本。规则包括长度过滤短于500字的丢弃、符号密度过滤中英文混杂严重的丢弃、敏感内容过滤。模型打分可以用一个小的BERT分类器标注几万条行业相关度高/低的数据训练能过滤掉大量无关的通用闲聊文本。第四步配比策略——这是最关键也最容易被忽视的。纯粹喂行业数据是不行的必须混入通用数据。道理很简单模型持续训练的持续二字意味着它要在原有知识基础上生长不是推倒重来。如果全部喂行业数据旧知识会被快速冲掉这就是灾难性遗忘。业内常用的配比是行业数据:通用数据 5:5 到 7:3。通用数据用什么可以从开源数据集里抽取也可以从原始训练数据池里复用关键是覆盖面要广——包括通用百科、新闻、书籍、代码等。我用过一个更精细的做法把行业数据再细分核心业务文档占60%行业公开文献占25%泛关联文本如行业论坛、专业社区讨论占15%这样训练出来的模型既有深度又有广度。关于数据格式还有一点要提醒不要统一转成对话格式。Continued Pre-Training用的是原始文本不是问题-答案对。很多团队习惯性地把数据整理成JSON格式的对话这其实是把CPT做成了SFT效果大打折扣。正确的做法是把文档段落、注意事项、案例描述这些内容整理成连贯的纯文本保留原文的逻辑结构和语序。3. 训练策略的精细设计学习率、批次大小与长度控制数据准备好了接下来是训练策略。很多做过SFT的人会顺手把SFT的超参直接搬到CPT上这是个大坑。CPT和SFT对超参的敏感度完全不同原因在于两者的优化目标不一样——SFT是在有限任务上快速收敛CPT是在海量文本上缓慢吸收知识。先说学习率。CPT的学习率通常要比SFT低一个量级我常用的区间是1e-5到5e-5SFT一般用1e-5到2e-5但CPT用这么高很容易训飞。为什么因为CPT要处理的文本量远大于SFT如果学习率太高模型在吸收新知识的同时会把旧知识冲得一干二净。这个损失函数下降曲线看起来可能很平稳但等你评估的时候就会发现通用能力已经崩了。我习惯在训练开始时做一个3%的warm-up然后采用余弦衰减到终值1e-6。整个过程监控两个指标loss曲线和通用benchmark的漂移幅度。如果行业loss一直在降但通用benchmark比如MMLU、C-Eval掉得厉害先别急着加正则多半是学习率偏高先降一半试试。批次大小方面我推荐用较大的global batch。SFT用256到512就够了但CPT我通常用1024到4096。为什么要这么大因为CPT的样本是长文本梯度方差较大大batch可以提供更稳定的梯度估计减少对特定样本的过拟合。你在DeepSpeed或Megatron-LM里配置梯度累积就能实现不需要真的把单卡batch开得很大。序列长度也有讲究。行业文本往往有很强的长程依赖关系——比如法律合同的条款引用、技术文档的交叉引用、财务报告的前后勾稽关系。如果序列长度太短这些长程依赖就被截断了模型学不到完整逻辑。我的建议是至少4096推荐8192。我有个客户做法律大模型最初用2048的序列长度训练结果模型在长合同分析任务上表现很差总是顾此失彼。后来把序列长度提到8192效果立竿见影。原因就在于法律文本中第X条所述之义务这类引用关系往往跨越了几千token。再说说重复数据的处理与训练轮数Epoch的关系。行业数据本身就少清完可能就剩1亿token很多人为了物尽其用就反复喂好几轮。我的经验是行业数据小的话1到2个epoch就够多了必过拟合。如果数据量不够宁可花时间去采集更多不同来源的文本也不要在同一批数据上反复咀嚼。模型背下了原文并不是本事能泛化才是。你们可能会问那怎么判断训得好不好这里给几个实用的中间评估指标Loss曲线训练集loss和验证集loss都下降且没有拉大差距说明没有过拟合。困惑度Perplexity在行业文本上的PPL明显下降说明模型确实学到了领域文本的统计规律。通用能力漂移跑一遍MMLU、C-Eval等通用benchmark跟原始模型对比下降幅度控制在3%以内算正常。4. 实战配置一份可以直接抄作业的CPT训练配置单理论研究半天不如给一份能直接用的配置。下面是我在8卡A10080G环境下训练一个7B模型的完整方案你们可以按自己的硬件情况调整。4.1 软件栈选择框架我用的是Megatron-LM或DeepSpeed HuggingFace Transformers的组合。个人更推荐前者做CPT因为它在张量并行、序列并行、数据并行上的实现都非常成熟而且对长序列支持很好。如果你团队对HF生态更熟悉DeepSpeed ZeRO-3也是够用的但需要谨慎处理序列长度的显存占用。分词器方面如果你的行业数据里有大量专业术语比如生物医学的英文缩写、化学式、代码片段建议在原有分词器基础上扩充词表。但这事儿要慎重——加了新token模型的embedding层就要多一块随机初始化的参数训练初期会有一些损失波动需要额外增加warm-up步数来稳定。4.2 超参配置参考模型: 7B (如Qwen2-7B、Llama-3-8B) 序列长度: 8192 global batch size: 1024 micro batch size: 4 梯度累积: 32 学习率: 3e-5 warm-up: 3% 衰减策略: 余弦衰减至1e-6 训练轮数: 1 epoch 优化器: AdamW (β10.9, β20.95, weight_decay0.1) 混合精度: bf16 上下文损失: 前1024个token不参与损失计算关于最后一项上下文损失这是很多团队忽略的细节。计算损失时把每个样本的开头一段token排除在外只计算后续token的损失。原因是文本开头的token缺少足够的上文信息预测难度大且信息量低硬算这部分损失只会引入噪声干扰。这个trick在代码模型和长文档模型上尤其有效能让训练更稳定。4.3 训练过程的监控与断点管理训练不是跑起来就完事了我习惯每保存一次checkpoint就跑一轮通用评估和一轮行业评估。行业评估怎么设计从验证集里抽几百条文本算PPL然后跑几个典型的行业任务比如法律条文问答、医疗病历结构化、代码生成。这里有个容易忽视的细节保存频率要跟数据顺序搭配。训练初期loss下降快checkpoint保存密一点后期loss平稳保存稀一点。我一般用指数间隔保存——第100步保存一次然后200、400、800这样翻倍。这样既能保证断点恢复的灵活性又不会把磁盘塞满。4.4 显存优化三板斧7B模型在8卡A10080G上跑8192序列长度理论上是够的但如果你并行配置不当也会OOM。我的经验是用Megatron-LM的序列并行把长序列的激活值分散到多卡上。开启activation recomputation重计算用一半的FLOPs换显存训练速度损失约20%但显存占用能降30%以上。用bf16混合精度不要用fp16。fp16在小模型上容易精度溢出bf16在A100和H800上表现稳定得多。配置对了之后整个训练过程的loss曲线应该是平滑下降偶尔有小波动但不会剧烈跳动。如果出现loss突然飙升不要慌先检查数据顺序有没有问题——比如某个batch里混进了异常的超长文本或大量重复文本这个排查掉就没事了。5. 训练完成后的评估与部署别只盯着Loss曲线模型训完很多人兴冲冲地下载checkpoint一测效果发现嗯看起来没变聪明啊。这个感觉很正常原因在于CPT是润物细无声地改模型内部表征不像SFT那样输出形式会发生明显变化。所以评估方法必须转变思路。5.1 行业能力评估三项核心任务我建议设计三项跟业务强绑定的评估任务术语理解测试。把行业术语表拿出来让模型解释每个术语的含义对比训练前后的回答质量。重点关注术语解释的准确性和完整性而不是流畅度。比如医疗模型让模型解释弥漫性大B细胞淋巴瘤的R-CHOP方案训练前可能只能说个大概训练后应该能说出具体药物的组合逻辑和适应症。领域文本困惑度对比。拿一批训练时没见过的行业文本计算训练前后模型在文本上的PPL。PPL显著下降说明模型确实学到了行业文本的统计规律。这个指标虽然不能直接反映智能但能客观说明知识内化的程度。业务场景模拟。根据你实际的应用场景设计几十道模拟题比如客服对话、报告生成、条款分析让模型直接跑人工打分。这是最贴近实际效果的评估方式但也最容易受prompt影响建议固定prompt模板多次重复取平均分。5.2 通用能力衰减的体检表CPT最大的副作用就是通用能力衰减必须做一次系统的体检。我的体检清单包括能力维度评测集可接受下降幅度通用知识MMLU、C-Eval≤3%推理能力GSM8K、BBH≤5%代码能力HumanEval≤3%中文能力CMMLU≤3%数学能力MATH≤5%如果某项指标掉得太多优先检查训练数据的配比和学习率。我遇到过代码能力掉8%的情况排查后发现问题出在行业数据里混杂了大量格式蹩脚的代码片段拉低了模型的代码统计规律。清洗掉这些噪声数据后重新训练代码能力就恢复了。5.3 部署时的模型融合技巧如果你手里的算力有限或者行业数据实在不够还有一个折中方案——模型融合。把训练后的模型和原始模型按比例融合公式很简单最终模型权重 α × CPC训练后模型 (1 - α) × 原始模型α一般取0.7到0.9具体看你的业务需求偏向行业能力还是通用能力。这个方法我之前觉得是土办法后来发现其实业界有不少团队在用尤其在算力紧张或数据量不足的情况下能有效平衡两个方向的能力。需要注意的是这个融合操作必须在模型结构完全一致的前提下做如果中途改了词表或embedding就不能直接套用这个公式了。6. 踩坑实录我经历过的五个经典翻车现场讲到这里理论、数据、配置、评估都说完了我挑几个印象最深的踩坑经历分享出来保准你们看完能少走弯路。第一个坑PDF解析后乱码导致loss不降。有个做能源行业的项目客户坚持用自己的内部文档训练说数据都是处理好的。结果训练到第2000步loss死活降不下去一直在3.2附近震荡。我抽了一批数据检查发现大量PDF转出来的文本里中文标点全变成了乱码字符英文单词之间没有空格。这个数据质量做ChatGPT训练肯定不行连基数模型都训不出来。后来用统一的正则清洗流程重新过了一遍数据loss才开始正常下降。第二个坑重复数据过多导致模型复读机。有个客户的数据集里某份产品说明书出现了47次原因是有多个部门各自保存了一份不同版本的文档清洗时只做了标题去重没做内容级去重。结果模型训练后在很多无关问题上会莫名其妙地输出产品保修期为一年这类内容这就是典型的数据重复导致的复读机现象。后来在流程里加了一层SimHash内容级去重问题才解决。第三个坑SFT直接替换CPT的起点通用能力崩了。有个团队拿着我们已经做好的CPT模型又想自己再做第二轮CPT结果直接用SFT的学习率4e-5去跑训练到一半模型就开始胡言乱语英文单词都拼不对了。这就是学习率过高的典型表现。改回2e-5之后情况才稳定下来。第四个坑训练中途改词表训了个半成品。有团队为了省事在CPT训练前只加了50个行业新词训练到一半发现还有100个词没加于是停下来改词表继续训。结果因为embedding层的随机初始化部分被训练过又重置整个模型的表现一塌糊涂。这个教训告诉我们词表扩增必须在训练开始前一次性搞定中途加词是大忌。第五个坑用SFT的评估标准来验收CPT。有个客户验收时拿了一堆问题-答案对来测试发现模型回答得不够准确差点要打回重训。其实CPT模型本身就不是用来做对话的它是给后续SFT打底座的。你用CPT后的模型直接做问答当然不对。后来我们给客户展示了行业文本PPL的显著下降又做了一道SFT的流水线demo他才心服口服。这几个坑说来说去都是同一个根源没搞懂CPT的本质是什么把SFT的思维惯性带过来了。CPT不是简单地再训一遍模型而是一次有约束、有节奏、有评估的知识注入过程。7. 成本控制与路线选择你的企业到底该不该做CPT最后聊一个很现实的问题算力成本和路线怎么选。毕竟不是每家企业都有几十张A100/H800随便造CPT的成本说高不高、说低也不低。以7B模型为例2亿token的行业数据8卡A100跑3-4天单次训练的算力成本大约在1.5万到3万人民币按云GPU市场价估算。如果是70B模型成本直接翻10倍不止。这么一比你就明白为什么好多人宁愿选择RAG检索增强生成了。我的判断标准是看三点一看知识类型。如果你的行业知识是事实型、检索型的比如产品参数、政策条款、操作手册RAG完全够用没必要上CPT。但如果你的业务需要模型具备推理、联想、综合判断能力比如法律条文适用性分析、病历诊断辅助、复杂设备的故障排查就必须把知识内化到模型里CPT才是正解。二看数据持续性。如果你的行业知识更新频繁比如法律法规每年变、产品线每月更新那训练一次CPT的意义不大因为三个月后模型又过时了。这时候应该考虑搭一个轻量持续学习的管道周期性做增量训练。反之如果你的行业知识相对稳定比如医学基础知识、材料科学原理这些几十年不变的知识最适合用CPT固化。三看上下文长度要求。如果你的业务场景需要模型阅读上百页的文档并做综合分析比如尽调报告审核、标书评审光靠RAG去检索碎片信息是不够的长文档的整体理解需要模型自己具备跨章节的关联能力这就必须在训练时用足够长的上下文喂给模型。所以也回到了我前面说的CPT的序列长度设计要多上点心。从执行路线上看我给预算有限的团队一个穷人的方案先花一笔小钱做数据清洗和CPT训练7B模型验证业务效果再决定是否上更大的模型和更多的数据。这个方案的逻辑是7B模型跑通了流程积累了行业数据资产后续换更大的模型只是重复同一套流程成本可控、风险分散。而如果你的业务对生成质量要求极高比如法律意见书初稿、医学影像报告生成那直接用70B级别的模型做CPT更合适一次到位省去后面反复迭代的隐性成本。说到底CPT不是万能的它解决的是知识内化的问题解决不了能力不足的问题——模型的底座能力推理、生成、理解还是取决于基础模型的素质。选一个好的基础模型比盲目堆训练次数重要一百倍。我最近在多个项目里用的Qwen2系列和Llama-3系列做CPT效果都还不错尤其是中文行业场景下Qwen2-72B的底座能力让人惊喜。关于Continued Pre-Training就先聊到这儿。无论你是刚起步还是已经在计划中记住一个核心原则数据质量决定知识内化的上限训练策略决定通用能力保留的下限评估体系决定你能不能真正用起来。这三样抓好行业模型的道路就顺畅了一大半。如果你们在实际训练中遇到什么问题欢迎在评论区交流。