🤖 AI Agent 工程师 · AI Agent 工程师·核心技能

成本/延迟工程:prefill vs decode、prompt caching、投机解码、模型路由 | AI Agent 工程师

别只想着换大模型——真正的杠杆在架构和推理细节里

地基:推理分两段,输出 token 才是延迟与成本的大头

做成本 / 延迟工程,第一步是理解 LLM 生成分两个阶段(NVIDIA 推理优化指南):

- Prefill(预填充)——一次性并行处理整段 prompt、算出第一个 token,是矩阵-矩阵运算,能打满 GPU 算力,属计算受限(compute-bound),决定首 token 时间(TTFT)
- Decode(解码)——按自回归逐个吐 token,每步是矩阵-向量运算、算力利用率低,瓶颈是把权重和 KV 从显存搬进 GPU 的带宽,属显存带宽受限(memory-bound),决定逐 token 间隔(ITL)

这条分界就是后面所有优化的地基:减 prompt 长度主要省 prefill / TTFT,减输出长度主要省 decode / 总时长。

🔆把推理想成做菜:prefill 是把所有食材一次性下锅爆炒,火力(算力)拉满、一下就出第一口(首 token);decode 是之后一勺一勺往外盛,瓶颈不在灶火,而在你来回跑储藏室(显存)取料的速度。所以菜(输出)越长,跑储藏室的次数越多,总耗时就越久。

由此得到一条反直觉但很实用的结论(Anthropic 降延迟文档 + NVIDIA):输出 token 通常单价高于输入 token,而且因为 decode 是逐 token、显存受限的串行过程,生成长度往往是端到端总时长的主导项——少生成 token 比少喂 token 对延迟影响更大。

Anthropic 官方给的降延迟三招正对应这点:

1. 选对模型——速度敏感的场景用更快的 Claude Haiku;
2. 优化 prompt 和输出长度——让模型简洁、用 max_tokens 设硬上限;
3. 用流式(streaming)——让首 token 尽早到达,改善体感响应。

一个细节坑:要求「按句 / 段限制」比「按精确字数限制」更有效,因为模型是按 token 而非按词计数的。

📷 配图位:一条横向时间轴,左段标「Prefill(compute-bound,决定 TTFT)」一整块并行处理 prompt,右段标「Decode(memory-bound,决定 ITL/总时长)」一个个串行吐出的小方块,箭头标注「输出越长,这段越长」

服务端三件套:KV cache / PagedAttention、连续批处理、投机解码

为了避免每步重算历史 token 的 key/value,推理会把它们缓存进显存——这就是 KV cache。它随对话动态增减,是限制并发批量大小的显存瓶颈。问题在于:朴素的连续显存分配,因内部 / 外部碎片和过度预留会浪费 60-80% 显存(即只有 20-40% 真正在存 token 状态)。

PagedAttention(vLLM) 借鉴操作系统虚拟内存的分页思想:把 KV cache 切成固定大小的非连续块,浪费只发生在每个序列的最后一块,实际浪费降到 4% 以下,从而塞下更大批量,在同等延迟下把主流 LLM 吞吐提升 2-4 倍

💡和 PagedAttention 配套的另一个降本利器是连续批处理(continuous batching,又称迭代级调度,源自 Orca 论文 Yu 等 2022):静态批处理要等整批里最长的序列生成完才释放资源,生成长度参差时 GPU 大量空转;连续批处理把调度粒度从「每个请求一次」降到「每次前向迭代一次」——某序列一生成完就立刻腾出显存槽位、把排队中的新请求插进下一次迭代,GPU 利用率大幅提高。Orca 报告相比既有系统最高 36.9x 吞吐;它与 PagedAttention 的 KV 管理结合后,成为 vLLM、TensorRT-LLM、TGI 等现代推理框架的标配。含义:同等硬件服务更多并发,就是直接降本。

第三件套是投机解码(speculative decoding)——一种无损加速。它用一个更快的小「草稿模型」一次猜出若干后续 token,再让大「目标模型」并行打分验证;配合一种修正的拒绝采样方案,最终输出分布与单独跑大模型完全一致——无损(lossless),不改输出、不需重训或改架构。

- 原论文(Leviathan 等)在 T5-XXL 上得到 2x-3x 加速且输出相同;
- DeepMind 独立工作(Chen 等)在 70B 的 Chinchilla 上得到 2-2.5x 加速,并明确其修正拒绝采样在硬件数值精度内保持目标模型分布。

它为什么有效?因为难任务里夹着大量「容易」的 token,小模型猜得准、被接受得多。

⚠️注意区分这三者解决的是不同问题,别混为一谈:PagedAttention 省的是显存(让你能开更大批量);连续批处理 省的是调度空转(提吞吐 / 并发);投机解码 省的是单条请求的 decode 时延(且严格无损)。它们可以叠加,但目标各异。

应用端省钱四招,与「只换大模型」的误区

服务端之外,作为 agent 工程师你在应用层还有四个直接杠杆:

1) Prompt caching(缓存复用前缀)。 Anthropic prompt caching 复用上次请求已处理过的 prompt 前缀。官方定价倍率:5 分钟缓存写入 = 基础输入价的 1.25 倍,1 小时写入 = 2 倍,而缓存读取仅 0.1 倍(即基础输入价的 10%)。默认 TTL 5 分钟,每次命中免费续期,所以稳定请求流能让热前缀长期存活。命中既省 token 成本(一次读取后即回本)又显著降低长文档的 TTFT。最适合稳定且高复用的前缀:工具 schema、固定指令、大段参考资料、重复示例集;注意缓存低于模型最小 token 数(多数模型 1024)则不生效

2) Batches API(异步批处理换折扣)。 对不要求实时返回的负载,Anthropic Message Batches API 异步处理:对输入和输出 token 都打 5 折(省 50%),单批最多提交 10 万个请求,承诺 24 小时内完成、多数在 1 小时内返回。适合 eval、分类、内容审核、摘要、大规模数据标注等离线任务,且批处理折扣可与 prompt caching 折扣叠加

💡3) 模型级联 / 路由(FrugalGPT)。 不同 LLM API 单价可差两个数量级(论文举例:处理 1000 万 token,GPT-J 仅 \$0.2、GPT-4 输入要 \$30,差 150 倍)。FrugalGPT(Chen、Zaharia、Zou 2023)给三类策略:prompt adaptation(精简 prompt)、LLM approximation(用缓存 / 微调小模型逼近贵模型)、LLM cascade(按置信度阈值从便宜到贵依次询问,达标就停)。其级联实例在匹配单个最强模型(GPT-4)性能的同时最高省 98% 成本。核心思想:简单查询用小模型分流,只有难查询才升级。

4) 提示压缩(LLMLingua)。 LLMLingua(Jiang 等,EMNLP 2023,微软)用一个小语言模型评估每个 token 的信息量,按由粗到细的预算控制器删冗余,把长 prompt 压缩后再喂大模型,在 GSM8K / BBH / ShareGPT / Arxiv 上达最高 20x 压缩且性能损失极小。它和 prompt caching 是互补的两条省输入成本路径——压缩减少要处理的 token,缓存复用已处理的 token。
⚠️最大的误区:把成本 / 延迟问题简单归为「模型不够强,换更大的就行」,忽视架构层面的浪费。 实测中多智能体系统约消耗普通对话 15 倍 token、单 agent 约 4 倍,token 用量是其性能与开销的主要解释变量。正确做法是先做架构级优化:模型路由 / 级联让简单任务走小模型(FrugalGPT 可省最高 98%)、prompt caching 复用前缀、提示压缩减冗余、批处理拿 50% 折扣、并行而非串行调用工具压缩端到端延迟。盲目放大模型会同时推高单价、prefill 和 decode 时间,是性价比最差的一招。

自测 · 学完检查一下

想真正动手做题、记进度、攒连胜?到互动课里练。

关于 LLM 推理的 prefill 与 decode 两段,下面哪句话是对的?

答案:Prefill 并行处理整段 prompt、算力受限,决定首 token 时间(TTFT);decode 逐 token、显存带宽受限,决定逐 token 间隔与总时长

Prefill 一次性并行处理整段 prompt、算出第一个 token,是矩阵-矩阵运算、能打满算力,属计算受限(compute-bound),决定 TTFT;decode 按自回归逐个吐 token,瓶颈是把权重和 KV 从显存搬进 GPU 的带宽,属显存带宽受限(memory-bound),决定逐 token 间隔(ITL)。因此减 prompt 主要省 prefill/TTFT,减输出主要省 decode/总时长。(出处:NVIDIA, Mastering LLM Techniques: Inference Optimization)

判断:因为 decode 是逐 token、显存受限的串行过程,且输出 token 单价通常高于输入,所以「少生成 token」往往比「少喂 token」对延迟的影响更大。

答案:正确

正确。输出 token 单价通常高于输入 token,且 decode 是逐 token、显存受限的串行过程,生成长度往往是端到端总时长的主导项——少生成 token 比少喂 token 对延迟影响更大。Anthropic 因此建议用 max_tokens 设硬上限、让模型简洁、用流式改善体感,并指出「按句/段限制」比「按精确字数限制」更有效(模型按 token 而非词计数)。(出处:Anthropic, Reducing latency;NVIDIA 推理优化)

团队要离线给一大批历史评论做情感分类,不要求实时返回,目标是把成本压到最低。下面哪个杠杆最对口?

答案:走 Batches API:异步处理,输入和输出 token 都打 5 折(省 50%),单批最多 10 万请求、多数 1 小时内返回,还能叠加 prompt caching 折扣

情感分类是典型的「可容忍延迟的离线负载」,正是 Batches API 的主场:输入输出 token 都打 5 折(省 50%),单批最多 10 万请求、承诺 24 小时内(多数 1 小时内)返回,还能与 prompt caching 折扣叠加。换更大模型只会推高单价;流式只改善体感不降成本;多 agent 反而约多用 15 倍 token。(出处:Anthropic, Batch processing)

判断:投机解码(speculative decoding)用小草稿模型先猜、大模型并行验证来加速,但代价是会轻微改变最终输出的分布、属于有损近似。

答案:错误

错误。投机解码是无损(lossless)加速:配合一种修正的拒绝采样方案,最终输出分布与单独跑大模型完全一致,不改输出、不需重训或改架构。原论文(Leviathan 等)在 T5-XXL 上得 2x-3x 加速且输出相同;DeepMind(Chen 等)在 Chinchilla 70B 得 2-2.5x 加速,并明确修正拒绝采样在硬件数值精度内保持目标模型分布。(出处:Leviathan et al. 2211.17192;Chen et al. 2302.01318)

你的 agent 性价比很差,老板说「直接换更大的模型不就完了」。按本课,下面哪个回应最站得住脚?

答案:先做架构级优化:模型路由/级联让简单任务走小模型、prompt caching 复用前缀、提示压缩减冗余、批处理拿折扣、并行调用工具;盲目放大模型会同时推高单价、prefill 和 decode 时间,性价比最差

「换更大模型就行」是典型误区,忽视了架构层面的浪费——多智能体系统约消耗普通对话 15 倍 token、单 agent 约 4 倍,token 用量是开销主因。正确顺序是先做架构级优化:路由/级联(FrugalGPT 最高省 98%)、prompt caching、提示压缩(LLMLingua 最高 20x)、批处理(省 50%)、并行而非串行调用工具。盲目放大模型会同时推高单价、prefill 和 decode 时间。(出处:Anthropic, multi-agent research system;FrugalGPT;LLMLingua)

想边练边学,而不只是读?

到互动课里答题、记进度、攒连胜——游客即可试学,无需注册。

进入互动课程 →

学点新东西,不错过更新

新课程、新功能、学习小技巧——偶尔一封,随时退订。