8.2 长上下文:从 4K 到百万 token
一场军备竞赛
2020 年的 GPT-3,上下文窗口只有 2048 个 token——大约半篇论文,聊天稍长一点它就把开头忘了。到 2025 年,旗舰模型的窗口已经卷到百万级:一次塞进几本书、整个代码仓库、几小时的会议记录。
五年一千倍。这不是把一个数字改大那么简单——每一步都在跟三笔账单搏斗。
为什么长上下文这么难
第一笔:计算的平方账。 3.1 节深入层埋过一个伏笔:注意力要让每个 token 和其他所有 token 打交道,计算量是 ——现在正式兑现。上下文从 4K 涨到 400K,长度涨 100 倍,注意力计算涨 10000 倍。
第二笔:显存的线性账。 6.2 节算过:KV Cache 随上下文长度线性膨胀。百万 token 的缓存动辄几十上百 GB——比模型本身还大,一张卡直接被「记忆」撑爆。
第三笔:训练的分布账。 语料里超长文档本来就稀缺(互联网上大多是短文),而且模型在 4K 长度上训练后,3.3 节的位置编码没见过第 100 万号「工牌」——直接外推会失灵。好在 RoPE 有个漂亮的性质:把旋转的「基频」调慢(相当于把钟表指针放慢,同样的表盘覆盖更长的时间),配合少量长文本继续训练,就能把窗口拉长好几倍。
工程组合拳
实际的长上下文方案是一套组合拳,而且几乎每一招你都在前面见过原理:稀疏/滑动窗口注意力砍平方账(不是每个 token 都需要看所有人)、RoPE 频率缩放解决位置外推、**GQA(分组查询注意力)**给 KV Cache 瘦身(6.4 节提过)、再配上 4.5 节家族新增的序列并行把超长序列切到多卡上训练。
还有一招,它一个字都没改
上面那些招数有个共同点:都在削减计算量——少看几个 token、把窗口开小一点。换句话说,它们都是用「看得少一点」换「跑得快一点」,多少要牺牲些效果。
但工业界最常用的那一招不在这个名单里,因为它走的是完全相反的路:
FlashAttention(2022)一个 token 都没少看,算出来的结果和标准注意力分毫不差——它只是换了个存取数据的方式。
要理解它,先要接受一个反直觉的事实:注意力慢,主要不是因为算得多,而是因为搬得多。
GPU 上有两种存储:一小块极快的片上缓存(几十 MB,快),和一大片显存(几十 GB,慢,就是你买卡时看的那个数字)。标准注意力的做法是:算出那个 的巨大注意力矩阵 → 写进慢的显存 → 再读回来做 softmax → 再写回去 → 再读出来加权求和。矩阵越大,这一趟趟搬运越费时间。真正的瓶颈是搬运,不是乘法——这和 6.1 节说的「解码卡在搬运」是同一个道理。
FlashAttention 的主意是:别把那个大矩阵写出来了。 把 Q、K、V 切成小块,一次搬一小块进快缓存,在里面把这一块的乘法、softmax、加权求和一口气做完,只把最终结果写回显存。那个 的中间矩阵从头到尾没有在显存里完整出现过。
效果是双份的:显存占用从 「随长度平方增长」降到「随长度线性增长」,实测速度快出好几倍——而且因为数学完全没变,你不需要为此付出任何精度代价。
这就是为什么 2023 年之后几乎所有训练框架都默认开着它:滑窗和稀疏是要你做取舍的,FlashAttention 不用。
说清楚一件事:FlashAttention 没有把平方账变成线性账。词对数量还是 个,乘法一次都没少算——省掉的是显存的读写次数和中间矩阵的存储。
所以本节开头那笔「长度涨 100 倍、计算涨 10000 倍」的账依然成立。FlashAttention 让你在同样的硬件上把这堵墙往后推了几倍,但墙还在那儿。真要突破平方,还得靠滑窗、稀疏那些会改变数学的办法——两条路是叠加使用的,不是二选一。
「大海捞针」:长了,但读懂了吗
标称一百万,实际行不行?业界流行的体检叫大海捞针(needle in a haystack,2023 年起流行):在超长文本的任意位置藏一句无关的话(「小明最喜欢的颜色是蓝色」),看模型能否准确捞出。2024 年后的旗舰模型在这项测试上普遍接近满分——但别高兴太早:捞针只考「查找」。要求模型对百万 token 做真正的综合推理(对比两章观点、追踪一条跨越全书的线索)时,成绩仍明显 掉队(2024-2025 年多项长文推理评测的共同结论)。
另外常有人问:有了百万上下文,还需要外接检索(RAG)吗?目前的共识是互补:检索负责从海量库里粗筛,长上下文负责把筛出的材料一次读透——一个是图书馆的索引卡,一个是更大的书桌。长上下文并没有取代 RAG,两者是搭档——这笔账(成本、窗口上限、精度)本站中篇 K7.3「RAG vs 长上下文」用一个计算器算给你看。
厂商标称的「支持 X token」只承诺能塞进去,不承诺在 X 长度下依然聪明。有效上下文(性能不明显衰减的长度)常常显著短于标称值,而且不同任务衰减速度不同。看长上下文能力,别只看一个数字,要看「长度-性能」曲线(2025 年的评测惯例)。
- 长上下文的三大敌人:注意力的 计算、KV Cache 的线性显存、位置编码的外推失灵。
- 解法是组合拳:滑窗/稀疏注意力、RoPE 频率缩放、GQA 瘦身缓存、序列并行。
- FlashAttention 是其中唯一「不改数学」的一招:靠分块 + 在线 softmax 让巨大的注意力矩阵不落显存,显存降到线性、速度快几倍、精度零损失——但它没有消掉 的计算量。
- 大海捞针满分只代表「查得到」,长文综合推理仍是普遍短板(2025)。
- 标称窗口 ≠ 有效窗口,看长度-性能曲线才算数。
延伸阅读
- FlashAttention (Dao et al., 2022)——「注意力是访存瓶颈而非计算瓶颈」这个洞察的原始论文。
- Lost in the Middle (2023)——长上下文的经典病灶:中间部分的信息最容易被忽略。
- Mamba (2023)——换掉注意力的代表作,了解「另一条路」长什么样。
- 下一节 8.3 多模态:文字之外,图像和声音怎么进模型。