跳到主要内容

生产级智能体的 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)的负载测试结果看起来很棒,中位数指标图表看起来也很棒,只有那些在部署、自动扩缩容事件或因低流量导致资源回收后触发首个请求的用户才会察觉到问题。

这种模式的一致性足以使其成为一门独立的学科。“智能体延迟”分解后的组件远比模型调用多,而且每个组件都有冷启动成本,并与其他组件叠加。修复方法不是单一的优化,而是在第一次冷启动发生前做出的一系列架构选择,因为发现这些问题的时机不该是在凌晨 3 点的生产环境中。

智能体冷启动剖析

在新节点上的容器化智能体会执行一段启动序列,而这段序列并非由任何单个工程师进行过端到端的系统设计。每个组件在孤立状态下都是合理的;但它们的组合却造成了巨大的性能损失。

容器镜像拉取。对于一个典型的包含嵌入模型权重、嵌入库和框架依赖项的智能体镜像,其大小可能达到 8–15 GB。标准容器注册表并非为这种吞吐量设计的;受限于镜像拉取的冷启动往往占据了时间预算的大部分,仅拉取阶段就可能在运行时启动前耗费 30–60 秒。

运行时初始化。模型客户端连接到提供商,协商身份验证,获取可用模型,并预热其 HTTP 连接池。如果智能体使用本地嵌入模型,该模型会加载到内存或 VRAM 中 —— 小型嵌入模型需要 2–5 秒;大型重排序器(reranker)则需要 15–30 秒。在从第一个用户请求开始计时的链路追踪工具中,这些都不会显示出来。

工具注册表实例化。现代智能体在启动时发现工具:MCP 服务器连接、函数调用注册、Spring Bean 注册过程。每个工具都带有一个 JSON Schema,需要进行解析和验证。最近对生产环境中 MCP 服务器的基准测试发现,模式验证问题占所有可靠性故障的 38%,而且验证工作本身也不容小觑 —— 工具调用的中位数延迟为 320 毫秒,但 P95 飙升至 1,840 毫秒,P99 更是达到 6,200 毫秒。一个拥有 50 个工具且在首次请求时进行串行验证的注册表,在智能体考虑调用什么之前,就可能耗费 10–15 秒。

向量数据库句柄建立。一旦预热,针对具有 HNSW 索引的 pgvector 的第一次查询仅需 5–8 毫秒 —— 但第一次连接需要协商 TLS、进行身份验证,在托管服务上还可能触发自身的无服务器预热,从而增加 200–800 毫秒。Pinecone 在稳态下每条查询会增加 10–20 毫秒的网络延迟,但冷连接则会耗费 1–3 秒。在低流量下因空闲而超时的连接池会在下一个请求中重新支付这一成本。

Prompt 缓存预热。Anthropic 的 Prompt 缓存默认 TTL 为 5 分钟,扩展 TTL 为 60 分钟。大型系统提示词的缓存创建需要 2–4 秒,成本是普通写入的 1.25 倍。一个在新鲜容器上发起 10 个并行请求的朴素实现会产生 10 次缓存写入、0 次缓存读取,产生的账单是预测值的 5–10 倍。对于那些在预热前就进行并行的团队,测得的命中率低至 4%。

综上所述。一个在新鲜容器上调优不佳的智能体可能需要 60–120 秒才能响应第一个用户请求,在此期间,链路追踪没有显示任何内容,因为追踪是在初始化完成后才开始的。

为什么分析 LLM 会忽略大部分问题

流行智能体框架中内置的默认检测工具测量的是模型延迟、工具调用延迟和端到端请求延迟。它们默认不测量从容器启动到第一个请求就绪之间的时间。它们不测量模式验证时间、嵌入模型加载时间或下游服务的首次连接延迟。它们在请求到达时才开始计时。

这是一种具有运维后果的测量偏差。工程团队在每日站会中审阅的仪表盘显示的是稳态延迟 —— 这没问题,因为大多数用户看到的就是稳态延迟。但“大多数用户”并不等同于“在推特上发布截图的用户”。冷启动尾部存在于不同的分布中:它不是请求延迟直方图的长尾,而是一个仅在特定条件下(部署、扩容事件、超过缓存 TTL 的流量间隙)触发的独立模式。

修复方法不是更激进的数据聚合,而是一个独立的指标。将冷启动延迟(定义为从容器启动到第一个请求就绪的实际时间)视为一等公民 SLO。为其配置告警。在仪表盘中将其与 TTFT 并列显示。在 CI 中针对新鲜容器运行该指标,而不是针对已经运行了数小时的热分段(staging)环境。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates