WorkBuddy 有时兜圈子、卡在思考里空转,根源是失败重复和成功重复两种 loop,Harness 只在轮次上限才喊停。作者写了一个 12KB 的外聘教练脚本,专门算 token 账,撞墙三四次就掐断止损。

使用过一段时间WorkBuddy的小伙伴都知道,有些时候你会感觉WorkBuddy执行任务的速度很慢,它好像在兜圈子,绕了一圈又绕了回来。

还有的时候它好像也没在调用工具干活,就一直卡在思考的环境,思考了半天感觉没动静。但过了一会儿,它又继续干活了。

这两种情况的根源在于,它在重复循环,重复撞墙,你可以理解成就是在兜圈子,或者叫空转。咱们一个个来理解,首先重复循环也分两种情况,一种是失败重复,一种是成功了还在重复。

失败重复,撞了七八次还在撞

第一种失败重复,比如你让它去查询一个文件,这个文件很重要,它就会去调用工具查询。而这个文件已经是不存在的了,它不知道啊,傻乎乎地重复循环查了七八次没查到,还在继续查。

没人去喊它停,别查了。也没有对应的规矩告诉它,查询了三次查不到就停止。这时候有小伙伴就会说了,那个Harness工程不就是来约束它的规矩么,Harness不会看到它干傻事了,喊它马上停下来么。

实际上不会,Harness只是给模型无限重试的机会,并没有对应的及时喊停止损机制。那什么时候它会才会意识到这个文件不存在,停下来呢?

有三种可能,一是模型悟了。

某次报错之后,它真的悟了。这个文件可能真的不存在。至于什么时候悟,纯看模型的心情和你一开始给的提示词。第二种可能是触发了Harness对于单次任务循环的轮次上限。

所以Harness不是不会喊停,而是等Agent已经兜了半天圈子,浪费了很多token,触发了轮次上限了,才喊停。哪怕这个时候模型已经空转了几十轮,而Harness只是在计算轮次,不会考虑这几十轮有多少是浪费的。

剩下就是你的WorkBuddy积分消耗光了,因为token消耗了很多,这个是对应的。然后是上下文窗口爆了,因为上下文长到一定的极限,会触发WorkBuddy去自动压缩,或者直接报错。

成功重复,查到了还在查

第二种成功重复,还是举同样的例子,你让它去查询文件,文件是存在的。正常情况下,它只需查询一次就可以了,因为调用命令工具后返回的结果都是一样的。但是它重复查询了五次,最后终于安心了,然后告诉你查到了。

这里面就存在四次是浪费的,空转的。因此无论是失败重复,还是成功重复,这种重复循环,换成一个叫loop的词,你应该见过,loop就是循环。Agent就是因为有了loop,它才能一直干活下去,直到任务完成。

没有这个循环,模型就只能一问一答,你问一句它答一句,干不了连续的活。有了loop,它才能想一下,动一下,看一下结果,再想一下,一步步把任务推进下去,直到完成。

教练管花钱,它妈管干活

但是这个过程,就是缺乏一个人站在旁边给它当实时的教练。这个教练是外聘的,专门算账的。算的是token的账,WorkBuddy的积分账。也就是说这个教练是看着WorkBuddy怎么花钱,不能让它乱花钱。

而WorkBuddy本身那套自带的Agent Harness,就有点像它妈。它妈惯着孩子啊,没事孩子你跑去,折腾去,别管家里有没有钱花,随便造。等造得鼻青脸肿了,钱花完了惹事了,这当妈的才上去喊停。

大概就是这样,可能如此举例不大恰当,但其实是很生活化,很符合我们人类社会场景的。因为各自站的角度不一样,秉持的立场就不一样。教练是我们请来监督WorkBuddy,立场和目的是为了省钱。

如果教练不帮我们省钱,我们就没有必要请他,他是毫无价值的。WorkBuddy它妈那是原生的,亲生的,它当然希望WorkBuddy能健康成长,把各种用户交代的任务完成好,别半途而废,遇到挫折一两次就放弃了。

如果是这样子,使用WorkBuddy的用户就会觉得,WorkBuddy这孩子是个什么玩意儿,这也能叫Agent,活都没干好,它妈肯定没教育好孩子。最后补充一点,你看到WorkBuddy的深度思考好像卡住很久了。

深度思考卡住,教练管不了

有两种可能,一种是模型在长推理。因为前面试错的次数太多了,上下文已经堆得很长,每次思考都要背着这一大堆历史重新推理一遍。

重复循环的空转不光直接烧token,还会把会话拖得越来越慢,越来越贵。另外一种就是模型服务挂了,或者网络卡顿的问题。但这个卡住思考的问题是教练解决不了的,教练只能管WorkBuddy动手动脚的事情。

WorkBuddy在动手动脚干活的时候,就会引发前面所说的两种重复循环,重复撞墙,空转浪费token,浪费积分的情况。笨手笨脚进而多多少少也会影响脑子的问题,因为动的手脚多了,会话上下文多了,思考推理时间也会增加。

所以你看,这又串起来了。你要理解或者说学习Agent的工作原理和流程,你就把它当成一个人去看,其实是通的。WorkBuddy作为一个Agent,底层就是如此。Agent是人设计的,Harness也是,所以跟人很相似的。

请个外聘教练,12KB的小脚本

好了,到这里不能再啰嗦再绕了,不然有人该开骂了。老马你逼逼半天,到底有没有解决办法。当然,办法就是请个教练。这个教练真是外聘的外教,是老马参考了微软的开源工具 TokenEconomizer提炼出来的。

这是一个装在WorkBuddy底层的本地小程序,通过Hook钩子的挂载机制,挂上去的一个叫Python写的小脚本。

它的作用在于,Agent每次用工具时都会过一眼,发现连续失败3次,或者同一条命令原样重复好几遍没有进展。

它就会在模型想收工时把它打回来,逼它停下交代卡点或者换思路,不许继续撞墙了,不要再做无意义的重复循环空转了。

对于前面说到的失败重复和成功重复都能成功喊停,甚至于隐藏起来的失败也可以。而且这个脚本本身是不消耗任何token和积分,喊停的速度还挺快,基本可以达到 33ms。

经过老马实际测试下来,对于一些卡住重复循环的任务,平均能减少 40%~60%的token消耗。日常的任务,大概能减少 5%~15%的token消耗。

只有很顺利的任务,没啥卡点的任务,脚本才不会出手去随便喊停。这个脚本跟你使用什么模型是没有关系的,它只对Agent的底层操作进行监控和出手。

那么安装使用这个脚本也非常简单,老马把整个过程都整理成了一个Skill。skill只是辅助安装这个脚本,它是说明书,没有其它作用。脚本一旦安装上了,就一直生效的,除非你哪天让WorkBuddy清理卸载掉。

现在你只需要打开WorkBuddy,把下面的提示词发送过去,就可以把这个脚本安装成功了。脚本本身非常小,文件只有12KB:

安装这个skill: dl.97444.cn/token-stuck-guard.zip

另外,这个脚本本身是无害的,如果你有所担心可以让WorkBuddy执行一下安全审查,装个所谓的什么安全审查Skill之类的。好家伙,本文居然做到了完全没有一张配图。

作者:马佳彬 公众号:马佳彬

本文由 @马佳彬 原创发布于人人都是产品经理。未经作者许可,禁止转载

题图来自 Unsplash,基于CC0协议