我去年花了三个月微调一个客服模型踩了无数坑最后总结出一个扎心的结论微调这件事70%的功夫在数据上。不是模型选得不对不是参数调得不好——是数据太烂了。后来我痛定思痛花了大把时间重新整理数据模型的回答质量直接从还能用变成了客户分不清是AI还是真人。今天就把我踩过的坑和总结出的经验全盘托出。先把概念说清楚SFTSupervised Fine-Tuning说白了就是拿着高质量的人工标注数据教模型学会特定场景下应该怎么说话。预训练模型就像一张白纸它懂语法、懂世界知识但它不懂你的业务。SFT就是用它最擅长的方式自回归生成去适应你的任务。但问题就在这儿——很多人以为SFT就是拿一堆问答对扔进去跑。把数据整理成JSONL格式、跑几个epoch就完事了。结果出来的模型要么胡说八道要么连基本的通用能力都掉了。我上过的当今天就别让你再上了。数据构建绕不过去的大山第一步搞清楚你真正需要什么数据在做SFT之前先问自己三个问题1. 模型现在会什么说白了基座模型本身的能力边界在哪。比如用Qwen2.5-7B它本身就懂代码、懂问答你要微调的只是回答问题的方式和业务知识边界不是让它学怎么说话。2. 上线后面对什么样的场景是单轮对话还是多轮是有固定回答模版还是自由发挥这个决定了数据格式。3. 什么样的回答算好这个最重要但很多人没想清楚。具体一点——好回答是信息全面是语气亲切是格式统一你定标准数据才能按标准生产。我当时踩了个坑客户说要热情亲切我按自己的理解写了一大堆亲~“开头的回答。上线后被客户疯狂吐槽太假。后来才知道他们说的热情亲切是用方言缩短回答长度”。第二步数据格式怎么选目前主流的SFT数据格式有三种ShareGPT格式{conversations:[{from:human,value:空调不制冷怎么办},{from:gpt,value:请按以下步骤排查\n1. 检查遥控器是否在制冷模式\n2. 清洗滤网...\n}]}这个格式的好处是多轮对话天然支持缺点是每个角色都标注from字段数据量大时略占空间。Alpaca格式{instruction:空调不制冷怎么办,input:,output:请按以下步骤排查...}最经典的三段式适合单轮问答。缺点是不好处理多轮。OpenAI Messages格式{messages:[{role:user,content:空调不制冷怎么办},{role:assistant,content:请按以下步骤排查...}]}跟ShareGPT很像但API兼容性好。我的建议如果是多轮对话场景直接用ShareGPT格式。如果是单轮QA库Alpaca最轻量。别在格式转换上浪费时间跑起来再说。第三步数据质量才是真正的分水岭这才是SFT的精髓。我总结了几条硬规矩质量 数量我一开始准备了3万条数据跑完效果稀烂。后来砍掉80%的质量不过关的数据用剩下的6000条重新训练效果翻倍。什么样的数据算质量过关回答准确废话但很多人真是拿百度百科直接扔进去格式统一所有回答风格一致别一个用亲~“一个用您好”长度适中别一个300字一个10个字多样性 重复性很多人做数据有一个坏习惯同一种问题写几十个不同版本。空调不制冷怎么办 空调不制冷了怎么办 空调不制冷了怎么办这三个问题对模型来说几乎没有区别。还不如只留1个把省下来的精力去覆盖其他case。难例 简单例模型面对你好、你是谁这种简单问题时基本不会出问题。真正容易翻车的是边界问题用户问的和业务擦边但不完全相关模糊问题用户自己也说不清楚想要什么对抗问题用户考验AI会不会胡说八道这些难例才是SFT数据的黄金。我最后6000条数据里大概有30%是这种难例训练完效果明显好了一大截。训练技巧别让模型的老本丢了数据搞定了训练参数也是坑。说几个最常见的坑。Epoch别太多一个非常普遍的错误以为epoch越多越好。我一开始跑了5个epoch结果模型的通用能力全面下降——让它写个Python脚本都跑不动了。后来换成2-3个epoch效果刚刚好。经验值2-3个epoch最佳超过4个大概率过拟合。学习率别太大SFT的学习率应该是预训练的1/10到1/100。我一般从1e-5开始调如果loss降得太慢就提到2e-5太快就降到5e-6。有个简单判断标准如果训练1个step后loss直接跳水说明学习率太大了。LoRA是个好东西说实话除非你资源充足否则别轻易做全量微调。LoRAQLoRA在大部分场景下效果已经够用了。我的常用配置lora_r16lora_alpha32lora_dropout0.05target_modules[q_proj,v_proj,k_proj,o_proj]如果你用的模型比较大32B以上建议只微调q_proj和v_proj省显存。数据混入防止灾难性遗忘这是SFT最大的坑没有之一。模型在SFT后会在你的任务上表现更好但其他能力代码、数学、通用问答可能会下降。这叫灾难性遗忘。我的解决办法在训练数据里混入10-20%的通用数据。比如你是微调法律模型除了法律QA再加一些通用问答百科式的代码问题如果模型需要写代码逻辑推理保持模型的思维链能力具体的比例我试过几种纯业务数据通用能力下降30%90%业务10%通用通用能力下降约10%80%业务20%通用通用能力几乎不变但业务效果略有下降我最后的方案是15%的通用数据混入这个平衡点效果最好。评估别光盯着loss看很多人训练完只看loss降没降。兄弟loss降了不代表模型变好了。我后来建立了一套评估流程自动评估准备200条测试集用GPT-4或人工打分算BLEU/Rouge/LlamaIndex的评估指标人工抽测随机抽50条找3个人盲评“哪个回答更好”线上效果A/B测试对比老模型和新模型的关键业务指标最惨的教训有一次我model loss从0.8降到了0.3兴高采烈上线结果线上对话满意度直接从85%掉到了62%。就是因为过拟合了训练数据处理开放性问题的能力全面退步。写在最后SFT这件事说难也难说简单也简单。说难——数据的质量要求高训练参数的调优需要经验灾难性遗忘的问题不好解决。说简单——只要你把数据做好了把Epoch控制在2-3个用LoRA跑一跑效果一般都不会太差。最后送大家一句话别迷信参数别忽视数据。我见过太多人花大把时间研究learning rate和weight decay结果拿出去的数据质量一塌糊涂。先把数据抄一遍再回来调参。这是我用三个月踩坑换来的经验。有问题评论区聊别客气。