上下文窗口的标称数字经历了三年三个数量级的膨胀:GPT-3 时代 2K,GPT-4 Turbo 128K,Gemini 1.5 到 1M,Llama-4 标称 10M。但这个数字与"模型真正能在多大范围内工作"之间有一道深沟------评测研究反复发现,128K 标称的模型在 64K 处已经开始丢针。把这道沟拆开,会看到长上下文的瓶颈其实经历了三次转移:从注意力的二次方计算,转移到 KV Cache 的存储,再转移到长任务的供给与评测。本文沿这三层往下拆,最后回到那个最实际的问题:标称与有效之间差了什么。
一、位置编码:RoPE 怎么被拉长
模型看不懂 128K 的第一个障碍不是算不动,而是位置没学过 。主流位置编码 RoPE 把每个维度变成不同频率的旋转角,位置 mmm 的旋转量是 mθim\theta_imθi:
python
import numpy as np
def rope_freqs(d, base=10000):
# θ_i 从高频到低频排列: 前几维相邻 token 旋转角大(细粒度), 末尾维度慢(粗粒度)
return 1.0 / base ** (np.arange(0, d, 2) / d)
def pi_freqs(d, base, s): # Position Interpolation: 位置 m → m/s
return rope_freqs(d, base) / s
def ntk_base(d, base, s): # NTK-aware: 换基底, 只压低频
return base * s ** (d / (d - 2))
def yarn_temp(s): # YaRN: 注意力温度随拉伸量微升
return 1 + 0.1 * np.log(s)
训练时模型只见过 m<Ltrainm < L_{\text{train}}m<Ltrain 的旋转量。直接把窗口开到 4 倍,高频维度进入从未见过的快速旋转(类似信号混叠),注意力立刻崩坏。三代外推方案本质都是"把没见过的位置映射回见过的区间",分歧在牺牲什么:
- PI (Meta, 2023):位置整体除以 sss。所有频率等比压缩,等效降低了位置分辨率------需要少量微调(千步级)找回精度
- NTK-aware:改 RoPE 基底。低频段(管粗位置)被压缩、高频段(管细位置)不动------细粒度位置信息无损,多数场景可零样本生效
- YaRN :分段处理高低频 + 温度修正 1+0.1lns1+0.1\ln s1+0.1lns,微调几百步即可到 128K,是 Qwen2.5、Llama-3.1 这代 128K 模型的标准配方
一个可信的工程侧写是 RoPE 基底的膨胀轨迹:Llama-2 用 10K,Llama-3 直接改 500K,CodeLlama 上探 1M------基底就是留给长度的预留带宽,新一代模型在预训练阶段就开始为长上下文付费。
二、训练侧:扩展是继续训练,不是重新发明
128K 能力不是外推白拿的,代价是一轮中等规模的继续训练。流程已高度模板化:改基底(或换 YaRN 频率表)→ 按课程从 8K 渐进到 128K → 数据里掺入专门构造的长任务(书级问答、跨章节指代、仓库级代码补全),量级在数千亿 Token。这里有个数据现实:网络上的自然长文档极其稀缺,超过 32K 的连贯文本主要是书、代码库和学术论文,所以长上下文数据一半靠筛、一半靠造(合成多跳问答、结构化聚合任务)。
训练系统侧的账同样变了。注意力对序列长度是二次方,激活显存随 LLL 线性膨胀,单卡装不下 128K 的中间结果------解法是序列并行(Context Parallelism / Ring Attention):把序列切成段分到多卡,KV 块沿环状拓扑逐卡传递,每卡在本地段与所有路过段上算注意力。通信量与序列长度线性相关,这是长上下文训练没有随二次方爆炸的直接原因;代价是延迟敏感的环同步,让 MFU 相比短序列训练打了一定折扣。
三、存储侧:KV 的经济学
算力问题解决后,KV Cache 接棒成为长上下文的主矛盾。接回 KV 尺寸公式(Llama-3.1 70B,GQA,约 320 KB/Token):
python
def kv_gb(tokens, kb_per_tok=320):
return tokens * kb_per_tok / 1e6
for L in [4_000, 128_000, 1_000_000, 10_000_000]:
print(f"{L:>12,} tokens: {kv_gb(L):>8.0f} GB")
# 4,000: 1 GB ------ 单卡轻松
# 128,000: 41 GB ------ 单卡贴脸
# 1,000,000: 320 GB ------ 必须跨机/卸载
# 10,000,000: 3,200 GB ------ 一台 8 卡 H100 机器的 5 倍
128K 一档,KV 就吃掉半张 H100;1M 一档,单请求 KV 超过整机显存。这组数字解释了长上下文服务系统的全部设计:
- KV 卸载与分层(cascade):热 KV 留 HBM,温层落 CPU 内存,冷层落 SSD,按注意力访问的时间局部性逐层搬运------分层的代价是 PCIe/网线带宽,收益是单机服务的上下文容量提升一个数量级
- KV 池化(Mooncake 路线):把 KV 提升为一等公民资源,独立成池、跨节点租借。prefill 算完的 KV 直接传输给 decode 节点,而不是让 decode 节点重算------长 prompt 场景下 KV 传输(数百 GB 级带宽网络)比重算(数万 GPU 秒)便宜两个量级
- 前缀复用:多轮 Agent 每轮都要重放全部历史,prefix caching 让历史部分的 KV 永远只算一次。上下文越长,这份复利的价值越大------这是 Agent 应用在长上下文时代的隐形生命线
再叠上第 5 篇拆过的 KV 量化(int8 减半、int4 凑 1/4),三招合起来才是 1M 级服务在工程上成立的原因。
四、架构侧:让注意力本身稀疏
以上都是"二次方照算,算完再治"。另一条线是直接动注意力:上下文的注意力矩阵本身高度稀疏------大量 Token 对的注意力权重接近零,为它们花算力是纯浪费。
最早的免费午餐是滑窗 + 注意力沉锚(StreamingLLM):只算局部窗口,但永远保留前几个 Token(沉锚)。反直觉的事实是初始 Token 对维持注意力的分布稳定至关重要,丢掉它们而不是丢中间段落,无限流式生成才稳。Gemma-2/3 的层间交替(每 6 层 1 层全局、其余层 4096 窗口)、Jamba 的 1:7 比例混排,都是"少数全局层 + 多数局部层"的省钱结构------推理成本骤降,长程依赖由少数全局层兜底。
2025 年的新一代是可学习的块稀疏(DeepSeek NSA、Moonshot MoBA),思路与 MoE 篇的路由同构------粗粒度打分、选 top 块、只算选中的:
python
def block_sparse_gate(q, k, blk=64, top=16):
"""概念版 MoBA/NSA 路由: 块级 top-k 选择"""
nb = k.shape[-2] // blk
block_mean = k.view(nb, blk, -1).mean(1) # (nb, d) 每块均值代表
scores = q @ block_mean.T # (T, nb) 粗粒度打分
idx = scores.topk(top, dim=-1).indices # 每 token 只选 top 块
return idx # 精确注意力只在 T×top×blk 上算, 128K 时节省 ~10×
与 MoE 的路由器不同,这里的路由是训练时与主干联合优化的(NSA 称 native sparse attention),不存在负载均衡问题------Token 天然可以挤向同一块。关键优势是 KV 也随稀疏性减负:没被选中的块理论上可以不驻留热层。再加上第 2 篇拆过的线性注意力一系(Mamba/混合架构)在长序列上的恒定状态推理,这个方向的主线已经清晰:长上下文的架构答案不是更快的二次方注意力,而是把二次方降为线性或近线性的结构稀疏。
五、有效上下文:标称与有效之间差了什么
以上全部是"让长窗口在工程上成立"。剩下的问题更锋利:窗口开到了,能力跟上了吗?
大海捞针 (针埋在长文本某处,问模型针在哪)曾是标配评测,但它测的是检索------一个接近纯匹配的任务,模型在 128K 全程接近满分,给市场造成了"128K 可用"的印象。NVIDIA 的 RULER 把任务换成多跳、聚合、计数之后,宣称 128K 的主流模型有效长度普遍缩水到 32~64K;更严格的 NoLiMa(2025)显示,一旦答案需要间接推理而非精确匹配,性能在不足 1K 时就开始衰减。检索能力跑得远,推理能力才是短腿------这与架构无关,是分布层面的问题:训练数据里几乎没有"必须综合 80K 跨度信息才能回答"的自然样本,合成长任务补的就是这块,但供给仍然远落后于窗口的膨胀。
第二个已知缺陷是位置偏置(lost in the middle):信息藏在上下文中段时命中率显著低于首尾------注意力分布天然偏向两端。多针场景里它以"召回率随针数增加而非线性下滑"的形式显形。
第三个是信源冲突:上下文里的信息与参数记忆打架时,模型并不总听上下文的------这决定了长上下文与 RAG 的分工边界。长上下文擅长"少量信源、深推理",RAG 擅长"海量信源、浅检索";"用 1M 窗口装下整个知识库替代检索"的叙事在这三项缺陷面前站不住。
| 层 | 解决的问题 | 代表技术 | 代价 |
|---|---|---|---|
| 位置编码 | 没见过的位置 | PI / NTK / YaRN | 分辨率 / 微调 |
| 训练 | 长程能力 | 课程 + 合成长任务 + 序列并行 | 继续 GPU 时间 |
| 架构 | 二次方计算 | 滑窗+沉锚、块稀疏、线性注意力 | 长程依赖覆盖 |
| 系统 | KV 存储 | 卸载分层、KV 池、前缀复用、量化 | 带宽与复杂度 |
| 评测 | 标称≠有效 | RULER / NoLiMa / 多针 | --- |
六、收束
把这张表纵向读一遍,能看到瓶颈的迁移路径:2023 年的问题"注意力算不动"已由架构稀疏与序列并行解决;2024 年的问题"KV 存不下"正由分层与池化解决;2025 年仍未解决的是**"值得开长窗口的任务供给与可靠度量"**。前两层是硬件工程,进展以月计;最后一层是数据与评测科学,进展以年计------这也是为什么各家敢于竞速标称数字,而没有人敢竞速有效数字。
一句话收束:窗口长度已经从技术问题变成了宣传口径,真正的竞争发生在有效上下文------那个由任务复杂度、位置鲁棒性和信源仲裁共同决定的、安静得多的数字上。