Skip to content

在 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 是概率系统,死循环必然发生——设计上假定会失控,用工程护栏把"失控"从故障降级为一次可恢复的失败。

💻 全栈开发专家 ​

死循环的三类根因 + 对应防线:

  1. 模型反复调用同一工具、结果无进展(最常见):
java
// 防线:循环内检测"连续相似动作"
if (isSimilarToLastAction(currentAction) 
        && repeatedCount >= 3) {
    injectMessage("检测到你在重复相同操作且没有新信息,"
                + "请改变策略或基于现有信息作答");   // 先提醒,模型常能自纠
    repeatedCount++;
    if (repeatedCount >= 5) break;                  // 再犯就终止
}
  1. 终止条件不明确:任务不可达成时模型不知道"该放弃"。
  • System prompt 写明:"如果确认无法完成任务,直接说明原因并总结已获得的信息";
  • 给模型一个显式的 finish 工具(带"结论/失败原因"参数),把"退出"变成可调用的动作。
  1. 上下文膨胀导致遗忘目标:轮次多了模型"忘了自己在干嘛"又开始循环。
  • 每步把任务目标 + 当前进度摘要重新注入(防遗忘);
  • 历史超阈值触发压缩(保留关键 Observation,丢弃冗余)。

硬性保险丝(最后一道):

java
int maxSteps = 15;                 // 步数预算
int maxTokens = 50_000;            // token 预算
Duration timeout = Duration.ofMinutes(5);   // 墙钟超时

任一超限强制退出,输出"当前进展 + 已获得的部分结果 + 未完成原因"。

排障配套:每步的 Thought/Action/Observation 落库,死循环 case 回放分析——大多是工具返回信息不足导致(比如搜索总返回空),修工具比调 prompt 更治本。