5-长上下文建模
长上下文不是单纯把窗口拉大,而是系统级问题。
1. 长上下文问题的本质
1.1 什么是长上下文
语言模型的核心能力之一是条件生成:在已知前缀
长上下文问题(Long Context Problem)的本质在于:当序列长度增大时,模型并非同等有效地利用了序列中的每一个位置。
这个问题有三个相互关联的维度:
- 有效上下文长度(Effective Context Length):模型真正能”看见”并影响输出的_token范围_,而非技术上限。
- 信息密度不均:序列中不同位置的信息对当前预测的贡献差异极大。近期 token 通常贡献更高,远期 token 的信息往往被”稀释”。
- 远距离依赖(Long-range Dependency):某些任务(如指代消解、逻辑推理)要求模型建立首尾关联,但这种依赖信号在长序列中极易被中间信息覆盖。
1.2 注意力机制的结构性瓶颈
标准的多头自注意力(Multi-Head Self-Attention, MHSA)是大多数 Transformer 语言模型的核心,其计算可分解如下。
给定输入序列
注意力权重矩阵的计算:
最终的输出:
计算复杂度分析:计算
当
1.3 远距离依赖为何难以捕获
Transformer 的自注意力允许任意两个位置直接交互(全局注意),理论上没有距离偏置。但实践中,远距离依赖难以捕获,原因有三:
- Softmax 的”赢者通吃”特性:Attention 分数经 softmax 后趋于极化,每个 Query 通常只聚焦在少数几个 Key 上。远距离 token 之间的语义关联往往比近距离的弱,注意力更容易被局部信息”劫持”。
- 位置编码的衰减:大多数位置编码方案(绝对位置编码、RoPE 等)对远距离位置的编码与近距离差异显著,模型难以建立统一的位置关系认知。
- 优化难度:在随机梯度下降中,远距离依赖的梯度信号需要经过多次矩阵乘法才能传回首端,容易出现梯度消失或退化。
2. 位置编码在长上下文中的作用
2.1 主流位置编码方案
| 方案 | 公式 | 外推能力 | 长上下文表现 |
|---|---|---|---|
| 绝对位置编码(APE) | 差,需微调 | 受限于训练长度 | |
| 相对位置编码(RPE) | 关注 Query-Key 位置差 | 较好 | 外推性优于 APE |
| RoPE(旋转位置编码) | 优秀 | 支持 128K+ 外推 | |
| ALiBi | 注意力分数上叠加线性偏置 | 良好 | 无需位置编码参数 |
RoPE(Rotary Position Embedding)是目前主流长上下文模型(如 LLaMA、Qwen、DeepSeek)采用的核心方案。其核心思想是将位置信息编码为旋转矩阵,使 attention 计算只依赖于 Query 和 Key 之间的相对位置差。
设
其中
2.2 位置编码的长度外推问题
即使模型支持
- NTK-aware Scaling(如 llama.cpp 的 rope_scale):在超出训练范围时动态调整 base frequency,延迟外推失败。
- 位置编码插值(PI / CodeGeex):将超出范围的位置索引压缩到训练区间内,如
。 - YaRN:结合注意力缩放和插值,对远距离维度施加更重的缩放。
3. 长上下文建模方法分类
3.1 稀疏注意力(Sparse Attention)
核心思想:将全
- 滑窗注意力(Sliding Window / Local Attention):每个 token 只 attend 半径
内的 token,复杂度 。适合捕捉局部结构,但无法建模跨文档的远距离依赖。 - 稀疏注意力模式:BigBird、Longformer 等通过滑窗 + 全局 token + 随机采样的组合,覆盖局部 + 全局视野。
- 静态稀疏 vs 动态稀疏:静态稀疏预先定义注意力模式;动态稀疏(如 Longformer 的 Dilated Attention)根据输入内容自适应选择 attend 的位置。
代表模型:BigBird(ICML 2020)、Longformer(AllenAI,2020)、ETC(Natural Questions 2020)、H2O(Hard Harder Omitted)等。
3.2 线性注意力(Linear Attention)
核心思想:利用注意力矩阵的结构性质,将
标准注意力的计算可以重写为:
线性注意力的关键是核函数近似:用特征映射
这种形式允许将
代表模型:Mamba(State Space Model,2023)、RetNet(Microsoft,2023)、GLA(Gated Linear Attention,2024)。
局限性:线性注意力在理论上具有
3.3 分块注意力(Chunked Attention / Blockwise Attention)
核心思想:不改变注意力机制本身,而是在工程层面将长序列划分为多个 chunk,分别处理后在 chunk 间传递信息。
- StreamingLLM(2023):维护一个”汇聚 token”(attention sink),始终保留近
个 token 的 KV cache,丢弃中间 token,在文本生成时逐段streaming。 - StreamingLLM + Pagoda:进一步将汇聚 token 分层,降低信息损失。
- Chunkwise attention in Megatron-LM:将序列划分为 block,在 block 内做全注意力,block 间做稀疏或层级注意力。
代表模型:FlashAttention 系列通过 tiling 和 tiling + 反向重计算,在不存储完整注意力矩阵的情况下完成注意力计算,本质上也是一种分块策略(chunked / blockwise computation)。
3.4 记忆增强(Memory-Augmented)
核心思想:引入外部记忆模块,将长序列的信息压缩存储,查询时从记忆模块检索相关记忆。
- Memory Transformer:维护一个外部 memory matrix,在生成时将 memory 通过 attention 融入上下文。
- Compressive Transformer(DeepMind,2020):引入二级记忆——将对长序列的压缩表示存入”压缩记忆”,实现更高效的远期信息保留。
- RMT(Recurrent Memory Transformer):在序列中插入特殊的 memory tokens,这些 tokens 的 hidden state 在 segment 间传递,实现隐式 recurrence。
3.5 外部检索增强(RAG, Retrieval-Augmented)
外部检索增强将在本文第 6 节专门讨论。
4. “能看更长”不等于”真的理解更好”
这是一个核心工程认知误区:将上下文窗口从 4K 扩展到 128K,并不自动意味着模型在长距离依赖任务上的性能等比例提升。
4.1 注意力分散问题
当上下文从 4K 扩展到 128K,同一个 Query 在
Needle in a Haystack(NIAH)测试:在长文本中插入一个特定信息(如”The special token is XYZ”),要求模型在 128K 文本中准确定位。许多模型在 NIAH 上表现尚可,但在需要多跳推理(跨越多个远距离段)的任务上急剧下降。
4.2 训练数据分布的mismatch
模型的上下文建模能力是由训练数据中的上下文长度分布决定的。如果训练数据中 99% 的样本在 4K 以内,只有 1% 在 4K-128K,即使模型架构支持 128K,在 4K-128K 区间也会表现不佳。这是**分布偏移(distribution shift)**问题,而非架构问题。
4.3 位置编码的退化
在超长序列上,远端位置的位置编码与训练时见过的范围差异过大,导致模型对远端 token 的位置感知退化,即使注意力权重正确分配给了远端 token,其表示质量也会下降。
4.4 有效上下文长度 vs 技术上下文长度
| 维度 | 技术上下文长度 | 有效上下文长度 |
|---|---|---|
| 定义 | 架构支持的最大输入长度 | 模型实际能可靠利用的输入范围 |
| 决定因素 | 位置编码外推能力 + 注意力架构 | 训练数据长度分布 + 任务类型 |
| 度量方式 | 架构设计 | NIAH 准确率、多跳推理任务表现 |
实践建议:在评估长上下文模型时,不要只看技术上限(128K),而要在具体的任务上测有效上下文长度。例如,在书籍摘要任务上测 32K 性能,而非仅凭 NIAH 通过率下结论。
5. 长上下文训练与推理的差异
5.1 训练成本
标准注意力训练的显存开销:
对于序列长度
- 注意力权重矩阵
: 显存(无法压缩,因为 softmax 需要逐行归一化) - KV Cache:在自回归训练中需要缓存所有位置的 Key 和 Value 向量,显存为
( 为层数) - 对比:
时,仅 KV Cache(假设 )就需要约
长上下文训练的三大工程挑战:
- 显存墙:
的注意力矩阵在 时已经不可接受。需要 FlashAttention-2/3 的 blockwise 计算 + 重计算策略来降低峰值显存至 量级。 - 计算墙:
的计算量在 时约是 时的 1024 倍。单卡日费数美元,训练数千卡集群的月费更是天文数字。 - 通信墙:在分布式训练中,跨设备传递注意力结果的开销在高带宽网络上尚可接受,但在跨机架场景下会成为瓶颈。
5.2 推理成本
推理阶段的成本结构与训练不同,主要体现在 KV Cache 的存储和读取:
- Prefill 阶段:对整个输入序列做一次前向传播,需要存储完整 KV Cache。
、 、 时,KV Cache 约 (半精度),这已经超过单张 H100(A100 80GB)的显存容量。 - Decode 阶段:每次生成一个 token,都需要读取完整 KV Cache。
时,每次 decode step 的 KV Cache 读取量约 64 GB,而 HBM 带宽约 3.35 TB/s(双精度全量传输理论上限),实际每秒约能完成数十次 decode step。
长上下文推理的优化方向:
- KV Cache 量化:FP8/INT4 量化可将 KV Cache 压缩 2-4 倍。
- Page Attention(vLLM):将 KV Cache 分页管理,按需加载,而非一次性全量驻留显存。
- Prefix Caching:对于系统 prompt 等固定前缀,KV Cache 可在不同请求间共享。
- Streaming + Chunked Decode:不存储全量 KV Cache,边生成边”驱逐”过期 token(如 StreamingLLM)。
5.3 训练与推理的gap
| 维度 | 训练 | 推理 |
|---|---|---|
| 注意力模式 | Full attention(需要看到所有 token 来计算损失) | 通常也是 full attention(prefill 阶段) |
| KV Cache | 不需要缓存(单向推理) | 需要全量 KV Cache(prefill)+ 增量更新(decode) |
| 显存峰值 | 激活值 + 梯度 + 优化器状态 | 激活值 + KV Cache + 模型权重 |
| 计算量 | Prefill: | |
| 主要瓶颈 | 计算墙 + 通信墙 | 显存墙(KV Cache)+ 带宽墙(Cache 读取) |
6. 工程流程
6.1 长文本数据构造
长上下文训练的第一步是构建长文本数据集。常见策略:
- 书籍与文档拼接:将多篇文章或书籍章节拼接,中间用特殊分隔符(如
[EOS]$_1$、$_2$)隔开。确保拼接后序列包含足够的远距离依赖(跨文档指代、主题一致性等)。 - 长文本采样:从原始长文档(论文、书籍、报告)中直接采样固定长度的片段,随机选择起始位置。
- 模拟远距离关联数据:刻意在序列头部插入”问题提示”,在序列尾部插入”答案”,测试模型是否真正建立了跨距离依赖。
- 长度上采样:对短文本做重复拼接,构造看似”长”但实际信息密度低的样本,用于训练位置编码的外推能力(但需控制比例,避免模型过度依赖重复模式)。
质量注意点:避免构造只有局部依赖但人为拉长的数据(如大量无意义重复),这会导致模型学到”短程依赖 + 重复”的捷径。
6.2 长度 Curriculum(课程学习)
直接从最大长度(如 128K)开始训练会导致收敛慢、显存溢出。常用的 curriculum 策略:
阶段1: 短序列(4K以内) → 学习词汇、基础语法、局部语义
阶段2: 中等序列(8K-32K) → 学习段落级语义、跨句依赖
阶段3: 长序列(64K-128K) → 学习文档级推理、长距离依赖、检索定位
- 逐步扩展(逐步长度扩展):每隔数千步,将最大长度乘以某个因子(如 2x),而非一次性跳到最大值。
- 混合长度抽样:在每个 batch 内混合不同长度的样本,避免模型遗忘短序列的处理能力。常见比例:短:中:长 = 7:2:1。
- 温度抽样:在课程学习的早期阶段,高频抽样短序列;后期逐渐增加长序列比例。
6.3 监控远距离依赖是否被学到
评估指标:
- NIAH(Needle in a Haystack)准确率:单针(准确检索特定信息)、多针(同时定位多个信息点)。
- 多跳推理任务:如 HotpotQA(需要两个文档的信息联合推理)、MuSiQue(多跳问答)。
- 文档级摘要 / 信息抽取:在长文档上测试摘要质量和关键信息抽取准确率。
- 位置编码外推测试:在超出训练长度 50% 的序列上测试,验证外推能力是否退化。
- 注意力分布可视化:观察在长序列中,attention sink 是否稳定,重要 token 是否被正确 attend。
训练过程中的监控:
- 每隔
步在验证集上测量不同长度区间的 perplexity,特别关注长序列 perplexity 是否随训练改善。 - 如果长序列 perplexity 不降反升,说明课程学习的步调过快,应放缓长度扩展速度。
6.4 控制显存 / 吞吐 / 延迟
| 优化手段 | 作用 | 代价 |
|---|---|---|
| FlashAttention-2/3 | 将注意力计算分块,峰值显存从 | 计算量略增(重计算),需硬件级优化(tiling) |
| 梯度检查点(Gradient Checkpointing) | 用计算换显存,存储部分激活值,反向时重计算 | 训练时间增加约 20-30% |
| 混合精度训练(FP16/BF16) | 显存减半 | 精度损失,需注意 loss scaler 调整 |
| KV Cache 量化(FP8/INT4/INT8) | 推理时 KV Cache 显存大幅降低 | 可能影响精确检索任务的准确率 |
| Page Attention + vLLM | 分页管理 KV Cache,提高显存利用率 | 系统复杂度增加 |
| Tensor Parallelism(TP) | 将模型权重和计算分布到多卡 | 通信开销高,适合高带宽场景 |
| 序列并行(SP) | 将长序列沿序列维度分片 | 需处理跨分片 attention |
| Prefix Caching | 共享 system prompt 的 KV Cache | 仅适用于多轮对话/重复 prompt 场景 |
7. 长上下文与 RAG 的关系
7.1 RAG 的核心思想
检索增强生成(Retrieval-Augmented Generation, RAG)通过外部向量数据库或稀疏检索,在推理时动态获取与当前 query 相关的文本块,将检索结果拼入模型上下文。
7.2 原生长上下文 vs RAG
| 维度 | 原生长上下文(Native Long Context) | 检索增强(RAG) |
|---|---|---|
| 信息获取方式 | 模型参数内存储(implicit) | 外部向量库检索(explicit) |
| 推理时延 | 单次前向传播,时延确定 | 检索 + 生成,引入不确定延迟 |
| 更新成本 | 需重新训练或微调 | 只需更新向量数据库 |
| 检索质量依赖 | 不依赖 | 高度依赖 embedding 模型和检索策略 |
| 跨模态 / 隐式关联 | 强(模型自主学习关联模式) | 弱(检索只能找显式相似文本) |
| 显存需求 | 高(KV Cache 随长度线性增长) | 低(只需容纳检索片段) |
| 精确信息定位 | 中(注意力可能分散) | 高(向量相似度精确匹配) |
| 推理成本 | 随上下文长度 | 随检索库规模近似常数 |
7.3 互补关系
原生长上下文和 RAG 并不互斥,而是互补的:
-
长上下文模型适合:
- 需要理解文档整体结构(如篇章级摘要、多文档推理)
- 跨文档的隐式关联(如”第一章提到的观点如何影响第三章的结论”)
- 预训练知识与上下文的融合(如”根据这份合同条款,回答…“)
-
RAG 适合:
- 超大规模知识库查询(如企业内部文档库、实时新闻)
- 频繁更新的知识(无需重训练即可更新)
- 需要精确事实检索的场景(如法律条文引用、数据表格查询)
混合架构:在工程实践中,常见做法是将 RAG 作为”调度层”——先用 RAG 检索相关片段,再用长上下文模型处理检索结果做精细推理(如 REPLUG、Self-RAG)。这种架构兼顾了 RAG 的知识更新灵活性和长上下文模型的深度理解能力。
8. 长上下文方法对比
| 方法 | 计算复杂度 | 显存复杂度 | 外推能力 | 精确检索 | 代表模型/系统 |
|---|---|---|---|---|---|
| 标准 Transformer | 依赖位置编码 | 优秀 | GPT-4(注意力截断) | ||
| FlashAttention | 依赖位置编码 | 优秀 | 几乎所有主流 LLM | ||
| RoPE + 位置插值 | 中等(需插值) | 优秀 | LLaMA、Qwen、Mistral | ||
| 滑窗注意力 | 弱 | 弱 | BiBERT、Mega | ||
| 稀疏注意力 | 中等 | 中等 | BigBird、Longformer | ||
| 线性注意力 | 中等 | 弱 | Mamba、RetNet、GLA | ||
| 记忆增强 | 良好 | 中等 | Compressive Transformer、RMT | ||
| StreamingLLM | 不适用(streaming) | 弱 | StreamingLLM | ||
| RAG | 取决于检索库 | 极优秀 | RAG、REPLUG、Self-RAG |
9. 训练长上下文模型的注意事项
9.1 位置编码优先选 RoPE
RoPE 的相对位置编码在长上下文场景下具有明显的外推优势,是目前 LLaMA、Qwen、Mistral 等主流模型的共同选择。若使用绝对位置编码,建议在训练初期即引入位置编码插值策略。
9.2 课程学习不是可选项
没有课程学习而直接训练 128K 上下文,几乎必然遇到显存溢出或收敛失败。建议从 4K 开始,分 3-5 个阶段逐步扩展,每个阶段的样本数应足够(通常数万到数十万步)让模型充分适应。
9.3 数据质量重于数据数量
长上下文模型特别容易因为低质量的长文本数据而学到错误模式。构造数据时应注意:
- 避免大量重复内容(模型会学到”重复 = 正常”的偏见)
- 确保远距离依赖真实存在(头尾呼应、跨章节引用)
- 控制噪声比例(如 OCR 错误、无关内容)
9.4 评估集要与训练分布匹配
如果训练数据主要是英文论文,评估集不应包含大量中文长篇小说。先分析训练数据的长度分布,再设计评估集。
9.5 注意推理优化的反向兼容性
如果训练时使用 FlashAttention,但推理部署使用不支持 FlashAttention 的框架,长序列推理的峰值显存会暴增。确保训练和推理的 Attention 实现一致,或在部署前进行充分的兼容性测试。
9.6 监控”短上下文能力退化”
长上下文训练可能导致模型对短序列的处理能力退化(灾难性遗忘的变体)。建议在训练过程中穿插短序列的混合 batch,并持续监控短上下文基准测试(如 2K 以内的 perplexity)。
10. 总结
长上下文建模是一个系统级问题,涉及算法(注意力机制、位置编码)、系统工程(分布式训练、推理优化)、数据工程(长文本数据构造、长度课程)和评估(有效上下文长度测量)多个维度。
核心结论:
- 标准注意力的
复杂度是结构性问题,无法通过硬件扩展彻底解决,必须从算法层面引入稀疏性、线性近似或外部记忆。 - “能看 128K”与”能理解 128K”是两回事——有效上下文长度取决于训练数据分布和任务性质,而非架构上限。
- 训练和推理的成本结构完全不同:训练受计算墙和通信墙限制,推理受显存墙和带宽墙限制。优化方向不可混淆。
- RAG 和原生长上下文是互补关系,不是替代关系。RAG 擅长精确检索和大规模知识库,长上下文模型擅长跨文档的隐式推理和整体理解。
- 系统级设计至关重要:从位置编码选择、课程学习规划,到显存管理和推理部署,每一个环节的失误都可能导致长上下文能力的严重退化。
长上下文的终极目标不是无限拉大窗口,而是在合理的计算成本下,让模型真正理解超出短记忆范围的信息结构。这一目标需要算法、工程、数据的协同设计,而非单一的架构创新。