跳到主要内容

31 篇博文 含有标签「incident-response」

查看所有标签

无故障停机情况下的面向客户 AI 质量退化复盘指南

· 阅读需 13 分钟
Tian Pan
Software Engineer

你的状态页是一片绿色。你的错误率为零。你的运行时间仪表盘连续第七个月显示为 100%。然而,在周二上午 9:14,你的客户团队给你转来了一条来自一家财富 500 强客户的消息,上面写着:“我们的团队注意到这周助手的表现变差了。你能告诉我们发生了什么变化吗?”午饭前,你又收到了 12 条类似的反馈。现有的事故沟通手册(incident-comms playbook)无法回答其中任何一个问题,因为那套手册是为停机事故准备的,而现在没有任何东西崩溃。

这就是面向客户的 AI 复盘难题,也是我在将 LLM 功能交付给企业合约的团队中看到的最普遍的差距。可靠性的维度已经从“系统是否在线”转向了“系统是否和上周一样好”,而几乎没有任何沟通基础设施跟上了这一变化。状态页上没有相应的展示块。严重性等级标准(Severity rubrics)没有对其进行评分。支持服务的回复模版默认为“我们发现了一个问题并已解决”,这取决于客户当天的情绪,听起来要么是敷衍,要么是危言耸听。

没人愿意写的 AI 事故复盘:四层诊断框架

· 阅读需 12 分钟
Tian Pan
Software Engineer

上季度,某推荐引擎推送了冒犯性内容,随后召开的事故复盘会议以一种我们再熟悉不过的方式收场:两小时的会议里,ML 工程师把矛头指向检索语料库,数据工程师把矛头指向提示词,产品工程师把矛头指向监控,基础设施团队把矛头指向没人记得何时升级的模型版本。最终产出了三条行动项,却没有一条落实到具体负责人。事故就此关闭。六周后,同样的故障模式再次上线。

这不是某一个团队的故事,而是大多数组织处理 AI 事故时的默认结局。AI 功能在生产环境中造成的后果,由足够多的参与方共同承担,导致标准的事故复盘根本无法锁定因果关系。那套在排查数据库超时时行之有效的"5 Why"分析法,面对"模型给出了错误答案"时便彻底失灵——因为下一步该追问什么,从来都不显而易见。

过度纠正陷阱:为什么在 AI 功能公开失败后下架它反而让恢复更慢

· 阅读需 11 分钟
Tian Pan
Software Engineer

2024 年初,谷歌的图像生成工具开始产生历史上不准确的结果,应对之策来得迅速:暂停所有人物图像生成功能。这一暂停持续了数月。想将该功能用于合法用途的用户毫无选择。等到功能重新上线时,采用率也很低——仅对一小部分订阅用户开放,受到严格限制,且声誉包袱尚未完全卸下。过度纠正本身成了一个新问题。

这是大多数团队在 AI 功能公开失败后都会掉入的陷阱。直觉没错——如果某个东西在造成伤害,就应该停止——但执行方式却错了。彻底下架功能,或者堆砌铺天盖地的护栏让其形同虚设,并不能重建信任。这只会表明你不知道如何负责任地运营 AI,也无法分辨那 0.1% 的错误输出与 99.9% 的正常输出之间的区别。

你的 AI 功能需要一个无需部署的紧急开关 (Kill Switch)

· 阅读需 14 分钟
Tian Pan
Software Engineer

想象一下这个场景:凌晨 2:14,值班工程师的手机嗡嗡作响,你旗舰产品中的 AI 功能正自信地告诉企业客户,他们的账号是“西红柿汤”。模型供应商推送了一个路由变更,你的提示词被静默升级的分词器截断了,或者是检索索引针对一个损坏的 Parquet 文件重新生成了——原因现在还不重要。重要的是,距离有人截图输出并发布到 LinkedIn 只剩 10 分钟。

如果你唯一的对策是“回滚部署并等待 CI”,那你已经输了。标准的流水线回滚从报警到恢复需要 20 到 40 分钟,而糟糕的输出不会在绿色对勾渲染时礼貌地暂停。等到新容器恢复健康时,截图已经在信息流里传开了,支持信箱里塞满了 50 个工单,而你花了 6 个月建立的信任正被那些从未使用过该产品的人审查。

那些能在 5 分钟而不是 5 小时内控制此类事件的团队并不是靠运气。他们在需要之前就构建了一个紧急开关(Kill Switch)——这是一个允许值班工程师在几秒钟内禁用 AI 路径的原语,无需部署,无需合并,也无需任何人触碰生产环境的二进制文件。这篇文章将探讨这种专门针对 AI 功能的原语是什么样的,为什么确定性软件的版本不足以应对,以及在事故发生前的一天必须具备什么条件,才能让响应在事故发生的当晚奏效。

禁用开关才是真正的产品:设计非 AI 回退路径

· 阅读需 11 分钟
Tian Pan
Software Engineer

每一个 AI 功能在发布时,都伴随着一个团队未曾预料到的时刻:必须将其关闭的时刻。在早会上,模型效果突然出现回归(Regression);一场没人告知工程团队的营销活动导致成本飙升,在 12 小时内让账单翻倍;隐私审查发现提示词上下文泄露;供应商宕机 90 分钟;合规团队在中午发出了警告,该功能必须在下班前消失。

大多数团队为此准备的“禁用开关”只是让“功能返回错误” —— 一个永远无法加载的旋转图标,或者是显示“AI 助手不可用,请稍后重试”的横幅。这比 AI 出现之前的现状要糟糕得多,而当 AI 表现下降时,用户恰恰会拿现状与你对比。以前的方案至少有一个按钮。而现在,用户只得到了一句道歉。

上线 AI 功能后的头 100 个工单

· 阅读需 12 分钟
Tian Pan
Software Engineer

AI 功能上线后的 Bug 数量并非质量问题。它是一个发现序列——一个非常可预测的序列,以至于你可以在发布公告发布之前,在白板上逐周、逐个工单地勾勒出来,并且在仪表盘数据跟上时,你会发现自己预测得惊人地准确。每个上线 AI 功能的团队都会经历这个序列。唯一的选择是,你是带着操作手册(runbook)去执行,还是通过一系列临时的紧急会议来应对。

我已经观察了足够多的发布,足以相信这个序列实际上与工程质量无关。它关乎信息差。发布前,团队拥有合成流量组合、精选的评测集(eval set)、理想路径的演示和董事会演示文稿。发布后,真实用户带着合成流量从未模拟过的意图蜂拥而至,市场团队开展了工程团队仅略有耳闻的营销活动,模型提供商发布了未经团队授权的更改,而隐私审查员在功能上线时正在休假。下面的序列就是当这两个世界碰撞时产生的摩擦。

你遗漏订阅的模型提供商 Webhook 通知

· 阅读需 12 分钟
Tian Pan
Software Engineer

我的团队第一次发现我们依赖的模型即将退役时,是从客户那里得知的。弃用通知邮件躺在一个被三名工程师退订了的共享收件箱里。提供商的状态页上挂着横幅。Webhook 事件发射到了虚空中,因为我们从未配置过接收端。60 天的预警时间,被我们浪费成了 0 天,最终以一场停机事故和塞满“紧急迁移”同步会的日程表收场。

我交流过的大多数团队目前都处于这种状态,只是他们自己并不知道。每个主流 LLM 提供商都在悄悄构建通知层面 —— 针对故障的 Webhook、变更日志中的弃用事件、通过电子邮件发送的账户警告、账单异常提醒、区域故障转移信号 —— 而大多数团队要么禁用了这些功能,要么将其路由到了一个没人看的邮件列表。提供商一直在提前告诉你坏消息。是你选择不去听。

你的值班轮换需要 AI 素养作为前提,否则不要在凌晨 2 点给任何人发报警

· 阅读需 13 分钟
Tian Pan
Software Engineer

一位拥有 8 年事故响应经验的平台工程师打开了一条凌晨 2 点的报警信息:“AI 助手性能下降 —— 错误率 12%”。她检查了模型延迟仪表盘:绿色。检查了模型 API 状态页:绿色。检查了部署日志:过去 72 小时内没有任何变更。她做了任何称职的值班人员接下来会做的事 —— 呼叫 AI 团队。AI 工程师醒来,打开了平台工程师甚至不知道存在的追踪 (trace) 仪表盘,发现一个检索工具在过去 4 小时内一直超时,原因是一个下游搜索索引丢失了一个副本,并在 11 分钟内解决了事故。AI 工程师在凌晨 3:14 重新入睡。第二天早上的复盘记录写道:“AI 功能故障,由 AI 团队解决”。没有人写下真正的教训:如果这位值班工程师曾被教导过 AI 功能的故障面 (failure surface) 长什么样,她本可以在 5 分钟内完成分流 (triage)。

这是 AI 功能在过去两年中,向我合作过的每一个工程团队悄悄征收的“轮换税”。曾经完美适用于无状态服务堆栈和几个数据库的共享值班轮换,在其中一个“服务”变成由 LLM 驱动的功能时就会崩溃。你的 SRE 团队通过十年的事故复盘建立的值班手册,是为一个“某处出错了”可以分解为 CPU、内存、网络、部署和依赖超时的世界而校准的。AI 功能增加了三个维度 —— 模型、提示词 (prompt)、检索管道 —— 以及四种值班人员从未接受过识别培训的故障形态,这些故障不会出现在他们习惯查看的仪表盘上。

五面分诊树:当常规操作手册不再适用时的 AI 轮值指南

· 阅读需 14 分钟
Tian Pan
Software Engineer

页面告警在凌晨 2:47 响起。智能体(Agent)正向客户支持工单发送语气错误的回复,延迟仪表盘显示平稳,错误率正常,而且由于过去 12 小时内没有进行过任何部署,没有任何东西可以回滚。值班工程师打开了运维手册(runbook),滑过了“重启工作线程池”和“扩容队列”,直到翻到底部,也没发现任何能与眼前告警相匹配的内容。他们在凌晨 3:04 开始阅读系统提示词(system prompt)。到凌晨 3:31,他们仍在阅读。

这是全新的故障形态。那些为“高延迟意味着重启 Pod,5xx 错误增加意味着回滚部署,队列深度增加意味着扩容工作线程池”而设计的轮值制度,已无法应对此类问题。第一直觉——回滚部署——是错误的,因为根本没有部署:模型在版本化别名(versioned alias)后静默升级了,第三方工具的响应结构发生了偏移,提示词版本在不同区域间出现了偏差,或者评估集在几周前就已失效,而回归问题一直在持续累积。告警是真实的。运维手册却保持沉默。AI 值班现在已经成为一门独立的学科,试图将其强行套入现有的轮值体系,只会产生那种在告警发生时,所有人第一步都是在通话中相对无言、第一次开始阅读提示词的方案。

你的 SRE 复盘模板遗漏了决定每次 LLM 故障的六个关键字段

· 阅读需 12 分钟
Tian Pan
Software Engineer

当你第一次用经典的 SRE 复盘(Postmortem)模板来分析 LLM 事故时,模板赢了,而事故输了。时间线、诱因、缓解措施、预防措施 —— 每个字段都填好了,每个复选框都勾选了,但在文档的最后,没人能回答唯一重要的问题:究竟是哪个变量发生了变动?不是部署事件。不是基础设施故障。不是代码变更。而是 Prompt 的修订、路由选择的模型切片、未触发报警的 Eval 评分所用的 Judge 配置、质量投诉发生时的检索索引状态、规划器(Planner)正在组合的工具 Schema 版本,或者是异常时间段内的流量组合。这些在模板里都没有对应的一行。

SRE 模板并不是为那些“事实来源是观察到的行为而非代码路径”的系统设计的。在 LLM 技术栈中默默变动的变量,正是模板从未需要列举的变量。强行借用模板,只会产生那种被归类为“持续调查中”的“我们不知道发生了什么变化”的复盘报告。

你的 stop_reason 在说谎:构建生产环境故障排查真正需要的停止分类法

· 阅读需 14 分钟
Tian Pan
Software Engineer

运维工程师调出一个 trace。模型已返回,span 正常关闭,API 调用显示 stop_reason: end_turn。从平台提供的各种信号来看,这是一次成功的生成。3 分钟后,客户报告说 Agent 煞有介事地写了半个配置文件,宣布操作完成,然后就继续下一步了。Trace 里没有任何预警信号,因为预警信号不在 API 协议里 —— 供应商提供的停止原因只有四到七类,而你的事故排查所需要的答案,恰恰隐藏在这些类别的缝隙之中。

停止原因(Stop reasons)是工程师在故障排查时最先查看的字段,也是最具误导性的字段。这些值是为运行时(runtime)设计的,旨在决定下一步该做什么:这一轮是否完成了?是否请求了工具?是否超出了预算?安全检查是否介入了?它们并不是为了让开发者重建答案出错的原因而设计的,而这两者之间的差异,正是生产团队耗费整个下午的时间所在。

Token 消耗是你的 SOC 尚未监控的安全信号

· 阅读需 12 分钟
Tian Pan
Software Engineer

你技术栈中最灵敏的泄露信号并不在 SIEM 中。它隐藏在财务人员月初打开的一份电子表格里。当攻击者窃取了 LLM API 密钥、利用提示词注入(prompt injection)窃取数据,或者通过被入侵的租户会话查询相邻客户的内存时,痕迹首先会表现为 Token 使用异常——这远在任何 DLP 规则触发、任何身份验证警报响起或任何终端代理察觉到异常之前。财务看到了,而安全部门却没看到。

这种差距并非理论上的。Sysdig 的威胁研究团队在观察到攻击者利用窃取的云凭据产生每日五位数的账单后,创造了“LLMjacking”一词。这一类别现已演变成一个有组织的犯罪产业,出现了每个账号 30 美元的交易市场,且有记录显示某些活动让受害者的损失每天超过 100,000 美元。OWASP 记录了一家初创公司因为密钥泄露,在 48 小时内产生了 200,000 美元的账单。斯坦福大学的一个研究小组由于在 Jupyter notebook 中遗忘了一个 Token,在 12 小时内烧掉了 9,200 美元。所有这些事件的共同点是:在安全团队察觉之前,账单图表就已经在几个小时甚至几天前揭示了真相。