在 AI 超级智能体项目中,你如何解决 Agent Loop 可能出现的死循环问题?
- 标签:后端、编程导航
🏛 业务架构师
Agent Loop 死循环是智能体生产的头号事故源,形态有三种:同一工具反复调用(参数错了重试、结果不满意再查,陷入"查-不满意-再查");目标漂移循环(A 做不完转去做 B,又回到 A);自言自语循环(生成无意义的思考链打转)。
我的防线是**"预算 + 检测 + 收敛"三层**:
1. 硬预算(保命线)
- 最大轮数(如 15 轮)、总 token 预算、总时长(如 120 秒)——任一超限强制终止,返回已完成的部分结果与说明。没有预算的 Agent 循环 = 挂在账上的无限刷卡机,这是商业护栏不是技术细节;
2. 循环检测(止损线)
- 重复动作检测:连续 N 次(如 3 次)调用相同工具+相同参数 → 判定卡死,注入干预提示("你已重复此操作,请换思路或结束");
- 进度检测:每轮评估"距离目标是否有新进展"(观察结果集合是否增长)——无进展连续出现即升级干预;
3. 干预与收敛(挽回线)
- 干预不是直接杀:先注入"打断提示"给模型一次自救机会("总结当前进展,直接给出阶段性结论");
- 救不回来则优雅退出:返回部分成果 + 明确告知未完成原因——比无限转圈或突然报错的用户体验好得多;
- 死循环案例全量落库复盘(哪类任务、哪步卡住)——反哺 prompt 与工具设计,同类问题不再犯。
根因预防:工具描述含糊、任务定义模糊是死循环的温床——把任务目标写成可验证的完成条件("生成包含 3 天行程的 PDF"而非"帮我做个规划"),模型知道"什么算完",才不会一直找。
🏗 系统架构师
死循环(Agent Loop 失控:相同工具反复调用、在两步间震荡、永不终止)是 Agent 工程的头号稳定性问题,我的防御体系四层:
1. 硬性熔断(保命底线):
- 最大步数上限(如 15 步)与最大 token 预算,超限强制终止并返回已完成的阶段性结果 + 说明;
- 单步超时(工具调用 30s、LLM 调用 60s)与总时长上限;
- 用户侧"停止"按钮——SSE 连接断开事件触发服务端任务取消。
2. 循环检测(智能识别):
- 动作签名去重:对 (tool, arguments) 归一化哈希,相同签名连续/高频出现(如同一查询连调 3 次)判定循环,中断并注入提示"你在重复相同操作,请改变策略或结束";
- 状态停滞检测:连续 N 步 observation 无新信息(结果相似度过高)视为无进展,触发重规划;
- 震荡检测:A→B→A→B 模式识别。
3. 提示词与机制预防:
- 系统提示词明确终止条件("信息足够时立即给最终答案,不要过度收集");
- Plan 机制:任务先拆计划逐步执行,比裸 ReAct 更不容易迷失;失败步骤允许标记跳过而非无限重试;
- 工具返回结构化失败信息(错误原因 + 建议),模型能据此换路,而不是重复撞墙。
4. 可观测与人工兜底:
- 每步 thought/action/observation 落库(trace),循环事故可回放归因;
- 循环触发率监控告警,异常会话转人工。
心法:LLM 是概率系统,死循环必然发生——设计上假定会失控,用工程护栏把"失控"从故障降级为一次可恢复的失败。
💻 全栈开发专家
死循环的三类根因 + 对应防线:
- 模型反复调用同一工具、结果无进展(最常见):
java
// 防线:循环内检测"连续相似动作"
if (isSimilarToLastAction(currentAction)
&& repeatedCount >= 3) {
injectMessage("检测到你在重复相同操作且没有新信息,"
+ "请改变策略或基于现有信息作答"); // 先提醒,模型常能自纠
repeatedCount++;
if (repeatedCount >= 5) break; // 再犯就终止
}- 终止条件不明确:任务不可达成时模型不知道"该放弃"。
- System prompt 写明:"如果确认无法完成任务,直接说明原因并总结已获得的信息";
- 给模型一个显式的
finish工具(带"结论/失败原因"参数),把"退出"变成可调用的动作。
- 上下文膨胀导致遗忘目标:轮次多了模型"忘了自己在干嘛"又开始循环。
- 每步把任务目标 + 当前进度摘要重新注入(防遗忘);
- 历史超阈值触发压缩(保留关键 Observation,丢弃冗余)。
硬性保险丝(最后一道):
java
int maxSteps = 15; // 步数预算
int maxTokens = 50_000; // token 预算
Duration timeout = Duration.ofMinutes(5); // 墙钟超时任一超限强制退出,输出"当前进展 + 已获得的部分结果 + 未完成原因"。
排障配套:每步的 Thought/Action/Observation 落库,死循环 case 回放分析——大多是工具返回信息不足导致(比如搜索总返回空),修工具比调 prompt 更治本。