"它昨天帮我查了三次库存都好好的,今天第一次就报错,说参数解析失败,我啥也没改啊。"

说这话的是我们办公室的采购老陈。我给他配了一个本地跑的小 Agent,能调两个工具:一个查内部库存表,一个按条件筛选供应商记录。用了一周,他说偶尔会"抽风",报个错就停了,再问一遍又好了。
"偶尔"这个词最让人头疼。我让老陈先别重试,把那次的完整日志发我。
一、先看它到底吐了什么
日志里,模型给出的工具调用参数是这样一段:开头的大括号有,物料名、仓库名都写对了,最后少了一个右括号,后面还多出半句"我来帮您查询一下"。工具那边拿到的不是一段合法的 JSON,解析直接失败。
老陈问:"那它为什么有时候好好的?"
我说,模型生成参数其实是在"写字",不是在填表。大多数时候它写得规规矩矩,偶尔顺嘴多说一句,或者问题里带了引号、换行,格式就容易乱。小模型更明显一些。
二、我加了三层
第一层:调用前先校验。 每个工具都写好参数格式说明,模型给出的参数先过一遍校验:能不能解析、必填字段在不在、类型对不对。不合格的不交给工具。

第二层:有限重试,并且把错误原样告诉它。 校验失败时,不是简单再问一遍,而是把"哪里不合格"回给模型,比如"缺少右括号""仓库名为空",让它重新给参数。最多重试两次,超过就停下来,直接跟老陈说"这次没查成,请换个说法或者稍后再试",不硬撑。
第三层:把生成参数这一步的随机性调低。 聊天回答可以活泼一点,但生成工具参数时,我把温度调低,并在说明里要求"只输出参数,不要附加说明"。
三、验收:故意找容易出错的问法
老陈帮我凑了四十个他平时真会问的问题,我又加了十个故意刁钻的:问题里带引号的物料名、带换行的备注、一句话里同时问两个仓库。
每个问题跑三遍,一共一百五十次调用,记三个数:一次成功、重试后成功、最终放弃。
改之前,五十题里有十一题至少出过一次解析失败,有两题三遍全挂。改之后,一百五十次里一次成功占了绝大多数,有九次是校验拦下、重试一次就对了,最终放弃的只有一次,是一句话问两个仓库的那种,它给出的参数总是只填一个。这一题我在说明里补了一句"多个仓库请分开查询",再测三遍都过了。

我还看了重试带来的等待时间,最慢的一次比平时多了四五秒,老陈说能接受。
四、我自己的几条小结
- Agent 调工具不稳,先看它实际吐出的参数,别急着换模型
- 校验要放在工具之前,别让坏参数进到真实的表里
- 重试要有上限,把错误原因告诉模型,比闷头再问一遍有效
- 验收时专门准备带引号、换行、一句多问的问题
老陈现在说它"不怎么抽风了",偶尔停下来也会说清楚原因。
你们的 Agent 工具调用失败率大概多少?是怎么处理格式出错的?评论区交流一下。
相关的配置记录我放在 evafang.com 。