如果 Agent 陷入了死循环怎么办?
· 4 min read
Agent 死循环不是极端情况,是给模型自由度必须付的代价。
- 直接原因:工具调用失败后盲重试——不换参数,反复撞同一堵墙。
- 深层原因:循环缺少收敛信号,Thought 和 Action 之间没有"该停了"的显式判断。
- 第一层防御:max_steps 硬限制,两行代码兜住 80% 的翻车。
- 第二层防御:把 Finish 做成一个 Action,循环有了天然终止 条件。
- 第三层防御:system prompt 里写死"重试失败就换策略",主动避障。
- 工程底线:step_id + 全局超时 + 连续重复 Action 检测,别信 Agent 能自己收敛。
- 三层防御一起上,单靠任何一层都有盲区。
Agent 为什么会死循环
ReAct 循环的代价是模型在"想"和"做"之间可以无限切——它每轮都在评估"还能不能再调个工具多搞点信息",而不是"够不够了"。模型没有内置的"停"。
实际跑下来,死循环分三种:
| 类型 | 症状 | 根因 |
|---|---|---|
| 重试死循环 | 工具返回 error → 相同参数再调 → 继续 error | 模型分不清"暂时失败"和"逻辑错误" |
| 摇摆死循环 | A 工具 → B 工具 → A 工具 → B 工具 | 两个工具互相依赖,谁都没给够决策信息 |
| 探索死循环 | 上下文越来越长,模型忘了原始任务 | 没有目标锚定,开始"看看还有啥能玩的" |
三种里最致命的是第一种——短、快、密集,几秒内烧掉大量 token。摇摆型至少还在换工具,重试型是纯浪费。