Agent 死循环问题有遇到过吗?如何解决?
- 标签:后端、AI、大模型、场景题
🏛 业务架构师
Agent 死循环是生产事故的常客——模型反复调用同一工具、重试相同的失败路径,token 烧钱不说,还可能重复执行写操作造成业务损失。我遇到的典型成因与解法:
成因三类:一是观察结果不收敛——工具返回模糊错误(超时、格式异常),模型得不到有效反馈就一直试;二是任务不可达——目标超出能力边界,模型不会放弃;三是上下文污染——历史里堆满失败记录,模型被带偏重复决策。
我的治理组合拳:
- 硬性熔断(保命底线):最大循环次数(如 10 步)、token/费用预算上限、超时总闸——到线即停,降级转人工;
- 重复检测:对"工具名+参数"做指纹,连续 N 次相同调用直接拦截,提示模型换思路;
- 反馈显性化:工具报错要给模型"可行动的信息"("参数 date 格式应为 YYYY-MM-DD"),而不是甩一句 500 错误;
- 反思注入:检测到循环时插入一条系统消息("该路径已失败 3 次,请改用其他方案或上报"),强制换道;
- 写操作幂等+确认:即使循环发生,业务侧也不会重复扣款、重复下单。
业务视角:死循环本质是"自主性的成本失控"。防线设计要分层——框架层熔断兜底、提示层引导换道、业务层幂等兜底。上线前专门做"故障注入测试"(故意让工具报错),验证熔断路径,这一步没做过的 Agent 不敢上生产。
🏗 系统架构师
Agent 死循环我见得多也治得多,分"识别 → 破环 → 根治"三层讲:
为什么死循环:模型目标感弱(做完一步忘了最终目标)、工具失败重试不换策略(同一个错误参数反复调用)、状态不更新(每步观察与上一步相同模型仍认为"再做一次")、上下文过载后模型"失忆"回到已完成步骤。
破环机制(保险丝,必装):
- 硬熔断:最大步数(如 25)、token 预算、时长上限、同一工具同一参数连续调用 ≤2 次——达到即中断并汇报中间结果;
- 循环检测:对 (tool, args-hash) 组合去重计数,重复即注入"你在重复,请换策略"的系统提示或强制人工介入;
- 状态快照对比:连续 N 步观察结果 hash 相同 → 判定停滞。
根治(让循环少见):
- 目标锚定:System Prompt 重申目标 + 每步要求输出"距目标还差什么"(计划外显);
- 失败反馈工程化:工具错误返回结构化原因 + 建议动作("参数 X 缺失,请先调用 Y 获取"),模型能改道就不会傻重试;
- 规划与执行分离:复杂任务先 Planner 产出 DAG,执行器按图走,偏离时回规划器——图结构天然无环(或显式受控回环);
- 反思机制:Reflexion 式自我评估,连续失败 2 次触发"复盘再规划"。
产品兜底:死循环后降级人工处理并把 case 沉淀进评测集——这是唯一的长期解。
💻 全栈开发专家
死循环是 Agent 生产化的头号事故源,我处理过的典型形态:同一工具同样参数反复调、两个 Agent 互相踢皮球、修复任务改来改去回到原点。
治理手段按层分:
硬刹车(保命层):
max_iterations/recursion_limit(LangGraph)全局步数上限;- token 与金额预算:单任务消费超阈值强制终止;
- 单工具调用次数上限(同一工具名连续调用 ≥3 次即熔断)。
循环检测(诊断层):
- 状态指纹:对「工具名+关键参数+结果摘要」做 hash,重复指纹直接判定无进展;
- 轨迹审查:每隔 N 步让 LLM 看 recent steps,自问「是否在重复」,是则强制换策略或终止。
纠偏(恢复层):
- 工具失败信息结构化回喂,引导模型换参数/换工具(很多循环源于模型看不懂报错);
- 失败 N 次后降级:换工具、换模型(升级到更强模型解难题)或转人工。
python
if fingerprint in recent_states[-3:]:
inject("检测到重复操作,请更换策略或输出 NEED_HELP")- 设计层预防:任务定义给明确的完成判据(DoD),prompt 里写「完成标准」;工具设计成幂等且带分页,避免模型反复全量重试。
根因经验:八成死循环的根因是工具报错信息对模型不友好或完成判据模糊,调 prompt 不如修工具返回信息。