设想一个周六早上,你开着一辆崭新的SUV载着全家去郊外露营。开上高速不到半小时,仪表盘突然报警:右前轮胎压过低。你靠边停车检查,发现轮胎侧面被钉子扎了。好在买车时随车工具里备了全尺寸备胎,你花二十分钟换上,虽然车速不能太快,但一家人还是按时到达了营地。这就是“备胎计划”:主轮胎出问题时,备胎顶上,让旅途不中断。 LLM服务也一样。你的应用依赖一个强大的主模型(比如GPT-4),它偶尔会超时、报错,甚至彻底不可用。如果没有任何准备,用户就会面对“服务暂时不可用”的白屏。降级策略就是为LLM服务准备的备胎——提前想好主模型出问题时用什么顶上、怎么顶、顶多久、怎么通知人。这篇文章从一个开车的比喻开始,把降级策略的触发条件、备选模型、提示词适配、兜底措施、日志告警讲透,让你能为自己的LLM系统备好一条“备用胎”。

岗位关联

学会降级策略,意味着你负责的LLM应用即使在主模型故障时也能保持基本可用,这是生产级LLM应用工程师的必备能力,直接关系到系统SLA与用户体验。

目录
  1. 可视化演示
  2. 降级触发条件
  3. 备选模型选择
  4. 提示词适配
  5. 效果兜底保障
  6. 降级日志记录
  7. 告警通知机制
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示多级降级链与熔断机制、降级触发条件与备选模型选择、降级恢复与平滑回切,切换模式掌握AI服务可靠性核心原理。

本节配有交互动效(进入视口后自动加载,约 3KB)。

多级降级链与熔断机制设计 降级链按优先级排列备选方案:GPT-4→GPT-3.5→规则引擎→缓存→默认值,每级触发条件递进 熔断器三态(Closed/Open/Half-Open)保护后端服务,错误率超阈值自动熔断切换降级 L0:GPT4 → L1:GPT3.5 → L2:Rules → L3:Cache → L4:Default 多级降级链确保服务在异常下仍提供基本可用性

降级触发条件

开车时什么时候需要换备胎?不一定等轮胎完全爆掉——胎压监测报警、方向盘抖动、轮胎发出异响,这些都是“提前信号”。真正的老司机不会拿生命赌一个“再开几公里”,而是果断靠边检查。LLM服务的降级触发也类似:不是等到主模型彻底宕机才降级,而是通过一系列监控指标发现苗头,提前切换。

这些监控指标就是LLM服务的“胎压报警器”。最常见的触发条件有四类:第一是超时检测,主模型迟迟不返回结果;第二是错误率阈值,失败请求占比超过设定值;第三是成本超限,调用的费用超出预算;第四是健康检查,主动探测主模型是否还“活着”。

它们的实现方式各不相同。超时检测要设定合理的等待时间(如3秒),超过即记为一次失败。错误率阈值则要在滑动时间窗口内统计失败请求数占总请求数的比例。成本超限通常由前端统计消耗的token数与单价乘积,达到预算额度就告警。健康检查则是周期性地发送一个小而全的探测请求,验证主模型连通性。

有了这些“报警器”,系统就能像老司机一样,在轮胎还没完全爆掉时就把备胎换上。触发条件不是靠运气,而是靠可量化的指标。把超时、错误率、成本、健康检查四项都配置好,降级策略才有一个可信的“发令枪”。

error_rate=NfailedNtotal,降级条件  ⟺  error_rate≥θ\displaystyle \text{error\_rate} = \frac{N_{\text{failed}}}{N_{\text{total}}},\quad \text{降级条件} \iff \text{error\_rate} \ge \theta
错误率 = 失败请求数 ÷ 总请求数。当错误率超过设定的阈值θ时,系统自动触发降级,把请求切换到备胎模型。
  1. 统计失败数在一个时间窗口内,统计所有返回超时、错误码或异常的请求数量
    NfailedN_{\text{failed}}
  2. 统计总请求数统计同一时间窗口内进入系统的全部请求,包括成功和失败的
    NtotalN_{\text{total}}
  3. 计算错误率用失败数除以总请求数,得到当前请求失败的比例
    error_rate=NfailedNtotal\displaystyle \text{error\_rate} = \frac{N_{\text{failed}}}{N_{\text{total}}}
  4. 与阈值比较错误率超过设定的阈值θ时,触发降级动作
    error_rate≥θ\displaystyle \text{error\_rate} \ge \theta

备选模型选择

备胎不是随随便便找个轮胎就行。全尺寸备胎能跑高速,非全尺寸备胎只能开80码,补胎液连城市快速路都跑不了。聪明的司机会根据出行路况选择带哪种备胎:常跑长途就带全尺寸,只在市区就带补胎液。LLM服务的备选模型也一样,要按任务场景搭好“备胎梯队”。

备胎梯队是从强到弱排列的一组模型:第一梯队可能是性能接近主模型的替代模型(如Claude Haiku),第二梯队是更便宜更快的小模型(如GPT-3.5-turbo),第三梯队是本地部署的小模型(如Qwen-7B),最后还有一个兜底:模板回答。根据任务的重要性和降级原因,选择不同的梯队。

选择备胎模型时,核心考虑三点:能力匹配(能否完成这一类的任务)、成本(单次调用费用)、延迟(响应时间)。不仅要看模型本身,还要看部署方式——本地模型保障数据安全,云端小模型保障弹性。模型路由组件则根据任务类型、当前降级原因和剩余成本预算,动态选择当前最合适的备胎。

有了成本公式,你就知道每个备胎的“油钱”是多少。备胎梯队不是拍脑袋排的,而是按能力、成本、延迟三个维度综合排序。这样当主模型故障或预算超标时,模型路由能立刻选出最经济、最合适的“应急胎”。

Cost=Tinput×Pinput+Toutput×Poutput1000\displaystyle \text{Cost} = \frac{T_{\text{input}} \times P_{\text{input}} + T_{\text{output}} \times P_{\text{output}}}{1000}
每次调用的成本 =(输入的token数 × 输入单价 + 输出的token数 × 输出单价)÷ 1000。用来比较主模型与备胎模型的开销。
  1. 统计输入token数把提示词和上下文切分为token,得到输入的token总量
    TinputT_{\text{input}}
  2. 统计输出token数模型生成的回答会被拆分为多少token,即为输出token量
    ToutputT_{\text{output}}
  3. 分别乘以单价并求和输入量乘输入单价,输出量乘输出单价,二者相加得到总成本
    Tinput×Pinput+Toutput×Poutput\displaystyle T_{\text{input}} \times P_{\text{input}} + T_{\text{output}} \times P_{\text{output}}
  4. 按千token归一化绝大多数LLM的计价单位是“每1000 token”,所以除以1000得到单次调用价格
    ⋯1000\displaystyle \frac{\cdots}{1000}

提示词适配

换上非全尺寸备胎后,驾驶方式立刻要变:师傅说“请勿超过80km/h”、别急转弯、别跑太远。备胎模型的“驾驶方式”就是提示词——同样的指令,强模型能听懂,弱模型可能就“懵”。所以降级时不光要换模型,还要“减速”改造提示词。

提示词适配有四个常规动作:指令简化、上下文裁剪、格式归一、任务降级。指令简化是把复杂的多步指令拆成几步简单的子任务;上下文裁剪是把长长的对话历史和参考文档缩短;格式归一是指定一个简单的输出格式(比如纯文本或短JSON);任务降级则是对任务的完成标准进行降格——比如把“生成营销文案”降为“从模板中选择合适的文案”。

这四件事的目标只有一个:让备胎模型在其能力范围内把事情做对。指令简化可以显著降低模型的理解难度,上下文裁剪直接减少输入token数进而降低成本,格式归一避免模型生成难以解析的内容,任务降级则是在“能不能完成”和“完成得多好”之间做权衡。在实际工程中,这四招往往组合使用。

降级换胎之后,不要拿原来的驾驶习惯去开。提示词适配就像“减速慢行”的交通标志,它提醒系统:备胎模型能力有限,指令要更短、上下文要更精简、格式要更简单。适配做得好,降级后的回答质量才不会断崖式下跌。

Treduced=α×Toriginal,α∈(0,1)\displaystyle T_{\text{reduced}} = \alpha \times T_{\text{original}}, \quad \alpha \in (0, 1)
上下文裁剪后的token数 = 裁剪系数 × 原始token数。α越小,裁剪得越狠,备胎模型处理起来越轻松。
  1. 测量原始token数计算原始提示词(含上下文)的总token数,作为裁剪的基准
    ToriginalT_{\text{original}}
  2. 确定裁剪系数根据任务复杂度和备胎模型能力,确定一个0到1之间的裁剪系数
    α\alpha
  3. 计算裁剪结果用裁剪系数乘以原始token数,得到压缩后的token量
    Treduced=α×Toriginal\displaystyle T_{\text{reduced}} = \alpha \times T_{\text{original}}

效果兜底保障

备胎终究是应急用品,可行驶里程通常不超过100公里,速度也不能快。如果备胎也撑不住呢?出发前,有经验的老司机还会带上工具包、充气泵、救援电话,甚至有队友同行。LLM降级也一样,要预先想好“最坏情况下的最坏情况”,准备好效果兜底。

效果兜底是降级策略的最后一道防线。第一层是缓存兜底:把高频问题的优质回答缓存下来,降级时直接命中缓存;第二层是模板应答:对于无法回答的问题,输出固定的、友好的话术;第三层是人工转接:把复杂问题无缝转交给人工客服;第四层是流式降级:如果备选模型能力足够,就逐步降低服务能力而不是彻底停摆。

这些兜底方案让服务在极端情况下依然“可用”。可用性的定义就是服务正常响应的时间占总时间的比例。降级的目标不是让效果和原来一样好,而是让可用性不归零:用户得不到完美答案时,至少能得到一个及时的、有温度的响应,或者被引导到人工渠道解决。

备胎撑不住的时候,工具包和救援电话就是你的第二条命。缓存、模板、人工、流式降级,这四样东西会在最极端的情况下兜住服务的底线。记住:降级的最终目标不是“效果不打折”,而是“服务不断线”。

A=TupTup+Tdown×100%\displaystyle A = \frac{T_{\text{up}}}{T_{\text{up}} + T_{\text{down}}} \times 100\%
系统可用性 = 正常运行时间 ÷(正常运行时间 + 故障时间)× 100%。兜底方案就是为了让T_down尽可能小,保住可用性。
  1. 统计正常运行时间服务能正常响应用户请求的总时长
    TupT_{\text{up}}
  2. 统计故障时间服务完全不可用或不可接受地慢的总时长
    TdownT_{\text{down}}
  3. 计算可用性比例正常运行时间占全部时间的比值
    TupTup+Tdown\displaystyle \frac{T_{\text{up}}}{T_{\text{up}} + T_{\text{down}}}
  4. 转为百分比乘上100%,得到常见的SLA可用性百分比
    A=TupTup+Tdown×100%\displaystyle A = \frac{T_{\text{up}}}{T_{\text{up}} + T_{\text{down}}} \times 100\%

降级日志记录

还记得上次爆胎是什么时候?换的是哪个备胎?胎压后面恢复了吗?如果这些都没记录,到了维修站,维修师傅只能从头排查。行车记录仪和维修日志,能在关键时刻省下大量时间。LLM服务的降级也一样,每一次降级都要留下清晰的“黑匣子”日志。

降级日志要回答四个问题:什么请求(ID)、用的什么模型、是否降级、耗时和成本多少。为此,日志要以结构化格式(如JSON)记录,字段包括request_id、model、degraded、latency、cost、timestamp等。其中degraded布尔字段标记本次请求是否走了降级链路,是后续统计的关键。

单条日志能看一次请求,还要把日志串起来才能看清全貌。链路追踪把一次用户请求经过的所有环节(网关、模型路由、缓存、备胎模型)串成一条流水线,哪一环拖慢了一目了然。性能分析则用日志数据统计降级比例、平均延迟变化、成本节省情况,为优化降级策略提供依据。

日志就是LLM服务的“行车记录仪”。有了结构化日志、降级标记和链路追踪,运维人员才能在故障发生后快速回答“发生了什么、为什么发生、下次怎么预防”。没有日志的降级,就是一场看不见过程的救援。

logdeg={request_id, model, degraded, latency, cost, timestamp}\displaystyle \text{log}_{\text{deg}} = \{ \text{request\_id},\ \text{model},\ \text{degraded},\ \text{latency},\ \text{cost},\ \text{timestamp} \}
一条降级日志的结构化字段集合。每条日志都包含请求ID、实际使用的模型、是否降级、延迟、成本和时间戳,方便检索与统计。
  1. 记录唯一标识request_id是这次请求的全局唯一编号,方便串联排查
    request_id\text{request\_id}
  2. 记录实际模型model字段记录这次请求真正调用的是哪个模型(主模型还是备胎)
    model\text{model}
  3. 标记降级状态degraded字段用布尔值标记请求是否走了降级链路
    degraded\text{degraded}
  4. 记录延迟与成本latency和cost分别记录响应耗时和消耗费用,是性能分析的核心数据
    latency, cost\text{latency},\ \text{cost}

告警通知机制

爆胎后换好备胎,难道就默默开走?不,第一件事是打开双闪、放好警示牌,打电话告诉家人“我这边爆胎了,会晚点到”,同时联系维修站准备新轮胎。LLM服务降级后也不能“默默进行”——必须通知到该知道的人。

告警通知机制要解决三个问题:通知谁、怎么通知、什么时候升级。通知谁由分级决定:P1表示主模型完全不可用,需要值班人员立刻介入;P2表示部分请求降级,影响面较大;P3表示少量请求超时降级,可观察处理。怎么通知由多渠道完成:紧急走电话或短信,重要走钉钉/企业微信,一般走邮件汇总。

告警的触发时机也很讲究,不能等降级持续半小时才通知。通常会在降级发生时实时告警,并在降级持续超过设定时间(如15分钟)时升级告警级别。同时,告警系统要支持“自动复位”:主模型恢复健康后,系统自动把流量切回主模型,并通知相关人员“故障已恢复”,让巡检闭环。

换好备胎之后的那通电话,决定了家人是干等还是提前准备。告警通知机制就是LLM服务的“那通电话”:分级、多渠道、值班响应、自动复位,一套完整的通知闭环,确保故障有人知道、有人处理、有人确认恢复。降级不是终点,而是运维流程的一个起点。

Severity=⌊λ×Impact+μ×Urgency⌋\displaystyle \text{Severity} = \lfloor \lambda \times \text{Impact} + \mu \times \text{Urgency} \rfloor
告警严重度 = 影响范围 × 权重λ + 紧急程度 × 权重μ,再向下取整。用来把连续的状态映射到P1/P2/P3离散等级。
  1. 估算影响范围Impact取0到1之间,表示受影响的用户或请求的占比
    Impact\text{Impact}
  2. 估算紧急程度Urgency取0到1之间,表示故障持续时长和恶化速度的紧迫性
    Urgency\text{Urgency}
  3. 加权求和影响和紧急程度分别乘以权重λ和μ,合并成一个综合分数
    λ×Impact+μ×Urgency\displaystyle \lambda \times \text{Impact} + \mu \times \text{Urgency}
  4. 向下取整映射等级用向下取整把综合分数映射为P1/P2/P3等离散级别
    ⌊⋯ ⌋\displaystyle \lfloor \cdots \rfloor

AI 应用场景

电商大促智能客服降级

阶段:模型调用层 / 服务编排

解决的问题:大促期间主模型QPS打满,大量请求超时。若客服机器人全部超时,用户满意度会断崖式下跌,传统做法是“无限扩容”或“排队等待”,成本高昂且体验差。

具体案例:某电商平台大促期间,主模型峰值响应时间从500ms飙升至6s,触发了错误率阈值。系统自动降级:简单咨询(退换货流程、物流查询)直接走缓存+模板话术,复杂问题转人工客服。晚高峰过后主模型恢复,流量自动切回,当天客服满意度反而提升了8%。

批量内容审核成本超限降级

阶段:批处理任务调度 / 成本管理

解决的问题:批量内容审核调用主模型成本过高,月度预算被迅速耗尽。传统做法是压缩审核量或降低审核频次,容易漏掉违规内容。

具体案例:某内容平台每天凌晨批量审核10万条新发布帖子,主模型审核成本每天约5000元,成本预算上限设为3000元。到达预算线后,系统自动切到备胎小模型做粗筛,只把疑似违规的内容交给主模型细审。审核覆盖率达到100%,月成本节省近40%。

银行私有化知识问答降级

阶段:数据安全与合规

解决的问题:银行内部知识问答系统使用云端主模型,但合规要求敏感数据不能出内网。主模型不可用时,整个系统完全瘫痪,业务和数据安全难以两全。

具体案例:某银行在本地部署Qwen-7B作为备胎模型。云端主模型异常时,流量自动切入本地模型,回答质量略降但数据始终不出内网。本地模型也异常时,降级为“检索 + 模板应答”。整个降级过程对柜员透明,业务无感。

Python 演示

python70 行
import jsonimport randomimport time  class LLMFallbackClient:    """LLM 降级客户端:主模型故障时自动切换到备选模型"""     def __init__(self, primary="gpt-4", fallbacks=None):        self.primary = primary        self.fallbacks = fallbacks or ["gpt-3.5-turbo", "local-mini"]        self.current = primary        self.fail_count = 0        self.switch_count = 0        self.threshold = 3        self.logs = []     def request(self, prompt):        try:            result = self._invoke(self.current, prompt)            self.fail_count = 0            return result        except Exception:            self.fail_count += 1            if self.fail_count >= self.threshold:                self._fallback()                self._record(prompt, degraded=True)            raise     def _invoke(self, model, prompt):        if random.random() < 0.3:            raise TimeoutError("simulated timeout")        return "[{}] {}".format(model, prompt[:12])     def _fallback(self):        if self.current in self.fallbacks:            idx = self.fallbacks.index(self.current)            if idx < len(self.fallbacks) - 1:                self.current = self.fallbacks[idx + 1]        elif self.current == self.primary:            self.current = self.fallbacks[0]        self.switch_count += 1        self.fail_count = 0     def _record(self, prompt, degraded):        self.logs.append({            "time": time.time(),            "prompt": prompt,            "model": self.current,            "degraded": degraded        })     def status(self):        return {            "current": self.current,            "primary": self.primary,            "switch_count": self.switch_count,            "threshold": self.threshold        }  if __name__ == "__main__":    client = LLMFallbackClient()    for i in range(20):        try:            resp = client.request("问题{}".format(i))            print("OK:", resp)        except Exception:            print("FAIL: 当前模型 =", client.current)    print("状态:", json.dumps(client.status(), ensure_ascii=False))
目的:演示一个带降级逻辑的LLM客户端——当主模型连续失败超过阈值时,自动切换到备选模型,并记录降级日志。
  1. self.current = primary初始时使用主模型发出请求,一切正常时无需降级。
  2. self.threshold = 3连续失败三次就触发降级,相当于是“三次确认”避免误判。
  3. result = self._invoke(self.current, prompt)真正调用模型的地方,放在try块里以便捕获异常。
  4. self.fail_count += 1每次失败就让计数器加一,这是错误率阈值的简化版实现。
  5. if self.fail_count >= self.threshold:连续失败次数达到阈值,触发降级逻辑。
  6. self._fallback()把当前模型切换到备胎梯队中的下一个模型。
  7. self.current = self.fallbacks[idx + 1]在当前备胎列表中向后移动一格,用更强的备胎优先。
  8. self.switch_count += 1记录降级切换的次数,用于后续性能分析。
  9. self._record(prompt, degraded=True)写入结构化日志,标记这次请求走了降级链路。
  10. raise重新抛出异常,让上层调用方知道本次请求确实失败了。

常见误区

误区好多开发同学觉得,降级策略是给“主模型彻底无法访问”这种情况准备的。只要主模型的接口还能返回结果,就完全不需要降级。

正解实际上,主模型“能用”和“好用”是两回事。当响应时间从300ms飙升到8秒、错误率从0.1%涨到10%,或者调用费用超额时,用户体感已经完全不可接受了。这时候果断降级到更快的备胎,反而是保住用户体验的正确选择。就像轮胎虽然没爆,但胎压严重不足时也要换备胎。

为何常见:人天然关注“可用/不可用”这种二元状态,容易忽略性能劣化这种渐变的过程。而生产系统中的故障往往是一个渐进恶化过程,等到完全挂掉才动作就晚了。

误区既然主模型不行了,那就把请求直接转发给一个更小、更便宜的模型,完事了。

正解如果直接把给GPT-4的提示词交给一个小模型,效果往往会断崖式下降:输出格式混乱、指令理解错误、上下文超长截断。换备胎之后要“限速行驶”——相应地简化指令、裁短上下文、降低输出要求。不做提示词适配的降级,等于不调座椅就开车,能走但一定不舒服。

为何常见:很多人把降级理解成“路由切换”,以为核心就是改一个URL。但在LLM应用中,模型能力差异会直接体现在提示词上,忽略适配就是拿备胎当全尺寸胎跑高速。

误区我把降级逻辑写进代码里了,自动切换、自动恢复都有了,之后就不用管了。

正解降级策略是“活”的系统,需要持续观察和调优。备胎模型的效果是否达标?触发阈值是否太灵敏导致频繁切换?日志记录是否完整?告警是否真的有人响应?这些都是需要周期性复盘的。好比备胎不是装上就一直不检查,跑一段路要停下来看看胎压和温度。

为何常见:把自动化误以为是一劳永逸,忽略了任何自动化系统都需要监控和维护。

误区为了保险,把市面上所有便宜的模型都配置成备胎,反正可以用路由自动选。

正解备胎太多的问题在于:每个模型的能力差异会放大提示词适配的复杂度,你要为每个模型维护不同的提示词版本;同时多模型意味着多处API Key、多份账单、多种延迟特征,运维复杂度直线上升。合理做法是定义2-3个梯队,每个梯队覆盖特定任务类型,够用就好。

为何常见:出于“多一手准备”的直觉,而不是从系统工程复杂度出发思考。事实上每一个额外组件都在增加故障点。

面试题

Q1. 降级策略的核心目标是什么?

单选题 · easy

  • A.让主模型永不宕机
  • B.故障时服务不断线← 正确答案
  • C.用便宜模型省钱
  • D.替代全部人工客服

答案:B。降级策略的首要目标是“服务可用性”——主模型出问题时,用备胎模型、缓存或模板顶上,让用户的服务不中断。省钱只是附带收益,不是核心目标;主模型永不宕机不现实;替代人工客服也不是降级策略的职责。

Q2. 以下哪项通常不作为降级触发条件?

单选题 · mid

  • A.响应超时率飙升
  • B.错误率超过阈值
  • C.用户投诉量剧增← 正确答案
  • D.调用成本超预算

答案:C。降级触发条件应该是系统内的可量化指标:超时率、错误率、成本。用户投诉量是“结果”而非“触发条件”,等用户投诉再降级就太晚了,就像等轮胎完全爆掉才靠边停车一样。

Q3. 选择第一梯队备胎模型时,最关键的标准是什么?

单选题 · mid

  • A.价格最便宜的小模型
  • B.能力接近主模型← 正确答案
  • C.响应速度最快
  • D.开源免费的模型

答案:B。第一梯队备胎是在主模型故障时的首选替代,能力必须接近主模型,才能尽量不降质量。价格、速度、开源是次要考量——如果能力差距太大,可能连任务的基本完成都做不到,算不上合格的“全尺寸备胎”。

Q4. 对备胎模型使用提示词时,首选的操作是什么?

单选题 · easy

  • A.把指令拆分得更简单← 正确答案
  • B.增加更多的示例
  • C.使用更长的提示词
  • D.保持原有提示词不变

答案:A。备胎模型能力较弱,复杂指令理解不了。首选操作是把指令拆分得更简单,降低理解难度。增加示例、加长提示词、保持原样都会增加模型负担,效果反而更差,就像给非全尺寸备胎加速跑高速。

Q5. 降级触发条件通常包括哪些?

多选题 · mid

  • A.响应超时← 正确答案
  • B.错误率超限← 正确答案
  • C.成本超额← 正确答案
  • D.用户好评

答案:ABC。响应超时、错误率超限、成本超额都是常见的量化触发条件,它们能客观反映主模型的健康状况。用户好评是主观的业务反馈,既不实时也不可量化,不能作为自动降级的触发条件。

Q6. 降级后恢复主模型的合理做法是什么?

单选题 · hard

  • A.恢复稳定后再切回主模型← 正确答案
  • B.继续保持备胎直到业务结束
  • C.立刻卸载备胎的全部连接
  • D.永不考虑恢复主模型

答案:A。正确做法是先观察主模型是否在连续一段时间内恢复稳定,确认后再切回。立刻切回有再次故障的风险;一直用备胎浪费成本;永不恢复更是荒谬。就像备胎换好后,也要到维修站确认新胎装好才把备胎换下来。

Q7. 效果兜底保障的常用措施包括?

多选题 · hard

  • A.高频问答走缓存← 正确答案
  • B.固定话术来兜底← 正确答案
  • C.人工客服来接管← 正确答案
  • D.无限重试主模型

答案:ABC。缓存放高频问题、模板话术兜底、人工接管的组合,能层层保障降级后服务依然可用。无限重试主模型是错误做法——主模型已经故障,重试只会加重负担并让用户等待更久,相当于在爆胎后还猛踩油门。

Q8. 降级日志中的degraded字段表示什么?

单选题 · easy

  • A.耗时是否异常
  • B.是否走了降级← 正确答案
  • C.模型是否热门
  • D.成本是否超标

答案:B。degraded是布尔字段,标记这条请求是否走了降级链路。这个字段是统计降级比例、分析降级影响的核心,而不是记录耗时、热度或成本。有了它,运维才能快速回答“今天有多少请求被降级了”。

Q9. 成本超限触发的降级,首选响应动作是什么?

单选题 · hard

  • A.切换到低成本模型← 正确答案
  • B.直接关闭全部服务
  • C.无限降低生成质量
  • D.暂停所有登录用户

答案:A。成本超限说明主模型太贵,第一步是切换到低成本备胎模型来控制成本,同时保持服务运行。关闭服务、暂停用户都是极端手段,无限降低生成质量也是不可控的。正确做法是“换条更省油的路”,而不是“把车停下”。

Q10. 降级日志的作用包括哪些?

多选题 · mid

  • A.帮助复盘降级原因← 正确答案
  • B.支撑链路追踪分析← 正确答案
  • C.记录成本与延迟数据← 正确答案
  • D.自动生成用户头像

答案:ABC。降级日志记录请求ID、模型、degraded、延迟、成本等字段,既能复盘每次降级的原因,也能支撑链路追踪和性能分析。自动生成用户头像与降级日志毫无关系,属于干扰项。