最近在试着用qwen2.5-7b(本地跑)搭一个简单的Agent,就是让它调用天气API和日历API做日程提醒。结果发现工具调用成功率特别低,有时候参数格式不对,有时候模型直接不调用工具就开始瞎编。我按官方文档写了function calling的格式,也试了temperature调低到0.1,但还是不稳定。想问下大家,是qwen2.5本身对工具调用支持不够好,还是我少配了什么prompt模板?或者有没有更稳的7B级别开模型推荐?感谢!
用开源模型搭Agent,工具调用老是崩,是qwen2.5的问题还是我姿势不对?
全部回复
共 7 条qwen2.5-7b在工具调用上确实有点挑prompt,官方示例只是基础框架,你可以试试在system prompt里把工具定义写得更具象,比如直接给几个带参数的调用范例。另外temperature可以再低点到0.01,或者试试用vllm跑,它对函数调用的稳定性好些。我之前也踩过类似的坑,后来换了glm4-9b,工具调用成功率明显高一些。
试试先把system prompt里工具描述的格式改成json schema,qwen对结构化输入敏感,比自然语言描述稳很多。
试试把system prompt里工具描述写得更详细点,比如加上参数示例,qwen对格式挺敏感的。
qwen2.5在工具调用上确实有点挑,尤其是7B版本对复杂参数格式的容错率不高,我试过把function description写得更具体一点,比如明确参数类型和枚举值,情况会好一些。另外你试试在system prompt里加一句“你必须严格使用工具,不要自己编造回答”,再配合few-shot示例,成功率能提不少。如果还不行,可以看看glm4-9b或者llama3.1-8b,它们的function calling在社区反馈里相对更稳一点。
同感,我之前用qwen2.5-7b搭工具调用也踩了不少坑,感觉它对function calling的格式特别敏感,尤其是参数嵌套时容易翻车。后来试了试先把系统prompt里显式强调“必须调用工具,不要直接回答”,再把temperature降到0,成功率才勉强能看。7B级别的话,你可以试试glm4-9b或者llama3.1-8b,这两货工具调用稳定性明显好一截,尤其是llama3.1的tool use微调版,官方示例跑起来几乎没崩过。
我最近也在折腾7B级别的Agent,qwen2.5的工具调用确实有点看运气,尤其是参数格式容易翻车。你可以试试加个system prompt把工具描述写得更细,比如每个参数的类型和例子都列出来,我上次这样改完成功率明显高了。另外如果还是不稳,glm4-9b的function calling我觉得更稳一点,虽然吃显存但至少不会瞎编。
同感,我也在qwen2.5-7b上踩过工具调用的坑,尤其是参数格式飘忽不定的时候,真的会怀疑人生。我觉得问题可能不全在模型——7B级别的模型对function calling的理解深度确实有限,尤其当工具描述复杂或者参数类型嵌套时,它容易搞混JSON schema里的字段。你可以试试在system prompt里把工具调用拆成两步:第一步让模型决定“要不要调工具”,第二步单独给一个“请输出严格符合schema的JSON”的指令,这样比一次性让它做判断+输出要稳一点。另外,temperature调低到0.01甚至0.0也没问题,反正工具调用场景不需要创造性。如果还是不行,可以看看qwen2.5的tokenizer对特殊字符(比如引号、花括号)的处理,有时候参数里的转义问题会导致模型输出被截断。至于替代方案,我个人试下来,glm4-9b在简单工具调用上比qwen2.5-7b稍微可靠一些,但多步骤场景同样会崩。其实7B级别目前没有特别完美的选择,可能得等社区把小模型的function calling指令微调方案再优化一波。