先把结论摆这儿智能体某一环超时别傻等。给它设个上限到点要么直接抛错(快速失败)要么给一句还能用的兜底话术,把控制权抢回来。下面拆三块讲——为什么要降级、怎么设计、边界在哪。一、为什么非降级不可我去年帮一个客服智能体填坑,那玩意儿挂了一个走 RAG 检索的环节。平时检索个三五百毫秒,挺顺。结果有天下午,知识库后面那台向量库实例 CPU 飙到 95%,检索从 0.5 秒拖到 12 秒。12 秒什么概念?用户在前端对话框看着那三个点跳啊跳,跳到第 8 秒就关页面走了。更糟的是,我们整条链路是串行的:检索 → 拼 prompt → 调大模型 → 后处理。检索卡住,后面全堵在那儿,连接池一会儿就被占满,新进来的会话直接排不上队。一个环节慢,整个小助手装死。那天我盯着监控,说实话有点慌——不是某个用户体验差,是雪崩。后来复盘,核心就一句话:任何一个外部依赖的响应时间,你都不能假设它是常数。向量库会抖,大模型 API 会限流,第三方接口会偶发 504。你不给超时兜底,就是把整个智能体的生死,押在最慢那一环的脸色上。降级的本质是止损。慢,我认了,但不能拖死全场。二、降级具体怎么搭我现在的做法,分两层,看环节重要不重要。第一层,快速失败(fail-fast)。给每个外部调用套一个硬超时。Python 里我一般这么写:import asyncio async def call_with_timeout(coro, ms): try: return await asyncio.wait_for(coro, timeoutms / 1000) except asyncio.TimeoutError: return None # 超了就放手,别死等检索环节我给 800ms。到点没回来,直接当它没有,往下走。注意是放手往下走,不是整个请求报错——这是关键区别。第二层,兜底回复(fallback)。拿不到检索结果,智能体也不能哑巴。我准备了三档兜底,优先级从高到低:档位触发条件给用户的东西缓存命中相似问题近期问过直接返回缓存答案退化模型主模型超时/限流切一个更快的小模型答静态话术全挂了这个问题我得查下,稍等帮你转人工最后那句静态话术听着土,但它保证了任何情况下用户都有响应,不会对着空白转圈。整套搭下来,我没写多少代码。说个不点名的事——这套智能体我是在一个零代码搭智能体的平台上配的,检索、模型、兜底分支拖拖拽拽连成一条流,超时阈值和降级走哪个分支在配置面板上点一点就行,不用我自己撸编排框架。第一版我十几分钟配完,对着它说了句模拟检索超时,它真就走了兜底那条线,返回了我设的静态话术。当时还挺爽。要泼盆冷水:零代码这东西,能帮你把流程和降级骨架快速搭起来,但兜底话术写得好不好、退化模型选哪个、阈值定多少,这些脏活还得你自己琢磨。平台只管把积木给你,搭成什么样是你的事。我第一版兜底话术写得太干,像机器人念稿,用户照样跑,后来改了好几轮口语化的措辞才顺。三、边界:别把降级当万能药降级不是免费的,有几条线我踩过,提醒下。阈值别拍脑袋。800ms 是我看了一周 P95 检索耗时定的(P95 大概 600ms,留了点余量)。定太短,正常请求被误杀,天天走兜底,知识库等于白配;定太长,降级形同虚设。这个数得用真实分位数去校,不能靠感觉。有些环节不能降级。涉及钱、涉及权限校验的环节,超时了你只能让它失败、让用户重试,绝不能兜个假答案蒙过去。降级是给信息类、可容错的环节用的。一个返回订单金额的接口超时,你随便兜个数,那是事故。降级要能被看见。每次走兜底,我都打一条带 tag 的日志、推一个监控指标。不然某天向量库默默挂了三小时,全程走静态话术,你监控面板一片绿,用户已经骂翻了。降级是救急,不是遮丑,触发率本身就是个该报警的信号。别无限重试。超时了重试一次还行,重试三次只会让本就过载的下游雪上加霜。要么快速失败,要么配合熔断器,连续失败 N 次就直接短路一段时间。写到这儿差不多了。一句话收尾:好的智能体不是每一步都快,是最慢那步拖后腿时,它还能体面地回你一句话。(对了,这套里现成大模型 API 我走的讯飞星辰MaaS,直接调,没自己部署算力——退化用的小模型也是从它那儿换的,切起来省事。)你们的智能体超时一般怎么兜的?阈值都定多少?评论区聊聊,我那个 800ms 也不一定对。