地基:推理分两段,输出 token 才是延迟与成本的大头
做成本 / 延迟工程,第一步是理解 LLM 生成分两个阶段(NVIDIA 推理优化指南):
- Prefill(预填充)——一次性并行处理整段 prompt、算出第一个 token,是矩阵-矩阵运算,能打满 GPU 算力,属计算受限(compute-bound),决定首 token 时间(TTFT)。
- Decode(解码)——按自回归逐个吐 token,每步是矩阵-向量运算、算力利用率低,瓶颈是把权重和 KV 从显存搬进 GPU 的带宽,属显存带宽受限(memory-bound),决定逐 token 间隔(ITL)。
这条分界就是后面所有优化的地基:减 prompt 长度主要省 prefill / TTFT,减输出长度主要省 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 倍。
第三件套是投机解码(speculative decoding)——一种无损加速。它用一个更快的小「草稿模型」一次猜出若干后续 token,再让大「目标模型」并行打分验证;配合一种修正的拒绝采样方案,最终输出分布与单独跑大模型完全一致——无损(lossless),不改输出、不需重训或改架构。
- 原论文(Leviathan 等)在 T5-XXL 上得到 2x-3x 加速且输出相同;
- DeepMind 独立工作(Chen 等)在 70B 的 Chinchilla 上得到 2-2.5x 加速,并明确其修正拒绝采样在硬件数值精度内保持目标模型分布。
它为什么有效?因为难任务里夹着大量「容易」的 token,小模型猜得准、被接受得多。
应用端省钱四招,与「只换大模型」的误区
服务端之外,作为 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 折扣叠加。
4) 提示压缩(LLMLingua)。 LLMLingua(Jiang 等,EMNLP 2023,微软)用一个小语言模型评估每个 token 的信息量,按由粗到细的预算控制器删冗余,把长 prompt 压缩后再喂大模型,在 GSM8K / BBH / ShareGPT / Arxiv 上达最高 20x 压缩且性能损失极小。它和 prompt caching 是互补的两条省输入成本路径——压缩减少要处理的 token,缓存复用已处理的 token。
自测 · 学完检查一下
想真正动手做题、记进度、攒连胜?到互动课里练。
关于 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)