5-长上下文建模

长上下文不是单纯把窗口拉大,而是系统级问题。

1. 长上下文问题的本质

1.1 什么是长上下文

语言模型的核心能力之一是条件生成:在已知前缀 的条件下,预测下一个 token 。上下文长度 指的是模型在一次前向传播中能处理的最大 token 数。

长上下文问题(Long Context Problem)的本质在于:当序列长度增大时,模型并非同等有效地利用了序列中的每一个位置

这个问题有三个相互关联的维度:

  • 有效上下文长度(Effective Context Length):模型真正能”看见”并影响输出的_token范围_,而非技术上限。
  • 信息密度不均:序列中不同位置的信息对当前预测的贡献差异极大。近期 token 通常贡献更高,远期 token 的信息往往被”稀释”。
  • 远距离依赖(Long-range Dependency):某些任务(如指代消解、逻辑推理)要求模型建立首尾关联,但这种依赖信号在长序列中极易被中间信息覆盖。

1.2 注意力机制的结构性瓶颈

标准的多头自注意力(Multi-Head Self-Attention, MHSA)是大多数 Transformer 语言模型的核心,其计算可分解如下。

给定输入序列 个 token, 维隐状态),自注意力先通过三个线性投影得到 Query、Key、Value:

注意力权重矩阵的计算:

最终的输出:

计算复杂度分析:计算 是矩阵乘法 ,其时间复杂度为 ;计算 的时间复杂度同样是 。因此,标准自注意力的总时间复杂度为 ,空间复杂度(存储注意力权重矩阵)为

时,注意力矩阵 需要存储 个浮点数;若 ,则需要 个浮点数——仅仅是存储这个矩阵就需要数百 GB 显存(单精度浮点下约 64 GB)。

1.3 远距离依赖为何难以捕获

Transformer 的自注意力允许任意两个位置直接交互(全局注意),理论上没有距离偏置。但实践中,远距离依赖难以捕获,原因有三:

  1. Softmax 的”赢者通吃”特性:Attention 分数经 softmax 后趋于极化,每个 Query 通常只聚焦在少数几个 Key 上。远距离 token 之间的语义关联往往比近距离的弱,注意力更容易被局部信息”劫持”。
  2. 位置编码的衰减:大多数位置编码方案(绝对位置编码、RoPE 等)对远距离位置的编码与近距离差异显著,模型难以建立统一的位置关系认知。
  3. 优化难度:在随机梯度下降中,远距离依赖的梯度信号需要经过多次矩阵乘法才能传回首端,容易出现梯度消失或退化。

2. 位置编码在长上下文中的作用

2.1 主流位置编码方案

方案公式外推能力长上下文表现
绝对位置编码(APE)差,需微调受限于训练长度
相对位置编码(RPE)关注 Query-Key 位置差 较好外推性优于 APE
RoPE(旋转位置编码),对 query/key 施加旋转优秀支持 128K+ 外推
ALiBi注意力分数上叠加线性偏置 良好无需位置编码参数

RoPE(Rotary Position Embedding)是目前主流长上下文模型(如 LLaMA、Qwen、DeepSeek)采用的核心方案。其核心思想是将位置信息编码为旋转矩阵,使 attention 计算只依赖于 Query 和 Key 之间的相对位置差

为第 个头中第 个位置的 Query 向量,维度为 。RoPE 在前 维和后 维分别施加旋转:

其中 为维度索引。相对位置编码的外推优势在于:注意力分数 最终只包含 ,与绝对位置无关,因此即使推理时的位置索引超出训练范围,只要旋转矩阵能外推,模型行为就有一定保证。

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)

核心思想:利用注意力矩阵的结构性质,将 降低为

标准注意力的计算可以重写为:

线性注意力的关键是核函数近似:用特征映射 将 query 和 key 映射到低维空间,使得 ,从而将求和顺序重新排列为:

这种形式允许将 的计算按输入顺序累积,实现 的时间复杂度。

代表模型:Mamba(State Space Model,2023)、RetNet(Microsoft,2023)、GLA(Gated Linear Attention,2024)。

局限性:线性注意力在理论上具有 优势,但实际中往往需要引入额外的门控机制(如 Mamba 的选择性扫描)来弥补表达能力损失,且其隐状态压缩性质使其在精确检索任务上弱于标准注意力。

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 在 个 Key 中选择被 attend 的对象时,大概率会分散到大量低相关度位置。模型面临的是”大海捞针”式的挑战——如何从 128K token 中精准定位少数真正相关的 token。

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 训练成本

标准注意力训练的显存开销

对于序列长度 、隐层维度 、batch size

  • 注意力权重矩阵 显存(无法压缩,因为 softmax 需要逐行归一化)
  • KV Cache:在自回归训练中需要缓存所有位置的 Key 和 Value 向量,显存为 为层数)
  • 对比: 时,仅 KV Cache(假设 )就需要约

长上下文训练的三大工程挑战

  1. 显存墙 的注意力矩阵在 时已经不可接受。需要 FlashAttention-2/3 的 blockwise 计算 + 重计算策略来降低峰值显存至 量级。
  2. 计算墙 的计算量在 时约是 时的 1024 倍。单卡日费数美元,训练数千卡集群的月费更是天文数字。
  3. 通信墙:在分布式训练中,跨设备传递注意力结果的开销在高带宽网络上尚可接受,但在跨机架场景下会成为瓶颈。

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: ;Decode: 每 step
主要瓶颈计算墙 + 通信墙显存墙(KV Cache)+ 带宽墙(Cache 读取)

6. 工程流程

6.1 长文本数据构造

长上下文训练的第一步是构建长文本数据集。常见策略:

  1. 书籍与文档拼接:将多篇文章或书籍章节拼接,中间用特殊分隔符(如 [EOS]$_1$$_2$)隔开。确保拼接后序列包含足够的远距离依赖(跨文档指代、主题一致性等)。
  2. 长文本采样:从原始长文档(论文、书籍、报告)中直接采样固定长度的片段,随机选择起始位置。
  3. 模拟远距离关联数据:刻意在序列头部插入”问题提示”,在序列尾部插入”答案”,测试模型是否真正建立了跨距离依赖。
  4. 长度上采样:对短文本做重复拼接,构造看似”长”但实际信息密度低的样本,用于训练位置编码的外推能力(但需控制比例,避免模型过度依赖重复模式)。

质量注意点:避免构造只有局部依赖但人为拉长的数据(如大量无意义重复),这会导致模型学到”短程依赖 + 重复”的捷径。

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. 总结

长上下文建模是一个系统级问题,涉及算法(注意力机制、位置编码)、系统工程(分布式训练、推理优化)、数据工程(长文本数据构造、长度课程)和评估(有效上下文长度测量)多个维度。

核心结论:

  1. 标准注意力的 复杂度是结构性问题,无法通过硬件扩展彻底解决,必须从算法层面引入稀疏性、线性近似或外部记忆。
  2. “能看 128K”与”能理解 128K”是两回事——有效上下文长度取决于训练数据分布和任务性质,而非架构上限。
  3. 训练和推理的成本结构完全不同:训练受计算墙和通信墙限制,推理受显存墙和带宽墙限制。优化方向不可混淆。
  4. RAG 和原生长上下文是互补关系,不是替代关系。RAG 擅长精确检索和大规模知识库,长上下文模型擅长跨文档的隐式推理和整体理解。
  5. 系统级设计至关重要:从位置编码选择、课程学习规划,到显存管理和推理部署,每一个环节的失误都可能导致长上下文能力的严重退化。

长上下文的终极目标不是无限拉大窗口,而是在合理的计算成本下,让模型真正理解超出短记忆范围的信息结构。这一目标需要算法、工程、数据的协同设计,而非单一的架构创新。