增长账单:上下文为什么会失控
讲次页用两组数字宣告长程任务必须做上下文管理——5 次调用累计 80K、1,500 个真实 session 平均 77,922 tokens——但没展开的是数字背后的机制:这本账按什么曲线涨、钱主要花在哪、瓶颈出在模型还是系统。本篇三步算清:Agent 每轮原样重发全部历史,单轮线性、累计二次;账单大头是工具结果而非对话;Capacity 与 Efficiency 两问立起坐标系,再从服务栈的 Prefill/Decode 视角看清「长 = 慢 = 贵」的物理原因。
6、17、33、54、80。一个每轮净增 5K token 的 Agent 循环,五次调用就把累计 input 推到 80K。
这本账怎么涨、钱花在哪,讲次页没有展开。本篇逐段算清,也替 2a 后续详解搭好坐标系。
一本增长账:每轮加 5K,五轮欠 80K
Agent 循环的结构性代价在于:每一轮调用,模型收到的不只是新消息,而是固定前缀加上此前的全部历史(L3 p.3):
input_t = fixed prefix + history before call t
slides 的演算如下:
| 第 t 次调用 | 本次 input | 累计 input |
|---|---|---|
| 1 | 6K | 6K |
| 2 | 11K | 17K |
| 3 | 16K | 33K |
| 4 | 21K | 54K |
| 5 | 26K | 80K |
每轮净新增恒定 5K,单轮增长是线性的;累计却近似 5K × n (n+1)/2 的二次曲线。单轮还好,累计才是要害。
五次调用只是开场。按同样斜率演算到第 50 次,累计约 6.4M token。问题从来不在窗口大小上,这种增长方式本身不可持续。
更糟的是,这份二次账单不只是 API 计费口径,它逐字压在服务端的计算上。压在哪,下文会看到。
钱花在哪:77,922 tokens 的解剖
上一节看增速,这一节看构成。OpenHands 团队对 1,500 个真实 session 做了实测(L3 p.4):平均每个 session 消耗 77,922 tokens,构成如下。
| 成分 | 占比 |
|---|---|
| 工具结果(observation) | 37% |
| 系统提示 + 工具定义 | 23% |
| 工具调用 | 20% |
| 推理(reasoning) | 9% |
| 用户输入 | 9% |
用户输入只占 9%。上下文的大头,是工具返回的内容。
工具调用加工具结果合计 57%,工具结果独占最大单项。所以 slides 把管理重点钉在工具结果而非对话本身。
这也预告了后续详解的下刀处:压缩优先处理工具结果,外置优先搬走证据原文。对话历史反而是最不用先动的部分。
系统提示加工具定义虽然只占 23%,但每轮都在、逐字不变,是「稳定前缀」的最合适候选:不变的部分可以被服务端缓存复用,变化的部分才是每轮真正的增量。
这条伏笔在 context-economy 一篇兑现成真金白银的价差。
Capacity 还是 Efficiency:先把两问分开
账单算清之后,slides 立起一张总地图(L3 p.5):长上下文的全部难题挂在两问上,本讲后面的每一种技术都能对号入座。
给定证据已经放进窗口,模型能否真的用到它。这由架构、位置编码、训练决定,主要是模型厂商的事。
这里有个关键提醒。标称窗口不等于有效窗口,GPT-4 的大海捞针实验(Kamradt 2023,L3 p.11)早已展示标称长度内的利用率并不均匀。
就算用得上,系统付得起吗。这由 attention 计算、KV 内存、缓存、压缩决定,是 Agent 工程师每天在做决策的主场。本篇下半的服务端视角属于这一问。
本讲后续的详解页就挂在这两问的枝干上:
服务端视角:长为什么等于慢、又等于贵
一个请求进入推理服务后要走完这条栈(L3 p.7-9):Scheduler 负责排队、批处理、路由,然后是预填充 / 解码两阶段,之间靠 KV cache 衔接。
KV cache 是每个请求一份的持久状态。两个阶段性格截然不同:
预填充把整段 prompt 一次算完,计算密集,延迟随长度上涨。它决定 TTFT,也就是 Time To First Token,请求到首 token 的时间。长度翻倍,attention 计算量约翻四倍。
解码逐 token 生成,内存带宽密集。它决定 TPOT,也就是 Time Per Output Token,输出 token 的间隔。历史不必重算,靠的是 KV cache 里存好的注意力状态,代价是显存随对话线性上涨。
为什么预填充的计算量随长度平方涨?复习一眼标准注意力(L3 p.10):
Attention(Q, K, V) = softmax((QK^T + M) / √d_k) · V
Q、K、V 由输入序列投影而来,QK^T 是 n×n 的矩阵:每个 token 都要与此前所有 token 两两比较,因果掩码 M 只是把未来遮掉。全序列两两比较,就是二次代价的根源(L3 p.10)。
80K 的历史每轮都要重新过一遍这样的比较,除非命中缓存。
系统研究就沿这个问题展开:
- Prompt Cache (MLSys 2024, arXiv:2311.04934):把重复提示段的 attention 状态预计算、跨请求复用,GPU 首 token 延迟降低 8 倍。
- DistServe (OSDI 2024, arXiv:2401.09670):把预填充与解码拆到不同的卡上消除相互干扰,同等服务目标下多服务 7.4 倍请求。
- Can I Buy Your KV Cache? (arXiv:2606.13361):2026 年把问题推成经济问题,追问一份文档的 KV 为什么不能由出版方算一次、全世界付费加载。作者在 Qwen3-4B 上实测,复用相比重算省 9-50 倍计算。
落到你的账单上,就是 input + cached input + output 三段计费里的 cached input 一档(L3 p.9)。这段价差怎么吃满,是 context-economy 一篇的主题。
与本讲的连接
本篇是 2a 的总账本,后续每一篇详解都放得回这张地图。资料卡从 Prompt Cache、DistServe、KV 缓存管理综述三张入手。增长的账躲不开,能省的都在 cached input 一档的价差里,context-economy 一篇接着算。
本节论文与规范
本节资料
- DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving 论文2401.09670进阶
经典·高引。指出 prefill 与 decode 两相位在同一卡上互相干扰:一条长前缀的预填充能把旁人正在流式输出的解码拖出 SLO 违约。分卡部署(PD 分离)后,同等延迟承诺下可多服务 7.4 倍请求——今天各家推理集群的 PD 分离架构多源于此。长上下文越长,这篇越值得读。
- From Tensor Buffer to Distributed Memory Hierarchy: A Survey of KV Cache Management for LLM Serving 论文2607.02574前沿
2026-06 新综述。把 30 多个 KV 缓存管理系统按局部性、生命周期、所有权、载体四轴分类,归纳出本地分页、分离流水线、共享存储、内存池、混合分层五种架构原型,并点名容错、MoE 服务等开放问题。给「KV 缓存线性显存」这座大山画最新全景地图。
经典·高引。提示缓存的系统论文源头:把反复出现的提示段落预计算成可复用的 attention 状态块,运行时按模块拼装,GPU 首 token 延迟最高降 8 倍。API 侧「缓存读一折」定价的学术根基——读懂它,各家提示缓存的价差与失效规则就透明了。
AI 生成 · 仅供参考,与课程方无关。选中正文里的任何一段也能直接问我(解释一下 / 举个例子)。
本详解以 CMU 11-768 AI Agents (Fall 2026) 课程大纲为参考框架独立撰写,AI 辅助起草、人工抽审。 涉及的官方课件、论文与课程材料版权归原所有方,讲义为站内镜像、其余外链原文出处; 观点与文字(除标注引用外)为作者原创。