本地 Agent 为了查一个数,把同一个工具调了四十多遍——步数上限与重复调用检测我这样加

21 阅读3分钟

“我就让它查一下上个月会议室的预约次数,它转了五分钟圈,最后告诉我‘无法完成’。”

行政的晓雯把日志截图发到群里,我点开一看,心里咯噔一下:Agent 调了四十多次“查询预约记录”这个工具,参数几乎一模一样,每次拿到结果,又接着调一次。

办公室这个本地 Agent 是我搭的,能调几个内部小工具:查会议室预约、查共享日历、读共享目录里的表格。平时问个“下周三下午哪个会议室空着”,几秒就答了。这次绕了这么多圈,我得给个说法。

一、它为什么停不下来

我把那四十多轮的输入输出一轮一轮看下来,发现了原因:

预约记录工具一次最多返回二十条,后面带着一句“还有更多结果”。上个月有一百多条预约,Agent 每次拿到二十条,看到“还有更多”,就再调一次,可它没把翻页参数带上,于是每次拿回的都是同样的前二十条。它以为自己在往下翻,实际上在原地踏步。

更要命的是,我当时没给它设任何步数上限。只要它觉得“还没查完”,就会一直调下去,直到上下文塞满才放弃。

晓雯问:“那是它笨,还是工具有问题?”

我说:“两边都有。工具的翻页说明写得太含糊,我这边也没给它设刹车。”

二、我加了三道刹车

图:Vin Crosbie from Southbury, Connecticut, USA / Wikimedia Commons / CC BY 2.0

**第一,总步数上限。**一次任务最多调十二次工具,超过就停下来,把已经拿到的东西和卡在哪一步原样告诉用户,而不是硬撑到最后说一句“无法完成”。

**第二,重复调用检测。**连续两次用完全相同的参数调同一个工具,第三次直接拦下,提示它“结果和上次一样,请换参数或停止”。这一条是专门针对原地踏步的。

**第三,把工具说明写清楚。**预约记录工具的返回里明确写上“当前第几页、共几页、下一页请传 page=N”。另外加了一个按月统计的接口,像“上个月一共多少次”这种问题,根本不用一条条翻。

三、验收:故意给它设坑

改完我没直接上线,先准备了一组“坑题”:

  • 原题:上个月会议室预约次数
  • 需要翻五页以上的查询
  • 故意问一个不存在的会议室
  • 让它查一个工具根本拿不到的数据

每题跑五遍,看三件事:总步数、有没有出现重复调用、拿不到时会不会老实说明。

结果原题平均三步就答完,因为走了统计接口;翻页那题最多用了七步,页码一页没重;不存在的会议室,第二步就回复“没找到这个会议室,请确认名称”;拿不到的数据,它在第四步停下,说明了缺哪个工具。二十次里没有一次撞到步数上限。

晓雯后来又问了一遍原题,看着结果说:“这下快多了,而且就算答不上来,它也会告诉我卡在哪里。”

四、一点体会

给 Agent 接工具,不能只想着它能做什么,还得想好它什么时候该停。步数上限、重复检测、清楚的返回说明,这三样加起来成本很低,却能挡住大部分绕圈。验收时别只用顺利的问题,专门设几个坑,看它摔倒的姿势是不是体面。

你们的 Agent 有没有遇到过绕圈、反复调同一个工具的情况?评论区聊聊你们是怎么给它设刹车的。

更多零碎记录在 evafang.com 。