跳到主要内容

48 篇博文 含有标签「latency」

查看所有标签

止于供应商边界的链路追踪

· 阅读需 12 分钟
Tian Pan
Software Engineer

你做了追踪(tracing)工作。检索有 span。工具调用有 span。编排循环有 span。Trace ID 贯穿每一个内部跳跃,记录在 W3C 的 traceparent 请求头中,正如 SRE 手册所说。然后请求到达 messages.create,SDK 记录了一个名为 llm.call 的单一 span,接着你流水线中接下来的 2.8 秒在火焰图上变成了一个没有任何内部结构的黑色矩形。首个 token 出现前的 800 毫秒:不透明。之后的 2 秒解码过程:不透明。你的追踪无法得知网络、队列等待、Prefill 或单 token 解码在总耗时中所占的比例。

当客户报告“今天助手感觉很慢”时,你的仪表板可以证实这种缓慢,但无法定位它。你流水线中最昂贵的一分钟——以美元、p95 以及用户感知的延迟来衡量——发生在供应商的数据中心内部,而你签约时接受的合同几乎没有给你任何可见性。你正在为一个黑盒值班(on call)。

温池与冷真相:Serverless LLM 推理中隐藏的延迟底线

· 阅读需 10 分钟
Tian Pan
Software Engineer

将你的 GPU 推理自动缩放至零(Autoscaling to zero)看起来是显而易见的成本控制策略。GPU 是账单中最昂贵的项目,流量具有突发性,而空闲时间纯粹是浪费。所以你开启了缩放至零(scale-to-zero),看着云端账单下降,并以此自得。

然而,在一段沉寂之后,一位用户出现了,他们的第一次请求需要 60 秒才能返回一个 token。运行 Serverless LLM 推理的生产部署经常报告冷启动超过 40 秒才出现第一个 token —— 相比之下,模型预热后的每个 token 延迟大约仅为 30 毫秒。这是冷路径和热路径之间千倍的延迟差距,而这完全取决于你的流量空闲情况。

这是没有人会写在 PPT 上的权衡。缩放至零并没有消除成本;它将稳定的金钱成本转化为了突发性的延迟成本,然后将这种延迟成本隐藏在仪表盘很少关注的 p99 尾部。

具有两种延迟的 AI 功能:你衡量的是一种,用户感知的是另一种

· 阅读需 10 分钟
Tian Pan
Software Engineer

传统的 HTTP 请求只有一个关键的延迟:从请求到响应的时间。那个数字的 p95 就是契约。SRE 监视它,SLO 是针对它编写的,当它退化时就会有人收到告警。一个数字,一个仪表盘,一个真相。

流式 AI 功能在响应变为流的一刻就打破了这一模型,而大多数团队还未察觉。现在有了两种延迟,而且它们是发散的。首字延迟(Time-to-first-token) 是用户在任何事情发生前盯着加载图标的时间。完成时间(Time-to-completion) 是直到回答完全写完的时间。它们受不同力量的影响,由不同的杠杆修复,并且用户感受到的情感权重完全不同 —— 而几乎每个团队都只衡量第二个指标,因为那是 HTTP 框架免费提供给他们的数字。

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

· 阅读需 11 分钟
Tian Pan
Software Engineer

你智能体系统提示词中的工具描述是一个六个月前的评估产物(eval artifact)。它说 search_pricing 返回“带有结构化定价的最新库存数据”,规划器(planner)对此深信不疑,因为自描述调优的那天起,提示词中的任何内容都没有更新过。而实际上,在过去的 40 分钟里,search_pricing 端点的 p95 延迟一直保持在 11 秒,因为上游供应商正在对你的账户进行限流。而那个被提示词描述为“可能略微陈旧”的更便宜的 search_cache 工具,只需 200 毫秒就能返回同样的答案。但规划器还是选择了 search_pricing,因为描述读起来仍和评估时一样,且规划器没有任何关于目前调用这两个工具成本的信号。

这就是静态工具描述的结构性失效。规划器是在根据一个已经发生变化的世界快照做出路由决策。工具选择实际上并不是一个能力问题——大多数生产环境中的智能体都有两三个在回答内容上高度重合的工具——它本质上是一个“等待成本”问题,而等待成本正是你的提示词模板所看不见的东西。

延迟预算博弈:如何告诉产品经理“实时性”是有能力代价的

· 阅读需 13 分钟
Tian Pan
Software Engineer

一位产品经理走进规划会议,提出了一个只有一行的需求:“响应时间低于两秒,就像 ChatGPT 那样。”讨论中的智能体 (agent) 需要调用六次工具,检索两个索引,运行一个带有思考预算 (thinking budget) 的推理模型,并由第二个评审模型验证其输出。目前端到端的 p50 延迟是 9 秒。工程团队有三个选择:答应下来并悄悄地把智能体削弱成更糟糕的东西;拒绝并眼睁睁看着产品经理去寻找那些在演示视频中吹得天花乱坠的供应商;或者做一件入职培训中没人教的事 —— 开启一场结构化谈判,将每一秒的延迟都转化为智能体放弃的一项能力。

大多数团队会选择第一种。智能体上线后延迟确实到了 2 秒,但准确率下降了 12 个百分点,发布会仍被视为成功,因为达到了标题上的延迟指标。三个月后,团队开始与质量退化作斗争,却没人能将其归因于某项改动,因为退化本身就是那次发布。延迟目标从未被定价,它仅仅是从一份将速度视为免费午餐的产品规格说明书中继承而来的。

MCP 冷启动税:工具服务器开销如何在智能体第 7 步发生累加

· 阅读需 12 分钟
Tian Pan
Software Engineer

一个 200 毫秒的工具调用在火焰图(flame graph)上看起来就像是杂音。但在 Agent 循环中堆叠七个这样的调用,杂音就变成了信号 —— 模型在 800 毫秒内完成了思考,但用户却等待了 4.5 秒,因为每一次工具调用都在重新支付首个调用已经吸收掉的启动成本。残酷之处在于,这种成本在任何单一的追踪(trace)中都不会显示为异常。它表现为干脆利落的 Demo 与反应迟缓的生产环境 Agent 之间的差异,而大多数团队会将其归咎于模型。

Model Context Protocol (MCP) 已成为 Agent 工具链的默认集成界面,这意味着它也成了延迟(latency)堆积的重灾区。MCP 的设计 —— 基于 stdio 或可流式 HTTP 的 JSON-RPC、能力协商(capability negotiation)、动态工具发现 —— 对于一个必须桥接任意客户端和服务器的协议来说是正确的。但它隐含的单次调用成本结构对于 Agent 实际的访问模式并不友好。Agent 的模式不是“每个会话调用一次工具”,而是“每轮对话调用七个工具,每个会话进行四十轮对话”。

这篇文章将探讨这种错配:冷启动税究竟存在于何处,为什么它在长生命周期的 Agent 中是叠加而非被摊销(amortize)的,以及如何通过“预热池”(warm-pool)规范将数秒的惩罚降低到 100 毫秒以下。

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

· 阅读需 11 分钟
Tian Pan
Software Engineer

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

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

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

语音智能体轮次切换:重塑架构的 250 毫秒门槛

· 阅读需 13 分钟
Tian Pan
Software Engineer

研究跨语言话次转换(turn-taking)的语言学家们得出的结论惊人地一致:日常对话中说话者之间的间隙大约为 200 到 300 毫秒。任何更长的停顿都会被解读为犹豫、疏远或顺从;任何更短的停顿则会被视为打断。这个窗口是如此狭窄,以至于人类显然在对方说完之前就开始构思回复了 —— 倾听和计划是并行发生的,而非顺序进行。

错过这个窗口的语音智能体并不仅仅是让人觉得有点慢,而是让人觉得“不对劲”。在聊天产品中没人会注意到的 700 毫秒延迟,在语音交互中会让智能体显得迟钝、心不在焉,或者导致用户因失去耐心而打断它。1.5 秒的间隙足以让用户开始重复他们说过的话。满足这一时间预算并非简单的打磨工作 —— 它迫使开发者做出文本智能体从未面临过的架构选择,而这些选择重塑了整个技术栈的构建方式。

挂钟时间截止日期漂移:为什么你的智能体认为它还有时间但实际上没有

· 阅读需 11 分钟
Tian Pan
Software Engineer

用户点击发送。智能体被配置了 30 秒的时间配额。规划器(planner)检查任务,发现一条耗时约 12 秒的“深度研究”路径和一条耗时 3 秒的“快速查询”路径,并自信地选择了深度路径,因为“我们有充足的时间”。28 秒后,响应返回,比团队上季度发布的 SLA 晚了 2 秒。仪表盘显示,智能体的推理是正确的,重试逻辑是正确的,工具调用也成功了。没有人能解释为什么用户的加载动画转了 46 秒。

这个 bug 不在任何单一组件中。它存在于组件之间的缝隙中,存在于一个系统从未想过要刷新的值里:智能体对于还剩多少时间的认知。在请求受理与模型的下一个规划步骤之间,发生了一次透明重试,挂钟时间在流逝,但截止时间的元数据却没有更新。模型现在正根据它在 15 秒前就已经花掉的预算进行推理,而它自己对此一无所知。

昼夜延迟:为什么你的 AI 功能在东部时间上午 9 点最慢

· 阅读需 10 分钟
Tian Pan
Software Engineer

在上个季度的某个时候,你团队的一名工程师在 Slack 上发了一个帖子,开头是“模型变慢了”。他们展示了一张图表:你的助手功能的 p95 延迟从早上 7 点开始稳步攀升,在东部时间上午 10 点左右达到顶峰,午餐期间处于平台期,并在下午 5 点后悄然恢复。这种形态在第二天、第三天不断重复。团队追溯了他们的部署记录,指责了分词器(tokenizer)的更改,接着是上下文长度的退化,最后发现没什么是特别确定的。修复方案从未落地,因为 Bug 根本不在你的代码里。

顶尖模型提供商运行着共享的推理集群。当你的用户醒来时,北美其他地区也醒了,再加上欧洲的下午,以及每一家购买了相同 API 的公司的每一个内部工具。提供商端的队列深度翻倍,GPU 竞争加剧,你的 p95 延迟也随之翻倍——而你的代码库没发生一行代码变更。这是你技术栈中最可预测的生产事故,但几乎没有团队会为此建立仪表板。

LLM 尾部延迟:为什么在 P50 表现良好时你的 P99 却是一场灾难

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的 LLM API 返回的 P50(中位数)延迟为 800 毫秒。你的仪表板显示为绿色。你的 SLA 规定“两秒以内”。接着,一个用户提交了工单:“它转了 30 秒然后就放弃了。”你检查日志,发现 P99 延迟高达 28 秒。

这种差距——中位数与尾部延迟之间 35 倍的比率——并非偶然。这是 LLM 工作原理的结构性属性,仅仅通过调整超时时间是无法消除的。

首个Token在撒谎:为什么上下文加载——而非推理——才是AI功能延迟的真正瓶颈

· 阅读需 11 分钟
Tian Pan
Software Engineer

大多数关于AI延迟的讨论都搞错了方向。团队痴迷于GPU利用率、模型量化和批处理大小。与此同时,真正让用户感到烦躁的延迟——AI开口说话前的那段停顿——几乎完全由推理开始前发生的事情决定。瓶颈在于上下文,而非算力。

首Token时间(TTFT)是决定AI功能感觉灵敏还是迟钝的关键指标。而TTFT主要由预填充阶段主导:在生成任何输出Token之前,处理完整输入上下文所需的时间。对于128K Token的上下文,预填充可能耗时数秒。GPU在努力工作,但用户什么也看不到。

解决方案不是更好的GPU,而是在用户提问之前就预先加载好上下文。