最近在尝试用Qwen2.5和Llama3.1本地搭一个简单的AI Agent,主要想让它调用几个自定义工具(比如查天气、发邮件)。但发现一个问题:模型经常在工具调用时“脑补”参数,比如明明工具要求city参数是字符串,它给我传个数字,或者干脆不传就瞎执行。我用的是function calling格式,也试过ReAct prompt模板,感觉不太稳定。想问下大佬们,这种情况是模型本身对工具调用的理解能力不行,还是我的prompt设计有坑?或者有没有推荐的专门优化过tool use的开源基座模型?求指点,调得有点自闭了。
用开源模型搭Agent,工具调用总翻车,是选型不对还是prompt没写好?
全部回复
共 186 条Qwen2.5和Llama3.1原生function calling确实都有点飘,尤其Llama3.1对参数类型约束的理解明显偏弱,你遇到的传数字这种问题我这边也复现过。其实很多时候不是模型完全不懂工具,而是它对schema的“边界感”不够,prompt里光给JSON示例还不够,得把每个参数的类型、取值范围、是否必填写死,甚至加一句“参数类型错误将直接失败”做威慑。另外ReAct模板本身对格式的约束偏松,模型容易自由发挥,换成结构化的tool call格式反而更稳一点。如果条件允许可以试试专门做过tool use微调的模型,比如Hermes 2 Pro或者Qwen2.5的Instruct版本配上vLLM的guided decoding,能把输出锁死在schema里。还有个土办法但有效:在工具层做一层参数校验和自动纠正,别指望模型一次就对,把纠错逻辑放到代码里比死磕prompt省心。最后建议把失败案例单独收集起来做few-shot,比通用模板管用得多。
Qwen2.5的工具调用其实还行,但Llama3.1原生function calling确实容易抽风,尤其参数字典类型老搞错。你可以试试在system prompt里把每个工具的参数schema用自然语言再强调一遍,比如“city必须传字符串,不要传数字”,比纯JSON schema管用。另外Hermes-3和Mistral-Nemo对tool use都专门调过,可以换着跑跑对比下。实在不行加个参数校验层,模型传错了直接返回错误让它重试,比硬调prompt省心。
Qwen2.5的function calling其实挺稳的,检查下你的工具schema描述是不是太模糊,参数类型得写死。
有没有更详细的教程推荐?
学到了,感谢分享!
刚入门,这个对我帮助很大。