跳到主要内容

AI On-Call 心理学:为非确定性告警重建运维直觉

· 阅读需 13 分钟
Tian Pan
Software Engineer

当一名 on-call 工程师第一次以“模型刚才又表现得有点怪”为由关闭告警页面时,团队就已经悄然越界了。这句话同时表达了三层意思:它宣告了问题不可调查,它将未来类似的告警归类为噪音,并免除了轮值人员记录事件经过的责任。一周后,同样的特征再次触发告警,另一个人看到“之前已经关闭过一次”,于是真正的回归(regression)便会一直潜伏在生产环境中,直到有客户在 Twitter 上发帖投诉。

这种模式并不是因为懒惰。它是将标准的 SRE 直觉运行在一个不再表现出确定性的系统上所产生的必然结果。经典的 on-call 培训教导工程师将“输入相同但输出不同”的情况视为可观测性堆栈中的 Bug——这不可能是系统本身的 Bug,因为系统不会那样运作。但基于大语言模型(LLM)的系统正是在每一次请求中都以这种方式运作,这是其设计使然。如果建立 on-call 轮值机制时没有内化这一点,系统就会滑向两个极端:要么是瘫痪(每一个随机波动都是 P2 级事故),要么是虚无主义(模型总是很奇怪,别再给我发告警了)。

我所见过的处理得比较好的团队,会将 AI on-call 视为一门与传统可靠性工作截然不同的学科。他们重新设计了告警分类体系,重建了轮值激励机制,并投入精力进行培训,明确要求参与者抛弃一些根深蒂固的 SRE 本能。以下是这些实践经验的总结。

“模型当时想这么做”并不是根本原因

传统 SRE 的运维前提是:通过严密的调查,每个事件都能找到其根本原因——错误的配置推送、竞态条件或是依赖项性能下降。围绕这一前提建立的复盘文化(五个为什么、因果链、无责备复盘)只有在树的最底层确实存在一个“为什么”时才有效。

随机系统(Stochastic systems)从底层打破了这一前提。在第一次 logit 计算中,仅仅一个比特位的差异就可能改变 token 的选择,而一旦轨迹发生偏移,模型可能在这一分钟给出准确答案,下一分钟就产生言之凿凿的幻觉,而输入完全没有变化。当批处理、缓存和请求调度与浮点非确定性相互作用时,即使在相同模型上以相同的 temperature 重放相同的 prompt,也可能产生不同的输出。树底层的“为什么”往往只是采样过程的联合熵(joint entropy)。

危险的做法是将这一事实引入 on-call 行为,将其作为停止调查的通行证。如果“模型当时想这么做”变成了事故树中被接受的终端节点,那么你已经把 AI 路径上的每一个生产环境 Bug 都定义为了不可分析。抵制这种倾向的团队会采取一种微妙的做法:他们将“随机性”视为分类体系中的一个类别,而不是逃避的借口。“在当前 N=1 的情况下无法与采样噪声区分”是一个结论,但它会触发不同的工作流——通常是自动请求以更高的 N 值重放追踪(trace)、运行针对性的评估切片(eval slice),或者在特征持续出现时升级处理。轮值产生的结果要么是真正的根本原因,要么是足以说明故障处于预期噪声范围内的统计证据。它永远不会产生一个“耸耸肩表示无奈”的结果。

为非确定性系统构建的告警分类体系

大多数 AI 可观测性堆栈只是将 LLM 指标硬塞进现有的告警基础设施中,这产生了根本性的信号混乱。一名工程师被叫醒,打开仪表盘,看到“质量分数下降了 8%”与“p99 延迟增加了 40ms”以及“错误率 0.3%”并列在一起——这三个指标有着三种完全不同的可复现性保证,却通过同一个寻呼机(pager)路由。

一个能够在生产环境中经受考验的分类体系至少将告警分为四个不同的族群,每个族群都有自己的响应协议。

第一种是确定性基础设施:常见的超时、5xx 错误率、依赖项健康状况、队列深度。沿用你之前的直觉即可。如果 GPU 主机卡死了,那就是卡死了;经典的调试方法依然适用。

第二种是策略和契约违反:安全分类器触发、JSON Schema 校验失败、拒绝工具调用、提示词注入检测。在固定的 trace 下,这些是确定性的,尽管它们发生在随机系统内部。单次复现就具有重要意义;它们属于高优先级的告警。

第三种是具有统计信号的质量回归:诚实度(faithfulness)分数持续下降、输出长度分布发生偏移、数千个请求中的工具调用成功率出现漂移。这些是真实存在的问题,但需要群体层面的分析,而不是单条请求级别的调试。它们绝不应该叫醒正在睡觉的人——它们应该被创建为一张明早处理的任务单,并预先附上评估切片。这类告警最容易让人产生习得性无助。

第四种是随机噪声:在低访问量的代码路径中出现一次奇怪的输出。这些根本不应该成为告警。如果它们漏进来了,正确的 on-call 操作是将该 trace 记录到重放语料库中并关闭页面。训练工程师毫无愧疚感地执行此操作比听起来要难,因为 trace 往往看起来是可调查的——模型确实给出了错误答案,而通常的直觉是错误答案必须被修复。

这里的纪律在于,将“修复”保留给在聚合层面可见的回归。单个随机失效是数据点,而不是 Bug。混淆这两者的团队要么每周二根据单个案例重写 prompt(由于对最新的噪点样本过拟合而导致 prompt 漂移),要么得出“任何事情都没有可行性”的结论并停止响应。

抵抗“推诿模式”的轮值设计

“AI 又出毛病了”这种推诿不仅是一种认知结构,更是一种社会结构。当一名工程师在凌晨 3 点的值班中耸耸肩,这种行为就会成为下一名工程师在下次值班时的先例。要打破这种模式,需要构建一种旨在传播调查而非推诿的轮值机制。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates