跳到主要内容

随时间波动的质量偏移:为什么你的 AI 功能在东部时间上午 10 点表现不同

· 阅读需 11 分钟
Tian Pan
Software Engineer

太平洋时间凌晨 2 点,你的评估套件(eval suite)在平静的提供商环境下全绿通过。上线前一晚 11 点,QA 进行了冒烟测试。功能正式发布。到了周二上午 10 点(东部时间),你的 p95 延迟比你签字认可的仪表盘高出了 40%,你的智能体(agent)在一个包含六步的计划中丢掉了最后一个工具调用,而你的支持信箱塞满了听起来如出一辙的工单:“今天早上 AI 表现很奇怪。” 谁都没错。模型也没错。错的是评估集 —— 它从未见过饱和的提供商环境,因此对于当队列深度翻倍、截止时间预算(deadline budget)崩溃时功能会如何表现,它无法给出任何参考建议。

提供商负载不仅仅是一个伴随质量副作用的延迟问题。它是你的模型和智能体循环接收到的输入的一种分布偏移(distribution shift),而你所信任的每一个质量信号,都是建立在这个分布中错误的那一截之上的。解决办法不是换一个更快的区域或更好的模型。解决办法是停止假装你的评估框架是在与你用户相同的世界中进行采样。

评估套件正在对虚构场景进行采样

大多数团队在低流量窗口期针对“冷”提供商运行评估,因为那时没有其他事情干扰,运行成本更低,且变异性(variance)更小。变异性低是因为提供商没有负载。于是,评估套件将团队对“模型能做什么”的思想模型锚定在了推理集群的行为上 —— 而该集群可能仅以 30% 的利用率运行,拥有空余的批处理能力和自动扩缩容空间。

东部时间周二上午 10 点的生产环境则是另一番景象。公开基准测试显示,OpenAI 的 GPT-4o 首字延迟(TTFT)在高峰和非高峰时段之间可能有 2–4 倍的波动,范围大约在 300ms 到 800ms 之间;而 Anthropic 的 Claude 的 TTFT 大约在 400–900ms 之间,在负载下的变异性更小。这些只是厂商公布的数据。它们未能捕捉到建立在延迟之上的二阶效应:当令牌流(token-stream)变慢时,你的客户端截止日期会更早触发,你的智能体循环在计划中途耗尽预算,而你的重试路径所使用的 Prompt 与你的评估套件曾经评估过的略有不同。

你测量的是模型质量的天花板。而用户在提问的那一刻得到的是整个联合系统 —— 模型、提供商负载、网络路径、你自己的截止时间预算、你的降级链 —— 的底线。当你最需要评估天花板和生产环境底线达成一致时,它们的背离却最为严重。

延迟在退化,但质量正通过延迟而退化

一种诱人的说法是:延迟和质量是独立的维度。它们并非如此。一旦提供商的批处理密度上升,队列加深,令牌流就会变慢。在这一减速过程下游,有三件事会悄悄降低质量,而这三件事在延迟仪表盘中都不可见:

  • 当令牌预算超时时,推理会被截断。 你的 Prompt 为思维链(chain-of-thought)分配了,比如 4,000 个令牌。在非高峰期的流式传输速度下,模型完成推理后给出答案。在高峰期速度下,同样的墙钟时间(wall-clock budget)预算会切断推理,模型会带着它在平静环境下本不会提交的残缺追踪记录给出答案。
  • 备用路由(Fallback routes)静默触发。 生产环境的路由通常有一个声明式的降级链 —— 主模型、更便宜的模型、语义缓存、报错 —— 它会在 429 错误、错误率上升或成本飙升时触发。在负载下,你运行的并不是你评估过的那个模型,而是一个未公开的该模型与其廉价兄弟机型的混合体。
  • 工具调用序列被切断。 一个拥有 30 秒截止时间限制、在快速响应时需要五次工具调用的智能体循环,在慢速响应时同样需要这五次调用。在慢速响应的日子里,你只能得到四次调用加一个猜测。

每个因素对于只对固定 Prompt 的整体响应正确性进行评分的质量评估来说,都是不可见的。评估集得分依然良好,因为降级后、截断后、切断后的响应在语法上依然正确且符合主题。它们只是在你的用户所关心的维度上系统性地变差了,而这种差距与一天中的具体小时数高度相关。

让这种现象变得不可见的组织缝隙

这种失效模式能在生产环境中长期存在,是因为存在一个没人质疑的清晰组织边界。SRE 负责延迟。AI 团队负责质量。两个团队都有仪表盘。但没有任何一个团队的仪表盘将两者叠加在同一时间轴上。

当 SRE 看到 p95 在上午 10 点攀升时,他们将其归类为预期的昼夜负载(diurnal load)并继续工作。当 AI 团队在每周流量评估报告中看到轻微的质量退化时,他们将其归类为模型漂移(model drift)并排期重新优化 Prompt。这种相关性永远不会浮出面,因为没有任何一个评审员会将这两个信号与提供商端的拥塞状况作为第三维度放在一起观察。组织结构图正在复现这个 Bug。

这里的修复方法是结构性的,而非技术性的。在任何团队拥有它之前,延迟-质量联合仪表盘必须先存在,因为没有团队会主动要求为他们被组织结构刻意忽略的问题建立仪表盘。领导层的举措应该是选出一位工程师 —— 实际操作中,选那个对跨团队相关性抱怨最响亮的人 —— 给他们明确的授权,将质量指标与提供商拥塞信号叠加在同一时间轴上,然后将结果作为现有的跨职能评审中的常设项目。重点不在于仪表盘。重点在于组织中现在有人负责去“注意到”这一点。

一个尊重时间段特征的评估框架是什么样的

仅在供应商负载下出现的质量退化,从原则上讲,是非高峰期评估套件无法捕捉到的回退。评估框架必须跨负载曲线进行采样,而不是针对理想化的空载集群。以下三个具体动作可以改变现状:

  • 按照匹配用户负载的时间表运行评估,而不是为了基础设施的便利。 如果你的用户在东部时间上午 10 点对功能的使用强度最高,你的评估套件就应该在东部时间上午 10 点运行,并且使用与生产流量相同的供应商层级和区域。非高峰期的运行仍可作为基准,但仅靠它们是不够的。与四分之一的用户不得不忍受降级体验相比,额外运行的成本只是微不足道的舍入误差。
  • 使用模拟负载在你的预发布路径中人为制造供应商拥堵。 像 GuideLLM 这样的开源工具包可以让你针对推理部署模拟真实的流量模式,并在受控负载下测量吞吐量和延迟。将负载生成器与评估框架结合,你就能拥有一种方法,在可以按需重建的饱和条件下对模型质量进行评分。这是该测试的低成本版本。
  • 在高峰窗口期将你的评估影子化(Shadow)到生产流量中。 影子测试——在不影响用户的情况下将实时请求复制给候选模型——是新模型推出的成熟模式。同样的机制也适用于在真实高峰条件下对当前模型进行自我评分。你可以获得用户实际发送的严苛输入,以及至关重要的负载配置,且无需向任何人暴露结果。

重点不在于三选一,而在于放弃“单一、低方差、低流量的评估窗口能代表生产环境”这种想法。事实并非如此,而两者之间的差距就是 Bug。

沟通与姿态:指明日间性能底线

工程团队往往在这一点的客户沟通维度上投入不足,直到它演变成续约风险。如果你的功能存在随时间段波动的质量漂移,且你决定不完全修复它——这是一个可以理解的选择,因为供应商负载位于你的上游——那么沟通姿态必须明确指出这一点。承诺团队无法交付的平稳延迟,比预先说明波动情况更糟糕。

三个具体动作会有所帮助:

  • 状态页需要增加质量维度,而不只是运行时间。 “在供应商负载高峰期,AI 功能的运行速度可能会变慢,或推理深度会有所下降”,支持团队可以指向这句话,而不是每天早上写五张工单反复解释同一件事。
  • 产品界面可以提示性能底线。 一个微妙的“此响应耗时比平时长”指示器比退款成本更低,且比无声的降级更能赢得信任。将用户的预期锚定在实际的分布上,而不是理想情况。
  • 销售和客户成功团队需要为此准备一套话术。 “AI 功能的响应速度随供应商负载而变化”应该是面向客户的部门可以毫不退缩说出的一句话。如果做不到这一点,当客户提出问题时的续约谈判,你的工程团队将会面临失败。

这些不是让步。它们是对 AI 功能质量具有日间周期性特征的一种承认——这种特征你的评估套件没看到,你的仪表盘没体现,而你的客户却最先注意到。

当团队看到曲线时,一切都会改变

跨负载曲线采样会产生一个有趣的下游效应:团队不再将质量视为一个单一的数字,而是将其视为一个以供应商状态为条件的分布。当你第一次看到“质量 vs 拥堵”叠加图时,发布会议上的对话将从“以 87% 的准确率发布”变为“以 87% 的中位数准确率发布,在负载高峰的第十百分位准确率为 74%——这个底线可以接受吗?”这是一个更好的对话,也是你的用户每天早上在支持工单中已经在替你进行的对话。

下一步是针对应用程序自身并发窗口的自动扩缩容策略。在已知的高峰窗口期预先放宽超时限制,优于在回退发生后才去追查;一个在凌晨 2 点能完成 5 次工具调用的 Agent 循环,在上午 10 点也应该被允许完成 5 次工具调用,即使每次调用都变慢了,而不是因为超时限制被设定在非高峰情况而被强行截断为 4 次。

这里在架构上的认知虽小但意义重大:AI 功能质量是你的模型、你的提示词、你的 Agent 循环,以及推理瞬间供应商负载曲线的共同属性。将质量仅视为前三者属性的团队,是在对空载供应商的环境进行过拟合。而将其视为共同属性的团队,才是真正发布了已经测量过性能底线功能的团队。

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