智能体的死信:当没有智能体能完成任务时该怎么办
一个正在构建多智能体研究工具的团队在一次失控任务运行到第 11 天时发现,他们的两个智能体在整个过程中一直在循环交叉引用彼此的输出。账单金额:47,000 美元。没有人类看到过结果。没有触发任何警报。系统只是在持续运行,并确信自己正在取得进展,因为架构中没有任何环节提出这样一个问题:当一个任务确实无法完成时会发生什么?
消息队列在几十年前就通过死信队列 (DLQ) 解决了这个问题。一条超过投递重试限制的消息会被路由到一个暂存区,操作员可以在那里检查它、修复根本原因,并在系统准备就绪时重新播放。这种模式简单、经过实战检验,但在当今的生产级智能体系统中几乎完全缺失。
然而,智能体失败与消息投递失败并不相同。队列消费者要么处理了消息,要么没处理——这是一个二元结果。而智能体可能会自信地产生幻觉、在没有进展的情况下循环、违反它并不知道存在的策略、在任务中途耗尽其上下文窗口,或者在被人发现之前将错误的输出级联到五个下游智能体中。这些失败 带有重试次数无法捕捉的语义权重。为智能体调整 DLQ 模式意味着保留这种权重,并将其路由到有用的地方。
为什么智能体的失败与消息不同
队列投递失败只有一个有意义的属性:已经尝试的次数。这足以决定“放弃并将其存入死信队列”。智能体任务失败至少有六种不同的模式,每种模式都需要不同的恢复路径:
置信度崩溃。 智能体生成的输出看起来正确,但是建立在不稳固的推理链之上的。推理中的微小偏差会不断累积,到第 15 步时,答案在操作层面就是错误的,而事实准确性检查却无法捕捉到这一点。与投递失败不同,这里没有错误代码——智能体返回了 200 OK。
无限循环。 两个智能体互相交叉引用;一个工具总是返回智能体不认同的数据;一个计划循环反复生成并丢弃同一个子任务。有限的迭代限制可以捕捉到明显的情况,但语义循环——即智能体每次用不同的方式表达同样的停滞状态——会逃过基于指纹的检测。
工具权限错误。 智能体调用了一个它不应该有访问权限的端点,或者触及了一个需要系统从未配置过的审批的资源。在当前上下文中,这些是永久性失败。重试没有帮助;修复需要人类更改智能体的授权范围。
上下文溢出。 随着上下文窗口的填满,模型对对话早期埋藏的信息的忠实度会降低。一个在第三步还能可靠跟踪复杂多步计划的智能体,可能会在第二十步默默丢掉一个 约束。这种失败不是崩溃,而是漂移。
任务中途的策略拒绝。 智能体在工作流中途发现,完成下一步需要模型安全训练所不允许的操作。任务在中间状态被放弃,导致下游智能体一直在等待永远不会到来的输出。
多智能体级联。 一个智能体产生了格式错误的输出。下一个智能体信任其输入,对其进行处理并生成了一个细微错误的结。当级联到达最后一步时,最初的错误已经变得不可见。一个拥有十个智能体且每个智能体独立可靠性为 95% 的系统,其端到端可靠性大约只有 60%——而且早期阶段的失败会污染下游的所有环节。
在失败发生时应保留什么
传统的 DLQ 保留消息负载和时间戳。对于智能体任务来说,这远不足以诊断问题出在哪里或安全地恢复工作。一个有用的智能体死信记录应该捕获:
原始意图。 在智能体开始解释之前用户表达的目标。这与当前的执行状态不同,执行状态可能已经明显偏离了实际请求的内容。
完整的工具调用历史。 按顺序排列的每一个被调用的工具及其输入参数和输出。这是执行追踪——等同于崩溃时的堆栈转储。如果没有它,人类审核者就无法理解智能体已经尝试过什么,或者失败为什么会发生。
关键步骤的置信度信号。 如果模型给出了置信度分数或产生了推理链,这些信息应该在每个决策点被捕获。低置信度下发生的失败与高置信度下发生的失败是不同的——前者表明任务 本身具有歧义,后者则表明模型存在细微错误或数据有误。
失败分类。 这是临时错误(速率限制、超时)还是永久错误(策略拒绝、权限被拒)?是否可以通过更换模型来恢复,还是需要人工干预?在捕获时对失败进行分类,可以使路由决策变得更快。
重试次数和之前的恢复尝试。 如果任务已经从廉价模型升级到能力更强的模型一次但仍然失败,这就是关键的上下文信息。对于已经经历了两轮升级的任务,其存入死信队列后的恢复路径应与首次失败时有所不同。
执行状态和记忆。 智能体写入的任何持久记忆、生成的任何阶段性结果、多步计划中的当前位置。如果任务最终重试或交给人类,他们不应该需要从头开始。
三种恢复路径
一旦任务进入死信队列(DLQ),它需要被路由到以下三种结果之一。
带升级机制的自动重试。 许多瞬时故障——速率限制、超时、上下文溢出——可以通过使用能力更强的模型或扩大工具访问权限来重试解决。在任务到达人工审核员之前,在轻量化模型上失败的任务应该尝试使用顶尖模型重新执行。这种升级应该是有限度的:最多设置两个升级层级,如果两者都失败,则进入硬死信(hard dead-letter)。无限度的升级会以更高的成本重现原始问题。
人工审核清理。 永久性失败和高歧义案例需要人工介入。清理队列的设计在这里至关重要。审核员需要看到原始意图、通俗易懂的失败原因、工具调用历史以及建议的操作(使用不同上下文重试、修改任务、放弃)。如果没有这种结构,队列就会变成一堆令操作员望而生畏的模糊故障。有了它,大多数失败的任务可以在两分钟内完成分拣。
- https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html
- https://www.rabbitmq.com/docs/dlx
- https://www.confluent.io/learn/kafka-dead-letter-queue/
- https://www.getmaxim.ai/articles/top-6-reasons-why-ai-agents-fail-in-production-and-how-to-fix-them/
- https://galileo.ai/blog/agent-failure-modes-guide
- https://arxiv.org/html/2602.03603
- https://galileo.ai/blog/human-in-the-loop-agent-oversight
- https://dev.to/waxell/ai-agent-circuit-breakers-the-reliability-pattern-production-teams-are-missing-5bpg
- https://fast.io/resources/ai-agent-retry-patterns/
- https://cdn-dynmedia-1.microsoft.com/is/content/microsoftcorp/microsoft/final/en-us/microsoft-brand/documents/Taxonomy-of-Failure-Mode-in-Agentic-AI-Systems-Whitepaper.pdf
- https://arxiv.org/html/2603.06847v1
- https://dzone.com/articles/idempotency-in-ai-tools-most-expensive-mistake
- https://www.diagrid.io/blog/checkpoints-are-not-durable-execution-why-langgraph-crewai-google-adk-fall-short-for-production-agent-workflows
- https://theoperatorcollective.org/blog/ai-agent-failures-lessons-crashes
- https://surgehq.ai/blog/when-coding-agents-spiral-into-693-lines-of-hallucinations
