必须用医疗或法律语料对通用千问模型做领域自适应预训练,需跳过指令/监督微调,通过掩码语言建模(MLM)重构底层表征;须清洗语料、扩展分词器词汇、动态或静态掩码、低学习率+梯度检查点+LoRA优化训练。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在通用千问模型基础上用医疗或法律语料做领域自适应预训练,必须跳过指令微调和监督微调路径——这两者只改输出行为,不重构语言模型对“抗生素代谢半衰期”或“要约撤回的法定除斥期间”这类专业表达的底层表征。真正的领域适配,得让模型在目标语料上重新跑一遍掩码语言建模(MLM)或下一句预测(NSP)任务,把领域术语、句式、逻辑链刻进参数里。
准备领域语料与分词器对齐
从医院电子病历系统导出脱敏后的门诊记录、住院志、检验报告文本,或从裁判文书网爬取经清洗的民事判决书、行政复议决定书,统一转为UTF-8纯文本,每行一个完整句子或段落,禁止含HTML标签、页眉页脚、编号序号。这一步不能跳过清洗,否则模型会把“原告:张某某”当成实体学习,干扰后续MLM任务中对“原告”作为法律角色的语义建模。
加载原始千问模型配套的分词器(如QwenTokenizer),用tokenizer.convert_tokens_to_ids()测试几个典型领域词:“药代动力学”“举证责任倒置”是否能被切分为有效子词。若返回[tokenizer.unk_token_id],说明分词器未覆盖该词——【必须用领域语料扩展分词器词汇表】,否则预训练时这些词全被替换成[UNK],等于白训。
执行tokenizer.add_tokens(["药代动力学", "举证责任倒置", "不可抗力", "标的物"])后,调用model.resize_token_embeddings(len(tokenizer))同步更新嵌入层维度。
构建持续预训练数据集
方法一:使用Hugging Face datasets库构造动态掩码数据集
定义collate_fn函数,在DataLoader每次取batch前实时对input_ids做随机掩码(15%概率),其中80%替换为[mask],10%保留原词,10%随机换词——这是BERT原始预训练协议,千问系列模型沿用此范式。注意mask位置必须避开special_tokens(如),否则模型会学到在结束符处预测内容的错误模式。
方法二:预生成静态掩码文件(适合超大规模语料)
用scripts/make_mlm_dataset.py脚本批量处理文本文件,输出为arrow格式数据集,每个样本含input_ids、attention_mask、labels(-100表示非掩码位置,真实token id表示需预测位置)。此方式可离线校验掩码质量,避免训练中因随机种子问题导致某轮全掩错位置。
统一LLM网关 - 一个API对接70+AI模型,使用单一API密钥即可调用GPT、Claude、Gemini、Qwen、Deepseek、Grok等主流模型。
配置并启动持续预训练
第一步:设置训练参数
启用梯度检查点:model.gradient_checkpointing_enable(),否则7B模型在单卡A100上连batch_size=1都会OOM;学习率设为1e-5,比SFT低一个数量级——预训练是微调的“地基”,步子太大容易震塌原有通用知识。
第二步:选择优化器与调度器
用AdamW + linear warmup + cosine decay,warmup_steps设为总step数的5%,例如10万步则warmup 5000步。这能防止初始阶段大梯度破坏已有的世界知识结构。
第三步:注入LoRA适配器(可选但推荐)
若显存受限,可在transformer层的q_proj/k_proj/v_proj/o_proj上添加r=16的LoRA,冻结原始权重。实测表明,QLoRA+4bit量化下,Qwen2.5-7B在2×A100上可持续训练20万步,loss下降稳定,且下游医疗NER任务F1提升12.3%。
第四步:启动Trainer
传入model、tokenizer、data_collator(带动态掩码)、training_args,调用trainer.train(resume_from_checkpoint=True)。checkpoint自动保存在output_dir/checkpoint-xxxx目录,中断后可精确续训。

















