Error Recovery — 错误不是结束,是重试的开始

"错误不是终点, 是重试的起点" — 升级 token、压缩上下文、切换模型。

Github 原文:shareAI-lab/learn-claude-code

问题

在之前的文章中,我们就提及了一个很重要的内容,就是 AI 参与的事情就有概率出错,就得准备好错误后该如何应对的机制。

特别是之前还只是一些偏旁模块报错,万一整个产品报错了怎么办?如果一个 agent 报错了、崩溃了,他没有重试,或者换模型,甚至连上下文都没减少压缩,直接报错了——那用户体验绝对是灾难级别的!

一般来说,API 错误是最常见的,主要包括三种:

  • 输出被截断:说到一半,token 用光了;

  • 上下文超限:压缩后还是长,还是爆炸了;

  • 临时故障:比如突然服务器过载了等等;

就像原文里说的那样:一个不处理错误的 Agent 就像一个一碰就熄火的车。

解决方案

Error Recovery — 错误不是结束,是重试的开始

解决方案其实和不是 AI 的时候一样,就是遇到故障的地方都想好对应的策略,然后要求 AI 按照策略执行后重跑 loop。

三种最常见的恢复模式,当然其实要比这里列出来的多得多,不过我们不是专业的工程师,只需要了解大概怎么回事即可:

模式触发恢复动作
输出截断max_tokens升级 8K→64K / 续写提示
上下文超限prompt_too_longreactive compact → 重试
临时故障429 / 529指数退避 + 抖动,连续 529 可切换备用模型

工作原理

输出被截断

我们应该都知道,模型对话生成是有一个最大的token 限额的,代表着一次对话的消耗的最大值,但假如这个任务太复杂了,已经达到了限额,那么输出就会被截断。

⚠️ 请区分 2 种输出被截断,这里不是用户没费了,而是达到了设定的最大单次对话 token 消耗上限,如果是没费了,一般就是停止继续生成并告知用户没费了,就比如 CC 的做法

一般情况下,会采取几步走策略:

  • 第一次发生时,采用 8 倍空间扩充,就是说让最大 token 上限扩大为原来的 8 倍,然后重试同一请求,如果这种情况下还是不够,那么就要保存截断输出的内容然后开始续写

  • 续写也不是无限续写的,因为之前我们说过模型是有上下文限制的,续写太多几乎就没有注意力了,一般不会超过 3 次

  • 如果即使这样都无解了,那么直接放弃,退出 loop,告知用户 G 了。

上下文超限

之前有说过,就是有可能出现 L4 运行失败,轮询 3 次还是失败就结束,又或者 L4 都走完了,还是超。这就必须要触发“保底”了,就是应急压缩机制。

这套方案之前介绍过,就不再过多赘述了。

临时故障

这就非常多了,很难穷举。不过一般都有什么防止网络波动的抖动策略,还有切换备用模型和降级策略等等,这里也不在过多赘述了。