Long Context · 面试核心

长上下文 Long Context

从「能写 2K」到「能读 100K+ 文档」,长上下文是近三年最卷的方向之一。面试高频问题:上下文长度到底受什么限制?RoPE 怎么外推?KV Cache 为什么吃显存?FlashAttention 省在哪?本节图文讲清。

01为什么需要长上下文

短上下文(如 2K/4K)只能处理单轮对话或短文档;长上下文让模型直接「一口气读完整本书、整个代码仓库、整段对话历史」,从而省去复杂的切分与检索。典型场景:长文档问答、代码库级补全、多轮 Agent 记忆、整本法律/医学卷宗分析。

📄 长文档理解

一次性塞入论文、报告、合同,避免 RAG 切片的召回偏差。

💻 仓库级编码

把整个项目作为上下文,跨文件推理依赖与调用链。

🧠 长程记忆

Agent 把历史轨迹放进上下文,替代外部记忆存储。

注意权衡:长上下文 ≠ 一定更好。越长越贵、越易「中间遗忘」(lost in the middle),许多任务上 长上下文 + RAG 混合 才是性价比最优解。

02位置编码与「外推」难题

Transformer 本身对序列长度没有先验——是位置编码把「第几个 token」注入模型。问题来了:训练时最多见过 4K 长度,推理时给 32K,模型能认得出「第 30000 个位置」吗?这就是长度外推(extrapolation)问题。

绝对位置编码

每个位置一个学习向量,长度写死,几乎无法外推——超出训练长度直接没见过。

RoPE(旋转位置编码)✅

用旋转把位置信息编码进 Q/K,相对位置可在注意力的点积中自然表达,是当前主流(LLaMA / Qwen / DeepSeek)。

RoPE 外推的核心思路:不硬撑到没见过的远距离,而是「缩放/插值」让推理时的位置分布尽量贴近训练分布。

训练分布(0 ~ L_train) vs 推理要覆盖(0 ~ L_infer,L_infer≫L_train) 训练见过的位置 推理时想要覆盖的全长度(外推区 = 虚线外侧) ↑ 外推/插值 让右侧「没见过」的位置被平滑映射

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 线性增长,但长上下文时这往往比权重还占显存。

一句话:算力吃在「算」上(O(n²)),显存吃在「存」上(O(n) 的 KV Cache)。长上下文之所以贵,是两个瓶颈叠加。
注意力矩阵随长度平方膨胀(n=4 → 16 格;n=8 → 64 格) → n 翻倍 → O(n²) 爆炸

04高效注意力:怎么把 O(n²) 降下来

MQA / GQA ✅

多查询(MQA)让所有头共享一组 K/V,分组查询(GQA)折中。KV Cache 显存直接降数倍,是长上下文落地的必选项。

FlashAttention

不把巨大的注意力矩阵物化到显存,而是分块在 SRAM 上算、只写回最终结果。省显存 + 提速,且数值等价。

滑动窗口 / 稀疏

每个 token 只关注附近窗口或关键 token(如 Mistral 的滑动窗口、StreamingLLM 的「注意力汇聚」)。牺牲全局但换长度。

线性注意力

用核技巧把 softmax 重写,复杂度降到 O(n);代价是表达力弱于 softmax,多用于超长序列辅助。

落地结论:现实长上下文模型几乎都是 RoPE 外推 + GQA + FlashAttention 三件套打底,再叠加窗口/稀疏等策略。

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 互补)。

关联:KV Cache 与推理部署、量化见《模型推理部署总览》与《模型量化详解》;RAG 对比见《RAG 检索增强生成》。

07面试速记卡

瓶颈两套

算力 O(n²)(算)+ KV Cache O(n)(存),长上下文贵在两者叠加。

RoPE 外推

PI 缩放 / NTK / YaRN,让超训练长度的位置被平滑映射。

三件套

RoPE 外推 + GQA(省 KV)+ FlashAttention(省显存提速)。

并非银弹

「lost in the middle」+ 成本高,长上下文常需与 RAG 混合。

关联:注意力机制基础见《Transformer 注意力机制图解》;位置编码见《Transformer 详解》;Agent 记忆场景见 agent 目录。