跳转到主要内容

工具延迟尾部:为什么 p99 重塑了智能体架构而 p50 掩盖了问题

阅读需 2 分钟Tian PanTian Pan

我上个季度合作过的一个团队发布了一个包含七个步骤的智能体(agent),并以显而易见的方式构建了其延迟预算:搜索返回耗时 200ms,SQL 查询耗时 80ms,电子邮件发送耗时 150ms,链条中的其他环节以此类推。将中位数相加,再加入一些缓冲,数学计算表明该智能体能轻松地保持在两秒的 SLA 之内。仪表板连续几周证实了这一点。中值延迟(median latency)表现优异。接着,客户开始抱怨该功能慢得无法使用,而仪表板看起来依然是代表正常的绿色。

他们互相转述的故事是错误的,因为他们是围绕 sum(p50) 构建的架构,而用户体验到的却是 sum(p99)。经过三到四个步骤后,链条中的 任何 环节掉入其自身尾部概率(tail probability)的可能性就不再微不足道了。经过七个步骤后,这种概率接近于掷硬币。没有任何单项工具的仪表板变红,因为没有任何单项服务表现异常 —— 问题在于没有人负责这种乘法复合(multiplicative composition)效应。

这并不是什么新教训。分布式系统研究人员已经为此撰写了四十年的文章。新鲜的是,每个构建智能体的团队都在最后期限的压力下,痛苦地重新发现这一点。

没人算的乘法链数学

假设一个工具的中位数是 200ms,p99 是 1.5 秒。单独使用一次时,它几乎符合任何合理的预算。将其与另外六个具有类似特征的工具组合在一起,用户感知到的延迟就不再是中位数的总和,而是开始变成每次调用落入的百分位数值的总和。乘法链的中位数由每个环节的中位数主导,这就是为什么单项工具的仪表板保持绿色的原因。而用户感知的体验受链条尾部(tail)的支配,这就是为什么支持工单不会保持绿色的原因。

算术是无情的。如果每次调用有 1% 的概率落入其自身的 p99 尾部,那么在一个七步链条中,至少有一次调用触及尾部的概率是 1 − 0.99⁷ ≈ 6.8%。这就是智能体运行中端到端延迟受最差情况工具支配(而非团队预算中的中位数)的比例。如果将链条增加到二十步 —— 这在进行规划、浏览、阅读和综合的研究型智能体中越来越常见 —— 这个概率就会超过 18%。现在,近五分之一的运行是尾部运行,而单项工具端没有任何监控能察觉到这一点。

Dean 和 Barroso 在 2013 年发表的 "Tail at Scale" 论文在仓库规模(warehouse-scale)的服务中具象化了这一点:当一个请求分发到一百个后端时,至少有一个后端变慢的概率趋近于 100%。智能体目前还没有分发到一百个,但它们会分发到七个,然后是二十个,同样的复合效应开始生效。这些智慧是相通的。第一次阅读它的团队将其视为启示。事实并非如此 —— 只是大多数应用工程师已经有四十年不需要考虑这个问题了。

撒谎的仪表板

这种故障模式之所以如此持久,是因为每个人的仪表化(instrumentation)在孤立状态下看起来都是正确的。搜索团队的仪表板显示其服务的 p99 在 SLA 范围内。数据库团队的仪表板显示的也是如此。邮件发送服务是健康的。模型提供商的状态页面显示没有事故。每个工具的所属团队都可以理直气壮地回答 “我的服务达标了吗?” —— 是的。而这个答案并不是智能体用户所问的问题。

用户问的问题是端到端的。而在电话会议上,没有人拿薪水来负责这个数字。智能体产品经理看着工具团队构建的中值延迟仪表板,看到的是绿色。可靠性团队看着每个服务的 SLO,看到的是绿色。实际的 SLA —— 从接收请求到交付响应的墙上时钟时间(wall-clock time)—— 在实践中没有任何团队负责,在实践中也没有任何仪表板跟踪。

这就是组织故障模式。每个工具团队的指标都锁定在单次调用的边界上。智能体平台的指标锁定在单一步骤的边界上。用户的指标锁定在单一请求的边界上。这三个不是同一个数字,而且当你最需要它们一致时,它们的差异最为剧烈。

真正的准则是什么样的

在乘法链停止反噬之前,必须落实三件事。

根据 p99 而非 p50 设定预算。 一个中位数预算总和为 1.4 秒的七步智能体,其 p99 预算接近 9 秒,因为每个环节的尾部可能是其中位数的 5–10 倍,而链条会为特定运行中出现尾部延迟的环节支付代价。要么架构必须适应更大的数字 —— 这通常意味着更宽松的 SLA、更多的并发容量,或两者兼而有之 —— 要么链条必须缩短。数学规律就是如此。你不能根据你偏好的数字来设定预算。

对冲慢速工具调用。 这是搜索基础设施已经使用了几十年的技术。当一个工具调用在(例如)尾部阈值时间内没有返回时,向同一服务发送一个重复请求,并使用最先响应的那个。其成本是少部分额外的负载 —— 生产环境中的对冲实现报告了 5–10% 的额外开销 —— 而好处是任何单一的慢速环节都无法再挟持整个链条。Hedge 的作者报告称,在他们的参考实现中,通过约 9% 的开销将 p99 从 64ms 降低到了 17ms。对于受尾部限制(tail-bound)的工作负载来说,这种比例并不罕见。

会员专享

余下内容仅对会员开放。

会员可读完整内容 —— 每一个公开发布的观点背后,那些框架、决策与推理的全貌。

  • 完整文章,包含未公开存档的部分
  • 可落地的工作框架,附带权衡与决策依据
  • 新文章抢先看,先于公开发布

随时取消 · 一次订阅,畅读全部

参考资料

保持联系,关注我获取更多内容

阅读需 9 分钟

你的 Agent 链路中无人分配的延迟预算

Agent 的 SLO 通常设置在边界处,而内部却缺乏预算分配,导致没人能归因是哪一跳搞砸了 P99。你需要分配逐跳预算,在 Span 级别进行追踪,并约束那个呈乘性而非加性增长的尾部延迟。

ai-agents
observability
阅读需 12 分钟

Agent 循环从搜索框偷走的延迟预算

将 200 毫秒的搜索调用换成 4 秒的 Agent 循环,延迟预算并没有消失 —— 它从基础设施迁移到了 UX。如果团队没有捕捉到这种交接,就会在交付一个指标更好但实际体验更差的产品。

insider
ai-agents
阅读需 10 分钟

延迟感知工具选择:当“当下的足够好”优于“未来的最出色”

智能体提示词中的静态工具描述在实时延迟和错误率面前会逐渐失效。提示词中的运行时“等待成本”信号,是将工具选择从僵化的评估产物转变为路由决策的关键。

insider
ai-agents
阅读需 9 分钟

那个因等待另一个 Agent 而死锁的 Agent

两个能力出色的 Agent 可能会在你的账单飞涨时永远互相等待。为什么是协作——而非模型能力——导致了 Agent 群体的崩溃,以及分布式系统准则如何修复这一问题。

insider
ai-agents
阅读需 10 分钟

你的智能体需要的是监督者,而不是重试循环

当长时间运行的智能体失败时,重试循环回答了错误的问题。Erlang 的 OTP 监督树在三十年前就定义了真正的决策路径:是彻底重启、从检查点重启,还是升级给人工处理 —— 以及如何将这些策略映射到智能体流水线中。

insider
ai-agents