Agent 是怎么做错误处理的呢?

错误处理全链路:报错 → 重试 → 换思路 → 熔断

Agent 的错误处理不是一句 try-catch、也不是「重试几次」,而是一条四级的升级阶梯------报错、重试、换思路、熔断,每一级针对一种不同的失败,关键是每一级都先判断「错在哪」。

前言

假设,Agent 调一次 API 报错了,你随手写了个 try-catch,加上「失败就重试」。结果它要么对着一个「永久性错误」死命重试、把 token 烧光;要么对着「方案本身错了」的情况,一遍遍重试同一个动作,就是不换条路。

问题出在一个认知误区上:「出错」不是一件事,是好几件事。 服务器限流是错,参数填错也是错,工具选错还是错------它们长得都像「一个 Error」,但解药完全不同。你用一个动作(重试)去应对所有错,必然抓瞎。

一、报错:先分类,别急着动手

错误不是铁板一块。动手之前,先回答三个问题,它们决定了后面每一级怎么走:

ts 复制代码
// 报错之后的第一件事:不是 catch 掉重试,而是先问清楚「这是哪种错」
function classify(err) {
  if (isTransient(err))  return 'transient'   // 暂时性:限流 429、过载 529、网络抖动
  if (isFatal(err))      return 'fatal'       // 永久性:鉴权 401、欠费、参数不合法
  return 'unknown'
}

这三个问题分别是:

  1. 暂时还是永久? ------ 决定「要不要重试」。
  2. 环境错了,还是方案错了? ------ 决定「重试,还是换思路」。
  3. 这是第几次失败了? ------ 决定「要不要熔断」。

取舍点 :大多数 Agent 会把分类这一步整个跳过,所有错误一视同仁地重试。于是「欠费」被当「限流」退避,「参数填错」被当「服务器抽风」反复重试。分类是这条链的地基------一个错误没贴对标签,后面每一级都会用错药。 这一步几乎零成本,却是后面所有判断的前提。

二、重试:只对「暂时性」失败有意义

分类之后,第一级动作是重试------同一个动作,等一会儿再来。它针对的是「暂时性失败」:世界暂时不配合,但你做的事本身没错。

重试的具体姿势(读响应头、指数退避 + 抖动、2 次封顶),这里不再重复,只强调一个和「全链路」有关的新角度:重试是最便宜、也最该放在最前面的一级,但它的适用面最窄------它只治「暂时性的环境问题」。

取舍点 :重试成立的前提是「错不在我 」。如果错在方案------工具用错了、参数填错了、路径走错了------重试一万次还是错。所以重试必须配一个硬上限(比如 3 次),超过上限,就说明「这不是暂时性问题」,自动进入下一级。重试的价值,一半在「多给一次机会」,一半在「证明这招没用、逼着你往下一级走」。

三、换思路:重试治标,换思路治本

这是这条链里最容易漏掉、也最能体现 Agent 特色的一级。

先分清两个词:重试是「做同一件事」,换思路是「做另一件事」。 当错误是「我的方案错了」------不是世界不配合,而是我选的工具、填的参数、定的步骤本身就错------重试就是白费,得停下来换个做法。

传统程序的错误处理是 try-catch → 兜底 → 失败,因为它不能自己改方案。但 Agent 有一个别的系统没有的超能力:它能把错误读进上下文,自己重新想一遍。 所以「换思路」这一级的实现,不是写死几个 fallback,而是把「这条路走不通」这个信号,喂回给模型:

ts 复制代码
// 不是死命重试,而是把「走不通」这个信号喂回给模型,让它自己换方向
if (sameThingFailed >= N) {
  messages.push({
    role: 'user',
    content: '[系统提醒] 这条路已经试了 N 次都不通,请换一个思路或换一个工具,不要重复同样的操作。',
  })
}

这和第 3 篇死循环检测里的「软提醒」是同一件事,但这里强调它的另一面:它不只是防「重复」,更是防「在错的方向上坚持」。 重试负责「再试一次」,换思路负责「换个方向再试」------一个是时间维度上的坚持,一个是方向维度上的调整。

取舍点 :为什么「换思路」要排在「熔断」前面?因为模型是有概率性的,换个思路很可能就成,直接熔断会误伤「再想想就能过」的情况。但「换思路」也有代价------每换一次思路,都要再烧一轮 token。所以它同样要有度:换了几次还不行,才进入最后一级。

四、熔断:最后的保险丝

当重试和换思路都试过、还在失败,就该熔断。熔断不是「一失败就停」,而是分两层:

ts 复制代码
// 单点熔断:某个工具连续挂了 N 次,先把它摘掉,让模型绕开它
if (toolFailures[toolName] >= N) {
  markUnavailable(toolName)   // 之后模型不再选它,用别的工具
}

// 全局熔断:烧超预算 / 跑超轮数 / 连续失败,整体停,交回给人
if (budgetExceeded || stepsExceeded || consecutiveFailures) {
  stop()   // 停在可控的失败点,而不是烧光之后再停
}

取舍点 :熔断的价值不在「停」,而在「止损」。它要保证 Agent 停在一个可控的失败点 上------停的时候,token 还没烧光、文件还没改坏、任务还能干净地交回给人。一个不会熔断的 Agent,出错时不是「失败」,而是「失控」。

五、原点:错误处理是一条「升级阶梯」,每级先判断「错在哪」

把四级收拢成一张表:

级 针对的失败 动作 代价
报错 ------ 分类:暂时/永久、环境/方案 几乎零成本,必须做
重试 暂时性(限流 / 过载 / 网络) 同一动作,退避后再来 再烧一轮 token
换思路 系统性(方案 / 工具 / 参数错了) 换方向,喂回给模型重新想 再烧更多 token
熔断 都试过了还失败 摘掉坏资源 / 停任务交回人 放弃这个任务

错误处理的本质,就是用越来越大的代价,去应对越来越「治不好」的失败。越往上,代价越贵、适用面越窄------所以正确的顺序,永远是从便宜的试到贵的,而不是一上来就重试几十次或直接熔断。

而这条链能不能走对,取决于一个贯穿全程的判断------「错在哪」。分对了:重试治「快」、换思路治「穷」(方案穷尽)、熔断止「损」。分错了:要么对着永久性错误死命重试,要么对着「换个思路就能过」的错误直接熔断。

结语

回到开头那句:Agent 的错误处理,不是一句 try-catch。

它是一条四级阶梯------报错(分类)、重试(治暂时的)、换思路(治方案的)、熔断(止损的)。每一级针对一种不同的失败,每一级都有它的代价和适用面,所以要按「便宜 → 贵」的顺序走。

而这套阶梯能成立的前提,是把错误读清楚:暂时还是永久、环境还是方案。分不清这些,重试和熔断就都是瞎忙。

所以下次别再问「出错了我该重试几次」,先问一句------这次,错在哪了?


参考:

相关推荐
小白马突突突1 小时前
零信脱敏正式提出“不过度脱敏”产品原则
人工智能·文件脱敏·文档脱敏·零信脱敏·pdf脱敏工具
Code_Solitude1 小时前
高数第一章函数笔记(原稿手写+AI识别优化)
人工智能·笔记
龙亘川1 小时前
面向绿色低碳城市:一网统管打通交通与能源治理的关键路径
大数据·人工智能·智慧城市·能源·开源软件
蓝悦无人机1 小时前
无人机系列之飞控算法:从PID到AI,飞行控制的核心进化
人工智能·算法·无人机·飞控系统
李溪白1 小时前
篇八:幻觉控制与可信回答——别让你的 AI 一本正经地胡说八道
agent
憨波个1 小时前
【说话人日志】DiariZen
人工智能·深度学习·算法·语音识别
付威20231 小时前
我用 100 行核心代码,做了一个能接入飞书的 Hermes 式智能体
人工智能·后端
Topskys1 小时前
AI Agent 沙箱
agent
IamZJT_1 小时前
拆开 DeepSeek Harness 10|创造模式在“创造”什么?让 Agent 组装一种新工作方式
人工智能