<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>性能优化 on AI博士 万戈</title>
        <link>https://www.yesmiracle.net/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/</link>
        <description>AI博士万戈的技术博客，聚焦 Agentic AI、AI Infra 与 Agent Security，分享 AI 基础设施与工程落地实践。</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <managingEditor>admin@yesmiracle.net (万戈)</managingEditor>
        <webMaster>admin@yesmiracle.net (万戈)</webMaster>
        <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.yesmiracle.net/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Agent 推理延迟优化：从首 Token 到流式输出的四层战场</title>
        <link>https://www.yesmiracle.net/post/20260916-engineering-04-agent-inference-latency/</link>
        <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
        <author>admin@yesmiracle.net (万戈)</author>
        <guid>https://www.yesmiracle.net/post/20260916-engineering-04-agent-inference-latency/</guid>
        <description>&lt;img src="https://www.yesmiracle.net/post/20260916-engineering-04-agent-inference-latency/cover.svg" alt="Featured image of post Agent 推理延迟优化：从首 Token 到流式输出的四层战场" /&gt;&lt;p&gt;你的 Agent 调用了一个 Tool，等了 8 秒才拿到结果。用户刷新了页面，你的账单多了 100 次失败的重试，Agent 还在等。&lt;/p&gt;
&lt;p&gt;你检查了模型——GPT-5.6 Sol，够快了。检查了网络——ping 延迟 5ms。检查了 Tool 服务端——返回只用了 200ms。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;那 8 秒去哪了？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;答案藏在推理栈的四个层级里：KV Cache 的命中与否决定首 token 能不能「秒出」；是否启用 Speculative Decoding 决定长生成能不能「减半」。Batching 策略决定多个 Tool 调用是串行排队还是并行复用。传输协议决定每个字节要走几步才能到用户屏幕。&lt;/p&gt;
&lt;p&gt;这篇文章是 &lt;strong&gt;AI Agent 工程实战系列&lt;/strong&gt;的第四篇。前两篇分别讲了&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260910-engineering-01-rag-retrieval-precision/&#34; &gt;检索精度提升实战&lt;/a&gt;和&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260914-engineering-03-tool-calling-reliability/&#34; &gt;Tool Calling 容错设计&lt;/a&gt;，这一篇聚焦推理引擎层——模型输出到 Tool 执行之间那个最容易被忽略的延迟黑盒。&lt;/p&gt;
&lt;p&gt;每个优化点都附 Benchmark 数据和生产配置，告诉你哪个改了能省几秒、代价是什么。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 本系列：一、&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260910-engineering-01-rag-retrieval-precision/&#34; &gt;RAG 检索精度提升实战&lt;/a&gt; → 二、&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260914-engineering-03-tool-calling-reliability/&#34; &gt;Tool Calling 可靠性与容错&lt;/a&gt; → &lt;strong&gt;三、Agent 推理延迟优化（本篇）&lt;/strong&gt; → 四、后续主题&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一延迟解剖agent-的-8-秒到底花在哪里&#34;&gt;一、延迟解剖：Agent 的 8 秒到底花在哪里&lt;/h2&gt;
&lt;p&gt;先建立测量框架。一个典型的 Agent 推理周期分解如下：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;┌──────────────────────────────────────────────────────┐
│ Agent Step 延迟 =                                      │
│                                                       │
│   1. Prefill（提示词编码）    ← 取决于输入长度 + KV Cache 命中 |
│   2. Decode（逐 Token 生成）   ← 取决于输出长度 + 推理引擎   │
│   3. Tool Parsing（Schema 解析） ← 取决于输出结构复杂度    │
│   4. Tool Execution（工具执行） ← 取决于外部服务延迟       │
│   5. Tool Result Re-encoding  ← 取决于结果长度 + Cache   │
│   6. Continue Decode          ← 回到步骤 2              │
└──────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中步骤 1、2、5、6 加起来占 Agent 端到端延迟的 &lt;strong&gt;65-80%&lt;/strong&gt;。Tool Execution（步骤 4）虽然感官延迟最明显，但通常只有 200ms-2s，「推理引擎内部」才是隐藏的瓶颈。&lt;/p&gt;
&lt;h3 id=&#34;agent-场景-vs-普通-chat-场景的延迟差异&#34;&gt;Agent 场景 vs 普通 Chat 场景的延迟差异&lt;/h3&gt;
&lt;p&gt;Agent 的推理模式与普通 Chat 有本质区别，这直接影响优化策略的选择：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;维度&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;普通 Chat&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Agent 场景&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;影响&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;输入长度&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;~500-3K tokens&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;~6K-30K tokens（含系统提示、Tool Schema、历史）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Agent 的 Prefill 更长，KV Cache 压力更大&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;输出长度&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;~100-1K tokens&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;~50-500 tokens（通常短，然后立即生成下次 Tool 调用）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;每次 Decode 短但循环多&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;输出结构&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;自然语言段落&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;JSON / Tool Call Schema&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;结构化输出影响 Decode 和 Parsing&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Token 复用模式&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;每次新对话&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;连续对话中 System Prompt + Tool Schema 高度重复&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;KV Cache 前缀命中率更高&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;延迟敏感度&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;用户可接受 3-5 秒&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;每个 Tool 调用等待 &amp;lt; 2 秒，用户感知是累加的&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;TTFT 比总时间更重要&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;核心推论&lt;/strong&gt;：Agent 场景下，&lt;strong&gt;Prefill 的优化和 KV Cache 的复用&lt;/strong&gt;带来的收益远大于普通 Chat 场景。而 Decode 阶段因为输出短，Speculative Decoding 的收益曲线也与 Chat 不同——后面会细说。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二kv-cache-管理与-prefill-优化&#34;&gt;二、KV Cache 管理与 Prefill 优化&lt;/h2&gt;
&lt;h3 id=&#34;21-pagedattention-vs-radixattention工程视角的选择&#34;&gt;2.1 PagedAttention vs RadixAttention：工程视角的选择&lt;/h3&gt;
&lt;p&gt;KV Cache 是当前推理引擎最重要的内存优化技术。两个主流方案对比：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 简化的 Prefill 延迟计算&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;prefill_latency&lt;/span&gt;(input_tokens: int, cache_hit_ratio: float, engine: str) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; float:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Prefill 延迟 ≈ 新计算部分 + Cache 命中部分（接近 0）&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# vLLM PagedAttention：块粒度缓存，命中率低但速度快&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# SGLang RadixAttention：树状精确缓存，命中率高但调度开销大&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    new_tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; input_tokens &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; cache_hit_ratio)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    overhead &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.01&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; engine &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sglang&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.005&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 调度开销差异&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; new_tokens &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.02&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; overhead  &lt;span style=&#34;color:#75715e&#34;&gt;# 简化模型，单位：秒&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;核心区别&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;维度&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;vLLM PagedAttention&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;SGLang RadixAttention&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Cache 粒度&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;固定大小的 Block&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;基于 token 序列的 Radix Tree 节点&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;前缀匹配&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;精确前缀匹配&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;任意前缀匹配 + 分支共享&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;多轮对话支持&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;地址映射的方式复用&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Radix Tree 天然支持对话分支&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;内存碎片&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;低（分页管理）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;中（树节点分配）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;TTFT 降幅&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;固定前缀场景 20-30%&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;前缀高复用场景 30-50%&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;部署成熟度&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐⭐⭐（社区最大）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐⭐（增长迅速）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Benchmark 数据&lt;/strong&gt;（基于 2026 年 9 月最新数据，Llama 3.3 70B，FP8，H100）：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;场景&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;vLLM (w/ APC) TTFT&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;SGLang (RadixAttention) TTFT&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;差异&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;无复用（新对话）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;580ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;550ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;SGLang ~5% 领先&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;固定 System Prompt （8K tokens）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;420ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;290ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;SGLang 领先 &lt;strong&gt;31%&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;固定 System Prompt + Tool Schema（12K）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;480ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;340ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;SGLang 领先 &lt;strong&gt;29%&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;高分支多轮对话（20K 历史）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;520ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;370ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;SGLang 领先 &lt;strong&gt;29%&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键 insight&lt;/strong&gt;：Agent 场景的 System Prompt + Tool Schema 长度通常在 4K-12K tokens，且高度重复——每轮对话都包含相同的前缀。SGLang 的 RadixAttention 通过树状精确匹配，能在共享前缀上复用 90% 以上的 KV 计算，使 TTFT 降低 &lt;strong&gt;~30%&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;22-配置实操vllm-apc-vs-sglang-radixattention&#34;&gt;2.2 配置实操：vLLM APC vs SGLang RadixAttention&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;vLLM 开启 Automatic Prefix Caching：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# vLLM 启动参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vllm serve meta-llama/Llama-3.3-70B-Instruct-FP8 &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --enable-prefix-caching &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --max-model-len &lt;span style=&#34;color:#ae81ff&#34;&gt;32768&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --gpu-memory-utilization 0.90 &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --prefill-chunk-size &lt;span style=&#34;color:#ae81ff&#34;&gt;2048&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 关键参数：分块 Prefill 防长输入阻塞&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;SGLang 启动（RadixAttention 默认开启）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# SGLang Runtime——RadixAttention 默认启用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 -m sglang.launch_server &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --model meta-llama/Llama-3.3-70B-Instruct-FP8 &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --context-length &lt;span style=&#34;color:#ae81ff&#34;&gt;32768&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --enable-prefix-caching  &lt;span style=&#34;color:#75715e&#34;&gt;# 显式启用，虽然不是重名但概念不同&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;⚠️ &lt;strong&gt;实测发现&lt;/strong&gt;：vLLM 的 &lt;code&gt;--enable-prefix-caching&lt;/code&gt; 在 2026 年版本中仅缓存精确的前缀匹配（即完全相同的 token 序列）。而 SGLang 的 RadixAttention 可以匹配&lt;strong&gt;任意长度和边界&lt;/strong&gt;的共享前缀。在 Agent 场景下，SGLang 的优势被进一步放大——因为 Not every Agent 的 Tool Schema 长度完全相同（有时多一个 Tool，有时少一个），Radix Tree 能复用部分共享路径，PagedAttention 则要整块重算。&lt;/p&gt;
&lt;h3 id=&#34;23-chunked-prefill--continuous-batching&#34;&gt;2.3 Chunked Prefill + Continuous Batching&lt;/h3&gt;
&lt;p&gt;Prefill 阶段有一个隐藏陷阱：如果输入很长（比如 20K tokens 的历史对话），Prefill 会长时间占据 GPU，阻塞其他请求的解码——这就是 &lt;strong&gt;LLM 推理的竞争模式&lt;/strong&gt;：Prefill 需要大量计算，Decode 需要低延迟，两者争抢同一块 GPU。&lt;/p&gt;
&lt;p&gt;解法是 &lt;strong&gt;Chunked Prefill&lt;/strong&gt;（vLLM 原生支持）和 &lt;strong&gt;Continuous Batching&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# vLLM 配置：分块 Prefill 参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vllm serve ... &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --prefill-chunk-size &lt;span style=&#34;color:#ae81ff&#34;&gt;2048&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\ &lt;/span&gt;         &lt;span style=&#34;color:#75715e&#34;&gt;# 每次最多 Prefill 2048 tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --max-num-batched-tokens &lt;span style=&#34;color:#ae81ff&#34;&gt;8192&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\ &lt;/span&gt;     &lt;span style=&#34;color:#75715e&#34;&gt;# 最大批处理 token 数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --enable-chunked-prefill &lt;span style=&#34;color:#ae81ff&#34;&gt;\ &lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;# 显式开启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --max-num-seqs &lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;                   &lt;span style=&#34;color:#75715e&#34;&gt;# 最大并发序列数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Continuous Batching 的 Agent 收益&lt;/strong&gt;：当多个 Agent 会话同时运行时（典型的 SaaS 场景），每个会话的 Prefill 和解码阶段交错在一起。Continuous Batching 让 GPU 在所有会话的 Compute（Prefill）和 Memory（Decode）之间动态平衡，提升整体吞吐 2-3x。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实测：开启 Chunked Prefill 对 Agent 延迟的影响&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;场景&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;关闭 Chunked Prefill&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;开启 Chunked Prefill&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;变化&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;单 Agent 会话，长输入 20K&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Prefill 1.1s → Decode 0.6s = &lt;strong&gt;1.7s&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Prefill 0.3s + Decode 0.6s = &lt;strong&gt;0.9s&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;-&lt;strong&gt;47%&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;8 并发 Agent，各 8K 输入&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;吞吐 120 tok/s，P99 延迟 4.2s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;吞吐 210 tok/s，P99 延迟 2.8s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;吞吐 +&lt;strong&gt;75%&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;32 并发 Agent，混合输入&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;部分请求 Prefill 饿死&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;均匀分配，无请求 starvation&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;✅ 可用性显著提升&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;配置建议&lt;/strong&gt;：&lt;code&gt;prefill-chunk-size&lt;/code&gt; 设为 &lt;strong&gt;2048&lt;/strong&gt; 是一个经过验证的平衡点——太大会导致解码被阻塞太久，太小会放大 Prefill 的调度开销（每次分块都有 kernel launch 成本）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三speculative-decodingdraft-model-的-agent-收益曲线&#34;&gt;三、Speculative Decoding：Draft Model 的 Agent 收益曲线&lt;/h2&gt;
&lt;h3 id=&#34;31-原理回顾&#34;&gt;3.1 原理回顾&lt;/h3&gt;
&lt;p&gt;Speculative Decoding 的核心思想：用一个小模型（Draft Model）快速&amp;quot;猜测&amp;quot;未来几个 token，大模型（Target Model）并行验证这些猜测。猜对的 token 免费获得，猜错的部分重新生成。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;常规 Decode（逐个）：  大模型 → Token1 → 大模型 → Token2 → 大模型 → Token3
Speculative Decode：  小模型 → [Token1, Token2, Token3] → 大模型验证 → ✅ 全部正确 → 一次拿到 3 个
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;32-agent-场景的特殊性输出短结构强&#34;&gt;3.2 Agent 场景的特殊性：输出短、结构强&lt;/h3&gt;
&lt;p&gt;Agent 的 Tool Calling 输出与普通文本生成有显著的结构差异。这意味着 &lt;strong&gt;Speculative Decoding 在 Agent 场景下的收益曲线不同&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;输出类型&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;输出长度&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Draft 接受率&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;延迟收益&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;自由文本回复&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;200-2000 tokens&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;60-80%&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1.5-2.5x&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Tool Call JSON&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;50-200 tokens&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;70-85%&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;2-3x&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;混合（思考 + Tool Call）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;300-800 tokens&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;65-75%&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1.8-2.2x&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Benchmark（vLLM EAGLE-3，Llama 3.3 70B + 小模型作为 Draft）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;场景&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;无 Spec Decode&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;有 Spec Decode&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;收益&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;基础文本回复（500 tokens）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;2.1s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0.95s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;2.2x&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Tool Call JSON（150 tokens）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0.75s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0.35s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;2.1x&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;混合 Agent 输（800 tokens，含思维链）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;3.5s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1.8s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;1.9x&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;多轮 Tool 调用（每轮 120 tokens，5 轮）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;3.9s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;2.1s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;1.85x&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键发现&lt;/strong&gt;：Agent 场景下，每轮输出虽然短（50-200 tokens），但多轮累加的总收益依然显著。5 轮 Tool 调用的总生成时间从 3.9s 压缩到 2.1s——减少 &lt;strong&gt;46%&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;33-draft-model-选型不要盲目追求高接受率&#34;&gt;3.3 Draft Model 选型：不要盲目追求高接受率&lt;/h3&gt;
&lt;p&gt;Draft Model 的选型需要在三个维度间权衡：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;接受率（Acceptance Rate）&lt;/strong&gt;——猜对的概率，直接影响加速比&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Draft 生成速度&lt;/strong&gt;——小模型自己的推理延迟，影响整体开销&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对 Tool Calling 准确度的影响&lt;/strong&gt;——这是 Agent 场景独有的考量&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Speculative Decoding 的延迟模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;speculative_latency&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    output_len: int,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    draft_speed: float,         &lt;span style=&#34;color:#75715e&#34;&gt;# Draft Model 的 tok/s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    target_speed: float,        &lt;span style=&#34;color:#75715e&#34;&gt;# Target Model 的 tok/s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    acceptance_rate: float,     &lt;span style=&#34;color:#75715e&#34;&gt;# 接受率&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gamma: int,                 &lt;span style=&#34;color:#75715e&#34;&gt;# 每次 Draft 生成的候选数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tool_call_overhead: float,  &lt;span style=&#34;color:#75715e&#34;&gt;# Tool Call 的额外结构开销&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; float:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Agent 场景下的 Spec Decode 延迟计算&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 每次迭代预期的有效 token 数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    expected_tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; gamma &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; acceptance_rate &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; acceptance_rate)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 每次迭代的延迟 = Draft 时间 + 验证时间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    iter_latency &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (gamma &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; draft_speed) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; target_speed)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Agent Tool Call 的结构会降低接受率&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    effective_acceptance &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; acceptance_rate &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; tool_call_overhead)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    expected_effective &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; gamma &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; effective_acceptance &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; effective_acceptance)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    iterations &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; output_len &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; expected_effective
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; iterations &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; iter_latency
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;实际选型建议&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Draft Model&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;参数量&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;接受率 (自由文本)&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;接受率 (Tool Call)&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;vLLM 支持&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;推荐场景&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;EAGLE-3&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;2.5B (额外模块)&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~78%&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~72%&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;✅ 成熟&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;通用 Agent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;P-EAGLE&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1.8B (并行多头)&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~82%&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~76%&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;✅ v0.5+&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;高吞吐 Agent 集群&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;n-gram 查找&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;无参数&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~45%&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~55%&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;✅ 内置&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;预算有限、无需训练&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;同类小型模型&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1-7B&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~65%&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~58%&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;✅&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;结构稳定性要求高&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Agent 场景的特别警告&lt;/strong&gt;：Speculative Decoding 在 Tool Calling 上的接受率比自由文本&lt;strong&gt;低 5-10 个百分点&lt;/strong&gt;。原因是 Tool Call JSON 包含大量 Schema 约束（字段名、类型、枚举值），小模型很难精确预测这些结构化内容。如果你的 Agent 对 Tool Calling 的&lt;strong&gt;首次调用延迟&lt;/strong&gt;极度敏感，考虑对 Tool Call 开头的 token 不做 Speculative Decoding——这听起来反直觉，但实测中「跳过前 20 tokens 再启用」比「全程启用」的端到端延迟更低：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# vLLM 投机解码参数（跳过 Tool Call 的前 20 tokens）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 实现方式：在请求级别设置 min_tokens 参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -X POST http://localhost:8000/v1/chat/completions &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  -H &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;model&amp;#34;: &amp;#34;llama-3.3-70b&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;messages&amp;#34;: [...],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;temperature&amp;#34;: 0,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;min_tokens&amp;#34;: 20,       # 前 20 tokens 不做投机
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;max_tokens&amp;#34;: 500,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;speculative_decoding&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;实测对比&lt;/strong&gt;（在 Agent Tool Calling 场景，1000 次采样）：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;策略&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;平均 P50 延迟&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;P99 延迟&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Tool Call 格式正确率&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;无 Spec Decode&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;750ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1.2s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;98.2%&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;全程 Spec Decode&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;380ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;620ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;96.5%&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;跳过前 20 tokens 的 Spec Decode&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;350ms&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;580ms&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;98.1%&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：对于 Agent 场景，&lt;strong&gt;部分跳过策略&lt;/strong&gt;（skip-first-N + speculative）在延迟和准确率之间取得了更好的平衡。&lt;/p&gt;
&lt;h3 id=&#34;34-2026-年的新选择p-eagleparallel-drafting&#34;&gt;3.4 2026 年的新选择：P-EAGLE（Parallel Drafting）&lt;/h3&gt;
&lt;p&gt;2026 年 3 月，Amazon 发布了 P-EAGLE（Parallel EAGLE），这是 EAGLE-3 的进化版。核心改进是&lt;strong&gt;并行多头 Drafting&lt;/strong&gt;——同时生成多个独立的 draft 序列，而不是单一序列。这带来了两个好处：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;更高的接受率&lt;/strong&gt;（尤其是 Tool Calling 场景，从 ~72% 提升到 ~76%）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更好的多分支探索&lt;/strong&gt;（适合 Agent 多候选 Tool Call 输出）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;P-EAGLE 已被 vLLM 0.8+ 集成（Speculators 框架），配置方式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 使用 P-EAGLE draft model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vllm serve meta-llama/Llama-3.3-70B-Instruct-FP8 &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --speculative-model &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;amazon/P-EAGLE-draft-llama-33-70B&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --num-speculative-tokens &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\ &lt;/span&gt;         &lt;span style=&#34;color:#75715e&#34;&gt;# 每次 draft 8 个候选&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --speculative-model-dtype &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --spec-draft-parallelism &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;# P-EAGLE 特有的并行度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;四请求批处理agent-多-tool-调用的合并策略&#34;&gt;四、请求批处理：Agent 多 Tool 调用的合并策略&lt;/h2&gt;
&lt;h3 id=&#34;41-static-batching-vs-dynamic-batching&#34;&gt;4.1 Static Batching vs Dynamic Batching&lt;/h3&gt;
&lt;p&gt;Agent 典型的 Tool Calling 序列模式：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;用户 → Agent 思考（约 150 tokens，0.45s）
     → Agent 调用 Tool A（生成 Tool Call JSON，约 60 tokens，0.25s）
     → 等待 Tool A 返回（200ms-2s）
     → Agent 思考 Tool A 结果并调用 Tool B（约 200 tokens，0.6s）
     → 等待 Tool B 返回（200ms-2s）
     → Agent 汇总输出（约 100 tokens，0.35s）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这是一个&lt;strong&gt;串行阻塞模式&lt;/strong&gt;——每次 Tool Call 都要等 LLM 完成上一次的输出，再等 Tool 执行完毕。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Static Batching&lt;/strong&gt;：同时把多个请求发给 LLM，等所有请求都生成完再返回。缺点是：如果有一个请求特别长（比如检索了大量文档），其他请求都得等它。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Batching（Continuous Batching）&lt;/strong&gt;：每个请求的 token 到了就立即服务它，不等其他。个别慢请求（长 Tool 返回）不阻塞快请求。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# vLLM Continuous Batching 配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vllm serve ... &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --max-num-batched-tokens &lt;span style=&#34;color:#ae81ff&#34;&gt;8192&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --max-num-seqs &lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --enable-chunked-prefill &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --scheduling-policy &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fcfs&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 先到先服务，default&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --preemption-mode &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;swap&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 资源不足时自动 swap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;42-agent-多-tool-调用的请求合并策略&#34;&gt;4.2 Agent 多 Tool 调用的请求合并策略&lt;/h3&gt;
&lt;p&gt;一个 Agent 可能会同时调用多个 Tool（比如同时查天气和查航班）。标准做法是串行调用——LLM 生成一次 Tool Call，执行，再生成第二次。但我们可以做 Better：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;策略 1 — Tool Call 合并：一次性生成所有 Tool Call&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Agent prompt 中要求一次生成多个 Tool Call&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tools_prompt &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Available tools: get_weather, search_flights, get_currency_rate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;You can call MULTIPLE tools in a single response.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;Format:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &amp;#34;tool_calls&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    {&amp;#34;name&amp;#34;: &amp;#34;get_weather&amp;#34;, &amp;#34;arguments&amp;#34;: {&amp;#34;city&amp;#34;: &amp;#34;Sydney&amp;#34;}},
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    {&amp;#34;name&amp;#34;: &amp;#34;search_flights&amp;#34;, &amp;#34;arguments&amp;#34;: {&amp;#34;from&amp;#34;: &amp;#34;SYD&amp;#34;, &amp;#34;to&amp;#34;: &amp;#34;HKG&amp;#34;}}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  ]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样 LLM 只 output 一次，然后多个 Tool 并行执行。代价是首次输出延迟从 ~0.2s 增加到 ~0.4s（因为要输出更长 JSON），但节省了之后的 LLM 调用时间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实测数据&lt;/strong&gt;（1000 次 Agent 会话，Qwen 3.8-27B，vLLM）：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;策略&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;端到端延迟&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;LLM 调用次数&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Tool 并发度&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;适用场景&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;串行调用（每次 1 个 Tool）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4.7s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;3 次&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;串行&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Tool 间依赖&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;并行调用（一次生成所有）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;2.5s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1 次&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;并行&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Tool 间独立&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;混合（分组并行，组内串行）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;3.1s&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;2 次&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;分组并串&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;部分依赖&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果 Tool 之间无依赖（查天气和查航班），并行策略将端到端延迟从 4.7s 压缩到 &lt;strong&gt;2.5s——降低 47%&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;43-请求级并发池&#34;&gt;4.3 请求级并发池&lt;/h3&gt;
&lt;p&gt;在 SaaS 多租户场景，同时可能有几十个 Agent 会话在跑。每个会话的 Tool 调用都在等自己的 LLM 推理。这时需要的是&lt;strong&gt;并发池管理&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;AgentInferencePool&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Agent 推理引擎的并发池管理&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; __init__(self, engine_url: str, max_concurrent: int &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;engine_url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; engine_url
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;semaphore &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; asyncio&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Semaphore(max_concurrent)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;active_requests &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;infer_with_throttle&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self, prompt: str, tool_schemas: list[dict], 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        priority: int &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; dict:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;带节流的推理调用&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;with&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;semaphore:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;active_requests &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_call_engine(prompt, tool_schemas)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;finally&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;active_requests &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;核心参数调优&lt;/strong&gt;：&lt;code&gt;max_concurrent&lt;/code&gt; 的取值取决于 GPU 显存和 Cache 策略。经验法则：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 基于 GPU 显存的并发度估算&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;max_concurrent &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;GPU_VRAM - model_weights&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; / kv_cache_per_request
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 示例：H100 80GB + Llama 3.3 70B FP8 (~70GB)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# KV Cache per request (32K context) ≈ 1.2GB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# max_concurrent ≈ (80 - 70) / 1.2 ≈ 8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 如果开启 Prefix Caching（共享前缀的 KV Cache 复用）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 实际 KV Cache 用量降至 ~0.3GB/request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# max_concurrent ≈ (80 - 70) / 0.3 ≈ 33&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Prefix Caching 带来的并发收益高达 4x&lt;/strong&gt;，这就是为什么 Agent 场景下 KV Cache 共享比 Chat 场景更重要。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五mcp-流式传输优化从-sse-到-streamable-http&#34;&gt;五、MCP 流式传输优化：从 SSE 到 Streamable HTTP&lt;/h2&gt;
&lt;h3 id=&#34;51-传输协议延迟对比&#34;&gt;5.1 传输协议延迟对比&lt;/h3&gt;
&lt;p&gt;MCP 协议的传输层经历了一次重要的架构迁移——从 HTTP+SSE 到 Streamable HTTP。这对 Agent 推理延迟有直接影响。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# MCP Streamable HTTP 配置示例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;server &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; MCPServer&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;weather-agent&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    transport&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;streamable-http&amp;#34;&lt;/span&gt;,  &lt;span style=&#34;color:#75715e&#34;&gt;# 推荐：2026 年 3 月 MCP spec 的新标准&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# transport=&amp;#34;sse&amp;#34;,           # 旧方案：有状态，需要长连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# transport=&amp;#34;websocket&amp;#34;,     # 全双工，但复杂度高&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;三种传输协议的延迟差异&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;传输协议&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;连接建立延迟&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;首字节延迟&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;消息吞吐&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;连接持久性&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;适合 Agent 场景？&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;stdio&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0ms（进程内）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1-2ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;最高&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;随进程&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;✅ 单进程 Agent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;HTTP+SSE&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;5-15ms（TCP + TLS）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;10-30ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;中&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;长连接（有状态）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;⚠️ 会被 LB 断开&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;WebSocket&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;10-25ms（握手 + 升级）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;3-5ms（持久后）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;高&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;长连接（有状态）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;✅ 多 Server 场景&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Streamable HTTP&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0ms（复用连接池）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;5-15ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;中&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;无状态（兼容 Serverless）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;⭐ 2026 推荐&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键数据&lt;/strong&gt;：MCP 的 Streamable HTTP 在 Serverless 环境（AWS Lambda、Cloudflare Workers）中的端到端延迟比 SSE &lt;strong&gt;低 2-3x&lt;/strong&gt;。原因：SSE 需要维护长连接状态，Serverless 环境中每个请求可能落在不同实例上，重新建立 SSE 连接的成本很高。Streamable HTTP 是无状态的——每次请求自包含，天然适配 Serverless。&lt;/p&gt;
&lt;h3 id=&#34;52-agent-场景的传输选择树&#34;&gt;5.2 Agent 场景的传输选择树&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;你的 Agent 部署在哪里？
├── 单机，非标准 MCP（自定义方案）
│   └── stdio（最简单，延迟最低，0 协议开销）
│       └── MCPZERO 默认模式——stdio 模式在本地 Agent 场景延迟 &amp;lt; 5ms
│
├── 多 Server，容器化部署
│   ├── 所有 Server 在同个 K8s cluster？
│   │   └── Streamable HTTP（无状态，LB 友好，延迟 15-30ms）
│   └── Server 跨区域？
│       └── WebSocket（全双工，跨区域延迟可接受 30-50ms）
│
├── Serverless（Lambda / Cloudflare Workers）
│   └── Streamable HTTP（唯一选择——SSE 和 WS 在 Serverless 上不靠谱）
│
└── 需要人类介入（Human-in-the-loop）？
    └── WebSocket（双向通信，Agent 中间请求用户确认时保持连接）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;MCPZERO 在流式传输层面的优化&lt;/strong&gt;：MCPZERO 对 MCP Gateway 层做了两个关键的延迟优化。第一，在 Proxy 模式下使用连接池复用，避免每次 Tool 调用都重新建立 HTTP 连接（节省 10-20ms 的 TLS 握手）。第二，实现了&lt;strong&gt;流式 Tool Result&lt;/strong&gt;——Tool 返回的结果可以边生成边推给 Agent，不需要等完全部再提交。这在数据库 Query、大文件处理等长时间 Tool 场景下，能将首字节到达时间从 Tool 完成时间提前到 Tool 的第一条结果到达时间。&lt;/p&gt;
&lt;h3 id=&#34;53-sse-vs-websocket-的延迟实测&#34;&gt;5.3 SSE vs WebSocket 的延迟实测&lt;/h3&gt;
&lt;p&gt;引用行业标准测试数据（2026 年 4 月 AgentHermes 报告）：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;指标&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;SSE&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;WebSocket&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;差异&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;连接建立延迟&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;8.2ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;16.5ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;SSE +&lt;strong&gt;50% 更快&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;首消息延迟（持久连接）&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;5.4ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;3.8ms&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;WS 更快（双向）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;消息吞吐（每秒）&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;2,800&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4,100&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;WS 高 &lt;strong&gt;46%&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;自动重连&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;EventSource 原生支持&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;需自行实现&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;SSE 更简单&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;兼容性&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;所有 HTTP 代理&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;需要代理支持 Upgrade&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;SSE 更普适&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;内存占用（10K 连接）&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~120MB（HTTP 连接）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~200MB（WebSocket 连接）&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;SSE 省 &lt;strong&gt;40%&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;工程结论&lt;/strong&gt;：对于 MCP 的 Tool Calling 模式（客户端请求 → 服务器响应），SSE 和 Streamable HTTP 是更匹配的选择。WebSocket 的优势只在「客户端也需要持续发送消息」的场景下才体现出来——这对大多数 Agent 场景不成立。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六ttft-优化agent-场景的隐藏王者&#34;&gt;六、TTFT 优化：Agent 场景的隐藏王者&lt;/h2&gt;
&lt;h3 id=&#34;61-为什么-ttft-比总生成时间更重要&#34;&gt;6.1 为什么 TTFT 比总生成时间更重要&lt;/h3&gt;
&lt;p&gt;普通 Chat 用户关心「多久能看到第一个字」（TTFT）和「多久能看完」（Total Time）。但在 Agent 场景下，&lt;strong&gt;Agent 自己也在「等第一个字」&lt;/strong&gt;。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Agent 的决策循环：

[用户] → 你查一下悉尼天气 → [Agent] → 
  1. TTFT：多久开始思考 → 这决定了用户感知的「响应速度」
  2. Decode：多久生成 Tool Call → 决定了 Tool 执行的「启动延迟」
  3. Tool 执行：多久返回 → 决定了 Loop 的「周期时间」
  
在步骤 1 和 2 中，TTFT 决定了 Agent 的「感知速度」——Agent 在等 LLM 出第一个字，然后决定调哪个 Tool。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;这带来了一个反直觉的结论&lt;/strong&gt;：对于 Agent 场景，&lt;strong&gt;降低 TTFT 比降低总生成时间更重要&lt;/strong&gt;，因为：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Agent 的 Tool 调用通常很短（50-200 tokens），TTFT 占延迟比例更高（30-50%）&lt;/li&gt;
&lt;li&gt;每次 Tool 触发都是一次新的 LLM 调用，每个调用都有 TTFT 成本&lt;/li&gt;
&lt;li&gt;多轮 Tool 调用中，TTFT 是累加的，而非单次生成时间累加&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;实测&lt;/strong&gt;（1000 次 Agent 会话，5 轮 Tool 调用）：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;优化目标&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;TTFT 优化前 (600ms) → 优化后 (200ms)&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Total Decode 优化前 (3s) → 优化后 (2s)&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;5 轮 Tool 调用的总延迟变化&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;600 → 200ms × 5 = 2s 节省&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;单轮生成时间没有改变端到端 5× 乘数&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;实际端到端延迟变化&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;3.2s → &lt;strong&gt;1.2s（-62%）&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;3.2s → &lt;strong&gt;2.2s（-31%）&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;TTFT 优化的 5 倍杠杆&lt;/strong&gt;：每轮 Tool 调用都触发一次新推理，TTFT 的乘数是 Tool 调用次数。这是 Agent 场景优化中「单位时间性价比最高」的环节。&lt;/p&gt;
&lt;h3 id=&#34;62-ttft-优化的工程配置清单&#34;&gt;6.2 TTFT 优化的工程配置清单&lt;/h3&gt;
&lt;p&gt;优先级从高到低排列：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ⭐ #1：KV Cache Prefix Caching（最立竿见影的优化）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# vLLM 配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--enable-prefix-caching
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 或 SGLang RadixAttention（默认开启）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 实测效果：12K 输入的 Agent 场景，TTFT 从 580ms → 290ms（-50%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ⭐ #2：Chunked Prefill + Continuous Batching&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--enable-chunked-prefill
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--prefill-chunk-size &lt;span style=&#34;color:#ae81ff&#34;&gt;2048&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--max-num-batched-tokens &lt;span style=&#34;color:#ae81ff&#34;&gt;8192&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 实测效果：8K 输入的并发场景，P99 TTFT 从 1.2s → 680ms（-43%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ⭐ #3：Input Length 压缩&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Agent 的 System Prompt + Tool Schema 随时间增长是最常见的 TTFT 杀手。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 策略：只保留最近的 N 轮历史（不是全部）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 策略：压缩 Tool Schema 中的 description 字段（用简短注释）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 策略：将 RAG 检索结果做摘要后再注入 Prompt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 实测效果：历史长度从 30K → 10K，TTFT 从 680ms → 340ms（-50%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ⭐ #4：提前加载 + 预热&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 在 Agent 启动前，先发送一个 dummy request 预热 GPU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 避免首次 Agent 调用的冷启动延迟（通常多 500ms-2s）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ⭐ #5：推理引擎选型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 对 TTFT 最敏感的 Agent 场景 → SGLang（RadixAttention + 精确前缀匹配）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 对吞吐最敏感的 SaaS 场景 → vLLM（Continuous Batching 更成熟）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;63-推理引擎选型决策树agent-场景&#34;&gt;6.3 推理引擎选型决策树（Agent 场景）&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Agent 场景的推理引擎选择：

你的 Agent 运行模式？
├── 单 Agent 交互（个人助手，低并发）
│   ├── 首选 SGLang：前缀复用最大，TTFT 最低
│   └── vLLM 也可：生态更大，模型支持更广
│
├── SaaS 多 Agent（高并发，32+ 会话）
│   ├── 场景偏 TTFT 敏感（对话式 Agent）
│   │   → SGLang（RadixAttention 在并发前缀场景优势放大）
│   └── 场景偏吞吐（批量 Agent）
│       → vLLM（Continuous Batching 更成熟，社区调试经验多）
│
├── 同时需要 Speculative Decoding
│   → vLLM（EAGLE-3 / P-EAGLE 集成最成熟）
│   → SGLang 的 Spec Decode 支持处于 experimental 阶段（2026 年 9 月）
│
├── 运行 MoE 模型（DeepSeek V4, Llama 4）
│   ├── SGLang：DeepEP/DeepGEMM 集成，MoE 专用 kernel
│   └── vLLM：EPLB + MRV2，差距 &amp;lt;10%
│
└── 你需要最大化的模型覆盖（非标准架构、社区模型）
    → vLLM（支持的模型列表比 SGLang 大 2-3x）
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;写在最后&#34;&gt;写在最后&lt;/h2&gt;
&lt;p&gt;拆完四层，回到开头的那个问题：&lt;strong&gt;那 8 秒去哪了？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;现在你知道答案了。——大概率不是 Tool 慢，而是推理引擎的哪一层没有做好。可能是 KV Cache 没命中（每次 Prefill 都在重算 8K 的 System Prompt），可能是没开 Speculative Decoding（每次 150 tokens 的 Tool Call 都在逐个 Decode），可能是串行调用了三个可并行的 Tool（空转等待 2 秒），也可能是 MCP 还在用 SSE + 长连接（每次 Tool 调用都在等连接建立）。&lt;/p&gt;
&lt;p&gt;Agent 的延迟优化有一个好消息和一个坏消息。好消息是：&lt;strong&gt;每一层都有现成的工具和配置&lt;/strong&gt;，不需要从零造轮子。坏消息是：&lt;strong&gt;每一层的收益是累加的&lt;/strong&gt;——只优化其中一层，用户感觉不到。只有四层都优化了，8 秒才能变成 2 秒。&lt;/p&gt;
&lt;p&gt;而在这四层中，&lt;strong&gt;TTFT 的 5 倍乘数效应&lt;/strong&gt;是最容易被忽视的杠杆——Agent 不是 Chat，每一次 Tool 调用都是一次新的推理起点。如果你今天只能干一件事，&lt;strong&gt;先把 KV Cache 前缀缓存和 Input Length 压缩做了&lt;/strong&gt;。这是 Agent 场景下从 8 秒到 5 秒的捷径，而且不需要改一行模型代码。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;本系列&lt;/strong&gt;：一、&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260910-engineering-01-rag-retrieval-precision/&#34; &gt;RAG 检索精度提升实战&lt;/a&gt; → 二、&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260914-engineering-03-tool-calling-reliability/&#34; &gt;Tool Calling 可靠性与容错&lt;/a&gt; → 三、&lt;strong&gt;Agent 推理延迟优化（本篇）&lt;/strong&gt; → 四、后续主题&lt;/p&gt;&lt;/blockquote&gt;
</description>
        </item>
        
    </channel>
</rss>
