ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

持续预训练(CPT)实战指南:从数据工程到行业模型落地

2026/9/11 6:49:14 拓冰建站 浏览量
持续预训练(CPT)实战指南:从数据工程到行业模型落地 很多做企业AI落地的朋友找到我开口第一句话往往是我们调了通用大模型也做了提示词优化但回答行业问题还是不够专业是不是该自己训练一个行业模型这个问题背后就是通用大模型和行业模型之间的鸿沟。通用大模型确实强但它掌握的是全人类范围的常识到了某个垂直行业术语体系、文档风格、知识密度全都变了光靠提示词很难把底座模型的认知拉到行业深度。Train from scratch成本高到离谱纯靠SFT又只是表面学会格式深层行业知识根本没进去。真正性价比最高的路径就是我今天要讲的Continued Pre-Training中文叫持续预训练简称CPT。这篇文章我会从数据工程、训练配置、评估回归、连带踩坑把整个CPT实战链路拆开讲一遍。适合企业AI团队的技术负责人、算法工程师也适合正在做技术选型的产品经理看个大概。里面所有数值和策略都是我在真实项目里跑过的不一定适合每一家公司但肯定比网上那些泛泛的概念介绍要实在得多。1. 项目概述搞懂Continued Pre-Training在企业里的真实定位1.1 为什么说从零预训练不是企业该走的路先直接回答一个最常被问的问题为什么不能从零开始训练一个行业大模型技术上不是不行但经济账完全算不过来。一个7B规模的模型从零预训练通常需要2到3万亿token的数据算力消耗在数千块A100级别显卡上跑几个月电费加硬件折旧就是几千万起步。到了70B甚至更大规模成本直接上亿。绝大多数企业根本没有这个预算也没有这个数据量。退一步说就算你砸钱砸数据勉强训出来了效果大概率还不如一个开源的通用底座模型因为你造数据的质量和广度和那些顶级团队的万亿级语料没法比。所以更聪明的做法是站在巨人的肩膀上。通用大模型已经具备语言学能力、推理能力、世界常识它只是对某个行业的专有知识覆盖不足。Continued Pre-Training要做的就是用大量行业语料对底座模型做二次训练让模型把行业术语、文档结构、专业逻辑内化到参数里。你可以把它想象成招了一个名校通识教育毕业的高材生他很聪明、基础很好但不懂你这家公司的业务你把他送去行业研究院进修三个月回来他就能直接干活了。这三个月进修就是CPT。它不需要重新学习语言只需要补充行业知识所以token量级通常在几十亿到几百亿之间和万亿级预训练相差两个数量级。这也是为什么CPT是目前企业自训行业模型的主流入场方式。1.2 CPT能解决什么、不能解决什么把CPT的边界搞清楚能避免后期大量返工。它擅长解决的问题我列几类行业术语和专有名词。制造业里的高炉煤气冷轧卷板金融里的授信额度债券回售医疗里的适应症给药途径通用模型经常理解得模棱两可CPT之后会稳定很多。行业文档的写作风格和表达习惯。让模型读一批环评报告、法律判决书、基金公告它能学会这类文本的段落结构、句式特征。企业内部的私有知识。公司历史项目文档、产品缺陷记录、FAQ库、客服对话这些都是公开语料里不存在的内容CPT是最合理的注入方式之一。减少幻觉的底层认知。模型对某个领域完全没概念时会一本正经地编造。CPT让它在知识边界内作答编造概率会大幅下降。但CPT不是万能的。首先它不能替代RAG做实时知识检索。企业内部的那套动态数据库、每天变动的价格、库存、政策根本不应当写进参数里CPT训练完之后数据就固化了今天注入的知识明天不可能自动更新。其次CPT不负责指令跟随。让模型按JSON格式输出先分析再总结这类能力是SFT阶段的工作。最后CPT也不能凭空创造模型没见过的新知识如果企业业务文档本身就稀缺那CPT的效果会非常有限。所以我经常和团队强调一句话CPT解决的是这个模型懂不懂行业SFT解决的是模型会不会按你的要求说话RAG解决的是模型能不能拿到最新最准的信息。三者是一条流水线不是互斥方案。2. 数据工程CPT的成败七成在数据三成才在训练2.1 数据来源企业知识资产的盘点与收集我见过不少团队训练还没开始第一步就被数据卡住了。企业里数据散落在各个部门、各种格式里文档有Word、PDF、扫描件、PPT甚至还有大量Excel里的结构化字段。你指望一个训练脚本直接吃进去根本不现实。所以在动训练之前先做一次认真到近乎较真的数据盘点。内部数据源通常包括这几类技术文档、产品说明书、操作手册、历年项目报告、行业分析报告、客服对话记录、工单系统里的问题描述和解决过程、研发代码仓库里的注释文档、企业内部的知识库和Wiki。外部的公开数据源包括行业白皮书、监管公告、专利文本、学术论文、标准规范、行业协会的公开报告。做金融的要把每年几千份基金公告、招股说明书纳入做法律的裁判文书、法律法规库是重中之重做制造业的设备说明书和故障案例库比泛泛的行业新闻更有价值。这块有个特别重要的提醒数据授权和合规。内部文档要注意是否包含客户隐私、员工个人信息、商业机密外部爬取的数据要确认版权和平台条款。CPT做完之后模型是可能记住具体片段并原样输出的如果语料里混入了未经脱敏的个人信息那在推理阶段就等于数据泄露。我在实际项目里要求所有进入训练流水线的数据必须先过一轮PII检测手机号、身份证号、邮箱、住址这类高敏信息直接做掩码或丢弃。盘完数据之后还要记录每个文档的来源、格式、时间、部门。这一步听着行政化但训练出了问题要回溯数据时它就是救命的索引。2.2 清洗去重决定训练下限的脏活累活很多人以为训练效果靠模型结构靠调参其实CPT这个阶段数据quality对结果的影响比模型还大。通用预训练数据规模足够大偶尔脏一点问题不大但行业语料本身就只有几十万篇如果遍地是OCR乱码、广告水印、重复段落模型很容易把噪声也学进去。清洗流程我按顺序拆一下第一格式解析。PDF要重点处理。很多扫描件需要OCROCR输出的错别字、乱码、表格错位都需要用规则和模型来修正。Word文档里的页眉、页脚、目录、水印要去掉。HTML下载的内容要剥离标签只保留正文文本。Excel表格要考虑是转成自然语言句子还是保持线性化的键值对。这里的核心原则是喂给模型的是可读的自然语言而不是机器导出的原始结构。第二去重。行业语料虽然总量不大但内部重复率高得吓人。同一份公告可能在三个网站出现同一个技术方案文档被复制粘贴了几十次。先去精确重复MD5或SHA1哈希判重这能干掉一半以上重复。再去模糊重复用MinHash加LSH做近重复检测相似度阈值我一般设在0.85左右。还有一个容易被忽视的重复类型跨文档重复。比如A文档是B文档的章节截断或者多份报告共用同一段政策原文这些都要去。重复数据不去干净模型过拟合的风险会成倍增加。第三质量过滤。不是所有文本都值得让模型学。规则层面可以过滤掉过短文本、非中文主体文本、乱码比例过高的文本。模型层面我习惯用一个小型语言模型给每个文档算困惑度那些困惑度异常高或异常低的都要查一下。异常高通常是语种混杂、乱码异常低往往是重复文本或模板化内容。另外广告、营销号、水军内容也要设规则词表过滤。清洗这块没有太多技术性捷径基本都是脏活累活但请务必重视。一个经验是如果你发现清洗完的数据量只剩原来的60%这是非常正常的情况不要心疼。用剩下的60%干净数据效果远好过用100%的脏数据。2.3 数据配比与词表扩展两个容易被忽略的关键点数据准备好之后下一个问题是训练语料里只放行业数据吗答案是否定的。我强烈建议在CPT阶段保留相当比例的通用语料目的就一个防止灾难性遗忘。模型本来已经具备了很强的通用能力如果连续几天只喂法律文书或医疗病历它对常识对话、代码、数学的能力会明显下滑。一个比较稳的配比是行业语料占60%到80%通用语料占20%到40%。通用语料从哪里来可以直接复用开源的中文预训练语料也可以从公开的百科、新闻、书籍里采样一部分。行业数据总量该有多少这个问题不能一概而论但可以给个参考区间。如果一个7B模型CPT阶段行业语料做到10亿到20亿token通常就能看到明显的领域能力提升。如果预算充足做到50亿到100亿token也很常见。再往上边际收益会递减除非底座模型本身训练不足。注意token不等于篇数一篇文章大约几百到上千token所以20亿token对应的大概是几十万篇文档。词表扩展是另一个很容易踩的坑。底座模型的分词器比如Qwen、Baichuan、Llama的tokenizer是在通用语料上训练出来的它对行业专有名词的切分很可能不友好。举个例子在Llama的中文词表里一个较长的行业术语可能被切成七八个token这就意味着模型要把一个完整概念拆成碎片来理解效果自然打折。解决方法是用行业语料跑一个BPE统计找出那些高频但当前词表切分过细的片段拼成增量词表然后把embedding矩阵和LM head对应位置随机初始化或做均值初始化再整体投入训练。这个操作会让模型对行业词汇的感知颗粒度更合适生成的术语准确率会有很直接的提升。当然词表扩展也有代价就是embedding维度变大显存占用增加几十到几百MB这个开销在可接受范围内。3. 训练实施从调度、超参到分布式训练的完整流程3.1 技术选型全量微调、LoRA、冻结层怎么选训练方案取舍本质是预算和效果之间的权衡。我先把三种方案说清楚。全量微调也就是对底座模型的全部参数做更新理论上限最高行业知识融入最彻底但显存和算力开销也最大。一个7B模型用全量微调如果用上ZeRO-3和激活重计算单卡80G显存大概需要8到16张卡才能跑起来70B模型则需要几十甚至上百张卡。这个成本大多数企业未必扛得住但效果确实是最稳的。LoRA这类参数高效微调方法只训练新增的低秩适配矩阵参数量只占原模型的0.1%到1%。显存需求大大降低7B模型4到8张消费级显卡就能跑。但它的劣势是可学习的参数量有限对大规模行业知识注入的深度不如全量微调。我的经验是LoRA适合数据量不大、预算有限的场景能实现五六成功力的CPT效果但如果目标是让模型在专业任务上达到非常高的水平全量微调始终是绕不开的选项。还有一个折中方案冻结浅层和深层部分层只训练中间几层或者只训练embedding和最后的几层。这种做法在CPT里也有应用但实践下来效果波动较大不是特别推荐作为首选。训练框架方面如果做全量微调DeepSpeed的ZeRO-3是标配如果做LoRAHuggingFace TRL加PEFT的组合就很顺手追求极致训练效率的团队可以考虑Megatron-LM但那套东西工程复杂度高很多适合专门做底座训练的团队。3.2 超参数设计与训练策略说到超参数网上很多教程上来就是一套默认值但CPT和SFT、预训练的超参数差别挺大。我按自己跑过的项目给一套经过验证的初始配置然后讲一下每个参数背后的考量。学习率是CPT里最需要谨慎的一个参数。通用的预训练学习率通常在1e-4到3e-4但CPT是在已有模型基础上继续训练学习率太大会把原有参数冲坏导致通用能力断崖式下降。我的习惯是初始学习率控制在2e-5到5e-5之间如果用LoRA学习率可以适当提高到1e-4到2e-4因为新增参数不涉及原始权重的稳定性。学习率调度用cosine decaywarmup比例在3%到5%。如果数据量不大比如只有几亿token可以不用完整cosine降到底在最低点截断也没问题。训练轮数也就是epoch这个特别重要。CPT不建议多轮反复训练。行业语料本身重复率就高连续两三轮之后模型可能会开始背数据生成时反复出现同样的句子。1到1.5个epoch是比较安全的范围也就是说训练数据每一条最多让模型看到一到两遍。batch size方面我建议关注全局batch size也就是单个batch乘以梯度累积步数保持在512到1024个样本之间。这个规模既能让梯度估计稳定又不会因为太大而损失泛化。序列长度上常规场景用4096就够如果行业文档以长文本为主比如年报、专利、判决书可以尝试8192甚至16384。长序列训练要注意位置编码如果是RoPE类的长度外推问题不大但如果用的Alibi长序列效果需要做针对性验证。损失函数不用特别设计还是标准的交叉熵。但训练过程中要盯两个指标一是loss曲线的下降趋势二是行业评测集上的困惑度变化。如果loss降得很快但行业评测集上效果没提升那通常意味着数据里学到的只是表面模式而不是真正可迁移的知识。下面给一份我实际用过的DeepSpeed配置片段方便你有个直观印象。# deepspeed_config.json { train_batch_size: 512, gradient_accumulation_steps: 16, train_micro_batch_size_per_gpu: 4, optimizer: { type: AdamW, params: { lr: 3e-5, betas: [0.9, 0.95], weight_decay: 0.1 } }, scheduler: { type: WarmupCosineLR, params: { warmup_min_lr: 1e-6, warmup_max_lr: 3e-5, warmup_num_steps: 500, total_num_steps: 8000 } }, fp16: { enabled: false }, bf16: { enabled: true }, zero_optimization: { stage: 3, offload_optimizer: { device: none } }, activation_checkpointing: { partition_activations: true } }这里面有个细节值得说明我推荐用bf16而不是fp16。因为在CPT这种长训练流程里fp16容易出现梯度下溢和精度丢失bf16的指数位更宽训练更稳定。如果你的硬件不支持bf16比如一些旧卡那再退回到fp16同时开启loss scaling。3.3 算力估算与分布式配置算力估算这件事网上公式很多我用一个比较直观的方式来讲。训练总计算量大致等于6乘以模型参数量再乘以训练token数。比如一个7B模型跑20亿token总计算量大约是6乘以7e9乘以2e9约8.4e19 FLOPs。再看硬件算力一张A100在bf16矩阵计算下大概能到312 TFLOPS考虑到实际利用率通常只有40%到50%真实有效算力按130 TFLOPS算。那么一张A100跑完全程需要的时间大概就是8.4e19除以130e12约6.5e5秒折合180小时左右。如果按2天跑完的节奏8张卡绰绰有余如果按1天跑完16张卡也够了。70B模型跑50亿token一张卡就不行了至少需要64张A100级别。这组数字告诉你一个道理CPT对算力的门槛远低于从零预训练但也绝不是一张消费级显卡能搞定的事。我给大家一个决策参考如果你的训练数据在5亿token以内模型是7BLoRA方案可行如果数据超过20亿token还是老老实实上全量微调加多卡分布式否则信息量消化不完。分布式配置这里面工程细节很多我不展开讲每一层只说三个最容易忽略的点。第一数据加载是很多CPT项目的瓶颈。行业文档清洗后可能需要做成统一的tokenized格式比如预编码成二进制内存映射文件这样训练时不用每步都做tokenize吞吐量能提升好几倍。第二混合并行策略。模型不大时数据并行加ZeRO-3就够了模型大到30B以上建议加张量并行否则单卡内存压力会爆。第三断点续训。CPT训练周期长机器故障是常态。每500到1000步存一次checkpoint而且要确认checkpoint里保存了优化器状态、学习率调度器状态和随机数种子状态否则续训时损失会跳变。最后训练过程中的监控面板也要搭好。除了loss还要盯梯度范数如果出现梯度爆炸往往需要把梯度裁剪设到1.0这是我最常用的急救手段。梯度范数长期异常偏大就得检查数据里是否有异常长文本或高重复序列。4. 评估与回归凭什么说这个模型行业化了4.1 行业评测集的搭建训练跑完了模型行业化没有这个问题如果只说我们自己测了一下感觉变专业了那在内部立项和外部汇报时都站不住脚。必须有一套可量化、可复现的行业评测集。搭评测集最理想的方式是从训练语料中留出一部分不参与训练的文档然后基于这些文档构造任务。比如你是做法律行业的可以从判决书里构造出根据以下案情判断被告是否构成违约这类问题做医疗可以从病例和用药指南里构造针对XX症状最适合的用药建议是什么。问题的形式可以是选择题、判断题也可以是开放问答但开放问答需要人工打分尽量把大部分评测项转成有标准答案的客观题这样自动化跑分才高效。除了从留出文档构造还可以请行业专家写一批典型业务问题。这个问题规模和模型能力匹配一个细分领域100到300道题是一个比较基础的评测集要想做严谨的版本500道以上会更有说服力。评测集定下来之后还要划分成dev集和test集dev集用来训练过程中随时监测test集只在最终评估时用一次避免你根据test集反复改模型造成过拟合。这里有一个细节用大模型辅助生成评测题是可以的但一定要专家审核。通用大模型生成的选项里经常有知识瑕疵如果这些瑕疵进入评测集那模型答对答错都不能反映真实能力整个评测就失效了。4.2 通用能力回归与灾难性遗忘的度量行业能力要涨通用能力不能跌得太狠。这是CPT项目里最难平衡的事。我在实际项目里有个铁律训练前后模型的通用基准测试成绩必须做对比。中文场景跑C-Eval、CMMLU、GAOKAO-Bench这类英文和代码配上MMLU、GSM8K、HumanEval。不用全跑挑三四个和你们产品最相关的。通常的标准是通用能力综合得分下降不超过2个百分点可以接受超过5个百分点就要停下来分析原因了。出现明显回落时先检查是不是学习率太大或训练轮数太多。还有一个更隐蔽的原因数据配比中通用语料比例太低。我后来习惯把通用语料维持在20%以上并且在训练后半段逐步提高通用语料的比例相当于做了一遍回放把模型对通用能力的记忆再巩固一下。如果回放效果还不理想可以试试EWC这类正则手段让模型参数更新时尽量远离原始模型位置。这个方法在部分项目里有效但不是银弹。另外我还特别建议关注一个指标行业语料困惑度。训练完成后的模型在留出的行业测试文档上困惑度应该比底座模型有明显下降比如下降10%以上这能证明模型确实在消化行业语言模式。当然困惑度下降不等于下游任务效果好所以要结合行业评测集一起看两个指标一个都不能少。4.3 训练到部署的验收清单把评估项整理成一张验收清单是我在每个项目收尾时都会做的事。这里我直接把清单分享出来你们可以直接抄。行业语义理解在行业评测集上的准确率对比底座模型提升是否明显比如提升10个百分点以上。专有名词生成抽检100个行业术语让模型输出解释看准确率是否超过95%。通用能力回归C-Eval和MMLU这类基准对比底座模型下降是否小于2个百分点。生成质量抽检人工阅读50条生成结果打钩确定是否存在重复、逻辑断裂、幻觉。指令跟随能力跑一批SFT阶段的标准指令确认模型没有在CPT后变笨。遗忘测试随机挑一批训练语料里的关键数据让模型输出相关内容确认不是机械背诵。这六项都过完再谈上线。很多项目失败不是败在训练效果而是败在验收标准模糊最后产品和算法互相甩锅。标准前置验收模板化是避免这个局面的唯一办法。5. 踩坑实录与实操心得5.1 我遇到的最典型的四个坑这一节全是真实项目里趟出来的坑每一条都值得你收藏。第一个坑是数据重复导致的过拟合。有一回训练一个金融行业模型loss下降异常快训练到一万步的时候生成结果里反复出现同一段公司的标准免责声明。查下来发现语料里一份50页的招股书被不同数据源重复收录了三百多次。清洗阶段虽然做了精确去重但那份文档在不同来源里文字略有差异MinHash的阈值又设得比较松结果漏掉了。那次之后我把模糊去重阈值从0.85调到了0.9并额外加了一道基于embedding的语义去重过拟合问题大幅缓解。第二个坑是学习率设置过高直接把模型通用能力冲崩溃了。第一次做CPT时我按预训练的节奏设了1e-4结果训练到一半模型写代码的能力几乎归零连写一个Python循环这种题都答不对。后来降到3e-5重新跑情况立刻好转。所以这里再次强调CPT的学习率宁低勿高这是血泪教训。第三个坑是词表垃圾化。有个制造行业的项目语料里全是设备型号和工业专有名词最初没做词表扩展训练之后发现模型生成术语时经常出现拼接错误把一个完整的型号拆成几截。后来统计tokenizer的切分情况把那几千个高频行业词加入词表重新初始化对应的embedding再训练一轮生成准确率明显恢复。词表扩展这件事越早做越好训练完再做代价就大了。第四个坑是评估指标骗人。某个项目只看了行业文档困惑度指标漂亮得很下降超过20%但实际问答测试一塌糊涂。原因很简单模型只是学会了模仿行业文档的句式并没有建立起足够的事实关联。所以从那天起我坚持困惑度只能作为参考行业评测集的准确率和人工抽检才是最终裁判。5.2 给后来者的实操建议CPT这件事做完一个完整项目之后你会明白它不是一次性的训练任务更像是一个持续迭代的数据产品。以下几点是我现在带团队时必讲的原则。先小规模验证再全量跑。起步阶段拿原始数据的10%跑一次CPT用最小的算力成本验证数据质量和训练配置是否合理。跑一小步观察loss曲线和评测集变化确认没问题再放到全量数据上。不要上来就全量跑失败了连排查的切入点头绪都没有。训练过程中定期做通用回归。不要等全部训练完了再评估。每几千步就把C-Eval这类基准抽20到50道题快速跑一遍。这个动作成本很低但能帮你尽早发现灾难性遗忘的苗头及时止损。保留每一个阶段性checkpoint。不要只留最后一版。训练到中间某一步的模型很可能比最后一步更适合你的产品需求尤其是当最后一步通用能力开始下滑时。回滚到几百步之前的checkpoint重来比重新训练省时间太多。把CPT和RAG、SFT串成一条流水线。单纯做一个CPT模型上线使用效果通常不会让你惊艳。更好的组合是CPT解决行业知识底子SFT教会模型按格式输出RAG在推理阶段拉取最新知识三者协同。这也是目前行业里企业自训大模型最经典的一套组合拳。最后再分享一个我自己坚持的做法。每次训练完成把训练数据、清洗脚本、训练参数、评估结果、模型checkpoint的版本号完整归档形成一份可复现的训练档案。之后再迭代版本时这份档案就是最好的起点。很多团队半年后在原模型上重新训练发现效果还不如老版本就是因为当初的细节没记录所有坑都白踩了。我个人在实际操作中的体会是CPT没有太多神秘感它的核心就两个字数据和耐心。数据质量决定了模型能力的上限训练策略只是尽量去逼近这个上限。把这个关系想明白项目就成功了一大半。如果你正准备启动自己的行业模型训练希望这篇实战指南能帮你少走几段弯路。