尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CPT继续预训练全流程指南:从数据工程到行业大模型实战

CPT继续预训练全流程指南:从数据工程到行业大模型实战 先把话说在前头如果你的公司正准备把某个开源通用大模型拉回来微调目的是让它“懂你们行业”那你大概率会遇到一个尴尬局面——微调之后模型变礼貌了、会跟话了但一问你行业细节还是满嘴跑火车。问题出在哪儿出在很多人把“教规矩”SFT当成了“补知识”Continued Pre-Training简称CPT。通用大模型缺的不是对话能力而是你们行业里那些有门槛、有上下文、有私有术语的专业知识。这篇文章我会从一个实际操盘过多个行业模型项目的工程师视角把CPT从数据准备、参数配置、训练监控到效果验收的完整链路讲透能复制到你自己环境里直接开跑。1. 为什么通用大模型做不了行业活先搞清楚CPT到底要解决什么1.1 通用模型的“知识盲区”不在常识而在专有名词和私有语料通用大模型在互联网公开语料上练过天文地理、代码作文、日常对话都能接得住。但放到具体行业里它会暴露两个非常典型的问题第一行业专有名词它没见过几次导致生成时频繁出现术语混用或直接编造第二企业内部有大量非公开、非结构化的文本——比如设备维修记录、法院判决书、临床病例、银行尽调报告、制造工艺卡——这些内容在网上根本找不到也就没有进入模型的原始训练集。拿制造业举个例子。通用模型能跟你聊“设备维护”的一般概念但你问它某条产线上“A类辊压工序的常见缺陷模式及处置预案”时它要么给一套教科书式的答案要么就一本正经地胡编。这不是模型笨而是它的记忆里压根没有你们工厂内部的工艺语境。CPT干的事情说简单点就是把这些行业语料和领域知识继续喂回给通用模型让它在维持原有语言能力的前提下把新的知识写进权重里而不是仅仅记住一段临时对话。1.2 CPT和SFT的区别一个是补知识一个是教规矩很多团队走了弯路是因为一开始就把SFT当万能药。SFT监督微调解决的是“格式服从”问题模型经过指令数据学习后能按照你要求的格式回答问题、能扮演客服、能遵循System Prompt的约束。但它有一个天然短板——SFT的训练数据量一般只有几万到几十万条这个量级只够让模型学会“怎么说”很难让它真正记住海量行业知识。CPT的训练数据量通常以“亿级token”为单位动辄几亿到几十亿个词元。数据规模差了三到四个数量级这决定了它们优化方向完全不同SFT的损失函数集中在输出端的答案质量CPT则是在整个文本序列上做自回归预测要求模型对每一段行业文本都建立深层的概率理解。所以SFT之后的模型如果不懂行业不是指令不够多而是缺了CPT这个“背课本”的过程。正确的做法通常是一条流水线先用CPT把领域知识灌进去再用SFT教会它问答格式最后用RLHF或DPO把输出偏好对齐。1.3 什么场景真正需要CPT什么场景其实用RAG就够了在动手之前先做一个冷静判断你真的需要CPT吗如果你只是需要一个能引用公司内部文档的问答机器人RAG检索增强生成是更低成本、更快上线的方案。RAG把知识放在外部知识库里用户提问时先检索对应段落再丢给模型做归纳不改变模型权重部署快、可解释性强。但有三类情况是RAG搞不定的。第一行业语料中的推理型知识——比如法律文书中“构成要件”和“量刑情节”的深度关联检索到的片段很可能缺少上下文模型拼不出来。第二专属术语和缩略语量太大的场景——比如生物医药行业的基因名称、化学名检索词都匹配不准更别说生成。第三低延迟、高并发的生产环境——每次请求都走检索链路会引入额外的延迟和故障点如果模型本身已经把知识背下来了在线推理就简单很多。判断标准很简单把知识放进提示词里如果模型能准确回答就不需要CPT如果放进提示词仍然答得混乱或者知识太深、太长、太多那就必须走CPT。2. 开工之前先盘数据CPT的数据工程比训练本身更决定成败2.1 训练数据应该怎么配比给你一组可落地的基线值CPT训练数据不是“行业数据拉满”就最好。我在项目中见过把100%量都押在行业数据上的翻车案例——模型确实懂行业了但通用对话能力断崖式下跌连“写一封会议通知”都开始带专业术语腔。这里有个数据配比的基线经验行业语料占50%到65%通用高质量语料占25%到35%指令与对话数据占10%到15%。通用数据的作用是“防遗忘”它像一根锚绳让模型在吸收新知识的同时不掉进偏科陷阱。行业语料还可以继续细分。我建议按“核心业务文本、专业知识文本、场景交互文本”三个桶分别管理。核心业务文本是你们独有的高价值数据比如产品缺陷报告、客户工单、故障处置记录专业知识文本是行业公开的教科书、标准规范、论文场景交互文本则是客服对话、销售话术、内部IM的脱敏记录。三者比例建议6:2:2起手再根据评测效果滚动调整。记住一个原则宁可少而精不可多而杂。低质量的行业数据灌进去模型会连带着把噪声当成规律。2.2 数据清洗与去重别拿脏数据喂模型这步省不得CPT对数据质量的要求比SFT低这是又一个常见误判。SFT数据只要几百条高质量样本人工就能筛完CPT数据量大必须走自动化清洗流水线而且缺一步都不行。我的标准清洗管线包含四道工序首先做规则过滤用正则去掉全角半角混乱、乱码、超长无标点文本、URL堆砌和HTML标签残留其次做语言过滤用fastText的语言识别模型把非目标语言的段落剔除然后做困惑度过滤用一个小型语言模型给每个文档打分把困惑度过高或过低的文档都扔掉——过高意味着乱写过低意味着可能是重复模板最后做MinHash去重这一步特别关键正文里稍有改写的重复文本精确去重工具是发现不了的。去重有个细节容易被忽略SimHash适合查相似文本MinHash适合在海量数据里做近似去重生产环境优先选MinHash。另外建议在文档级别和段落级别都做一次去重因为有的行业资料里同一段结论会被反复引用几百次文档级查不出来但段落级一查一个准。重复数据进入训练集模型会开始“背答案”直接表现为评测集上领域指标虚高、换一批数据就崩。2.3 数据质量如何自动化评估先给语料建立一套体检指标数据清洗完不能直接就训练你需要一个体检环节来判断这批语料是否满足CPT的投喂标准。我平时会给每个数据集生成一份数据体检报告核心看四个指标期望token数量、类型分布、领域关键词覆盖率、重复率。那怎么算这批数据够不够训先定一个经验规则CPT的行业语料总量建议在总训练token的5%到20%之间。也就是说如果你准备训50亿token行业语料至少准备2.5亿到10亿token。少于这个量模型可能“记不牢”多于这个量边际收益会迅速递减。领域关键词覆盖率则用来检查代表性把你行业里的高频专有名词列100个统计它们在语料里的出现频次如果某几个核心词汇压根没出现说明语料有缺口先别训练回去补数据。3. 训练方案选型与参数设计全参、LoRA还是Q-LoRA3.1 算力评估与方案选型别一上来就全参先算一笔账CPT的参数高效微调方案有全参微调Full Fine-tuning、LoRA、Q-LoRA三条路线各有各的适用场景。不少团队的直觉是“全参效果最好所以选全参”但现实常常是行业数据量不够大、单卡显存不够多、训练工期不允许。一条实用的选型策略是——如果你的行业语料在20亿token以下LoRA/QLoRA基本够用如果语料超过50亿token或者你希望模型100%贴合一个非常垂直的领域再考虑全参。算力成本估算可以用一个粗略公式训练时长 ≈ 总token数 ÷单卡吞吐 × 卡数。以7B模型为例在A100 80G上全参训练单卡吞吐大约在3000 tokens/s左右如果想在7天左右训完50亿token需要的卡数大概在12到16张之间。这只是一个量级参考实际吞吐受序列长度、batch size、框架版本影响波动很大。但至少能让你在老板问“需要多少卡、多少预算”时心里有数。3.2 超参数配置学习率、序列长度、批次大小的推荐值CPT和SFT的超参逻辑完全不一样。SFT为了防止模型丢失已有能力学习率通常压得很低但CPT要学大量新知识学习率太低会导致知识根本写不进权重。我的经验值如下适用于大多数7B到14B的模型学习率全参CPT建议 2e-5 到 5e-5LoRA建议 1e-4 到 2e-4批次大小单个step的总token数建议在0.5M到2M之间即如果你序列长度为4096每步大概处理128到512条样本序列长度行业文本普遍较长建议从4096起跳条件允许直接上8192Warmup建议总训练步数的2%到5%优化器AdamWbeta设为(0.9, 0.95)weight decay设为0.1配合梯度裁剪设置为1.0。LoRA的秩和Alpha设置也要注意。秩r32到64是比较稳的经验区间r值太小比如8学复杂行业术语会吃力Alpha设置为r的2倍即r32时Alpha64。Target modules建议不要只挂在attention层的q和v上要把k、o、gate、up、down都覆盖否则LoRA的容量会限制新知识的写入能力。3.3 退火阶段CPT里最容易被忽略的关键操作它是稳定模型的胜负手退火Annealing这个词在SFT里不常提但在CPT里基本是决定成败的一环。思路是这样的在整个训练过程的前90%到95%的步数里保持相对较高的学习率让模型充分吸收行业知识在最后5%到10%的步数里把学习率以余弦曲线降到初始值的十分之一同时切换到一个经过精筛的、高质量的小数据集——通常混入30%到50%的通用数据和指令数据。这个“退火投喂”操作有三个作用。第一低学习率能让模型在已经学到的知识上做精细打磨把参数收敛到更平滑的局部最优。第二高质量通用数据在低学习率下能唤醒模型原有的通用能力明显缓解灾难性遗忘。第三把指令数据放在退火阶段可以提前为后续SFT预热输出风格。我在多个项目里对比过加退火和直接硬训的最终效果加了退火的模型在领域严格评测上平均提升了10%到20%。4. 模型训练与监控损失函数不降不一定代表模型没在学4.1 训练监控指标怎么解读别被飘忽的Loss吓到很多人看到训练日志里的Loss在波动就以为训练出了问题直接中断重来。CPT的Loss曲线本身就是波浪形的因为每一步的batch来自不同分布——这步全是行业工艺文档下一步可能是通用新闻Loss当然会来回跳。正确的观察方式不是看单步Loss而是看“平滑后的趋势线”一般取最近50到100步的加权平均。如果整体趋势是下降的就是正常如果Loss在某一阶段长期横盘甚至反弹才需要考虑数据配比、学习率或梯度问题。还有一个容易被误读的指标是验证集困惑度Perplexity。很多人把困惑度当成了唯一的评估标准这是一个常见的认知误区。困惑度衡量的是模型“预测下一个词”的能力但行业模型的核心目标不是预测词语而是准确回答行业问题。在实际项目里我见过困惑度降得很漂亮的模型问它“这台设备的故障代码E-203是什么含义”时照样答非所问。原因很简单训练时预测下一个词学的是概率分布但复杂推理和知识关联需要的是更深层的表征。所以训练监控只是过程手段最终验收一定要回到下游任务评测上。4.2 扩展词表行业术语变成token比想象中更影响效果中文行业语料里有很多专属词汇——工艺名称、化学分子式、产品型号、地名代码。如果直接用原始词表模型会把一个完整的行业术语切成好几个token这不仅增加了计算量更严重的是切碎后的token失去了整体语义模型很难学到“这个词是一个整体概念”。解决方案是做词表扩展用行业语料训练一个新的BPE词表然后把新增的token合并进原模型的embedding。一般新增规模在5000到30000个token之间。比如原始词表是5万扩展后可以到8万。操作上可以用tokenizers库在行业语料上训练一个BPE模型取出新增的merge规则和词条再复制原模型的embedding矩阵新增的行随机初始化或直接取相关词向量的均值。注意扩展词表后需要把训练时的embedding维度同步改掉这部分坑很多建议先在单卡小batch上跑10步验证维度没问题再上全量。4.3 Checkpoint怎么保存与继续训练断点续训是必然事件不是概率事件分布式训练跑一周以上中途断掉几乎是必然的。如果不做足断点保存策略一次机房抖动就能让你前功尽弃。我这里只说三个我踩出来的硬经验第一保存频率不能只看步数还要加一个时间维度比如每500步保存一次同时每4小时再强制保存一次第二必须同时保存优化器状态只保存模型权重的话断掉后学习率、动量和梯度状态全部丢失续训效果会明显变差第三续训前把数据加载器的随机种子固定住否则断点前后的数据顺序对不上数据被重复或漏掉。另外一个细节如果训练中断发生在退火阶段续训时的学习率调度器必须从断点位置继续走如果从头开始或者从非退火位置开始之前精心设计的退火效果就作废了。所以训练脚本里一定要处理好学习率调度器的状态恢复。5. 评估与验收别拿困惑度当KPI构建领域评测集才是正道5.1 领域评测集怎么构建人工标注自动生成的组合打法很多团队把CPT训完就急着部署上线结果一问业务方“效果怎么样”大家全凭感觉。这是项目管理上的一个大坑没做验收标准。CPT的效果验收不能只靠几个演示性问题必须有一份固定的领域评测集。构建评测集的组合打法是这样的业务专家写100到200道核心问答对这些是“保命题”必须答对然后从行业语料里自动生成一批封闭式问答比如“根据下列段落X的故障原因是什么”作为扩充再收集一批真实用户问题作为开放测试。这个过程并不复杂关键是“锁定版本”每一次训练迭代都用同一套评测集打分模型才有可能被横向比较。评测方式上既有客观匹配答案包含关键词、实体识别准确率也要有专家人工评分正确性、完整性、术语规范性各占权重。5.2 全链路评估方法从单项指标到业务闭环评估不能只看模型本身要从“模型能力”“下游任务”“业务闭环”三个层面去测。模型能力层面用领域困惑度、实体召回率、术语一致性打分下游任务层面直接丢进你们的真实业务场景里比如客服意图识别、工单自动分类、文档审核辅助看端到端指标有没有提升业务闭环层面小流量上线对比观察人工介入率、处理时长这些业务指标。举个例子我之前做的一个法律行业模型领域困惑度降了20%实体召回率提升了15%但放到“合同风险审查”这个下游任务里整体准确率反而下降了一个点。排查了一下发现模型把新学的“风险条款”知识过度泛化了把正常条款也标成了风险。这个案例说明模型能力提升不直接等同于业务效果提升所以必须把下游任务的评估也纳入CPT的验收链路。5.3 通用能力保持度验证防遗忘不是一句口号要测才知道灾难性遗忘是CPT最典型的副作用——模型学了行业知识把通用能力丢了。防遗忘除了在数据配比和退火技巧上做文章更要有量化的验证手段。建议从原始模型的评估集中抽取一个子集比如通用知识问答、数学计算、代码生成、文本摘要各挑几十条在CPT前后分别跑一遍算出“通用能力保持率”。保持率在90%以上属于优秀80%到90%属于合格低于80%就要考虑调高通用数据比例或加强退火阶段的通用数据投喂。我自己的习惯是在训练过程中每隔固定步数就做一次“迷你评估”用一个小型通用评测集加上20条领域核心问题快速打分画成两条曲线看趋势。这样可以及时发现问题而不是等几天的训练跑完才在最终评估里被打击。记住一个原则通用能力和行业能力不是此消彼长的零和游戏数据配比和训练策略做对了两者可以同时提升。6. 踩坑实录CPT实战中比较常见的问题与排查技巧6.1 灾难性遗忘严重损失函数降了但通用对话能力崩了这是一个高频问题特征很明显训练完成后模型能精准回答行业问题但“帮我写一首诗”“解释一下什么是牛顿第一定律”这类基本请求都变得迟钝甚至混乱。排查思路分三步。先检查行业语料和通用语料的比例通用比例低于20%就很有可能出问题再看退火阶段有没有放通用/指令数据如果完全没有退火或退火数据过少这个问题大概率会出现最后检查学习率是不是过高全参CPT超过6e-5就比较危险。对应的解法有三种可以单独用也可以组合用把通用语料比例提高到30%以上在退火阶段显著增加通用高质量数据的比例我试过把退火数据里的通用数据含量调到50%遗忘现象明显缓解如果项目已经训完了可以在现有checkpoint上用低学习率1e-5以下混合通用数据补跑几千步但效果不如从一开始就设计好。6.2 重复数据导致的领域过拟合评测集上分数虚高但真实场景拉胯这是最难从表面察觉的问题。训练过程一切正常领域评测集分数也很好看但当你把它部署到真实场景里模型对没见过的问题泛化能力很差。原因大概率是训练语料里有大量重复或近似重复的文本。我处理过的一个项目里行业语料里同一篇技术规范被以不同格式复制了上千次导致模型把这段文本背得滚瓜烂熟Score虚高一到新问法就露馅。解法就是我在2.2里强调过的去重流程。如果你已经训完才发现那就只能清洗后重训没有捷径。所以这里再说一次MinHash段落级去重必须在训练前执行宁可多花半天时间也不要带着重复数据上卡。6.3 数据污染与评测集“泄漏”模型的“高分”其实是背答案数据污染是指训练数据和评测数据同源。比如你从网上爬了一批行业问答作为训练语料评测时又从同一批来源里抽题模型当然“答得好”但这是虚假繁荣。这个问题在行业模型项目里特别隐蔽因为行业语料的总量本身就有限训练集和评测集很容易来自同一批文档。规避方法是做三重隔离。训练语料中挖掉评测题所在的原始文档评测集的构建时间早于训练集发布时间晚于训练语料收集时间定期补充人工撰写的新题防止模型对固定题目的记忆化。如果一个模型在评测集上表现完美但真实场景一塌糊涂最先怀疑的就是数据污染。6.4 算力中断与训练恢复最头疼但也最常发生的概率事件分布式训练跑长周期中途断掉太常见了光我自己就遇到过机房断电、显存ECC报错、NCCL超时、磁盘写满等好几种。这里分享一套标准处理流程第一所有训练节点保证同版本框架和CUDA不要混用版本第二保存频率设置为“按步数按时间”双保险第三启动脚本里加上“自动重启断点加载”逻辑一旦进程退出且存在最新checkpoint就自动续跑第四续跑前先检查一段日志确认数据加载轮次和学习率调度器的状态都恢复对了再放量跑。一个更容易被忽视的点是训练数据的完整性。有时候训练中断不是因为算力故障而是某个数据分片文件损坏导致DataLoader读取出错。处理方法是在训练前对所有数据文件做一次CRC校验记录每个文件的哈希值中断排查时优先检查有没有文件被改动或损坏。最后分享一点个人体会我经手过的每一个CPT项目真正拉开效果差距的都不是训练参数调得有多精妙而是数据工程做得有多扎实以及验收标准定得有多早。很多团队把预算大头花在租卡上却不肯投入时间做语料治理结果就是车跑得飞快但跑错了方向。如果你手上正好有行业语料、也想走CPT这条路我建议你按这篇实战指南的顺序走一遍——先盘数据配比再做小规模验证性训练比如用5亿token试跑确认Loss趋势和人工抽测效果都OK再上全量。这样即使中间出问题代价也完全可控。CPT的技术门槛并不高真正考验人的是耐心和细心。
返回列表