ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

行业大模型落地难?详解继续预训练(CPT)的数据工程与实战避坑指南

行业大模型落地难?详解继续预训练(CPT)的数据工程与实战避坑指南 1. 聊几句大实话通用大模型为什么不够用这两年我接触了大量想做行业大模型的企业从金融、法律、制造到医疗几乎所有人最开始问的都是同一个问题ChatGPT/GPT-4/开源通用基座模型这么强能不能直接拿来用能但你会发现一个尴尬的现状——通用大模型在公开语料上很强一旦落到行业场景就开始露怯。你问它某个行业的专用术语、内部规范、设备型号、企业知识库里的特定内容它要么含糊其辞要么一本正经地胡说八道。原因不复杂预训练阶段根本没见过你的行业数据或者只见过公开网络上的皮毛行业里真正有价值的知识沉淀在闭源文档、专业库房里互联网上占比极低。这时候需要做的不是重新训练一个几百亿参数的基座模型也不是直接丢给模型一堆问答对去微调而是用行业数据对通用模型做Continued Pre-Training继续预训练简称CPT让模型在下游任务之前先把行业语言和知识内化进参数里。以下是这篇实战指南的核心内容全程按我在真实项目里踩过的坑和跑通的路来写不聊虚的适合算法工程师、AI团队负责人、以及准备自建行业模型的技术管理者参考。2. 为什么CPT是行业模型绕不开的一步1.1 通用模型装不下行业细节先想清楚一个问题通用大模型的能力来自什么来自海量文本的统计学习。它掌握的是一个平均人通过公开互联网能了解到的知识分布。在这个分布里财经新闻、百科条目、代码GitHub、日常对话占了绝大多数而某个特定行业的真实工作流、内部术语、工艺参数、合规条款比例极低。比如制造业里常见的SPCOEE工装这些词通用模型最多给你一个泛泛的定义。但如果你是给工厂内部知识库做问答机器人模型必须理解SPC超标后应该走什么流程OEE低于85%要拉哪个部门的警报。这些细节不存在于通用语料里它再聪明也只能猜。更麻烦的是行业里的黑话。同一个词在不同行业的含义完全不一样比如背板在光伏和服务器领域是两个物种开度在阀门行业和互联网流量分析里毫无关联。不做行业语料继续预训练模型学到的永远是通用语义很难对齐行业语境。1.2 CPT、SFT和RLHF三者的分工完全不一样经常有人把继续预训练和微调混为一谈这里必须先理清楚。CPT是在改模型的知识底座和语言习惯让模型理解行业的词汇、句式、事实、逻辑通常在大量无标注的行业文本上进行。它的训练目标和预训练完全一致——就是下一个词预测next token prediction只是数据从海量通用语料换成了行业语料。SFT监督微调是教模型怎么说话用问答对数据对齐输出格式和交互方式。如果模型连行业术语和逻辑都没搞懂给再多的问答对也是空中楼阁微调完看起来像模像样一较真就露馅。RLHF/DPO这类对齐技术是教模型什么能说、什么不能说属于价值观和行为规范层面跟行业知识本身关系不大。我见过大量项目直接在通用基座上做SFT效果奇差。不是因为微调技术不行而是模型根本没见过这个行业的语料。好比让一个从没学过法律的人直接背一万道法考题他可以背出答案但换一个问法就不会了。CPT的作用是先把这个人送进法学院读三年书。所以我的结论很直接**如果目标是做一个认真可用的行业模型CPT是SFT之前必须做的一步。**除非你的行业场景非常窄、知识密度极低否则跳过CPT几乎都会在后续评测里还债。1.3 什么时候可以跳过CPT当然不是所有项目都需要CPT。我一般用这三个标准判断行业知识在通用模型里已经覆盖得不错比如大众金融理财常识、常见法律条文科普、公开的技术概念问答场景只需要模型做通用能力的换个格式比如提取摘要、改写润色数据积累基本为零连一万篇干净的行业文档都凑不出来。这几类情况直接调Prompt或者做SFT更划算硬做CPT反而可能污染通用能力。但如果你的场景涉及企业内部文档问答、专业内容生成、行业术语理解、垂直搜索CPT就是必选项。3. 数据工程CPT真正的胜负手很多人以为CPT最难的环节是训练大错特错。以我实操过的项目来看CPT百分之七十的精力应该花在数据上。模型的参数量是固定的训练框架是成熟的跟通用预训练相比CPT唯一的差别就是数据。2.1 行业语料从哪来首先要承认一个现实绝大多数企业手里没有现成的干净语料。所谓行业数据通常散落在各种地方需要自己想办法归集。我按数据价值和获取难度把常见来源排了个序企业内部文档最高价值技术规范、产品手册、工艺文档、历史投标书、项目复盘、培训材料、客服沉淀的知识库。这些数据外部绝对拿不到是CPT最有价值的部分但往往格式混乱、隐私敏感需要花大力气清洗和脱敏。行业公开出版物国家标准/行业标准文本、专业期刊、行业白皮书、展会技术资料。公开渠道可以获得质量较高但注意版权问题。垂直社区与专业论坛比如制造领域的工控论坛、法律领域的裁判文书公开网、金融领域的研报聚合站。内容覆盖度高但噪声大需要严格过滤低质灌水内容。自采数据针对特定业务场景定向爬取或人工整理。这里要特别提醒采集公开数据务必遵守相关法律法规和网站条款别在数据合规上翻车。对大多数企业而言我建议先做一次数据盘点把散落在各部门的知识资产集中起来往往比去外面爬数据优先级高得多。很多企业做完盘点才发现自己手里的行业文档比想象的丰富只是过去没人拿它们当资产。2.2 清洗与过滤宁可少不可脏行业语料清洗跟通用预训练的数据清洗思路一样但更严格因为行业语料总量本来就少每一份都珍贵。我的清洗管道一般包括这几层格式清洗去掉页眉页脚、目录页码、水印、乱码。PDF转出来的文本特别容易出现断行错字这些噪声会让模型学到乱七八糟的格式特征。质量过滤用规则加分类器过滤广告、无意义灌水、纯表格图片类没有提取出文本、数据严重缺失的内容。语言过滤如果只做中文行业模型要过滤掉大段外文内容或中英混杂的噪声。语义去重行业文档之间互相引用、照搬的情况非常普遍这批数据里可能有大量重复甚至一模一样的段落必须做去重。质量过滤的标准我建议走宁缺毋滥路线。CPT数据的质量权重远大于数量权重。喂给模型一万篇高质量的工艺文档比喂十万篇爬来的低质灌水内容效果好得多而且训练成本还更低。2.3 数据配比一个常被忽略的参数CPT的一个核心参数是通用语料与行业语料的配比。直觉上有人觉得既然要训练行业模型那就全用行业数据。结果训练完发现模型在行业问题上确实变强了一点但通用能力严重退化连正常的逻辑推理都变得奇怪——这就是典型的灾难性遗忘。实际项目中我更倾向于按10:1到20:1的比例混合通用语料和行业语料。比如650B token通用语料配30~50B行业语料。通用语料可以复用开源数据集用它来稳住模型已有的通用能力行业语料负责往里面注入新的知识。这个比例不是拍脑袋定的它是模型容量、数据量、训练步数共同作用的结果。通用能力越弱的基座模型通用语料占比应该越高。需要说明的是这里说的配比指token比例。如果行业文档普遍很长实际样本条数上行业样本可能占比更高这没问题以token量为准。2.4 去重的坑重复数据对loss的影响行业数据里的重复问题比通用语料严重得多。同一个行业标准文档会在几十个网站发来发去同一份工艺规范会在多个部门资料里反复出现。如果不做去重模型会把高频重复的句子背下来生成时出现严重的重复惩罚问题甚至产生复读机现象。在实操中我发现一个规律如果训练时loss下降异常慢但一到某些文档就突然下降多半是遇到了重复数据。模型不是在学知识是在背答案。去重层面我用的是MinHash LSH方案对段落级和文档级分别做去重。特别注意保留一定程度的相似变体因为同一个概念在文档里的不同表达方式本身是有学习价值的完全去掉反而损失信息。阈值我一般设置在0.8左右即余弦相似度低于0.8的保留。4. CPT技术拆解增量预训练的参数与细节数据准备好之后进入训练阶段。CPT训练在技术框架上和预训练完全一致但很多细节需要针对增量这个特点来调。3.1 全参训练还是LoRA这是个关键抉择CPT最常见的技术路线有两类全参数继续预训练和基于LoRA等参数高效微调PEFT方式做继续预训练。全参数CPT放开全部模型参数用行业数据接着训练。优点是知识注入最充分、模型学得最透缺点是对算力要求极高7B模型即使bf16训练也需要多卡13B/70B就更不用说同时灾难性遗忘风险更大。LoRA等PEFT方式的CPT冻结原模型只训练低秩适配器。优点是显存占用小、训练速度快、基座能力基本不丢还能方便地管理多个行业的适配器。缺点是对深层知识的注入能力有限——LoRA参数量很小能做的权重更新幅度也有限。很多人说LoRA这种PEFT方法主要用在SFT上不适合继续预训练。我实话说在数据量不大的场景下我用LoRA做CPT的效果还不错尤其是只做领域适配、知识密度较低的场景比如让模型理解特定公司的内部术语和文件风格。但如果要让模型真正掌握一个行业的复杂推理能力比如法律条文之间的逻辑关系、工艺参数之间的联动规则LoRA明显不够用。我的建议是这么定维度推荐方案行业知识密度低、数据量小于5B tokenLoRA/QLoRA做CPT即可行业知识密度高、数据量大于10B token全参数CPT有多个行业需要维护基座每行业一个LoRA要做行业基座再二次开发全参数CPT追求知识打底效果3.2 学习率与batch size怎么选CPT的超参设置跟从头预训练有明显区别最大差异在于学习率。从头预训练通常用比较大的学习率因为要从随机初始化开始。CPT是在一个已经收敛的模型上继续训练学习率必须显著调小。我一般用峰值学习率1e-5到3e-5配合warmup和cosine衰减warmup比例设置在2%到5%。如果用的是LoRA学习率可以稍微大一点比如1e-4左右因为有效参数量小。这里有个经验如果训练到一半发现通用能力已经开始下降而行业loss还在继续降可以尝试把学习率再降低一个数量级。这说明模型update幅度过大正在覆盖原有的参数空间而不是在原有基础上微调。batch size方面我习惯维持较大的global batch size例如256到1024个序列sequence length 4096或8192这样梯度估计更稳定。并行策略上用DeepSpeed ZeRO或FSDP把模型参数、梯度和优化器状态切分到多卡显存压力可控。序列长度建议从模型原生的上下文长度出发比如原生4K就先用4K训练后期再用更长的序列做长文本延伸。一步到位的长上下文训练往往不稳定loss容易震荡。3.3 训练阶段怎么安排从长文本到领域混合CPT训练过程我一般拆成两个阶段。阶段一领域适应warm start on domain。先用相对较短的序列如4096和稍高的学习率以较高的行业数据比例如行业:通用1:5训练几千步让模型尽快进入行业语境。这个阶段主要目标是让模型在行业语料上说得顺。阶段二混合巩固stabilize with general mixing。切换为正式配比如1:10或1:20学习率降到阶段一的1/3左右继续训练至总步数结束。阶段二是为了防止遗忘把模型从适应行业拉回行业和通用平衡的状态。实际训练中我通常把80%的数据量放在阶段二上阶段一只是预热。有的企业数据量不大比如就2-3B token也可以不做阶段一直接混合训练效果差别不大。数据量很大的话阶段一的价值会更明显。3.4 训练框架选型与基础设施CPT框架选择不多主流就三个方向如果用HuggingFace生态transformers DeepSpeed ZeRO-3最稳如果追求极致性能用Megatron-LM或者Megatron-DeepSpeed如果资源相对有限axolotl、LLaMA-Factory这类封装工具也可以快速跑起来但大规模训练时我建议还是上DeepSpeed/Megatron这类更底层的方案。节点之间建议用高速网络互联NCCL通信在长时间训练里非常关键。存储方面做数据Dataloader时注意做数据随机shuffle和数据切分避免多个epoch过拟合——注意CPT一般跑1个epoch甚至不到1个epoch就够跑多了大概率过拟合加遗忘这是新手最容易犯的错误。5. 一次完整的CPT实验记录理论聊得再多不如直接跑一遍。下面我把最近一次做能源设备行业CPT的实验过程完整记录一遍包含环境、命令、参数和评估方法你可以直接当模板参考。4.1 实验环境与数据准备基座模型选择了7B量级的开源模型此处以通用底座模型为假设代码以Qwen2或InternLM2的运行方式为例。7B的量级在行业场景中性价比很高单机多卡可以跑部署也方便。语料情况整理出能源设备相关的行业文档约4.2GBtxt文本清洗后剩2.8GB约1.1B token。通用语料选用RedPajama和中文通用清洗后的混合数据约12B token。总训练数据约13B token行业:通用≈1:11。清洗流程按前面说的管道执行格式清洗、规则过滤、分类器过滤、段落级MinHash去重。数据引擎用PaddleNLP的DataPipe或者自建TFRecord这里不展开细节重点是过程要可控、能复现。4.2 训练脚本与核心参数核心参数我列一下以DeepSpeed ZeRO-3 HuggingFace Trainer为例# 核心训练参数示例 model_name_or_pathQwen/Qwen2-7B train_datamixed_industry_general.jsonl # 行业通用混合数据 # 关键超参 per_device_train_batch_size4 gradient_accumulation_steps16 global_batch_size512 # 4*16*8卡 learning_rate2e-5 num_train_epochs1 warmup_ratio0.03 lr_scheduler_typecosine bf16true max_seq_length4096对应到一个简化的训练调用deepspeed --num_gpus8 \ --master_port29500 \ train.py \ --model_name_or_path Qwen/Qwen2-7B \ --deepspeed ds_config_zero3.json \ --per_device_train_batch_size 4 \ --gradient_accumulation_steps 16 \ --learning_rate 2e-5 \ --num_train_epochs 1 \ --warmup_ratio 0.03 \ --bf16 True \ --max_seq_length 4096 \ --logging_steps 10 \ --save_steps 500 \ --output_dir ./cpt_energy_7bDeepSpeed ZeRO-3的配置里我习惯把zero_optimization.stage3_gather_16bit_weights_on_model_save设为true这样保存模型时能完整汇聚出fp16/bf16权重避免shard权重恢复时麻烦。4.3 评估怎么知道模型真的懂行业了训练跑完评估才是重点。CPT的评估跟传统模型的精确率召回率很不一样因为语言模型没有标准标签。我一般从四个维度做评估维度一行业困惑度Perplexity。留出模型没见过的行业文档做测试集对比CPT前后模型在这些文档上的PPL。PPL下降说明模型对行业文本的建模能力提升。但要注意PPL受tokenizer、文本长度影响很大所以必须在完全相同的测试条件下对比。维度二行业知识问答。整理一批行业常识题库让模型直接回答按主观打分1-5分评估答案准确性。行业知识问答是衡量CPT效果最直观的方式建议准备200道以上覆盖不同子方向的题。维度三通用能力回退检测。用MMLU、C-Eval、GSM8K这类通用评测集测试看模型在通用能力上是否出现明显退化。经验值7B模型做完1B行业tokens的CPT后通用能力下降在1-3个点以内就算健康。维度四特定任务模拟。模拟真实业务场景比如让模型从设备故障描述中提取关键参数、生成维修工单摘要等。这个维度最贴近业务价值也最容易跟业务方对齐预期。我亲眼见过一个项目模型行业PPL降得很好但一问专业知识还是漏洞百出后来发现是因为评测题本身出现在训练数据里了——所以评测集必须严格排除训练语料范围别不当回事。6. 翻车现场CPT最常见的坑与排查实录最后一个章节分享一下实操中踩过的坑。这些都是真实项目里遇到过的问题每条背后都有血泪教训。5.1 灾难性遗忘模型学完行业知识通用能力崩了这是CPT出现频率最高的翻车现场。症状很典型训练结束后行业术语和知识问答变好了但小学数学计算开始算错常识推理变得古怪甚至写出的中文都带点机械味。踩坑过程一般是这样想着行业数据多多益善全用行业语料训练或者学习率调得大幅偏大、训练步数过长。模型在原领域参数被大范围覆盖通用能力衰退。排查方法训练中间定期跑通用评测集建议每500步做一次快照的通用评估画出通用能力的下降曲线一旦发现通用能力下降超过阈值比如C-Eval掉5个点以上立刻调低学习率或提高通用语料配比最终结论通用能力损失是不可完全避免的行业和通用之间存在一个无法两全的权衡点你要做的是在业务可接受的范围内选择一个最优点。客户如果不理解给他看那个trade-off曲线比讲任何道理都管用。5.2 loss狂跳/不收敛问题多半在数据CPT训练过程中loss异常十有八九不是模型和代码的问题而是数据。我在实操中遇到过的三类情况第一类是数据里有大量空文档或极短文本。比如一批PDF转文本后只留下几个字符。空文档会直接污染batch造成loss跳变。排查方法统计训练数据里文档长度分布把低于阈值比如50字符的内容直接过滤掉。第二类是tokenizer导致的意外高loss。行业术语里大量生僻字或特殊符号tokenizer拆得一塌糊涂的话loss会高得离谱。一个很坑的地方是如果模型本来在中英文切换上就不太稳定行业文档里中文里夹杂大量英文缩写可能导致loss周期性震荡——这是模型在标记特殊token模式不是真学到知识。排查方法单独对一批行业文本做tokenizer后的序列长度和token分布统计看是否有大量unk未知token有就要换分词器或用数据增强补充相关词汇。第三类是数据顺序泄露。数据文件没有全局shuffle前几个batch全是同一个领域的内容模型会学到阶段性的数据分布表现为loss逐步台阶式下降。解决方法训练前做全局乱序或者让dataloader的shuffle设置生效。5.3 测试集泄漏评测结果虚高自己骗自己做过一个法律行业的CPT项目评测结果一度好到令人惊喜——专家盲评给分接近满分。后来发现评测题的内容几乎都能在训练语料里找到原文段落等于模型直接背出了答案实际效果根本没有评测显示的那么好。此后我定了一条死规矩测试集在建语料库之前就先划分好并且测试集的题目来源与训练集分开。比如训练集来自近三年的文档测试集就选用更早年份的、明确不参与训练的文档或者人工构造一批模拟行业问题不在任何公开文档里出现。另外行业模型上线前一定要请业务专家做盲测。专家的反馈比任何自动指标都可靠因为行业模型最终要看的是它能不能干好行业里的活而不是能不能在leaderboard上拿高分。5.4 算力不够的替代方案不是所有企业都有八卡A100/H800的资源。算力有限时我有几条务实的建议优先选择7B或更小的基座模型14B和72B的效果差距在小数据量的CPT场景下通常没有想象中那么大。先把7B全参数CPT跑通比在一台机器上挣扎着跑大模型要强。用QLoRA做轻量CPT比如用4bit量化加载13B模型一样能做领域适配。知识注入深度有限但至少能让模型说行话。分阶段训练减少总token数只训练行业最核心的语料把数据量压缩到300M-500M token训练时长能缩到原来的三分之一。小模型小数据量也能出可用模型。云租用算力短期冲刺训练可以租用云GPU实例按需付费不必一开始就自建集群。最后再分享一点实在的心得跑CPT项目这几年我最大的感受是技术上真正难的不是训练那个环节而是把行业理解这件事拆解成数据问题。很多企业拿着大模型来咨询开口就是我们想要一个行业大模型但实际核实下来连自己的数据都没归集过也没有人把散落在业务系统里的文档导出过。这种情况下再好的训练框架和GPU集群也救不了。另一个体会是CPT不是一锤子买卖。行业知识永远是动态更新的——2024年的行业规范和2022年就可能有明显差异模型需要定期迭代继续训练。不要指望一次训练一劳永逸建议把数据管道和训练流程固化成可以反复执行的流水线。如果你正准备启动行业模型的训练我的建议很朴素先花两周时间把行业数据盘点清楚再花一周做清洗和评测集构建最后再碰训练框架。数据基础没打好之前别急着烧算力否则大概率是在浪费钱。
返回列表