Agent 陷入循环时,每一轮看起来都有动作,任务却没有新增证据、状态变化,也没有更接近完成。常见表现包括同一参数反复调用工具、两个 Agent 互相退回、计划文字变了但下一步没变。排查时先比较相邻两轮的目标、状态、工具参数和回执,找到始终没有变化的字段。
ZGI 的 Workflow 支持设置循环次数和中断条件,Runtime 对连续工具步骤也设有安全上限。这些硬边界可以阻止任务无限运行,循环能否提前结束,还取决于完成条件、状态写入和工具回执是否足够清楚。
概念示意图:判断、调用和结果沿轨道循环,每一轮检查状态变化与新增证据;没有进展时进入停止或人工接管。
先看这一轮增加了什么
工具调用次数多,不一定已经陷入循环。分页读取、分段处理和多轮检索都可能需要重复动作,区别落在每一轮是否带来了新页码、新文件、新状态或更小的剩余范围。动作不断发生,进展记录却原地不动,才需要触发停止策略。
循环常留下几种指纹。同一个工具携带相同参数连续出现;模型改写了计划,却再次选择相同动作;失败结果回到原节点后没有改变输入;两个 Agent 反复把任务交给对方,双方都没有明确的验收条件。把相邻两轮并排比较,通常比只看最后一条报错更容易找到入口。
系统为什么还允许下一轮开始
完成条件写成“把事情处理好”,程序无法判断何时结束。工具已经返回文件标识,结果却没有写入任务状态,Agent 下一轮仍会认为文件尚未生成。外部接口只返回一段模糊文字,没有区分成功、失败和结果未知,也会让模型继续尝试。
多 Agent 交接还会引入另一个断点。上一个 Agent 没有留下当前负责人、已完成项和验收条件,下一个 Agent 读取到整段对话后,可能重新规划已经做过的步骤。任务在角色之间移动,完成状态却没有一起移动。
给每一轮留一张进展记录
进展记录保留六个字段:当前目标、上轮动作、新增证据、状态变化、剩余缺口、下一步许可。
“新增证据”可以是文件 ID、查询结果、审批选择或明确错误;“状态变化”应采用程序能读取的值。连续两轮都没有新证据,也没有状态变化,系统就不再自动进入下一轮,而是补问缺失信息、换一次备用路径或交给人工处理。
局部刹车和全局刹车分开设置
局部刹车盯住某一个重复单元。可以把工具名、规范化参数和目标对象组成调用签名,同一签名连续出现且返回没有变化时,阻止再次调用。这样能抓住“查询同一订单”“反复生成同一文件”一类短循环。
全局刹车观察整项任务。最大轮次、总耗时、调用预算和目标差距都可以成为上限;其中一项触发后,任务保存当前结果与停止原因。ZGI 的循环节点可以用循环次数和中断条件限制 Workflow,排查时再结合相邻节点的输入输出,确认流程在哪里重新进入了旧状态。
停止以后留下可继续的信息
任务停止后,别把结果统一标成失败。记录可以区分“已经完成”“等待补充资料”“工具返回异常”“连续无进展”和“已转人工”。后续恢复时先读取停止原因,再决定补参数、换工具或从指定节点继续,避免恢复动作再次回到原循环。
选一条曾经重复执行的任务,把任意相邻两轮摆在一起。若说不清第二轮新增了什么,就补上进展字段和停止路径,再允许它继续运行。
GitHub:https://github.com/zgiai/zgi
Gitee:https://gitee.com/zgiai/zgi