我在做一个简单的AI Agent,用Qwen2.5-7B微调后作为核心模型,负责根据用户指令调用外部工具,比如查天气、设提醒。微调用的是Lora,训练数据是自己整理的几百条工具调用对话。但实际测试时,模型经常选错函数,比如用户说“帮我设个明天早上的闹钟”,它却去调用查询天气的API,参数还填得乱七八杂。我试过加大工具描述的权重,也调整过prompt模板,效果都不明显。想问问大家,是不是我的训练数据格式有问题?还是模型太小了,7B做这种结构化输出本身就不靠谱?有没有什么更好的策略来提升tool calling的准确率?
微调后的模型做Agent工具调用,总是乱选函数怎么办?
全部回复
共 165 条几百条数据太少了,LoRA学不到函数语义边界,先整两千条高质量带负样本的试试。
几百条数据太少了,工具调用对格式一致性要求极高,建议先检查数据里函数名和参数是否有多样性偏差。
几百条数据对tool calling来说确实太少了,模型很难学到函数边界。你可以试试把工具调用的输出格式固定成严格的JSON schema,微调时加上一些负样本,比如故意给容易混淆的指令让它学会区分。7B其实够用,关键是数据质量和格式一致性,我见过用3B做function call也跑得不错的。另外检查下推理时有没有开guided decoding或者outline约束,这个对结构化输出帮助很大。
几百条数据对tool calling来说确实有点少,模型很容易过拟合到表面措辞上,换种说法就懵了。你试试在训练数据里加一些“负样本”,就是故意给错误的函数和参数让模型学会区分,光喂正例它学不会边界。另外7B做结构化输出其实够用,但建议把工具调用拆成两步:先让模型输出函数名,再单独生成参数,比一步到位稳很多。
几百条数据想教会模型稳定地做tool calling,确实有点勉强,尤其是Qwen2.5-7B这种尺寸。我自己的经验是,数据里不光要有"正确调用"的样本,还得刻意混入一些容易混淆的负例,比如用户说设闹钟、但正确输出是空调用或者澄清提问,让模型学会区分语义相近但意图不同的情况。你现在的现象很像是模型根本没建立起"意图→函数"的强映射,只是学到了工具描述和query表面上的词面关联,所以一遇到"明天早上"这种时间词就乱串到天气去了。另外检查一下训练格式是不是和推理时的chat template完全一致,Lora微调这块很容易踩坑,格式差一点效果就崩。7B做结构化输出本身不是不行,但前提是任务别太杂、函数别太多,函数一多它就容易糊。可以试试在推理时加一层约束解码或者用outlines之类的库限制输出空间,先保证格式合法,再谈选得对不对。如果函数数量超过十个,考虑先做个路由分类再交给模型填参数,会比端到端硬扛靠谱不少。