Skip to content

上下文窗口:从“工作记忆”到能力边界

摘要: 上下文窗口作为 LLM 的「工作记忆」,其容量直接决定了模型处理长文档、多轮对话和大型代码库的能力边界。本文从上下文窗口的基本定义与三种典型应用场景出发,深入剖析了 Attention 机制 O(n²) 计算复杂度对窗口扩展的根本制约,以及 Flash Attention 等工程优化未能改变的数学本质。在此基础上,本文详细讨论了 Lost in the Middle 现象——LLM 对上下文中间位置信息的系统性忽视——及其对 Prompt 设计的实践启示。最后,系统对比了 NTK-aware Scaling、YaRN 和 RoPE 线性插值三种核心扩展技术的原理与适用场景。全文为理解长上下文的性能边界、技术取舍与工程最佳实践提供了完整框架。

📄
图集速览:上下文窗口——从“工作记忆”到能力边界如果你对上下文窗口与长文本处理还比较陌生,建议先读这篇图集速览。用可视化图片集合和要点摘要,帮你快速理清 LLM 工作记忆的核心概念。
上下文窗口AttentionRoPELLM

1. 定义与意义

上下文窗口(Context Window)LLM 一次能够处理的最大 token 数。它就像模型的"工作记忆"——在这个窗口内的所有信息,模型都可以同时参考;窗口之外的,模型完全不可见。

figure
上下文窗口 = 模型的"视野范围"

          窗口边界(如 128K tokens)
┌──────────────────────────────────────────────────┐
│ Token₁ Token₂ Token₃ ... Token 100 ... Token 128000 │  ← 模型能"看到"
└──────────────────────────────────────────────────┘
                                                        ↑ 窗口之外:模型无法知晓
                                                     Token 128001 Token 128002 ...

为什么窗口大小如此关键?

三个实际场景说明:

  1. 长文档分析:分析一份 5 万字的合同,如果窗口只有 4K(约 3000 字),你需要把合同切成十几个片段分批送入,每段之间模型会"忘记"上下文,无法建立跨段落的关联。
  2. 多轮对话:与你聊了 50 轮,如果窗口不够大,模型只能"记住"最近几轮,前面的对话内容会被"遗忘"。
  3. 代码库理解:一个中等项目可能有几十万行代码。128K 上下文才能让模型一次性理解整个项目的结构。

3. 上下文窗口与注意力复杂度的关系:O(n²) 难题

上下文窗口并非越大越好,因为标准 Attention 机制的计算量和显存占用随 token 数平方级增长

Attention 计算 QKᵀ 矩阵:

n = 4K tokens:   4096 × 4096 = 16,777,216 次点积运算    (~1,670 万)
n = 32K tokens:  32768 × 32768 = 1,073,741,824 次       (~10 亿)
n = 128K tokens: 131072 × 131072 = 17,179,869,184 次     (~171 亿)
n = 1M tokens:   1,000,000² = 1,000,000,000,000 次       (~1 万亿!)

每层都要算一次!x 96 层(GPT-3)→ 天文数字
QKᵀ 矩阵大小示意图:

n=4K  ████                                      (小方块)
n=8K  ████████
n=16K ████████████████
n=32K ████████████████████████████████
n=1M  ██████████████████████████████████████████████... (巨大)
      ← 边长 = token 数,面积 = token 数² = 计算量 →

图中每个像素代表一对 token 之间的一对注意力分数计算

这就是"长上下文 = 贵"的根本原因。

处理 128K token 上下文的计算量是处理 4K 的 1024 倍。Flash Attention 通过分块计算降低 IO 开销,但并未改变 O(n²) 的数学本质。

4. Lost in the Middle 现象

Lost in the Middle(中间信息丢失) 是 2023 年由斯坦福、伯克利和 Samaya 团队在论文中系统揭示的现象:当上下文变长时,LLM 对中间位置的信息提取能力显著下降,对开头和结尾的信息则保持较好。

Lost in the Middle 效应示意(信息提取准确率随位置变化):

准确率

  │  ● 开头:85%
  │        ●─┐
  │          │ 准确率持续下降...
  │          │               ┌─●
  │          └───────────────┘   结尾:82%
  │            中间:仅 40-60%
  └────────────────────────────────────→ 信息在上下文中的位置
    开头                              结尾

(数据来源:Lost in the Middle, Liu et al., 2023)

这意味着:你不能想当然地把最重要的信息放在上下文中间的某个位置——模型可能几乎"读"不到它。

实用的缓解策略

  • 将关键信息(指令、约束条件)放在上下文的开头或结尾
  • 在长文档中多次重复关键约束
  • 使用 RAG 时,将检索到的相关片段放在 prompt 的前后两端

5. 长上下文的优化技术

业界已发展出多种技术,能够在无需重新训练或仅需轻量微调的情况下,将上下文窗口大幅扩展至数倍甚至数十倍。

核心都是围绕 RoPE(旋转位置编码) 的改进:

RoPE 核心公式回顾:旋转角度 θᵢ = base^{-2i/d}

位置 m 和位置 n 的注意力分数 ∝ cos((m-n)θ)

训练时见过的最大距离 = L_train(如 4096)
测试时外推的距离 = L_test(如 16384,远超训练)

直接外推的问题:模型没见过这么大的 (m-n),注意力模式崩溃

三种核心扩展技术对比:

技术核心做法效果代表模型
NTK-aware Scaling改变 RoPE 的 base 频率(如从 10000 改到 500000),让高频维度对长距离更敏感4K → 16K 不微调即可用Llama 生态广泛使用
YaRN(Yet another RoPE extensioN)NTK + 按维度分组缩放 + 温度调节 softmax4K → 128K,无需微调LLaMA 2 4K→128K
RoPE 线性插值将位置索引线性压缩(m → m × L_train/L_test)简单直接,但需微调Meta Llama 早期扩展
训练时扩展直接在更长序列上训练(如 CodeLlama 用 16K 训练)效果最好GPT-4、Claude
NTK-aware Scaling 的直观类比:

将收音机从"本地频率"调到"短波频率"——调谐旋钮(base 值)一转,
以前只能收到近距离台(4K token 内),现在能收到远距离台(32K token 外)。
模型参数本身没变,只是"收听参数"调整了。

一句话总结

长上下文是 2024-26 年 LLM 最核心的能力之一,但它的代价是 O(n²) 计算和 Lost in the Middle 效应。

在应用设计中,能用完 128K 是例外而非常态,合理的上下文管理和压缩往往比单纯追求更大窗口更重要。