最近在折腾本地部署的Qwen2.5-7B做简单Agent,发现它调用工具时经常“自说自话”——比如我让它查天气,它不调API,反而自己编一个“晴转多云”的JSON返回。我试过改system prompt强调“必须使用工具”,也调过temperature到0.3,效果还是不稳定。看到有人说要用特定的chat template,但我用的是vLLM加载,是不是默认模板不对?另外,如果模型返回的tool_call格式偶尔不标准,是不是得自己写解析兜底?有没有大佬分享下实际项目中让7B模型老老实实调工具的调参经验?
用Qwen做Agent总是跑偏,function calling到底怎么调才稳?
全部回复
共 35 条7B确实容易偷懒,试试用Qwen官方推荐的tool call模板,vLLM里不会自动套,得手动传。
7B模型确实容易这样,我试过加tools参数后好一些,但关键还是chat template要对。vLLM默认可能没套Qwen的tool模板,你手动指定一下试试。另外它偶尔返回不标准JSON,我一般用正则兜底提取,再不行就重试一次,比硬解析稳。
vLLM默认模板确实容易出这问题,换官方chat template再试试,7B不写解析兜底基本没法用。
vLLM默认模板经常不带工具调用格式,得手动指定chat template,再写个正则兜底解析。
vLLM默认chat template确实容易出问题,建议手动指定Qwen的tool_call模板试试。7B模型本身工具调用就不太稳,加个格式校验兜底比较实在。
7B模型自说自话挺常见的,我这边也踩过坑。vLLM加载时确实要确认chat template有没有正确套上Qwen的tool_call格式,不然模型根本不知道工具调用长啥样。除了temperature,建议把top_p也压到0.8左右,再配合few-shot示例塞进system里,比单纯喊“必须用工具”管用。解析兜底肯定得写,我一般用正则先抓tool_call块,抓不到就强制重试一次,基本能稳住。
7B模型确实容易自己脑补结果,建议直接上outlines或lm-format-enforcer约束输出,比调prompt管用多了。
7B 确实容易幻觉工具结果,建议上 grammar 约束解码强控 JSON 格式,比调 prompt 稳多了。
vLLM默认模板确实容易出这问题,换官方chat template再试,tool_call解析兜底也得写。
这个问题我踩过一模一样的坑,7B模型确实容易“自作聪明”直接编结果。vLLM加载时如果没传--chat-template或者tokenizer自带的模板跟Qwen官方不一致,function calling的格式基本就废了,建议直接拿Qwen官方repo里的chat template手动指定,别信默认的。另外7B这个量级想让它稳定调工具,光靠system prompt硬压不太够,我试过把工具描述写得极其具体、连参数示例都塞进去,命中率会高不少。temperature降到0.1甚至greedy其实对格式稳定性帮助更大,0.3还是有点飘。解析兜底肯定要写,模型偶尔吐个不带tool_call标签的JSON太正常了,用正则加json.loads双重保险,失败了就重试一轮或者直接报错让上层处理。还有个小技巧是在few-shot里塞一两个“正确调用工具”的完整对话样例,比纯文字强调管用得多。
7B模型确实容易这样,尤其vLLM默认可能没走Qwen官方的tool call模板,得手动指定chat_template或者用tokenizer.apply_chat_template验证下输出格式。我之前也遇到过自己编JSON的情况,后来在system里加了few-shot示例,明确给一两个正确调用样例,稳定性明显好很多。解析兜底肯定要写,但别只靠正则,最好用json5或者宽容解析,遇到格式歪的还能救回来。温度0.3对7B来说还是偏高,调工具场景我一般直接设0,再配合stop token控制输出。
vLLM默认模板可能真没带tool_call格式,换官方chat template试试,我之前也踩过这坑。
Qwen2.5的chat template里tool_call得配合hermes格式,vLLM默认可能没走对,建议手动指定下模板。
vLLM默认模板经常不带工具调用格式,换成Qwen官方的chat template试试,解析兜底也得自己写。
7B模型确实容易自己编结果,建议强制用Qwen的chat template加tool_choice参数试试。