最近在跟一个项目,老板让用LLaMA-2-7B做中文客服问答,说必须微调。我按网上教程,用中文alpaca数据集的子集,跑了LoRA(r=8,alpha=16),只冻结原模型、训adapter,大概2万条样本,1张A100,batch size调小到4,训了3个epoch。结果测试时,回复经常答非所问,有时候还带英文混排。反而我用gpt-3.5-turbo配一个简单的few-shot prompt,效果明显更好。难道微调还不如直接调prompt?还是我的数据预处理有问题?比如要不要先做中文分词?或者直接用英文基座模型本身就不适合中文场景?有没有大佬踩过类似的坑,求分享下经验,真的很困惑。
用LoRA微调LLaMA做中文客服,效果还不如prompt工程,求指点
全部回复
共 87 条2万条样本想教会它客服话术其实不太够,LoRA更容易学到的是格式而不是知识。你试试把数据换成真实客服对话,多轮那种,别用alpaca的问答对。另外中文分词不用做,LLaMA的tokenizer虽然不是为中文优化的,但loRA秩才8,容量太小了,先调到32或64看看。混英文很可能是训练数据里本来就有中英夹杂,清洗一下会好点。
LLaMA-2-7B中文底子本来就薄,你拿alpaca中文子集微调,2万条其实不太够,r=8也偏保守。答非所问和英文混排大概率是数据里指令格式没对齐,或者中文token占比太低导致的。分词倒不用你操心,sentencepiece自己会处理,关键还是基座中文能力弱。我建议你先拿gpt-3.5把客服问答重写成统一模板再训,或者直接换Qwen、Baichuan这类中文基座,LoRA效果会好很多。
LLaMA-2的中文能力本来就是短板,你拿它硬微调客服,训2万条确实容易灾难性遗忘,答非所问和蹦英文都挺典型的。中文分词倒不用额外做,tokenizer那套BPE对中文其实能凑合,关键还是基座中文语料太少。要不先试试换成Chinese-LLaMA-2或者Qwen这类中文底子好的模型再上LoRA,效果应该会差很多。另外r=8可能偏小,客服这种任务可以试试r=16到32,数据质量也比数量重要,2万条里要是有不少噪声就更拉胯了。
2万条数据训3个epoch确实容易过拟合,而且alpaca那套中文数据质量参差不齐,客服场景的分布也对不上。中文分词不用做,LLaMA的tokenizer对中文本来就吃亏,一个汉字经常被拆成好几个token,7B基座本身中文能力就弱。LoRA想打赢few-shot prompt,数据得够干净、够贴近业务,不然不如直接上prompt。建议先拿几百条真实客服对话试试,base模型加prompt做baseline,再决定要不要微调。
这个坑我踩过,而且踩得比你还深。LoRA微调中文客服这事,模型选LLaMA-2-7B基本就输在起跑线了,它的中文token占比太低,你拿2万条中文数据去训adapter,本质是在让一个不太懂中文的底座硬学客服话术,效果能好才怪。真正的问题往往不在数据量,而在数据质量和格式,中文alpaca那套指令模板跟客服场景差太远,模型学到的更多是“回答问题的姿势”而不是“客服该怎么说话”。还有一点,r=8其实偏小了,中文适配本身就需要更大的秩来承载语言迁移,alpha和learning rate没调好也很容易训崩。你说带英文混排,这就是典型的基座语言偏见没被压住,不是分词的问题,LLaMA的tokenizer本来就不是为中文设计的,分不分词意义不大。用gpt-3.5-turbo加few-shot效果好,恰恰说明你任务本身不需要微调,或者至少不该用这个基座来微调。真想走微调路线,换个中文底座比如Qwen、Baichuan或者ChatGLM,同样的LoRA配置效果会差一个量级。另外老板说“必须微调”这种话,很多时候是拍脑袋,先把prompt方案做成基线,再拿数据说话更有说服力。
2万条中文数据对7B模型来说太少了,LoRA容易学偏。先别分词,换个中文基座比如Qwen试试,效果可能直接起飞。
这坑我踩过,2万条数据训LoRA确实容易翻车,尤其LLaMA-2的中文底子本来就弱,7B更明显。回复夹英文多半是基座中文词表覆盖不够,跟分词没啥关系,不用专门做中文分词。你试试把数据加到10万条以上,或者直接换Qwen、Baichuan这类中文基座,LoRA效果会好很多。另外r=8有点小,客服场景可以拉到16或32,alpha对应翻倍,学习率别超过2e-4。