最近在尝试用Qwen2.5和Llama3.1本地搭一个简单的AI Agent,主要想让它调用几个自定义工具(比如查天气、发邮件)。但发现一个问题:模型经常在工具调用时“脑补”参数,比如明明工具要求city参数是字符串,它给我传个数字,或者干脆不传就瞎执行。我用的是function calling格式,也试过ReAct prompt模板,感觉不太稳定。想问下大佬们,这种情况是模型本身对工具调用的理解能力不行,还是我的prompt设计有坑?或者有没有推荐的专门优化过tool use的开源基座模型?求指点,调得有点自闭了。
用开源模型搭Agent,工具调用总翻车,是选型不对还是prompt没写好?
全部回复
共 177 条Qwen2.5和Llama3.1在function calling上确实偏弱,参数幻觉是常见坑,尤其本地量化后更明显。建议直接试GLM-4-9B或FireFunction V2,这俩对工具调用的格式约束强很多,而且对中文prompt容错高。另外prompt里给每个参数加一个“若缺失则返回错误”的强制说明,比堆ReAct模板管用。你那边是用的原生API还是自己写的解析逻辑?如果是后者,检查下工具schema的description是否写得太含糊。
说实话这俩模型裸跑function calling都容易飘,Qwen2.5对参数类型约束本来就弱,Llama3.1得把工具描述写进system里才稳一点。你可以试试在prompt里把工具参数schema再拆细点,比如明确写上“city必须是字符串,比如'北京',不要带数字”,同时给个错误示例。另外,可以看看Firefunction v2或者Glaive那个工具调用模型,这俩专门调过tool use,比通用模型省心很多。
说实话这俩模型在tool use上都不算强项,Qwen2.5对参数类型约束本来就松,Llama3.1更吃prompt的格式细节。你可以试试把工具schema写得再死板点,比如在描述里直接加“必须传字符串,否则报错”这种硬性要求,或者用few-shot给几个失败案例。另外可以看看Glm-4-9b-chat或者FireFunction V1,这俩对工具调用的稳定性会好不少。
试试glm-4或qwen2.5的tool-use微调版,参数校验得自己在代码里加一层兜底。
Qwen2.5对参数类型确实容易抽风,建议你在工具描述里把每个字段格式写死,再给个few-shot示例。
我之前也遇到过类似问题,Qwen2.5在function calling上确实容易脑补参数,后来我把工具描述里每个参数都加了明确示例,比如“city必须是字符串,如北京的拼音beijing”,情况改善了不少。你用的是原版prompt模板还是自己改过?有时候温度调太高也会让模型瞎编。想稳定的话可以试试glm-4-9b-chat或者firefunction,这俩在tool use上专门调过,比通用模型靠谱一些。
Qwen2.5的function calling本来就不如专用模型稳,试试加few-shot示例把参数格式写死。
参数校验得自己在代码里兜底,光靠模型自觉不现实,换啥模型都得加这层保险。
Qwen2.5和Llama3.1在function calling上确实偏弱,参数幻觉是常见问题,尤其Llama3.1对JSON格式的约束力不够。你试过给工具定义加few-shot示例吗?我当初是把每个工具都配了2-3个成功调用案例丢进system prompt里,稳定性提升明显。另外建议直接换GLM-4-9B或者FireFunction V2,这俩专门调过tool use,配合自带模板基本不用折腾。如果非要自己调,把温度降到0.1以下也能减少瞎编概率。
说实话这俩模型裸跑function calling都容易抽风,Qwen2.5对参数类型约束尤其敏感,建议你试试给它few-shot示例,把每个工具调用都写一个完整例子放进system prompt里,比单纯描述schema管用。另外可以看看Llama3.1的tool use微调版,或者干脆试试ATOM、Devstral这类专门为agent调优的模型,本地部署也不难。还有个坑是温度调太高会加剧脑补,我一般直接设0。
说实话这俩模型裸跑function calling都不算稳,Qwen2.5对参数类型约束本来就弱,Llama3.1更吃prompt格式。你不如试试把工具描述写得更具体,比如在parameter里直接加“这是城市名,必须用字符串”,或者干脆用JSON Schema强制类型。另外可以看看FireFunction V2或者Gorilla这类专门调优过的模型,本地跑效果会比通用模型强不少。
参数校验放Agent层兜底吧,模型该抽风还是抽风,别全指望prompt。Qwen的tool calling确实比Llama稳点。
说实话这问题我太有共鸣了,之前拿Llama3.1跑tool use的时候也是被它那个“脑补”参数折磨到怀疑人生。我觉得可能不完全是选型或者prompt单方面的问题,Qwen2.5和Llama3.1在function calling上其实都偏弱,尤其对参数类型和必填项的约束理解很模糊,你试试看把工具描述写得极其具体,比如在prompt里直接强调“city必须是字符串,如果用户没提就反问”这种硬性规则,会好一些。另外ReAct模板对这类模型确实不友好,它容易把推理和调用混在一起,不如把工具调用拆成独立步骤,用few-shot给几个正反例子,让它模仿格式。你要是想省事,可以看看专门为agent微调的模型,比如FireFunction V2或者Gorilla OpenFunctions,不过本地跑起来可能对显存要求高一点。对了,你试过在工具返回结果后加一步校验逻辑吗?即使模型传错参数,代码层面先拦截住,至少不会瞎执行,这样能减少不少崩溃时刻。
试试给工具描述里加上参数示例和边界说明,Qwen对这块的敏感度真不如专门微调过的模型。
要不直接换GLM-4或DeepSeek,tool calling稳不少,省得调prompt调到头秃。
说实话这问题我太有同感了,之前用Llama3.1调工具的时候也是被它瞎编参数整到怀疑人生,后来发现很多时候真不是模型智商不够,而是我们给的工具schema和示例太“裸”了。你试试在prompt里把每个工具的输入输出样例写得特别具体,甚至直接给一段“错误调用”和“正确调用”的对比,模型会明显更乖一点。另外Qwen2.5对function calling的支持其实比Llama3.1稳不少,但它的系统提示词里对工具格式的描述得用英文原版,我一开始自己改写中文版反而降了精度。如果你愿意折腾,可以看看最新的Qwen2.5-72B的tool-use微调版本,或者试下Glaive那个专门为工具调用训练的小模型,虽然参数小但在这块确实比通用基座强。还有个坑是温度参数,我调到0.1之后参数幻觉少了很多,你可以先排查下这个。最后想问下你用的推理框架是什么?vLLM和llama.cpp对工具调用的实现差异也挺大的,有时候换一下后端就能解决问题。
试试给工具加严格JSON schema校验,再在system prompt里塞两个few-shot例子,Qwen的tool calling会稳很多。
试试加个few-shot例子把参数格式钉死,Qwen对复杂指令容易飘,比换模型省事。
说实话这问题我太有共鸣了,Qwen2.5的function calling我调了两个星期才勉强能用,后来发现它最大的问题不是不理解工具,而是对参数类型的感知特别弱,尤其在温度调高的时候简直放飞自我。你试试把temperature降到0.1以下,然后每个参数都加上严格的正则校验,在系统提示里用few-shot把错误案例怼给它看,会比单纯写描述管用很多。另外ReAct模板对这种小模型来说确实容易崩,因为它生成过程太长,中间一步错后面全歪,我后来改成让模型先输出一个严格JSON的tool call,再用代码解析,而不是让它自由文本生成,翻车率直接降了一半。至于基座模型,说实话目前开源里做tool use最稳的还得是Qwen2.5-72B,小参数版本都半斤八两,要是你机器带得动,直接上72B别犹豫。还有一个坑是自定义工具的描述,别写太复杂,最好把每个参数能取什么值直接列出来,比如city就写“北京/上海/广州”,模型猜错的概率会小很多。你要是试完还是不行,可以看看带tool use微调的模型,比如Gorilla系列,但那些更新慢,有时候也不适配最新框架。最后建议你给自己设个止损点,别死磕一个模型,先拿最稳的跑通流程,再考虑换模型优化效果。
说实话这俩模型在tool use上都不是强项,Qwen2.5的function calling对参数类型约束确实弱,Llama3.1得靠写得很死的system prompt才能稳住。我建议你换个思路,试试用JSON schema做强制约束,比光靠prompt可靠多了。另外可以看下Hermes 4或者Devstral,这俩对工具调用做过专门微调,我本地跑下来比Llama稳不少。你那个发邮件的工具是不是经常漏传收件人?我遇到过类似的,后来把必填参数全塞进工具描述里,用few-shot举例才勉强不翻车。
说实话这俩模型在function calling上确实不算强项,尤其是Qwen2.5对参数类型的约束经常飘,我试过把工具schema写成超详细的JSON description,再加一个强制校验层拦截非法调用,比单纯改prompt管用。你要是想省事,可以看看GLM-4-Flash或者FireFunction系列,这俩对tool use做过专门微调,本地部署也轻量。另外检查下你是不是把多个工具塞进一个system prompt里了,有时候分开每个工具单独一条指令,模型反而不会乱抖机灵。