最近在试着用qwen2.5-7b(本地跑)搭一个简单的Agent,就是让它调用天气API和日历API做日程提醒。结果发现工具调用成功率特别低,有时候参数格式不对,有时候模型直接不调用工具就开始瞎编。我按官方文档写了function calling的格式,也试了temperature调低到0.1,但还是不稳定。想问下大家,是qwen2.5本身对工具调用支持不够好,还是我少配了什么prompt模板?或者有没有更稳的7B级别开模型推荐?感谢!
用开源模型搭Agent,工具调用老是崩,是qwen2.5的问题还是我姿势不对?
全部回复
共 146 条qwen2.5工具调用确实偏弱,可以试试把每个工具的schema写得更细,再不行就换glm4-9b或functionary,这俩稳不少。
试试给few-shot示例,qwen2.5对空泛指令容易懵,塞两个标准调用范例能稳不少。
说实话qwen2.5的function calling在7B这个规模上确实有点飘,尤其本地量化之后更容易出问题,你可以先试试把工具描述写得极度明确,比如用“当用户提到明天”这种触发词,参数类型也尽量给枚举值而不是自由文本。另外我后来换成了glm-4-9b-chat,同样尺寸但工具调用稳定很多,你也可以对比下。还有个坑就是别太信官方格式,我自己最后是拆成两轮:先让模型决定要不要调工具,再单独解析参数,成功率能拉高不少。
7B模型工具调用本来就不太稳,不如换个思路,用prompt硬约束再加个解析兜底,比调temperature管用。
qwen2.5-7b做function calling确实有点勉强,我试过类似的场景,7B级别模型在多工具选择时很容易犯迷糊。你试试把工具描述写得再具体点,参数类型和示例都给全,有时候模型就是靠这些细节才能选对。另外可以加个强制步骤,在system prompt里明确让它必须先判断是否需要调用工具再回答,能减少瞎编的情况。要是还不行,建议换个专门微调过tool use的模型,比如Hermes或者Firefunction,7B级别里稳不少。
qwen2.5-7b做工具调用确实有点看运气,我上个月也拿它搭过类似的日程助手,情况跟你差不多。后来发现一个挺关键的点,就是它有时候不是不会调,而是你给的system prompt里工具描述写得太抽象,它理解不了参数到底该怎么填。尤其是天气API这种需要城市名和日期两个参数的,如果你没在描述里把格式写死,它就会自由发挥。另外temperature调到0.1其实对function calling帮助有限,反而可能让它在该调用的时候犹豫,我试过0.3左右反而更稳一点。还有个小技巧是可以在prompt里加一两个few-shot示例,直接展示一次完整的调用过程,它模仿能力挺强的。如果你不想折腾prompt,可以试试glm-4-9b或者minicpm3,这两个在工具调用上比qwen2.5-7b稳一些,至少不会动不动就自己编答案。