Agent 的第一个失败信号,是它开始重复同一个动作
约 3 分钟1 阅读
我跑一个订票 Agent 的那晚,盯着日志看了快半小时才反应过来出事了。
它本该查询余票、有票就下单、没票就换班次。逻辑简单得很。但日志里,同一条「查询某班次某座位」的记录,刷了 30 多次,一分钟能查几十遍。它在原地疯狂确认一个早就查过的空座。
我第一反应是代码有 bug。但细看代码,没问题——它确实是在「正常」执行:查到没票,判断该重试,于是又查。问题不在某个步骤错了,在于它没有「我已经查过这个了」的记忆。
循环不是 bug,是 Agent 的默认状态
我后来想明白了一件事:Agent 卡在循环里,不是异常,是它的自然状态。
一个 Agent 的本质是「观察 → 决策 → 行动 → 观察」的循环。它每一步都基于当前观察做决策,但它天生没有「这件事我做过 N 次了」的元记忆。所以只要一个状态反复出现(比如余票一直是空),它就会反复对同一状态做同一决策(再查一次),直到有什么东西打破这个循环——通常是用户的耐心或者服务器的钱。
这跟人不一样。人查一次没票,心里会记一笔「这班没票,别再查了」。Agent 不会,每次都是全新的世界。
两个救命的开关
那次之后,我给所有 Agent 加了两个开关,从此再没出现过空转:
第一个:动作去重。 每个动作执行前,记一笔「这个动作、针对这个目标、做过没」。做过就跳过,或转而尝试别的。这就等于给它补上了那个「这班查过了」的记忆。
第二个:步数上限。 不管什么任务,硬性设个最大执行步数(比如 15 步),到了就强制停。这是兜底——就算去重逻辑有漏洞,它也跑不飞。
就这俩,Agent 的稳定性上了一个台阶。不是它变聪明了,是我堵住了它最容易掉���去的坑。
怎么判断该停了
但只设去重和上限还不够,还有个更细的问题:Agent 在什么情况下该判断「这个任务我搞不定」,然后主动认输?
我的做法是给「重复」定个阈值:同一个动作或同一类结果连续出现 3 次,就触发「我可能卡住了」的判断,让 Agent 转去反思——是把任务换个思路重试,还是直接报告失败交给人。
这个机制让 Agent 从「无限空转」变成「有限尝试 + 主动汇报」。它可能还是完不成某些任务,但至少会停下来告诉你「我做不到」,而不是悄悄空转到你发现账单爆了。
收尾
那次订票 Agent 的空转,是我对 Agent 失败模式的启蒙。后来我审任何一个 Agent 设计,第一件事不是看它的能力边界,是看它的「停止条件」。
一个不知道何时该停的 Agent,能力再强也是颗定时炸弹。而一个知道自己该停的 Agent,哪怕能力一般,也是个你能信任的 Agent。
Agent 的可靠,不是从「能完成任务」开始的,是从「能体面地放弃」开始的。
