垂直领域微调避坑指南:从金融到医疗,我踩过的 5 个大坑
接到一个项目把通用大模型微调成一个医疗问答助手。当时我觉得很稳 —— 不就是整理数据、跑个 LoRA、交差吗不都是公开的套路。结果后面两个月现实教育了我。今天把我在金融和医疗两个垂直领域微调过程中踩过的五个大坑写出来。虽然不能说看完就能搞定所有问题但至少能帮你避开那些我花了大量试错成本才绕开的弯。坑一公开数据集不要直接用一开始贪方便去 Hugging Face 上找了个医疗问答数据集大概 10 万条。看起来质量不错直接就拿来微调。结果模型跑出来效果非常奇怪 —— 专业问题的回答倒是还行但稍微生活化一点的问法就开始乱说。排查过程我随机看了 200 条数据发现问题约 15% 的数据答案明显错误。「头痛应该怎么办」的回答里包含某种药的推荐但根据最新的诊疗指南这种药已经被限制使用了。约 8% 的数据格式混乱。有的问答对是「问题xxx 答案xxx」有的是「Q: xxx A: xxx」。模型学到了两种格式生成的时候随机切换。还有一些数据其实是重复的只是措辞略微不同。我的做法放弃直接使用公开数据集改为公开数据集只做种子数据用大模型做清洗 格式统一。找领域专家审核。找了两个医生朋友帮忙审了 1000 条核心数据。虽然耗时但质量上了一个台阶。标注版本号。医疗知识有更新时效每条数据标注「参考日期」和「来源指南版本」。方便后续知道哪些数据可能过时了。数据质量比数据量重要一万倍。5000 条精标数据 10 万条粗标数据。这一点我用自己的案例验证过了。坑二LoRA Rank 和 Alpha不是越大越好做 LoRA 微调的时候我一开始觉得 rank64 肯定比 rank8 好。毕竟是更复杂的适配。结果 rank64 的模型不仅训练时间长了 4 倍效果反而变差了一些。为什么LoRA 的本质是在原始权重上加一个低秩矩阵。rank 越高这个矩阵的表达能力越强。但问题是rank 太高 →过拟合。模型把训练数据中的噪声也记住了。rank 太高 →灾难性遗忘更严重。原始模型的能力被覆盖得太多。金融场景尤其明显。我用 rank64 微调后模型遇到了一个关于「货币政策」的问题回答的内容里面掺杂了我们内部的金融术语跟通用语境下的理解完全不一样 —— 它不仅记住了知识还把语序风格都学过度了。我现在的选择基于场景做选择通用问答场景如客服rank16, alpha32。保留较多原始能力。专业场景如医疗诊断辅助rank8, alpha16。重点学习新知识少覆盖原有能力。风格迁移如让模型说方言rank32, alpha64。需要更多改变。αalpha是 LoRA 权重的缩放系数。一个经验法则是 α rank × 2。这个值越大LoRA 的更新量对原始模型的影响就越大。坑三灾难性遗忘比你想象的严重金融模型微调完成后我兴高采烈地跑了几个金融测试用例效果都很棒。然后随手问了一个通用问题「李白是什么朝代的诗人」模型回答「唐朝诗人代表作《蜀道难》。」嗯李白是《将进酒》的作者不是《蜀道难》。《蜀道难》是李白的没错…等等我问的不是金融问题吗但模型开始把所有问题都往金融方向扯了。真正的灾难性遗忘表现我后来专门做了一组测试发现模型在以下方面的退化能力维度微调前微调后通用知识问答95%72%代码生成90%65%逻辑推理88%70%安全性拒绝不当请求96%88%这个退化是我没想到的。解决方案用EWCElastic Weight Consolidation来缓解。核心思路是在微调前先让模型在大量通用数据上跑一遍记录每个参数的重要性。微调时对重要的参数施加惩罚不让它们变化太大。不重要的参数随便改用来学习新知识。实现起来其实不复杂在 LoRA 上只需要改 loss 函数。效果上面的表格重新测了一遍通用知识问答恢复到 88%安全性恢复到 94%。代价是收敛变慢了训练时间多了约 40%。还有一个更简单的做法混合训练数据。每次微调用 70% 的领域数据 30% 的通用数据。效果不如 EWC 好但胜在简单代码基本不用改。坑四评估维度单一错过关键问题做了两个月自认为效果不错拿去给客户演示。客户上来就问了一个很现实的问题「如果用户问的问题不在知识库里模型会怎么回答」我当场演示了一个我知道的问题效果很好。客户说「试一个不知道的。」结果模型编了一个听上去很专业的答案但里面关于药品用量的细节完全是错的。根本原因我之前的评估只覆盖了两个维度准确率回答是否正确流畅度语言是否通顺但忽略了三个更重要的维度诚实度不知道是否说不知道安全性是否会给出有害建议鲁棒性输入有干扰时是否稳定改进建了一个多维评估矩阵评估维度 权重 工具/方法 准确率 30% 专家LLM判分 诚实度 25% 对抗性测试 安全性 20% 红队攻击 鲁棒性 15% 拼写同义词攻击 推理能力 10% 思维链评估每个维度独立打分综合看。诚实度和安全性在我原来的评估体系里完全被忽略了但实际应用中最致命的恰恰是这两个维度。坑五领域知识的「边界感」这是最大的坑也是最难解决的问题。模型学会了医学知识但它不知道自己的知识边界在哪里。举个例子问一个微调过的医疗模型「宝宝发烧怎么办」。模型回答得头头是道建议了一堆家庭护理方法。但没问的是——宝宝多大了有没有其他症状烧到多少度了为什么难因为微调数据里的问答对大多数都是「问题 → 答案」很少包含「在什么条件下才适合回答这个问题」的信息。我尝试的方案在训练数据中加了边界用例「患者我发烧了 → 回复前先问发烧多久了有没有其他症状体温多少」「患者我觉得不舒服 → 回复前先问具体哪里不舒服持续多久了」「如果问题中提到这些症状 → 必须建议就医xxx」「如果不知道答案 → 明确说不知道不要说废话。」效果有改善但不完美。模型偶尔还会在不该回答的时候直接回答。这个问题的终极解决方案应该是RLHF 或者 DPO加上更多边界情况的偏好数据。但我负责的项目预算有限就先做到这一步了。写在最后垂直领域微调这件事看起来是「收集数据 → 跑 LoRA → 上线」三步走。但实际上每个步骤的细节能把人逼疯。我做的两个项目时长预估全是「两周搞定」结果都是两个月起步。不是因为技术多难而是因为坑太多了而且每个坑看起来都不像坑。如果你也在做类似的事情我的建议是数据先行。花 70% 的时间搞数据不亏。评估先行。先定评估标准再动手不然没法衡量进步。留足测试时间。效果提升的最后 20%可能要花额外的 80% 时间。有问题欢迎交流。踩坑经验这东西分享出去才有价值。