长上下文 Long Context
从「能写 2K」到「能读 100K+ 文档」,长上下文是近三年最卷的方向之一。面试高频问题:上下文长度到底受什么限制?RoPE 怎么外推?KV Cache 为什么吃显存?FlashAttention 省在哪?本节图文讲清。
01为什么需要长上下文
短上下文(如 2K/4K)只能处理单轮对话或短文档;长上下文让模型直接「一口气读完整本书、整个代码仓库、整段对话历史」,从而省去复杂的切分与检索。典型场景:长文档问答、代码库级补全、多轮 Agent 记忆、整本法律/医学卷宗分析。
📄 长文档理解
一次性塞入论文、报告、合同,避免 RAG 切片的召回偏差。
💻 仓库级编码
把整个项目作为上下文,跨文件推理依赖与调用链。
🧠 长程记忆
Agent 把历史轨迹放进上下文,替代外部记忆存储。
02位置编码与「外推」难题
Transformer 本身对序列长度没有先验——是位置编码把「第几个 token」注入模型。问题来了:训练时最多见过 4K 长度,推理时给 32K,模型能认得出「第 30000 个位置」吗?这就是长度外推(extrapolation)问题。
绝对位置编码
每个位置一个学习向量,长度写死,几乎无法外推——超出训练长度直接没见过。
RoPE(旋转位置编码)✅
用旋转把位置信息编码进 Q/K,相对位置可在注意力的点积中自然表达,是当前主流(LLaMA / Qwen / DeepSeek)。
RoPE 外推的核心思路:不硬撑到没见过的远距离,而是「缩放/插值」让推理时的位置分布尽量贴近训练分布。
PI(Position Interpolation)
把位置下标线性缩放 x → x·L_train/L_infer,把推理位置「压」回训练区间内。简单有效,但短距离分辨率下降。
NTK-aware / YaRN
不缩放所有频率,而是对不同频率分量区别处理(高频少动、低频多补),兼顾外推与局部精度;YaRN 是主流增强版。
03注意力复杂度与 KV Cache 显存
这是长上下文的物理瓶颈。设序列长度 n、头维度 d、层数 L、头数 h:
计算复杂度
自注意力对每个 token 都要和前面所有 token 算点积 → O(n²·d)。n 翻倍,算力约翻 4 倍。
显存(KV Cache)
每生成一个新 token,都要缓存之前所有 token 的 K、V。缓存量 ≈ 2·n·L·h·d·bytes,随 n 线性增长,但长上下文时这往往比权重还占显存。
04高效注意力:怎么把 O(n²) 降下来
MQA / GQA ✅
多查询(MQA)让所有头共享一组 K/V,分组查询(GQA)折中。KV Cache 显存直接降数倍,是长上下文落地的必选项。
FlashAttention
不把巨大的注意力矩阵物化到显存,而是分块在 SRAM 上算、只写回最终结果。省显存 + 提速,且数值等价。
滑动窗口 / 稀疏
每个 token 只关注附近窗口或关键 token(如 Mistral 的滑动窗口、StreamingLLM 的「注意力汇聚」)。牺牲全局但换长度。
线性注意力
用核技巧把 softmax 重写,复杂度降到 O(n);代价是表达力弱于 softmax,多用于超长序列辅助。
05长文本训练策略
直接拿 4K 模型去训 128K 数据,既贵又难收敛。常见「分阶段」做法:
- 继续预训练( continual pretrain ):用长文档数据,在已有短模型上继续训,让模型适应长序列分布。
- 序列并行 / Ring Attention:把超长序列沿设备切分,用环形 all-gather 跨卡算注意力,突破单卡显存上限。
- 阶段式长度课程:8K → 32K → 128K 逐步加长度,配合位置编码插值,稳定且省算力。
- 数据配比:长文本数据稀缺,需合成「书本/代码库/长对话」样本,并控制短数据比例防止遗忘。
06推理与工程优化
PagedAttention(vLLM)
像操作系统分页一样管理 KV Cache,把不连续的显存块拼起来,消除碎片,吞吐大幅提升。
KV Cache 量化
把 K/V 从 FP16 压到 INT8/INT4,显存直接减半或更多,几乎不掉点。
投机解码
小模型先「猜」多步、大模型一次验证,缓解长上下文下逐 token 慢的问题。
上下文压缩 / 召回
对过长历史做摘要或检索式裁剪,只把相关片段送进上下文(与 RAG 互补)。
07面试速记卡
瓶颈两套
算力 O(n²)(算)+ KV Cache O(n)(存),长上下文贵在两者叠加。
RoPE 外推
PI 缩放 / NTK / YaRN,让超训练长度的位置被平滑映射。
三件套
RoPE 外推 + GQA(省 KV)+ FlashAttention(省显存提速)。
并非银弹
「lost in the middle」+ 成本高,长上下文常需与 RAG 混合。