跳转到正文

2a · 长上下文:容量与成本 ​

长上下文有两场独立的战争:容量问“用不用得上”,效率问“付不付得起”。

5 分钟4 个概念对应详细讲义 全文

先记住 ​

  • 成本由循环决定,不由单次调用决定。 每轮把历史整体重新送进模型:每轮新增 5K,五轮后上下文只有 26K,累计处理量却是 80K,而且随轮数呈二次增长。
  • 容量与效率要分开测。 模型可以“装得下但用不好”,也可以“用得好但服务不起”;1M 窗口是宣称,能在 1M 里找到证据才是能力。
  • 前沿模型的共识是混合架构。 大多数层做廉价的地方性计算(滑窗、线性注意力、状态空间),少数层做昂贵的全局计算,比例约 3:1 到 5:1。
  • 压缩是最后手段,也是一次状态估计。 目标不是“摘要得好看”,而是让压缩后的未来动作分布接近原始历史。

核心机制 ​

缓存解决“重复”,压缩解决“装不下”,两者不能互相替代:

手段解决什么不解决什么
Prompt caching复用稳定前缀,减少重复 prefill不减少模型实际能看见的历史
上下文压缩把历史压进预算,降低干扰不保证行为不变,可能逐轮漂移
长窗口架构提高原理上可达的历史长度不保证远处证据真的被用上

缓存的价格差非常直接:多数厂商 cached input 约为 regular input 的 1/10,output 约为 regular input 的 3–6 倍。一次系统提示里加时间戳,就能让整条前缀缓存失效;所以 prompt 应该设计成“稳定前缀 + 只追加的日志”。

压缩则要满足三个互相拉扯的条件:

s^t=C(Ht; B),∣s^t∣≤B,p(Afuture∣s^t)≈p(Afuture∣Ht)\hat s_t = \mathcal{C}(H_t;\, B), \qquad |\hat s_t| \le B, \qquad p(A_{\text{future}} \mid \hat s_t) \approx p(A_{\text{future}} \mid H_t)

保留什么也有优先级:目标与硬约束逐字保留(锚点),近期动作与结果精确保留(尾部),已做的决策压成检查点,大日志外置成证据指针,重复与被取代的尝试直接丢弃。

Growth历史线性增长,累计计算二次增长
Inferenceprefill 影响 TTFT,decode 影响 TPOT
Architecture局部层 + 少数全局层
Caching稳定前缀,命中率做到 90%+
Compaction保留锚点、尾部与恢复路径

最容易错的地方 ​

  • 以为 1M 窗口就不需要压缩。 容量不等于可用性,而且每一步都要为长 prefill 付费,除非缓存命中。
  • 以为压缩能省钱。 压缩省的是可见历史;缓存省的才是重复计算。如果前缀稳定,压缩的主要收益是减少干扰。
  • 反复压缩不留锚点。 第二次压缩的输入是上一次的摘要,误差会逐轮累积:“CUDA 12.4” → “12.x” → “recent CUDA” → 消失。

30 秒自测 ​

1. 为什么 agent 的累计输入是二次增长?

答案

每一轮都要把“固定前缀 + 此前全部历史”重新送进模型,单轮输入随轮数线性增长;把每轮输入累加,总量就随轮数二次增长。

2. 压缩的目标应该怎么定义?

答案

不是还原历史,而是保持行为:压缩后的状态应让后续动作分布接近原始历史下的分布,同时大小有界、原文可找回。评测也应该用“续跑”而不是“摘要质量”。

基于 CMU 11-768 课程公开材料整理,仅供学习使用