最近想试试用本地小模型做特定框架的代码补全,选了Llama3.2-3B,用LoRA微调。数据集是GitHub上爬的某框架的issue和对应PR代码块,清洗后大概2万条,格式是“问题描述 + 代码段”。训练时loss能稳定降到0.3左右,但推理时生成的代码完全不可用,全是重复的括号和缩进,偶尔蹦出几个函数名。
楼主
14天前
微调Llama3.2-3B做代码生成,loss降到0.3但输出全是乱码,哪里出了问题?
请 登录 后发表回复
全部回复
共 41 条
2楼
13小时前
loss降到0.3只能说明模型在拟合训练集,不代表学到了代码逻辑。你那个数据格式“问题描述+代码段”很容易让模型把注意力全放在描述上,代码部分反而成了背景噪音。建议试试把代码单独作为输入输出对,或者加个特殊的分隔符强制模型区分上下文。另外2万条对代码生成来说可能偏少,LoRA的rank也可以调大点试试,我之前用类似配置也遇到过纯输出括号的情况,后来发现是tokenizer对缩进和换行的处理有问题。
这现象我太熟了,大概率是数据预处理的时候把代码里的缩进和换行符搞坏了。Llama的tokenizer对空格和tab特别敏感,你要是清洗的时候把\t换成空格或者合并了连续空格,模型学到的就是一堆无效的空白模式。先检查下训练集里代码的原始格式和推理时输入格式是不是完全一致,不一致的话loss再低都是白搭。另外你用的prompt模板是什么?如果训练和推理时模板不一致,输出乱码也很正常。