具有两种延迟的 AI 功能:你衡量的是一种,用户感知的是另一种
传统的 HTTP 请求只有一个关键的延迟:从请求到响应的时间。那个数字的 p95 就是契约。SRE 监视它,SLO 是针对它编写的,当它退化时就会有人收到告警。一个数字,一个仪表盘,一个真相。
流式 AI 功能在响应变为流的一刻就打破了这一模型,而大多数团队还未察觉。现在有了两种延迟,而且它们是发散的。首字延迟(Time-to-first-token) 是用户在任何事情发生前盯着加载图标的时间。完成时间(Time-to-completion) 是直到回答完全写完的时间。它们受不同力量的影响,由不同的杠杆修复,并且用户感受到的情感权重完全不同 —— 而几乎每个团队都只衡量第二个指标,因为那是 HTTP 框架免费提供给他们的数字。
结果就是一个技术上准确但在体验上盲目的仪表盘。你的 p95 看起来很健康。你的用户却在盯着一个四秒钟的加载动画。这两件事同时发生,而它们之间的差距是当今生产环境 AI 功能中最常见的、未被测量的失败模式。
为什么框架默认会对你说谎
打开任何 Web 框架的请求追踪中间件。它记录请求到达的时间和响应结束的时间,并报告两者之差。对于 JSON API,这完全正确。对于流式端点,它是 整个流 的持续时间 —— 也就是说,是完成时间。框架无法看到第一个 token 离开服务器的时刻,因为就传输层而言,响应是一个长连接,要么成功,要么失败。
因此,默认的测量手段衡量的是用户 最不关心 的延迟。一旦答案开始渲染,用户就开始阅读了;他们已经停止检查功能是否坏了。等待中最痛苦的部分 —— 即他们怀疑是否应该刷新页面的部分 —— 完全发生在第一个 token 出现之前,而这个间隔在标准仪表盘上是不可见的。
这创造了一种特定且危险的指标形态。完成时间主要受长回答的影响。一个产生 1,200 个 token 的正确、有用输出的请求需要几秒钟才能完成,这 没问题 —— 用户一直都在愉快地阅读。但这种数秒的完成时间与真正糟糕的体验处于同一个直方图中:在出现单个 token 之前有四秒钟的停顿。合并数字的 p95 被“长但没问题”的回答推高,被短时间的停顿拉低,真正糟糕的体验被平均化,从而变得不可见。
你可能会有一个 3 秒的 p95 完成时间,其中包含零个不满意的用户;也可能有一个 3 秒的 p95,其中全是不满意的用户。这个数字无法告诉你属于哪种情况。这不是一个你可以通过增加小数位来解决的精度问题。这是一个迹象,表明你衡量了错误的量。
