上周在一个技术群里看人吐槽:他自己攒了两万多条对话数据,把一个开源 7B 模型 SFT(监督微调,拿人工标注的问答对教模型怎么回话)了一遍,loss 曲线漂亮得像教科书,评测集分数也涨了。兴冲冲部署上去,用户反馈就一句话——"这模型怎么变话痨了?"问个价格,它先道歉,再安抚,再绕一大圈,最后报了个数。他百思不得其解,把截图甩到群里问是不是模型基座不行。
我点开他的样例数据看了十分钟,基本就明白了。问题不在模型,在他那两万条数据里。
先把这事从头捋一遍。这两年开源微调的全家桶越来越顺手,LoRA、QLoRA 加上几个开源训练框架,一个懂点工程的程序员从零到"模型学会回话",一个下午就够。技术门槛降下来之后,大家的注意力都放在了"怎么训"上:学习率怎么设、rank 给多少、几轮不过拟合。而数据本身,多数人的理解停留在"燃料"这个比喻上——多多益善,攒就完了。这位群友的两万条就是这么来的:业务日志里捞一批,网上爬一批,再用强模型蒸馏(用能力更强的模型生成训练数据)一批,凑齐了就开训。
问题就出在这几处。SFT 的监督信号粒度比你想象的细得多。你以为模型在学"怎么答对",实际上它在逐 token 学"接下来说什么"——包括那些道歉、铺垫、绕圈子的废话。你的数据里三成对话带着"您好,非常抱歉给您带来不便",模型就原原本本把这套腔调学回去了,还学会了在任何场合调用它。评测集为什么发现不了?因为评测题也大多是这种"客气问答"风格,模型把腔调答得越标准,分越高。训练目标和你真正想要的东西,从根上就岔开了。
这不是什么新发现。Meta 三年前那篇 LIMA 论文(Less Is More for Alignment)已经把话说得很直白:一个 7B 模型,只用精心筛选的 1000 条数据做 SFT,效果就跟那些喂了几万条数据的版本打得有来有回。论文里的结论我到现在都记得,模型的能力绝大部分在预训练阶段就长好了,SFT 教它的不是"会不会",而是"用哪种方式说话"。既然只是教说话方式,你要的样本就贵在准,不在多。
道理听着都懂,真到自己动手的时候,坑还是一个接一个。去年我帮一个做智能客服的团队看他们的 SFT 数据,就是这个坑的现实版。他们准备了差不多两万条对话,标了好几个星期,训练预算烧了不少,模型答业务问题倒是对的,就是废话密度高得离谱。我们坐下来做数据审计,把对话按"信息含量"重新过了一遍——麻烦就麻烦在这儿:原始客服日志里混着大量礼貌性寒暄、重复话术,甚至还有几千条是同一个问题的换皮重写。真正带着业务知识、答案风格干净利落的,筛完只剩两千多条。
我们就做了一次很粗暴的对照实验:同一份模型,一边用原封不动的两万条训,一边只用裁出来的两千三百条训。结果不体面但很真实——小数据版本在他们的真实业务评测里赢了,回答长度砍掉接近一半,信息密度翻了一倍还多。那个负责标注的姑娘幽幽来了一句:"所以我们几个礼拜的白干了?"我只能说,那几个礼拜不是白干,是给筛选积累了库存。话是这么说,她白了我一眼。
比"多而杂"更隐蔽的是"多而同"。数据量够大、单条质量也不差,但样本之间长得太像——同一个模板换汤不换药,同一类问法反复出现。这种情况模型不会变话痨,它会干更隐蔽的事:背题。我在审计另一个项目的时候专门做过检查,把验证集里的题拿去和训练集做匹配,发现不少验证题在训练集里有近似克隆,模型答得又快又好,其实是复述见过的话术,换个稍微不同的问法就露馅。后来我们养成了个习惯,训之前先做去重(用 MinHash 这类指纹算法把近似重复的样本找出来)加多样性检查,宁可样本少,也要让每条样本教模型一点新东西。
跳出来看,这件事在行业里的分量正在悄悄变重。早年大家吹微调,比的是谁的数据多、谁的算力猛;现在越来越多团队把预算往数据工程上挪——用奖励模型当裁判给样本打分,低分直接扔;从零标注转成"先造再筛",用合成数据铺量,再靠严格的质检把噪声滤掉。数据清洗这个以前没人爱提的脏活,正在变成训练管线里公认的贵环节。当然它自己也长出了新毛病:合成数据铺量的路子,噪声是会自我复制的——上一代模型的毛病,喂给下一代,可能被放大成下一代的地基问题。脏数据进、脏模型出,这条链子越来越长,每一环都得有人盯着。
回到群里那位话痨模型的哥们。我给他的建议土得掉渣:别急着调参数,先把两万条数据裁一遍,把所有超过三句废话的回答砍掉重标。两天后他回消息,就四个字:"好了,清爽。"
所以想问问大家:你手里那份准备拿去微调的数据集,有多少条是真正在教模型新东西的,又有多少是拿来凑数的?要是心里没底,不妨学我做一次数据审计——被自己数据的真实成色吓一跳的,估计不止我一个。评论区聊聊,你筛数据的时候踩过什么坑?