跳到主要内容

33 篇博文 含有标签「latency」

查看所有标签

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

· 阅读需 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,而是在用户提问之前就预先加载好上下文。

生产级智能体的 90 秒冷启动:当 LLM 不再是瓶颈时

· 阅读需 12 分钟
Tian Pan
Software Engineer

用户点击按钮。90 秒后,他们才收到第一个 token。团队的反应几乎是条件反射式的,即要求模型厂商提供更快的 TTFT —— 而厂商的 TTFT 其实只有 800 毫秒。模型从来都不是慢的那一部分。请求花了 30 秒等待工具注册表(tool registry)加载,20 秒等待向量数据库客户端协商首次连接,15 秒用于新鲜容器上的 Prompt 缓存预热,还有 10 秒让智能体框架针对一个初次使用的 JSON Schema 校验器验证注册表中的每个工具模式(tool schema)。

这就是智能体冷启动,它几乎与模型无关。仅对 LLM 调用进行性能分析的团队是在优化请求中本就不慢的部分。更糟糕的是,冷启动在稳态下是不可见的 —— 针对热池(warm pool)的负载测试结果看起来很棒,中位数指标图表看起来也很棒,只有那些在部署、自动扩缩容事件或因低流量导致资源回收后触发首个请求的用户才会察觉到问题。

智能体管道中的并行陷阱:扇出为何让延迟更糟

· 阅读需 9 分钟
Tian Pan
Software Engineer

你的智能体管道很慢,于是你把任务拆分给五个并行子智能体。p50 下降了,你把它上线了。三天后,告警响了:一批用户请求超时。你挖进去发现 p99 从 4 秒涨到了 22 秒。单个智能体本身没有任何变化。超时是因为编排层在等最慢的那个——它以 1% 的概率遇到了检索抖动,但现在任何触碰全部五条路径的请求都会遇到这个概率。

这就是并行陷阱:这个模式看起来是显而易见的提速方案,实则以一种伤害真实用户更多的方式重构了延迟分布,p50 的改善远不能弥补 p99 的恶化。在生产基准测试中,单个智能体在 64% 的评估任务上能匹配甚至超过多智能体管道。并行扇出奏效的时候,确实奏效得很干净——但仅限于特定类别的问题。把扇出当作默认选项,才是错误所在。

你的 LLM 网关缺少的长尾容错重试策略

· 阅读需 14 分钟
Tian Pan
Software Engineer

查看你的网关重试配置。三次尝试。带有抖动的指数退避。在 5xx 错误和超时时重试。最大延迟限制在几秒钟。这看起来很合理,而且是某人两年前从微服务运行手册中复制过来的。但这正是你的 P99 是 P50 两倍、在服务商发生故障期间 Token 费用激增,以及相当一部分用户在默默流失前盯着 30 秒加载圈的最主要原因。

专为 50 毫秒 RPC 设计的重试策略在面对 8 秒的 LLM 调用时注定会失效。失败的形式不同,每次尝试的成本不同,用户感知到的时间维度也不同。默认设置并不安全,只是让人感到熟悉。大多数团队通过同样的方式发现这一点:在一次事后回顾中,网关日志显示响应成功,而客户的截图却显示 UI 已经卡死。