你的 AI 功能需要一个无需部署的紧急开关 (Kill Switch)
想象一下这个场景:凌晨 2:14,值班工程师的手机嗡嗡作响,你旗舰产品中的 AI 功能正自信地告诉企业客户,他们的账号是“西红柿汤”。模型供应商推送了一个路由变更,你的提示词被静默升级的分词器截断了,或者是检索索引针对一个损坏的 Parquet 文件重新生成了——原因现在还不重要。重要的是,距离有人截图输出并发布到 LinkedIn 只剩 10 分钟。
如果你唯一的对策是“回滚部署并等待 CI”,那你已经输了。标准的流水线回滚从报警到恢复需要 20 到 40 分钟,而糟糕的输出不会在绿色对勾渲染时礼貌地暂停。等到新容器恢复健康时,截图已经在信息流里传开了,支持信箱里塞满了 50 个工单,而你花了 6 个月建立的信任正被那些从未使用过该产品的人审查。
那些能在 5 分钟而不是 5 小时内控制此类事件的团队并不是靠运气。他们在需要之前就构建了一个紧急开关(Kill Switch)——这是一个允许值班工程师在几秒钟内禁用 AI 路径的原语,无需部署,无需合并,也无需任何人触碰生产环境的二进制文件。这篇文章将探讨这种专门针对 AI 功能的原语是什么样的,为什么确定性软件的版本不足以应对,以及在事故发生前的一天必须具备什么条件,才能让响应在事故发生的当晚奏效。
这种类型的故障,部署路径太慢了
十年经验的 Web 服务工程师通常会对“如何回滚错误的变更”有一个自信的答案:撤销提交、运行 CI、部署上一个制品、监控。这个答案适用于你的生产二进制文件是故障单元,且发布频率大约是每日一次的机制。它之所以有效,是因为部署是可预测的,错误的代码就是新的代码,且回滚目标是昨天在生产环境中运行的已知良好版本。
AI 功能同时在三个方面打破了这些假设。
首先,故障通常不在 你的 代码中。你的容器运行良好。但模型供应商在稳定的模型名称下轮换了权重,上游向量化服务开始返回 0.0 向量,或者安全分类器变得更加激进,现在正拒绝 30% 的合法请求。由于回归是搭载在他人的发布列车上而来的,因此没有可以撤销的提交。
其次,故障表现在 输出质量 上,而不是可用性上。端点返回 200,延迟正常,JSON 解析顺利。根据你现有告警关注的每一项指标,系统都是健康的。出问题的是输出的 含义,而你的流量仪表盘无法感知含义。
第三,回滚目标是模糊的。即使你重新部署了之前的容器,其背后的模型可能已经改变了。“昨天的二进制文件”不再等同于“昨天的行为”,因为行为始终是代码、提示词、模型、检索索引以及半打拥有各自时钟的上游服务的集合体。你可以发布上周的制品,但仍然会遇到这周的事故。
这些因素都使得“部署即回滚”路径比确定性服务更慢、更不可靠且更不精准。紧急开关的存在就是为了完全绕过这条路径。
开关实际需要做什么
AI 功能的紧急开关不是一个简单的布尔值。它是一组预先部署的行为,每个行为都由一个 Flag 控制,值班工程师可以在几秒钟内进行组合。最小可行方案包含四个成员。
第一个是 关闭并回退(off-with-fallback)。当 AI 路径被关闭时,功能不会返回错误或加载动画。它会返回一个确定性的响应——来自 AI 之前的关键词匹配的搜索结果,基于规则的草稿(而不是 LLM 编写的),或者是静态的常见问题解答(而不是对话式回答)。用户会察觉到功能变笨了,而不是功能消失了。核心点在于“关闭”不能意味着“损坏”——如果你唯一的回退方案是 500 错误,那么你的紧急开关只是另一种形式的停机。
第二个是 基于租户的范围(per-tenant scope)。AI 故障的影响范围在客户之间很少是均匀的。破坏某个租户索引的检索 Bug 对其他租户是不可见的。破坏受监管行业客户格式的提示词变更对其他人可能没问题。全局关闭是一把大锤;基于租户的关闭则是手术刀,而大多数实际事故需要的是手术刀。Flag 系统必须支持根据租户 ID、账户等级、区域或流量实际拆分的任何其他维度进行定位。
第三个是 基于操作的范围(per-operation scope)。AI 路径很少是单一 路径。它包括流式对话端点、后台摘要任务、自动补全、基于向量的搜索。它们共享基础设施但独立发生故障。因为其中一个表现异常而关闭整个“AI”功能的紧急开关在 75% 的情况下都是过度反应。每个高价值操作都需要自己的 Flag,每个 Flag 都需要自己的回退方案。
第四个是 自动激活(automatic activation)。值班工程师是响应链条中最慢的一环。即使是一个优秀的团队,从检测到通知再到确认并切换 Flag 的过程也很少能压缩到 5 分钟以内。对于故障信号可以自动化的场景——输出分布偏移、金丝雀集合上的评估分数骤降、拒绝率激增、幻觉分类器报警——紧急开关应该在信号超过阈值时自行触发,并在事后(而不是事前)通知人类。这就是 5 分钟和 5 秒钟控制事故的区别。
无人愿解决的检测难题
一个紧急开关的速度取决于触发它的信号。确定性软件工具包(deterministic-software toolkit)会给你 5xx 错误率、p99 延迟和异常计数;但对于 AI 功能,这三项指标可能非常平稳,而输出却已在悄无声息中崩溃。
对 AI 功能真正重要的信号是不同的,且更难进行埋点监测(instrument)。
输出分布偏移(Output-distribution shift)是核心手段。你对模型在近期窗口内的输出进行指纹提取——包括长度分布、拒绝率、top-k token 频率、输出到一小组预设类别的分类——并与基准线进行对比。平均输出长度的突增、拒绝率的翻倍或类别分布的偏移,都是上游发生了变化的强烈信号。检测器不需要知道哪里出了错,它只需要注意到系统的行为与一小时前在统计学上有所不同。
连续金丝雀(continuous canary)上的评估分数回退能捕捉到分布偏移漏掉的故障。你每隔五到十分钟针对生产环境运行一小组固定的评估集(五十到几百个用例),并跟踪分数。当分数低于设定的底线时,你会收到告警,并可选择自动触发紧急开关。金丝雀的规模是成本与灵敏度之间的杠杆;在实践中,“小而频繁”优于“大而稀少”。
分群质量仪表盘(Per-cohort quality dashboards)能发现特定用户细分领域中无声的回退。整体质量可能保持稳定,但某一个群体——如企业级客户、德语用户、负载异常的长尾账户——可能正在悄然崩溃。通过分群切分质量并在单分片出现回退时告警的监控层,可以在用户提交工单之前捕获这些问题。
- https://www.featureflow.com/blog/feature-flag-kill-switches
- https://launchdarkly.com/docs/tutorials/videos/kill-switch
- https://www.getunleash.io/feature-flag-use-cases-software-kill-switches
- https://www.harness.io/blog/kill-switch-code
- https://upstat.io/blog/feature-flags-kill-switches
- https://beefed.ai/en/kill-switches-incident-response-feature-flags
- https://www.getunleash.io/blog/graceful-degradation-featureops-resilience
- https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_mitigate_interaction_failure_graceful_degradation.html
- https://medium.com/@mota_ai/building-ai-that-never-goes-down-the-graceful-degradation-playbook-d7428dc34ca3
- https://venturebeat.com/infrastructure/monitoring-llm-behavior-drift-retries-and-refusal-patterns
- https://www.langchain.com/articles/llm-monitoring-observability
- https://portkey.ai/blog/failover-routing-strategies-for-llms-in-production/
- https://launchdarkly.com/blog/operational-flags-best-practices/
