跳到主要内容

持续生产环境评估:实时 LLM 流量的统计质量监控

· 阅读需 10 分钟
Tian Pan
Software Engineer

大多数团队将 LLM 质量评估视为部署前的关卡:运行评估套件,检查分数,然后发布。这种方法大约只能捕捉到用户实际会遇到的 40% 的故障。剩下的故障之所以会溜走,是因为生产环境的流量与你的评估集完全不同——不同的查询分布、不同的会话长度、不同的上游数据,以及并发负载下不同的模型行为。等到用户投诉出现时,问题往往已经发生了好几天。

解决办法不是在部署前增加更多评估,而是针对实时流量进行持续评估。这种评估是基于这样一个现实设计的:你在推理时没有标准答案(ground truth)标签,并且你需要在几分钟内(而不是几周后)获得可操作的信号。

无参考质量信号究竟在测量什么

“无参考评估(reference-free evaluation)”这个词听起来像是一种妥协——你更想要标准答案,只是无法得到。在实践中,无参考信号测量的故障类别与准确度基准(accuracy benchmarks)测量的完全不同。

准确度基准检查模型在精选问题上是否给出了正确答案。而无参考生产信号则检查模型的行为是否与上周二时的表现保持一致。行为一致性往往是生产环境中首先出问题的地方,而且其发生方式是准确度测试从未设计的:当提示词的边缘情况触发安全过滤器时,拒绝率(refusal rate)会飙升;当模型更新改变了详细程度的默认设置时,输出长度分布会发生偏移;当工具描述与模型版本脱节时,架构符合度(schema conformance)会下降。

按类别划分最有效的无参考信号:

结构化信号(同步,低成本,100% 覆盖):架构符合率、JSON 解析成功率、以 token 为单位的输出长度、必需字段的存在性、响应格式遵循度。这些在热路径(hot path)中的每个请求上运行,成本几乎为零。在六小时内,架构符合率从 99.8% 下降到 97.1% 是一个具体的事件,而不是统计噪声。

行为信号(异步,采样,5-10% 的流量):拒绝率、对冲语言频率、偏离预期领域的议题漂移、重试下的自我一致性。这些需要第二次模型调用或正则模式匹配,在关键路径之外运行。

不确定性信号(采样):响应熵、输出 token 的对数概率方差(如果可用)、同一输入的两次独立生成的自我一致性得分。较低的熵和较高的自我一致性与较高的置信度相关——虽然不一定代表正确性。

LLM 作为评委信号(采样,高延迟):由独立评委模型进行的基于评分标准的质量打分。这是保真度最高的信号,但也是最昂贵的。在 1-5% 的流量上运行,而不是全部。

大多数团队犯的错误是试图在第一天就建立所有四个层级,结果什么也没发布。从针对 100% 流量的结构化信号开始。在完成 30% 的里程碑时加入行为信号。在 60% 的里程碑时加入不确定性和评委信号。

将统计过程控制应用于质量指标

统计过程控制(SPC)最初是为制造过程开发的,你需要区分随机波动(正常)和可分配原因(需要干预的问题)。其核心见解直接适用于 LLM 质量指标:每个指标都有自然方差,你需要一种有原则的方法来识别观察到的方差何时超出了基准。

对于 LLM 监控最有效的三个 SPC 构件:

X-bar 控制图绘制滚动平均值,并将控制限设定在距离过程均值 3 个标准差处。对于 LLM 指标,使用 7 天滚动基准来确定均值和标准差。指标越过 3σ 边界时应触发调查。这不是一个一次性设置的阈值——它会随着你的流量模式演变而重新校准。

CUSUM(累积和)图随时间累积与目标值的偏差。X-bar 图用于检测大的突然变化,而 CUSUM 对小的持续漂移很敏感,这些漂移孤立来看可能在 3σ 以内,但在 12-24 小时内会累积成可检测的信号。模型更新导致的退化通常看起来就是这样:每次发布 2% 的质量下降,逃过了 X-bar 阈值,但在 6 小时内就会在 CUSUM 中显现。

EWMA(指数加权移动平均)图为近期的观测值赋予比旧观测值更高的权重。这对于具有季节性的指标(查询量随时间段变化,用户行为随周中/周末变化)非常有用,因为平滑的 7 天平均值会混淆不相关的方差。EWMA 能更快地适应合理的基准偏移,同时仍能检测到持续的异常。

一个实际的起点:对拒绝率和架构符合率应用 X-bar 图(这两个指标的突然变化解释最清晰),对评委质量得分应用 CUSUM(缓慢漂移是更常见的失效模式)。

告警阈值设计

固定阈值不适用于 LLM 质量指标。“当裁判分降至 4.0 以下时报警”听起来很具体,但它忽略了你的基准裁判分在周二可能是 4.3,而到了周日可能是 3.8,因为周末的流量往往偏向于低质量的使用场景。周日得分 3.9 是正常的,而周二得分 3.9 则可能是一起事故。

SLO 消耗率 (burn rate) 告警更为可靠。将你的质量 SLO 定义为一个时间窗口内的最低可接受值(例如,“每 24 小时周期内,95% 的采样追踪其裁判分 ≥ 3.5”)。然后,当你消耗错误预算的速度超过可持续速度时发出告警:

  • 短窗口(30 分钟):消耗周预算的 >2% → 立即传呼 (page)
  • 长窗口(6 小时):消耗周预算的 >5% → 创建工单供早间复盘

这种结构既能为你提供针对突发事故(如拒答率突然达到 30%)的高灵敏度传呼,又能追踪缓慢漂移(如质量得分每周下降 0.1)的静默累积。

另一种阈值设计失败是触发告警时没有提供足够的诊断背景。一条只说“裁判分下降”的告警几乎毫无用处。而一条包含功能名称、受影响的查询类别、当前分数对比 7 天基准、模型版本以及最近一次提示词部署情况的告警,能让工程师在几分钟内识别出原因,而不是花费数小时。

真正重要的反馈闭环

持续监控只有在能改变你的行动时才有价值。这个闭环需要三个组成部分:

带有查询分类的追踪日志 (Trace logging)。每个采样追踪都应该被打上功能标识符、查询类型(由轻量级分类器提取)、会话上下文以及运行在其上的每个评估层的质量得分。通过这种方式,你可以将“裁判分下降”转化为“从 UTC 时间 14:00 开始,‘多步计算’类别的查询裁判分出现了下降”。

自动分发给正确的负责人。特定功能的质量下降应该路由给该功能的提示词工程师或负责人,而不是发送到通用的告警频道。大多数组织都为基础设施告警定义了这种路由,但几乎没有组织为 AI 质量告警定义这种路由。

发现的失败案例应转变为永久测试。每当实时监控发现你的评估集未能捕捉到的失败类别时,都应向评估集中添加一个新的测试。这是你的评估集随时间推移而不断改进,而不是进一步偏离生产现实的机制。跳过这一步的团队会眼睁睁地看着他们的评估集每个月都变得越来越缺乏代表性。

这里的工具开销比以前要低。Langfuse、LangSmith 和 LangWatch 等平台将追踪日志、质量评分和告警整合到了一个统一的界面中。更难的问题在于组织层面:需要有人负责从监控到提示词迭代的反馈闭环,而这种责任很少被明确分配。

团队尝试时的失败模式

监控错误的层级。团队通常从监控延迟和错误率开始——这很有用,但它们是基础设施指标,而非 AI 质量指标。一个能稳定在 200 毫秒内返回低质量响应的系统是不健康的。先添加质量层指标,再添加基础设施指标。

采样过于激进。为了节省成本而在 0.1% 的流量上运行 LLM-as-judge,意味着对于一个中等流量的系统,你每天只能看到大约 100 条评估追踪。这个样本量太小,无法以统计置信度检测到 3% 的质量下降。5% 的采样率可以为你提供足够的容量进行可靠的异常检测,同时将裁判成本保持在推理支出的 5% 左右。

使用相同的模型作为裁判和被测对象。如果 GPT-4o 既是你的生产模型又是你的裁判,那么裁判会系统性地忽略 GPT-4o 容易出现的失败模式。为裁判使用不同的模型系列,或者使用专门为此目的训练的质量模型。

缺少基准期。只有当你有一个稳定的基准进行衡量时,SPC 控制限才有意义。新系统在配置任何告警之前,应在仅监控模式下运行 7-14 天,建立一个反映完整工作日/周末周期实际流量模式的基准。

一个最小化的初始栈

你不需要一次性构建所有这些。一个最小的生产级监控栈如下:

  1. 同步模式校验 (Synchronous schema validation):针对每个请求进行校验,追踪每个功能的合规率。零成本,可针对结构性失败进行即时事故检测。
  2. 异步拒答率追踪:通过模式匹配对 100% 的流量进行模式匹配追踪。成本低,信号强度高。
  3. 裁判质量得分的 CUSUM 图:针对 5% 的流量进行,配合 7 天滚动基准。捕捉缓慢漂移。
  4. SLO 消耗率告警:针对裁判质量指标,设置短窗口和长窗口。
  5. 带有功能标签的追踪日志:针对所有采样追踪,并路由给功能负责人。

这就是能在用户报告之前捕获 80% 生产质量失败的方案栈。剩下的 20%——边缘案例中的分布偏移、模型版本之间细微的行为漂移、特定于稀有查询类型的失败模式——则需要上述更复杂的信号。但这些是你运行六个月后才会遇到的问题,而不是发布时会遇到的问题。

那些做得好的团队将持续的生产评估视为基础设施,而不是发布后的可选补充。缺少它的每一周,都是质量下降在静默累积的一周。

References:Let's stay in touch and Follow me for more thoughts and updates