
先说一个很多团队都踩过的场景你费劲把手上的通用大模型调通、上线结果业务侧丢来一堆行业问题——合同条款怎么审、设备报警代码怎么解、这个领域的专有名词是什么意思——模型要么答得模棱两可要么一本正经地胡说。于是老板一句话丢过来把这个大模型训练成我们行业的模型。这里面的关键动作往往就是 Continued Pre-Training持续预训练简称 CPT。这篇文章我就围绕企业如何把通用大模型训练成行业模型这件事聊清楚 CPT 的适用边界、数据工程、训练参数、评估验收以及我在实操中踩过的一些坑。1. 先分清你真正需要的是 CPT 还是 SFT/RLHF三类训练的本质差异1.1 预训练、持续预训练、指令微调到底各管哪一段很多刚接触大模型工程化的朋友会把微调这个词当成万能解一上来就直接甩指令微调SFT数据集结果训练完发现模型确实听话了但问它行业知识还是答不上来。原因很简单SFT 学的是怎么说话不是知道什么。拆开看大模型的知识来源其实分三段。第一段是预训练Pre-Training模型在海量通用文本上学习语言规律和世界知识底座能力在这一步成形但这一步成本极高不是一般企业能碰的。第二段就是本文的主角——Continued Pre-Training持续预训练也常被叫做领域预训练或增量预训练它是在通用底座的基础上用大量行业语料继续做自监督学习让模型的参数里真正嵌入这个行业的词汇、表达方式和知识图谱。第三段才是指令微调SFT和人类反馈对齐RLHF/DPO用来教会模型以对话的格式、遵循指令的方式把知识吐出来。也就是说如果你的目标是模型懂我们这个行业缺的不是 SFT而是 CPT。CPT 发生在 SFT 之前是补知识的环节SFT 是补规矩的环节两者解决的根本不是同一个问题。1.2 为什么行业场景绕不开 CPT我做过的几个行业项目里最典型的是工业设备故障诊断。工程师手册、维修记录、设备参数文档加起来有几十个 G里面全是F3083 报警代码液压系统压力阈值这种高度专业的内容。通用大模型在预训练阶段基本不可能见过这些内部资料。这时候如果你只做 SFT把维修记录整理成问答对去训练模型学到的只是这个问法配这个答案的表面映射换个问法、换个场景又不会了。但如果你先拿这批文档做 CPT让模型把整本手册读进去之后再叠加一个轻量级的 SFT效果会完全不同模型是真的把F3083 的排查逻辑内化到了参数里而不是死记硬背了一组问答。我见过一个很直观的对比实验同一份法律合同审查任务A 组只做 SFTB 组先 CPT 后 SFT。A 组在训练集上的通过率很高但换到新合同上准确率掉了二十多个点B 组虽然训练成本高了一截但泛化能力明显更强。行业模型和通用模型的差距本质上就是靠 CPT 拉开的。1.3 先泼盆冷水什么情况其实不需要 CPTCPT 不是银弹也不是所有行业场景都得先上它。如果你发现业务需求可以用 RAG检索增强生成解决也就是先把文档切片灌进向量库回答问题时检索相关资料再扔给模型去读那就不一定需要 CPT。这两条路怎么选我一般这样判断如果知识是静态的、读起来就能理解的比如规章制度、产品说明先上 RAG成本低、可解释性强、更新方便如果知识需要内化到推理过程中比如医疗诊断、法律条文适用、设备故障链路排查模型必须带着行业直觉去思考那 CPT 才是值得做的如果知识是动态变化的比如每天新增的新闻、实时行情CPT 的成本会非常高优先考虑 RAG实在要 CPT 也要有持续的增量训练机制。另外还有一种情况你的团队手上只有消费级显卡业务也没到非私有化部署不可的程度那先用 API RAG 把业务跑起来把收益验证清楚再决定要不要投入 CPT。训练行业模型是一次资源和时间的集中投入先把账算明白再做不丢人。2. 数据工程CPT 成败的 70% 都在这里2.1 行业语料的来源与采集原则我见过太多团队在训练参数上精益求精结果数据一塌糊涂训练出来一个复读机。CPT 说白了就是让模型把行业语料读进去所以语料的质量直接决定行业模型的天花板。行业语料的来源通常有三类。第一类是对外公开的行业资料比如专利文档、论文、公开的技术标准、行业白皮书这类数据规模大但噪声多。第二类是企业内部的专有资料比如工单记录、设备日志、合同库、客服对话记录这是最有价值的护城河数据但也是最脏的——很零散、很乱需要大量清洗。第三类是合作伙伴或第三方采购的数据集比如法律文书、医疗病例、金融公告这类数据量大、结构相对规整但要特别注意授权范围。还有一个经常被忽略的原则语料要原生态。CPT 阶段喂给模型的是纯文本语料不要为了省事直接把问答对丢进去。问答对是 SFT 的格式在 CPT 阶段大量使用会让模型产生全文都是问答题的偏差反而破坏预训练阶段学到的自然语言分布。我习惯的做法是原始文档尽量以原文形式进入清洗流程如果需要增强可以额外用模型生成一些段落摘要术语解释之类的辅助语料但占比不要超过总量的 20%。2.2 清洗流程脏数据比没有数据更可怕不管语料来自哪里进了清洗流水线之后我一般会走这几道工序。第一道格式规范化。PDF 解析出来的文本经常有乱码、错页、页眉页脚混入OCR 出来的材料更是重灾区。先把所有格式统一成纯文本去除不可见字符、把全角半角统一、把连续空行压缩。这些看起来是小问题但在训练阶段会被模型原封不动地记进去等到生成时就会吐出一堆乱码。第二道去重。行业语料里重复率极高尤其是公开数据同一份标准文档可能被多个网站转载。直接用精确去重可以去掉完全重复的文件但更隐蔽的是那些换了个标题、内容几乎一样的文档需要做 MinHash 或 SimHash 的近似去重。我见过一个金融项目去重前 40G 语料去重后只剩 22G训练效果反而上升了。多出的那 18G 不但没用还拉长了训练时间。第三道质量过滤。文档里总混着一些无意义文本比如从网页爬下来的导航栏、评论区、广告或者是把日志文件、乱码片段当成了知识。可以用困惑度Perplexity来筛也可以训练一个轻量分类器打低质/高质标签。更进一步可以用业界常见的规则句子长度过短的、标点符号占比过低的、以及大量重复字符的段落直接过滤掉。第四道敏感信息过滤和脱敏。企业内部数据中经常包含个人姓名、联系方式、客户信息这些如果直接喂进模型一方面有合规风险另一方面模型会记住这些信息并在推理时泄露出来。CPT 之前必须做一轮脱敏该替换的替换该删除的删除。这一点做不好模型上线之后可能直接从回答里把客户手机号背出来到时候就不是技术事故了。2.3 数据配比行业语料和通用语料要按什么比例混合这是 CPT 数据工程里最容易被忽视、但影响最大的一个问题。很多团队的直觉是既然是行业模型那就全喂行业语料。这个直觉是错的而且是致命的错。问题出在灾难性遗忘Catastrophic Forgetting模型在大量行业语料上继续训练时会逐渐把预训练阶段的通用知识覆盖掉。你花了十万美元训练一个行业模型结果它的数学能力、常识推理、代码能力全都崩了这种模型根本没法用因为行业场景永远需要通用能力来兜底。我的实践经验是行业语料和通用语料按 7:3 或 8:2 混合是一个比较稳妥的起点。通用语料从哪里来可以直接复用公开的预训练数据子集比如 RedPajama、SlimPajama 的采样片段或者之前下游任务验证过质量较高的开源数据集。关键在于让模型在学行业知识的同时持续看到通用文本维持旧知识不衰减。配比这东西没有绝对标准和你行业语料的量级、覆盖度、以及你希望保留多少通用能力有关。一个常见的做法是先用 8:2 跑一轮小规模实验然后分别用 9:1 和 7:3 做对比看行业任务和通用任务MMLU、C-Eval 等基准的涨跌曲线。如果行业能力涨、通用能力崩就适当增加通用语料比例如果行业能力都没怎么涨就别急着调比例先回头查数据质量。2.4 为什么混合通用语料是防遗忘的关键而不是锦上添花我再把混合通用语料这件事多说两句因为它看起来像是一个简单的比例问题实际上涉及训练动态的底层逻辑。模型在 CPT 阶段的学习率虽然远低于预训练但仍然会对参数造成持续扰动。如果训练数据全部来自一个狭窄的行业领域模型参数的更新方向会高度一致地偏向该领域导致对其他领域的表征逐渐退化。而混合通用语料相当于给训练过程加了一个正则化项——每当参数往行业方向跑得太远时通用语料的梯度会把一部分参数拉回原来的空间。这就像一个人进入新公司之后如果除了吃饭睡觉全都在背公司规章制度久了连正常聊天都不会了但如果你让他每天还留一点时间看新闻、读小说他的语言和常识就不会钝化。实际操作层面我见过有团队为了省带宽把通用语料压缩到只有 5%结果模型行业术语说得头头是道但稍微复杂一点的逻辑推理就崩了用户一测就露馅。通用语料不是可选项是必选项。起步至少留 20%如果行业语料本身就很杂、覆盖到了很多基础表达可以适当降低但不能没有。3. 训练链路与参数实践从 7B 到 70B 的配置基准3.1 框架选型不是越高级越好而是匹配你的规模CPT 的训练框架选择和你手上的显卡数量、模型规模、团队工程能力直接相关。我把常见方案按从轻到重排一个序最轻量HuggingFace Transformers Accelerate DeepSpeed。适合 7B、13B 的中小模型单机多卡就能跑。Transformers 生态成熟写训练脚本快调试方便。缺点是显存效率不够极致大规模超过 30B会吃力。中等重量DeepSpeed ZeRO-3 Megatron-LM 混合。适合 30B 以上的模型或者需要在多机多卡上跑并行训练的情况。ZeRO-3 把模型参数、优化器状态、梯度分片到所有卡上能有效突破单卡显存瓶颈。重量级Megatron-LM 原生分布式训练。适合 70B 以上的模型支持张量并行、流水线并行、数据并行等多种并行策略组合。但配置复杂度高调试门槛高一般企业如果没有专门的训练基建团队不建议直接上手。我个人的建议是哪怕最终目标是 70B先用 7B 跑通全流程再迁移到大模型上。这个策略能帮你省掉大量调试时间——小模型训练快、显存需求低用来验证数据、验证超参、验证效果一天能跑好几轮实验。等小模型上验证出最优的数据配比和学习率策略再原样放大到 70B风险小得多。3.2 核心超参数从学习率到上下文长度的经验区间大模型预训练和 CPT 的超参选择有非常成熟的经验区间我直接给出一版我常用的基线参数表供大家做参考起点参数7B~13B 经验区间30B~70B 经验区间备注学习率1e-5 ~ 2e-55e-6 ~ 1e-5CPT 用比预训练更低的学习率批大小 (batch size)256 ~ 512 个序列1024 以上用梯度累积模拟大 batch序列长度4096 ~ 81928192视业务文档长度调整Warmup 步数总步数的 1% ~ 3%1% 左右稳定训练前期学习率调度Cosine 衰减到峰值的 10%Cosine不要直接衰减到 0Weight Decay0.10.1AdamW 的标准配置梯度裁剪1.01.0防 loss spike展开说几个关键点。学习率是 CPT 里最敏感的参数。很多人会把 SFT 的学习率习惯比如 2e-5 到 5e-5直接搬过来但 CPT 的任务是吸收知识不是适配格式学习率太高会让模型剧烈震荡新知识没学进去旧知识全忘光。我踩过的坑就是拿 5e-5 跑 7B 模型训到一半 loss 开始飙升整个实验报废。后面把学习率降回 1e-5一切恢复稳定。序列长度决定了模型能读多长的上下文。如果你的业务文档经常是几千上万字的那 4096 的序列长度根本装不下。可以先用 4096 跑基线再用位置编码插值Positional Interpolation或 NTK-aware scaling 把上下文扩展到 8192 甚至 16384。注意扩展上下文时要把位置编码的 base 频率一并调整不然长文效果会退化。批大小与学习率要联动。使用更大的 batch 时梯度的方差更小训练更稳定可以适当调高学习率batch 较小时则应该调低学习率。我一般习惯用线性缩放法则batch size 翻倍学习率乘以 sqrt(2) 左右这样既能保持稳定又能提升吞吐。3.3 全参数微调 vs LoRA/QLoRACPT 场景下怎么选现在 LoRA 和 QLoRA 很火很多人会问CPT 能不能也用 LoRA答案是可以但要清楚它的代价。LoRA 的核心思想是冻结原模型参数只训练一小部分低秩矩阵rank 通常在 8~64 之间。这种方法的优势是显存占用小、训练速度快特别适合 SFT 阶段。但 CPT 阶段我建议能全参数就全参数理由是低秩矩阵的参数容量有限很难承载大量新知识的注入。如果你想在一个 7B 模型里塞进一个行业的大规模语料分布LoRA 那几十亿分之一参数量通常不够用。我做过一个对照实验同样的行业语料约 3B token全参数 CPT 的行业任务准确率比 LoRA CPT 高出约 12 个百分点而 LoRA 的通用能力保持优势因为它对原模型改动小。如果你的目标只是让模型稍微懂一点某个细分领域LoRA 也可以但如果你的目标是让模型成为真正的行业专家需要学习的知识量很大那就别省这个钱全参数 CPT 是正路。如果确实卡在显存上退而求其次可以用 QLoRA 配合更大的 rank64 以上然后把 LoRA 的权重合并回基座模型最后再做一轮短 SFT 对齐。这个方案比纯 LoRA 效果好一些但和全参数 CPT 仍有差距。等业务验证清楚了、预算到位了再迁移到全参数训练也不迟。3.4 训练过程的监控指标loss 之外还要盯什么很多人训练时只盯 loss 曲线loss 降了就觉得万事大吉这是很危险的。CPT 阶段 loss 下降是一个必然趋势因为它本质上是在拟合训练语料的分布不降才奇怪。真正要关注的指标有这么几个验证集 loss 与语料困惑度。每个 checkpoint 存下来之后在独立的验证集注意必须和训练集去重上算困惑度看是不是持续下降。如果训练集 loss 在降、验证集 loss 在升那就是过拟合信号该停了。通用能力基准抽查。训练到中间阶段拿 MMLU、C-Eval、GSM8K 这些通用基准跑一下看通用能力有没有明显回退。如果掉了几个点但不严重可以继续如果崩了就得调低学习率或增加通用语料比例。梯度范数Gradient Norm。训练过程中梯度范数的波动能提前预警训练崩溃。如果梯度范数突然飙高通常是学习率过高或者某个 batch 里有异常数据需要及时干预。嵌入漂移Embedding Drift。比较新 checkpoint 和原模型在固定文本上的嵌入向量差异。行业模型的嵌入分布应该向行业语料偏移但不应偏移得离谱。这个指标可以帮你判断模型是不是学过头了。4. 评估与验收别让行业能力上涨变成通用能力崩盘4.1 评估集怎么设计闭卷考和开卷考一起来做一个行业模型评估集的设计直接决定你如何判断训练到底成了没有。我习惯把评估集分成三块行业闭卷题、行业开放题、通用能力题。行业闭卷题是有标准答案的客观题比如某个设备故障代码对应的处理步骤是什么某个法律条款的适用条件有哪些答案可以从权威文档里抽取出来。这类题用来测知识的准确率可以机器自动判分适合大规模跑。行业开放题没有标准答案需要人工或让评判模型来打分比如根据这段病历给出可能的诊断思路分析这份合同的潜在风险点。这类题测的是模型的推理能力和行业思维更接近真实使用场景。通用能力题则是拿 MMLU、C-Eval、GSM8K、BBH 这些公开基准来测防止模型应试能力上涨但基础能力崩盘。三块评估集的比例我一般控制在 5:3:2 左右闭卷题为主开放题和通用题做辅助判断。还有很关键的一条评估集和训练集的数据必须做去重和隔离。如果训练语料里包含了评估的题目内容那评估出来的分数就是自欺欺人。我自己吃过这个亏训练集里混了客户给的旧版题库结果评估分数高得离谱上线一测立马现原形。4.2 LLM as Judge怎么用才不会自己骗自己开放题的评估业界常用的做法是让一个大模型来当裁判LLM as Judge比如让 GPT-4 或 Claude 给模型的回答打分。这个方法很高效但它有固有的偏好和局限需要花心思设计。我的 prompt 模板一般包含四部分角色设定、评分维度、评分标准、输出格式。评分维度通常会拆到事实准确性逻辑连贯性行业术语使用信息完整度四项每项单独打分再算加权总分。一个简化模板长这样你是一位资深行业评审专家。请根据以下评分标准对 [模型回答] 进行评分。 评分维度 1. 事实准确性0-5分是否与行业标准或权威资料一致 是否存在明显错误。 2. 逻辑连贯性0-5分推理过程是否清晰有没有跳跃 或前后矛盾。 3. 信息完整度0-5分是否覆盖了问题要求的所有关键点。 4. 表达专业性0-5分术语使用是否准确、表达是否简洁。 标准 - 总分 18-20 优秀14-17 良好8-13 及格0-7 差。 请直接输出 JSON 格式 {fact: 分数, logic: 分数, completeness: 分数, professionalism: 分数, total: 总分, reason: 一句话说明理由}但注意LLM 裁判也有偏差它偏好更长的回答、偏好它熟悉的表达方式、有时候会被自信的语气带偏。所以在关键场景上一定要保留人工抽检的比例至少拿 100~200 条让行业专家打分再和 LLM 裁判的分数做对齐确认两者的评价倾向一致再大规模铺开。4.3 能力回退检测怎么设不得不回滚的红线行业模型训练经常出现的一种尴尬是行业闭卷题分数确实涨了但通用能力崩了。技术团队觉得行业能力涨了就是有效果但业务侧反馈它现在连基本常识都答不好。所以我的建议是在训练开始之前就定好能力回退的红线。比如要求在 MMLU 上的下降幅度不超过 2 个百分点GSM8K 不超过 3 个百分点这些指标量化之后每次出 checkpoint 就自动触发评估一旦超线模型就不能上线必须先调参重训。红线怎么定不要拍脑袋。先跑几个小规模基线实验统计不同数据配比下通用 benchmark 的方差范围然后在这个范围上留出一点余量设置成红线。这属于让数据告诉你边界在哪比主观设定要科学得多。4.4 从离线验收走到在线落地AB 测试与影子模式评估集分数漂亮不代表线上一定好。行业模型的落地我强烈建议走影子模式过渡让新模型和线上模型同时接收真实请求但新模型的回答只记录、不直接对用户展示由人工定期复盘。跑一两个星期的影子模式你能拿到最有说服力的数据真实用户在问什么、模型答得怎么样、哪些场景是训练集里根本覆盖不到的。这时候再做一个快速补充 CPT 的迭代效果往往比盲目调参好得多。等到影子模式表现稳定了再切一个小流量做 AB 测试对比线上模型和新模型在用户反馈、任务完成率、投诉率等业务指标上的差异。用数据说话比什么我觉得模型变厉害了有说服力得多。5. 我踩过的坑知识冲突、幻觉回潮与训练崩溃5.1 幻觉问题在 CPT 后反而变严重了很多人期待 CPT 能把幻觉问题治好但现实是在某些情况下CPT 之后模型的幻觉反而变严重了。我在一个法律文本项目里就遇到过训练前模型不懂法律但知道自己不懂训练后模型学了一些法律术语反而开始用自信的口吻编造不存在的法条。原因要从大模型的训练目标说起。CPT 是自监督学习目标只是预测下一个词它并不区分这句话是事实还是编造。如果训练语料中有噪声、有错误信息或者语料覆盖不全面模型就会把这些知识缺口通过自信的胡说补上。缓解思路有几条一是在数据清洗阶段做更严格的质量过滤把含糊不清、互相矛盾的语料剔除二是训练轮数不要过长CPT 的 epoch 通常 1~2 轮就够了来回反复学同一批数据会放大噪声三是在推理阶段配合 RAG让模型在不确定时可以去查资料而不是强行生成答案。也可以考虑在 CPT 之后再叠加一轮事实性偏好优化比如 DPO但这属于后话投入产出比要自己衡量。5.2 知识冲突新学的行业知识和旧知识打架行业语料和通用语料之间经常存在冲突。比如企业内部在 2024 年把产品线的名称改了但通用语料里全是旧名称再比如行业标准更新了新标准和你训练语料里写的老标准不一致。这种知识冲突在 CPT 里表现得很隐蔽你喂了 1B token 的新标准进去但模型在回答问题时还是会时而用新标准、时而用老标准甚至一次回答里两种混着来。我当时的排查思路是第一步检查新标准语料在训练集里的占比是不是太低了如果占比低于 10%模型根本学不扎实第二步用实体对齐和实体遮蔽Entity Masking技术把新旧标准里的关键概念先统一成同一种表达方式再送进训练第三步在 SFT 阶段补充一批老标准问法、新标准回答的对话样本强制模型学会在新旧知识之间切换。这个问题的核心是知识冲突没法完全消除只能通过数据设计来管理。你要让模型在大概率用新知识和兼容旧知识以理解历史文档之间找到一个平衡点这个平衡点的调优本质上是靠数据配比和 SFT 样本设计来推进的。5.3 训练崩溃与 loss spike现场抢救手册训练大模型最刺激的瞬间就是 loss 曲线突然像心电图一样狂跳然后训练崩了。我经历过好几次第一次手忙脚乱后面总结出经验了。遇到 loss spike按以下顺序排查和处理先查梯度范数。如果梯度范数在同一时刻冲到巨大值通常是学习率偏高或者某个 batch 混入了异常数据。先把梯度裁剪值从 1.0 下调到 0.5看看能不能稳住稳不住就降低学习率 30%~50%。再定位异常 batch。用 DataLoader 把最近一批数据的 hash key 打出来定位触发异常的具体数据样本去源数据和清洗 pipeline 里查明原因。常见的元凶是清洗后残留的超长无标点文本、某个文档里嵌入了乱码二进制、以及多种语言混排。检查学习率调度器。如果 warmup 步数太短模型在前期就冲得太猛后面容易出现过冲导致的 loss spike。我后来把 warmup 从 1% 调高到 3%整个训练明显平稳了。启用 loss spike 自动暂停机制。在训练脚本里加一个监控逻辑如果 loss 连续 N 步超过历史均值的若干倍自动保存 checkpoint 并停止训练等待人工介入。这比眼睁睁看着训练崩掉、几万美元的算力打水漂要强得多。我个人的体会是训练崩溃这种事百分之八十都是数据和超参的问题而不是框架的 bug。别一崩就怀疑是分布式环境的问题先把数据和超参排查清楚效率高很多。5.4 训练完后的落地配合从 checkpoint 到推理服务模型训练完只是一个开始后面还有一条链路要走。训练框架产出的 checkpoint 通常是大模型的权重文件不能直接用于推理服务。我常用的两条路一是把权重转成 HuggingFace 格式然后用 vLLM 部署配合 AWQ/GPTQ 量化来降低显存成本二是导出成 GGUF 格式配合 Ollama 做本地或端侧部署。如果你的业务对延迟敏感比如客服机器人、实时辅助系统推理阶段的优化甚至比训练更复杂——连续推理时的 KV Cache 命中率、批量调度策略、量化带来的精度损失这些都要重新验证。我的经验是量化前必须重新跑一遍评估集确认量化后的模型在行业任务上的掉点可以接受。我见过有团队直接 AWQ 量化后上线行业问答准确率掉了 8 个百分点用户立刻感知到变笨了。另外上线前的安全测试也别忘了。除了常规的内容安全过滤还要测一测模型的投毒鲁棒性也就是有没有可能通过精心构造的输入诱导模型输出训练阶段不该输出的敏感内容。企业内部数据上过 CPT 的模型尤其要小心这一点。最后再聊一个很多人忽略的环节CPT 是一次性工程还是持续工程我的答案很明确行业模型没有训练完这一天。企业的业务在变、产品在变、知识在更新行业模型必须有一套持续的增量训练机制。我的习惯是每季度或每半年做一轮小规模 CPT用近三个月的新增语料加上一部分历史通用语料让模型始终能跟上业务的最新状态。在我实际操作下来CPT 的投入产出比非常依赖团队对数据的理解深度。训练脚本跑起来需要的时间其实只有几天但前期的数据清洗、配比实验、评估集建设往往要占掉整个项目百分之七十的时间和精力。谁在数据上花的心思多谁最后拿到的行业模型就更抗打。