跳到主要内容
← 返回新闻
news 焦点文章

AI Agent 错误处理与重试策略:生产环境指南

2026年11月10日 smaugbrain 9 分钟阅读 WordPress 文章

# AI Agent 错误处理与重试策略:生产环境指南

引言

在开发环境中运行完美、在生产环境中却不可预测地崩溃的 AI Agent,是一种非常常见的模式。原型系统与生产系统之间的差异往往不在于智能——而在于韧性。错误是不可避免的:LLM API 会对您进行限流,网络连接会中断,下游服务会返回意外负载,工具执行中途超时。如果没有系统的错误处理机制,这些临时故障会级联为工作流失败、重复操作和用户沮丧。

本指南介绍适用于生产环境的 AI Agent 错误处理与重试策略。您将学习如何正确分类错误、实现带指数退避的有界重试、使用幂等密钥防止重复、设计回退链以及应用熔断器。

为何 AI Agent 的错误处理有所不同

传统软件错误处理遵循可预测的路径。HTTP 请求返回您可以分支判断的状态码。AI Agent 的运行方式不同,因为其执行流程是动态的,由语言模型决策驱动而非静态控制流。

三个特性使 Agent 错误处理变得尤为困难:

非确定性执行路径。相同的输入可能在不同运行中产生不同的工具调用序列。重试策略必须处理每一个可能的故障点,而不仅是一组固定的分支。

有状态副作用。与纯函数不同,Agent 会修改外部状态——发送邮件、更新数据库、触发付款。如果原始操作已成功但响应丢失,盲目重试可能导致这些效果的重复执行。

不透明的故障模式。LLM 可能返回格式错误的 JSON 响应、跳过必需的工具调用或幻化参数。这些是逻辑错误而非传输错误,需要不同的恢复策略。

生产型 Agent 需要分层防御:针对基础设施故障的系统级重试、针对模糊结果的验证后重试,以及针对推理错误的模型感知恢复。

在实施重试之前先对错误进行分类

Agent 错误处理中最常见的错误是将所有故障一视同仁。重试认证错误会浪费 token,而不重试速率限制则会不必要地丢失工作。分类发生在三个层级。

传输层错误

传输层错误发生在应用程序逻辑执行之前。包括连接超时、DNS 解析失败和 TCP 连接中断。这些几乎都是临时的。

错误类型 是否重试 策略
连接被拒绝 是 指数退避,3–5 次尝试
超时 是 较短的退避上限(10–30秒)
DNS 失败 有条件 5 秒后重试一次
TLS 错误 否 快速失败;需要手动干预

传输层重试属于编排层。LLM 不应看到这些错误——系统应静默处理它们。

服务层错误

服务层错误来自可达端点但拒绝了请求的情况。这些需要检查 HTTP 状态码。

状态码 是否重试 策略
429 是 解析 Retry-After 头部;相应退避
500 有条件 带退避重试一次;耗尽后升级
502/503 是 标准指数退避
400 否 修复参数;不要重试相同请求
401/403 否 快速失败;凭证需要轮换

速率限制响应值得特别关注。现代 LLM 提供商包含 Retry-After 头部。始终优先采用提供商的指导建议而非通用退避计算。

应用层错误

应用层错误源自 Agent 自身的逻辑:无效的工具参数、缺失必填字段或格式错误的模型输出。这些很少能通过重试恢复。相反,它们需要将结构化错误报告回模型,以便其调整方法。

当发生应用层错误时,将其作为清晰文本回答。如果搜索工具收到空查询,应返回 "Search requires a non-empty query string" 而不是抛出未处理的异常。Agent 可以看到错误上下文并重新格式化请求。

带指数退避和抖动的有界重试

A comparison infographic showing retry versus fallback strategies for AI agents with cyan and orange accents on a dark background
重试与回退:何时重复操作与何时完全切换路径的对比。

指数退避是生产环境重试逻辑的基础。您在每次尝试之间等待越来越长的间隔,让过载的服务有时间恢复。

标准公式:

delay = initial_delay × backoff_factor^attempt

当 initial_delay = 1s 且 backoff_factor = 2 时,四次尝试的重试会产生 1s、2s、4s 和 8s 的延迟——总等待时间为 15 秒。

裸指数退避会导致雷群效应:许多 Agent 在故障后同时重试,它们会在同一时刻醒来并淹没正在恢复的服务。解决方案是抖动——向每次延迟添加随机变化。

import random, time

def delayed_retry(max_attempts, initial_delay=1.0, backoff_factor=2.0, max_delay=60.0):
    for attempt in range(max_attempts):
        try:
            return execute_operation()
        except TransientError as e:
            if attempt == max_attempts - 1:
                raise
            delay = min(initial_delay * (backoff_factor ** attempt), max_delay)
            sleep_time = random.uniform(0, delay)
            time.sleep(sleep_time)

有界重试必须有硬限制。根据延迟容忍度设置 max_attempts——面向用户的操作通常为 3 到 5 次。记录每一次重试尝试,包括错误类型、尝试次数和计算的延迟。

幂等密钥:让重试安全可控

只有当操作具有幂等性时,重试才是安全的——即多次执行的结果与执行一次相同。大多数写操作天然不具备幂等性。

幂等密钥将确定性标识符与每个逻辑操作关联起来。当下游服务两次接收到相同的密钥时,它返回缓存结果而非再次执行操作。

import hashlib

def make_idempotency_key(agent_id, operation_type, payload):
    material = f"{agent_id}\x00{operation_type}\x00{payload}"
    return hashlib.sha256(material.encode()).hexdigest()[:32]

密钥生成规则:

  • 哈希 agent ID、操作类型和序列化载荷一起。
  • 绝不要包含时间戳或非确定性值。
  • 在多步骤工作流中传播相同的密钥。
  • 当下游 API 不支持原生幂等密钥时,实现客户端幂等存储。按标识符缓存每次成功操作的结果。重试时,先检查缓存。

    验证后重试:解决模糊结果

    最困难的故障模式是模糊结果:Agent 发送了工具请求、收到超时,却无法得知操作是否实际执行。盲目重试会导致重复,验证后重试可避免这一问题。

    验证后重试模式增加了一个后置条件检查:

    1. 使用幂等密钥执行操作。

    2. 如果响应指示成功,正常继续。

    3. 如果响应是错误或超时,查询当前状态以验证预期效果是否存在。

    4. 如果验证确认成功,将操作视为已完成。

    5. 如果验证确认失败,使用相同的幂等密钥重试。

    这对应于分布式系统中带有幂等消费者的至少一次投递原则。对于中间序列失败留下部分状态的复合操作,验证尤为重要。从未验证的点恢复,而不是重试所有内容。

    持久失败的降级链

    当重试耗尽时,Agent 需要一条降级路径。降级分为两类。

    工具级降级将一个实现替换为另一个:主/备工具、缓存结果,或在复杂调用反复失败时使用简化操作。

    模型级降级解决推理层失败:同提供商等级切换、跨提供商故障转移,或对关键路径使用本地/离线降级。

    降级配置应当明确且可测试。定期运行模拟提供商宕机的混沌测试。不要在真实事故中才发现降级失败。

    熔断器:保护系统免受自身伤害

    A circuit breaker visualization for AI agent systems showing closed open and half-open states as stylized electrical switch icons
    熔断器状态控制何时停止对持续失败的依赖进行重试。

    熔断器防止对已退化服务的持续调用。当连续失败超过阈值时,断路器打开并在冷却期内短路后续请求。

    熔断器有三个状态:

    关闭。正常运行。每次错误时故障计数递增。

    打开。立即拒绝请求。计时器跟踪冷却期。

    半开。冷却期后,一个探测请求通过。成功则关闭熔断器;失败则重新打开。

    按依赖项配置熔断器。您的 Agent 可能调用五个不同的工具——每个工具有不同的可靠性特征。支付网关故障应立即触发熔断;非关键的分析工具可以容忍更多失败。

    熔断器与重试逻辑互补。在单次调用内对临时错误使用重试,用熔断器停止对持续损坏依赖的反复尝试。

    模型层面的错误恢复

    系统级重试处理基础设施故障。Agent 还会遇到模型引发的故障:幻化工具参数、跳过步骤、循环推理或计划执行错误。

    结构化错误反馈。将错误作为模型可以解析的清晰文本返回。包含工具名称、验证失败和预期格式提示。

    有界反思循环。某些框架允许 Agent 在失败后修订其方法。强制执行最大修订周期数——通常为 2–3 次。耗尽后升级到预定义处理器。

    人工升级路径。并非所有失败都能自动化处理。升级应包括任务摘要、具体错误、已尝试的恢复操作、可用的人工选项和唯一参考 ID。

    实战示例:构建弹性研究 Agent

    考虑一个使用三个工具的 AI Agent 来研究市场趋势:网页搜索 API、新闻聚合 API 和报告生成器。

    搜索层。每次搜索使用全抖动指数退避的有界重试(3 次尝试,1 秒初始,2.0 因子,30 秒最大值)。搜索 API 在速率限制时返回 429——重试逻辑解析 `Retry-After` 头部。如果所有搜索都耗尽重试,Agent 继续使用收集到的结果而非整体失败。

    新闻层。熔断器监控 502 频率。连续 5 次 502 后,熔断器打开 60 秒。在打开状态下,使用带有新鲜度时间戳的缓存新闻结果。

    报告层。每次写入都携带由 Agent 会话 ID 和报告标题派生的幂等密钥。如果写入超时,Agent 在重试前验证报告是否已保存。客户端缓存存储最近的写入结果。

    模型层。如果综合产出格式错误的输出,Agent 收到结构化验证反馈并以修正后的指令重新生成。反思计数器将重新生成限制为 2 次尝试。

    这种分层方法意味着单个工具的故障会优雅降级而非导致管道崩溃。

    常见陷阱

    陷阱 1:重试不可重试的错误。将所有异常同等对待会在认证失败上浪费 token,并在验证错误上造成无限循环。显式分类错误。

    陷阱 2:非确定性幂等密钥。为每次重试生成新的 UUID 会破坏去重功能。从稳定输入派生密钥。

    陷阱 3:对变更操作无验证地重试。假设失败的请求从未执行是导致重复付款和数据损坏的最快途径。始终验证后置条件。

    陷阱 4:重试上限过高。十次重试会增加分钟的延迟。对于面向用户的操作,3 次尝试就足够了。更高的限制属于后台作业。

    陷阱 5:缺少半开转换。没有探测请求,熔断器在短暂故障后会永久保持打开状态。

    陷阱 6:仅记录调试级别日志。结构化记录每次重试——尝试次数、错误类型、耗时和幂等密钥。将日志结构化为 JSON 以供机器解析。

    常见问题

    问:多少次重试尝试是合适的?

    答:三到五次是标准做法。面向用户的操作应使用 3 次;后台批量处理可以容忍 5–10 次。始终配合最大延迟上限。

    问:当 LLM 返回错误时应重试吗?

    答:传输层错误(超时、503)应在编排层重试。输出格式错误应作为结构化反馈返回给模型以进行自我纠正。

    问:降级和重试有什么区别?

    答:重试是重复相同的操作。降级是执行不同的操作以达到相同目标。重试应对临时故障;降级应对持久故障。两者都是必要的。

    问:幂等密钥会与合法重复冲突吗?

    答:是的,如果两个不同的用户发起了相同操作。始终将密钥限定范围,包含唯一用户或会话标识符。

    问:如何测试错误处理?

    答:使用混沌工程引入受控故障。模拟上游服务返回特定错误码。验证重试、降级和熔断器按预期激活。单独和组合测试每种故障模式。

    结论

    适用于生产环境的 AI Agent 将错误处理作为首要架构考量。本文介绍的这些模式——错误分类、带抖动的有界指数退避、幂等密钥、验证后重试、降级链、熔断器和模型感知的恢复——构成了分层防御,确保在单个组件故障时 Agent 仍能运行。

    从错误分类开始。为临时错误添加有界重试。为有副作用的操作引入幂等密钥。为模糊结果实现验证后重试。设计降级链并部署熔断器。为基础设施韧性无法修复的推理错误构建模型级恢复。

    在生产环境中存活下来的 Agent 不是最聪明的,而是那些优雅失败、系统恢复、即使在个别组件故障时仍能持续交付价值的 Agent。

    —

    准备构建有弹性的 AI Agent 了吗?请访问 SmaugBrain 探索生产级 Agent 工作流、错误处理模板和部署指南。