Agent工具调用中无限重试死循环的根因与修复

Agent工具调用中无限重试死循环的根因与修复 Agent 工具调用中无限重试死循环的根因与修复——技术复盘问题现象Agent 在执行任务时调用某个工具后进入死循环——不断以相同或微调参数重试同一个工具调用每次返回相似结果但仍继续重试Token 快速消耗任务卡死无法推进。典型日志[Turn 3] tool_call: search_database(query用户订单) [Turn 4] tool_call: search_database(query用户订单 2026) [Turn 5] tool_call: search_database(query用户订单 2026年) [Turn 6] tool_call: search_database(query用户 订单 2026 年) ...直到 context window 耗尽排查过程检查工具返回内容工具返回了 {“error”: “no results found”, “hint”: “try different keywords”}这个 hint 本身就是诱因——它在引导 Agent 换关键词重试。检查 Agent 的 System PromptPrompt 中写了如果工具返回错误请分析原因并重试但没有给重试次数上限。检查工具实现工具在无结果时返回 HTTP 200 错误描述而不是返回空数组 []。Agent 无法区分真的没数据和查询方式有问题。统计同类问题发现 24% 的失败任务都有类似的重试模式平均浪费 8-12 轮对话。根因分析三重原因叠加层面问题工具层错误返回格式不标准hint 字段诱导 LLM 继续尝试Prompt 层没有最大重试次数约束没有空结果即停止的规则编排层缺少工具级 circuit breaker没有重试计数和熔断机制核心矛盾LLM 天然倾向于再试一次可能就行了而工具的错误信息恰好给了它这个理由。解决方案Layer 1工具返回规范化python错误时返回明确的 STOP 信号不包含诱导性 hintdef tool_response(status, dataNone, errorNone):return {“status”: “empty” if not data else “ok”,“data”: data or [],“total”: len(data) if data else 0}❌ 不再返回 {“error”: “no results”, “hint”: “try different keywords”}Layer 2Prompt 硬约束在 System Prompt 中加入工具调用规则同一工具同一参数最多重试 2 次超过则报告用户而非继续尝试收到空结果data[]且total0立即停止换策略而非换参数单个任务工具调用总次数不超过 20 轮Layer 3编排层熔断器pythonclass ToolCircuitBreaker:definit(self, max_retries3, window_turns5):self.max_retries max_retriesself.window_turns window_turnsself.call_history []def check(self, tool_name, params_hash): recent [c for c in self.call_history[-self.window_turns:] if c[tool] tool_name and c[params_hash] params_hash] if len(recent) self.max_retries: return False, 检测到重复调用已自动跳过请报告用户或更换策略 return True, None复盘总结维度教训设计原则工具的错误信息要终结歧义而非产生歧义。模糊的 hint 是毒药防御性编程永远不要信任 LLM 会自己停下来。重试上限必须写在 Prompt 代码两层监控意识应该对工具调用轮次设置告警单任务 20 轮 → 人工介入可迁移性这个模式同样适用于 API 调用、数据库查询、文件操作等所有工具一句话总结让工具说清楚为什么停比告诉 Agent 怎么继续更重要。Prompt 是柔性约束代码是刚性约束两层都要做。#Agent #技术复盘 #AI工程 #工具调用 #死循环调试