智能体多步任务失败怎么优雅降级
先把结论摆这儿:智能体跑多步任务,千万别让某一步抛个异常就把整条链路带崩。正确姿势是给每一步都想好"它挂了我退到哪",该兜底兜底,该跳过跳过,该换路换路。下面是我自己踩出来的几种失败场景 + 对应的降级打法,直接照着抄。
背景交代一句。前阵子我做了个帮运营同学批量处理客诉工单的小助手——读工单、查知识库、生成回复草稿、再打个标签分类,四步串一条链。第一版上线第二天就被一条脏数据搞崩了:某个工单正文里夹了段乱码,知识库检索那步直接报错,然后整个任务挂死,后面三十多条全没跑。运营在群里@我的时候我正在吃午饭,血压瞬间上来。
后来重写了降级逻辑,稳了。分享几个我真正用上的。
1. 工具调用超时/报错 → 退到缓存或默认值
最常见的就是某个外部工具(检索、API、数据库)抽风。我现在的做法是:每个工具调用包一层 try,catch 到之后不抛,而是返回一个"降级结果"。
def call_kb(query):
try:
return kb_search(query, timeout=3)
except (TimeoutError, KBError):
# 检索挂了,退到上次缓存 + 标记 degraded
return {"hits": cache.get(query, []), "degraded": True}
关键是那个 degraded 标记要一路往后传,让下游知道"这步数据不全,你悠着点用"。别假装一切正常,后面生成的草稿质量会很迷。
2. 大模型这步输出格式崩了 → 重试一次 + 降级到规则
让模型返回 JSON,结果它给你包了段 ```json 还带一句"好的,以下是结果:",解析直接炸。我的策略是分两层:
-
第一层:解析失败先原样重试一次,顺手在 prompt 里加一句"只返回纯 JSON,不要任何解释"。八成能救回来。
-
第二层:重试还挂,退回最朴素的关键词规则给个粗分类。差是差点,但任务不会断。
|
失败情况 |
第一反应 |
兜底 |
|
JSON 解析失败 |
重试 1 次 |
关键词规则兜 |
|
模型空响应 |
换个 temperature 再来 |
标 "待人工" |
3. 链路中间某步彻底没救 → 跳过这步,标记 partial,别拖累后面
不是每一步都生死攸关。打标签那步挂了,草稿其实照样能交。所以我把每步标了 critical / optional:optional 步骤失败就跳过,整条任务标成 partial 继续往下走,最后汇总时告诉用户"这条只完成了 3/4 步"。比起整批崩掉,这种"残血完成"运营更买账。
4. 整批任务里单条挂了 → 隔离它,别连坐
这就是我午饭那次的教训。循环里每条任务独立 try,单条失败记进 failed 列表,继续跑下一条,最后统一返回成功 N 条、失败 M 条 + 失败原因。三十多条不会再因为一条乱码集体陪葬。
5. 整条链都不可用了 → 给最小可用兜底,留人工入口
极端情况——模型服务整个挂了。这时候别返回个 500 拉倒,退到一个最朴素的模板回复 + 一个"转人工"按钮。用户至少有东西可看,不是对着报错页面干瞪眼。
说点不完美的。这套降级逻辑写下来,代码量比主流程还多,可读性也拖了后腿,第一版我自己回头看都嫌啰嗦。而且降级多了有个隐患:任务"看起来成功了"但其实一堆 degraded,得配合日志埋点才看得出来,光看成功率会被骗。所以我专门加了个 degraded 计数,每天瞄一眼。
哦对,搭这个小助手本身我没写多少框架代码。流程编排是在一个零代码就能配智能体的平台上拖出来的——节点拖一拖、把知识库挂上去、降级分支用条件节点连一连,省了我大半天搭骨架的功夫,我主要精力都花在调上面那几个兜底策略上了。学习曲线倒也不是没有,刚上手那些节点连线绕了我一会儿,熟了就快。
(模型这块我直接走的讯飞星辰 MaaS,现成 API 调,没自己部署算力,省心。)
你们做多步智能体,都是怎么处理中间步骤失败的?有没有那种"以为兜住了结果兜漏了"的翻车现场,评论区聊聊,我想看看还有哪些坑我没踩过。
更多推荐




所有评论(0)