最近在尝试用Qwen2.5-7B搭一个简单的Agent,目标是通过ReAct框架调用几个API工具(比如天气查询、计算器)。本地部署用的是vLLM,工具描述按OpenAI格式写的。但实际跑的时候,模型经常在“Action Input”这一步卡住,要么输出格式不对(比如多写了换行符或引号),要么直接生成一段无关的废话,很少能一次成功调用工具。我看网上很多人用GPT-4就很顺,是不是开源模型的工具调用能力天生弱一些?还是我prompt写得不够好?或者需要微调?求有经验的大佬指点一下,现在调得很迷茫……
用开源模型搭Agent时,工具调用总是卡住,是我姿势不对吗?
全部回复
共 168 条我之前也踩过这个坑,Qwen2.5用vLLM跑的时候,温度设太高或者top_p太激进,输出就容易飘,试试把temperature调到0.1以下,能稳不少。另外OpenAI格式的工具描述对开源模型来说不一定最友好,你可以试下把Action Input的示例直接写进system prompt里,给两三个完整的JSON样例,比单纯描述字段管用。微调倒是不急,先把解码参数和prompt结构调顺了,大概率能解决八成问题。
我也遇到过类似的情况,Qwen2.5-7B在工具调用上确实比GPT-4更容易飘,格式稍微一复杂就崩。你可以试试把工具描述写得更死板一点,比如用json schema那种硬约束,然后在prompt里直接给一个“Action Input”的完整示例,让它照着抄,别让它自由发挥。
另外vLLM的采样参数也影响很大,temperature调到0.1以下,top_p别太高,不然它老爱自己加戏。我之前还试过在系统提示里强调“不要输出任何多余字符”,效果能好一点,但确实没法保证每次都成功。
如果要省心,可以考虑加一层后处理逻辑,比如正则提取Action Input里的json,或者用个小模型专门做格式修正,绕开主模型的脆弱点。微调倒不是首选,先看看是不是参数和prompt的问题。
开源模型这块确实比GPT-4费劲,Qwen2.5-7B在工具调用上不是天生弱,是它对格式的敏感度太高,稍微一点换行或引号偏差就崩了。我之前也卡在Action Input,后来把工具描述改成极简的JSON schema,并且强制在system prompt里给一个完整的输出示例,成功率能提不少。vLLM的采样参数也得调,比如temperature设0,top_p拉低点,不然它容易自己发挥。微调暂时别想,先拿几个固定模板试,把prompt里的“思考步骤”压缩到最少,让模型没机会跑偏。你试试看。
说实话这问题我也踩过坑,Qwen2.5-7B对OpenAI格式的tool calling支持确实一般,尤其是Action Input的JSON容错率很低。建议你先试试把工具描述改成更简短的纯文本,别用复杂嵌套结构,同时把temperature调到0附近,能改善不少。另外vLLM的采样参数也可能影响输出,比如repetition penalty设太高会让格式崩掉。如果还不行,可能得考虑用更小的专用模型或者干脆用grammar constraint强制输出JSON,比微调省事多了。
先试试把temperature调低到0.1,再强行约束输出json格式,能解决大部分卡顿。
Qwen2.5-7B的tool calling确实没那么稳,我试过用它的原生function call格式会好不少,别纯靠ReAct那套prompt硬怼。另外vLLM部署时把stop token配好,不然模型容易在Action Input后面瞎续写。建议先拿这个模型专门微调一小批工具调用数据,几百条就能明显改善格式问题。
7B模型做ReAct确实容易在格式上翻车,我拿Qwen2.5试过也踩过类似的坑。后来发现把stop token加上“Action:”和“Observation:”,再在prompt里塞一两个完整的few-shot样例,成功率能提不少。工具描述别写太啰嗦,字段越简单越好。如果还不行,可以试试用vLLM的guided decoding强制JSON格式,比硬调prompt省心多了。
Qwen2.5-7B做ReAct其实挺吃prompt格式的,官方建议用他们特定的tool call模板,直接套OpenAI格式容易翻车。我试过用vLLM跑7B,把工具描述改成Qwen自己的function calling格式后成功率高了不少。另外temperature调低点(0.1左右)能减少那些莫名其妙的废话输出。如果还不行,可能真得考虑换个14B以上的模型,7B在复杂工具调用上确实有点吃力。