上下文不是平的:位置与结构如何决定一条信息对输出的干预力

同一条信息放在上下文的开头、中间、结尾,对最强模型输出的影响力可以差出几十个百分点——而且这个"位置地形"会随上下文填充率动态变形:塞满一半之后,经典的 U 形曲线塌掉,只剩结尾优势。从注意力机制的三个根本约束出发,讲清位置偏差的成因、衰减的动态过程,以及"结构"为什么本质上是在地形上打人工锚点。

把同一条关键信息放在上下文的不同位置,其他什么都不改,最强模型在同一个任务上的正确率可以差出 30 个百分点以上。这不是老模型的历史遗留问题——2025 年 Chroma 的 Context Rot 研究测了 18 个前沿模型,全部存在可测量的位置相关衰减。

如果你只带走一句话,就带走这个:

上下文窗口不是一块平坦的白板,而是一片有地形的注意力场:开头是高地,结尾是高地,中间是盆地。信息对输出的干预力,等于位置给它的默认权重,乘以结构给它的锚点,再除以全场竞争者对注意力的稀释。而且这片地形不是静态的——当你把窗口塞满一半之后,开头的高地会塌掉,只剩结尾。

这篇是《删掉 80% 系统提示词之后》的下篇。那篇讲的是”上下文里该放什么”;这篇讲更底层的问题:放进去的东西,放在哪、怎么组织,它的影响力是怎么随位置衰减的,这个衰减过程本身又是怎么变化的。

一、先把地基打好:注意力是一场零和竞争

要理解位置为什么有地形,得先看清 Transformer 读上下文的方式。不需要完整推导,只需要三个事实。

事实一:模型每生成一个 token,都要对上下文里的所有 token 做一次”注意力投票”。 每个历史 token 得到一个分数,所有分数经过 softmax 归一化成权重:

attentioni=esij=1nesj\text{attention}_i = \frac{e^{s_i}}{\sum_{j=1}^{n} e^{s_j}}

关键在分母:所有权重加起来恒等于 1。这意味着注意力是零和的——上下文里多塞一千个 token,哪怕全是废话,每个 token 也在分走一份注意力预算。你的关键指令不需要”被遗忘”才失效,它只需要被稀释。

事实二:因果掩码(causal mask)让开头的 token 天然特殊。 自回归模型只能往前看,所以第 1 个 token 是唯一一个被所有后续位置都看得到的 token。训练中,模型学会把”没处安放”的注意力倾倒在开头几个 token 上——这就是 StreamingLLM 论文发现的注意力沉没(attention sink):开头的 token 吸走不成比例的注意力质量,跟它的语义内容几乎无关。这是”开头高地”(primacy,首因效应)的机制来源之一。

事实三:主流位置编码 RoPE 自带距离衰减。 RoFormer 论文在设计旋转位置编码时就证明了它的一个性质:两个 token 的相对距离越远,注意力分数的上界越低。这是刻意设计的归纳偏置——“近处的信息更相关”在语言里通常成立。它的直接后果是”结尾高地”(recency,近因效应):离当前生成位置最近的内容,天然拿到更高的分。

把三个事实叠起来:开头有沉没锚点,结尾有距离优势,中间两头不沾——盆地就是这么来的。2026 年的理论工作甚至证明,这个 U 形在模型随机初始化时就已经存在:因果掩码制造首因尾巴,残差连接制造近因锚点,预训练并没有爬出这个形状(MIT 团队 2025 年的研究得到类似结论:偏差来自掩码与位置编码等架构选择,训练数据只是加剧或缓和它)。

换句话说:位置偏差不是 bug,是架构的先验。 它不会被下一代模型”修好”,只会被重新塑形。

二、衰减的动态过程:地形随填充率变形

这是这篇的核心,也是老认知最需要更新的地方。“lost in the middle”常被当成一条静态规律来引用,但 2025 年之后的研究拼出的图景是:位置偏差的形状取决于你把上下文窗口塞了多满。 整个过程分三个阶段。

阶段一(短上下文,< 1K 量级):基本平坦

上下文很短时,注意力预算充裕,softmax 的稀释效应可以忽略,RoPE 衰减在短距离内也不明显。信息放哪都行——这也是为什么在 playground 里手搓短 prompt 时,你几乎感觉不到位置的存在。NoLiMa(ICML 2025)测的 13 个模型在 1K 以内几乎都接近满分。

阶段二(占窗口 50% 以内):经典 U 形

这是 Lost in the Middle(Liu et al., 2023)刻画的区间:正确率是位置的 U 形函数,关键信息放中间比放两头差得多——跨模型家族复现,中段位置的衰减可超过 30%。首因(开头高地)和近因(结尾高地)同时在场。

阶段三(超过窗口 50%):U 形塌掉,只剩近因

COLM 2025 的一篇论文发现了此前研究互相打架的原因:大家用绝对长度做实验,而真正决定形状的是相对填充率(输入占该模型窗口的比例)。他们的结论:

  • U 形效应在填充率 ≤ 50% 时最强;
  • 超过 50% 之后,首因偏差持续减弱,近因偏差保持稳定
  • U 形最终消失,取而代之的是单调的距离偏差:信息离末尾越近,表现越好。

用地形的话说:窗口塞得越满,开头的高地被越压越平,最后整片地形变成一个朝结尾方向抬升的斜坡。机制上这不难理解——首因靠的是注意力沉没这种”固定锚点”,锚点的注意力份额会被越来越长的上下文按 1/n1/n 稀释;近因靠的是 RoPE 的相对距离优势,“我比别人离得近”这个相对优势不随总长度贬值。绝对锚点会被稀释,相对优势不会——这就是两块高地命运不同的原因。

这个三阶段模型能直接解释很多工程玄学:为什么短 prompt 里指令放哪都灵、到几万 token 的 agent 会话里开头的系统提示词开始”失聪”、而快爆窗口时模型几乎只听最后几轮的话。

叠加在位置之上的:长度本身就在伤害

还有一个更狠的发现值得单独说。EMNLP 2025 的 Context Length Alone Hurts LLM Performance Despite Perfect Retrieval 做了一组控制实验:把无关内容全换成空白、甚至直接在注意力里掩掉无关 token、把所有相关证据紧贴在问题前面——检索被做到完美、干扰被清零。结果性能仍然随长度下降 13.9% 到 85%。也就是说,位置偏差之外还有一层纯长度税:哪怕你的信息就放在最优位置,一个被塞满的窗口本身就在拖累推理。

任务类型决定你多快撞上这堵墙。NoLiMa 把大海捞针测试里的字面匹配线索去掉、只留语义关联,结果 13 个号称 128K+ 的模型里,11 个在 32K 就跌破短上下文基线的 50%——GPT-4o 从 99.3% 掉到 69.7%。字面匹配是低功率任务,衰减慢;语义跳跃、多跳整合是高功率任务,衰减快得多。这也是为什么”大海捞针测试早就满分”和”实际用起来长上下文不行”可以同时为真:RULER 定义的”有效上下文”(保持基线 85% 以上的最大长度)普遍只有标称窗口的几分之一。

三、结构是什么:在地形上打人工锚点

位置决定默认权重,但你并非只能被动接受地形——结构就是对抗(或利用)地形的手段。拆开看,常见的结构手法本质上是四种操作。

1. 把信息搬运到高地上。 最直接的一种:既然结尾是永不塌陷的高地,就把最关键的指令放在最后。LongIns 基准做过消融:指令只在开头出现(全局)vs 在每个问题前重复(局部),随距离拉长,前者衰减陡峭得多——GPT-4o 从 256 token 时的 76.31 掉到 16K 时的 51.15。实践中”指令收尾”、“开头结尾各说一遍”都是这一招。

2. 让模型自己做搬运工。 上面那篇 EMNLP 论文提出的缓解办法很优雅:让模型先复述(recite)检索到的证据,再回答。复述这个动作把埋在几万 token 深处的信息重新写到了生成位置的紧前方——等于模型自己把货从盆地搬上了结尾高地,把长上下文任务原地转换成了短上下文任务。这也是各种 agent 框架里”先总结再行动”、思维链先摘录原文再推理有效的深层原因。

3. 用标记降低寻址成本。 XML 标签、markdown 标题、编号列表这些结构标记,不改变注意力地形,但给了检索一个高对比度的目标。NoLiMa 的教训反过来读就是:字面锚点让匹配变容易<user_data> 这样一个独特的标签串,比一段没有边界的纯文本容易被注意力命中得多——你在替模型预付它本来要花在”语义搜索”上的注意力功率。

4. 区分”住在哪一层”。 系统提示词、工具描述、对话历史不只是位置不同——它们在训练中被赋予了不同的先验权重(模型被专门训练成更服从 system 角色)。这是位置之外的另一个维度:角色结构也是锚点。但它同样逃不过稀释——上篇讲过的那个 80% 删减实验说明,把说明书常驻在系统提示词里并不能豁免注意力预算,Anthropic 的解法是渐进披露:说明按需加载,用完就走,不占地形。

注意这四招没有一招能突破第一节的根本约束:注意力总和恒为 1。结构可以重新分配预算,不能增发预算。给所有段落都加粗、每条指令都重复三遍,等于给每个人都发扩音器——地形又变平了,只是噪声更大。

四、带走的模型

把全文压缩成一个可复用的心智模型:

干预力位置默认权重×结构锚点全场竞争稀释\text{干预力} \approx \frac{\text{位置默认权重} \times \text{结构锚点}}{\text{全场竞争稀释}}

  • 位置默认权重由地形给出,而地形随填充率变形:短上下文近乎平坦 → 中等长度 U 形(两头高) → 塞满一半后首因塌陷、只剩近因斜坡。绝对锚点(开头)会被稀释,相对优势(结尾)不会。
  • 结构锚点是你主动打的桩:指令放尾、让模型复述搬运、字面标记降低寻址成本、利用角色先验。它们重新分配注意力,但不能增发。
  • 竞争稀释是分母,也是最容易被忽略的一项:每一个不服务任务的 token 都在给你的关键信息抽税——这还没算纯长度税。最好的结构手段,常常是删除。

对照到日常工程,这个模型给出的操作清单很短:关键指令贴近末尾,或首尾各一份;大块资料在前、指令在后;给数据打独特的字面标签;长链路任务让模型先复述再推理;按需加载代替常驻;以及最重要的——把有效上下文(而非标称窗口)当作预算上限来规划。

五、边界与反对意见

“新一代模型不是已经缓解了吗?” 缓解是真的:校准注意力的 Found-in-the-Middle 能把中段检索拉回 15 个百分点,IN2 训练、Ms-PoE 等方法都在往盆地里填土;前沿模型的有效上下文也在逐年抬高。但消除不是——第一节说过,U 形在初始化时就写进了架构,因果掩码和位置编码不换,地形只会被重新塑形,不会消失。18 个前沿模型全部中招的 Context Rot 结果就是现状。

“不同模型的地形一样吗?” 不一样,这是使用这套模型时最需要留的余地。有的架构首因更强,有的一致偏爱近因;扩散语言模型因为用双向注意力,干脆没有 U 形,是单调偏向生成位置附近的衰减。50% 这个相变阈值也是经验值,不是物理常数。形状因模型而异,但”有地形、且地形随填充率变形”这个事实本身,目前没有反例。

“我该实测吗?” 该。这套心智模型的价值是告诉你往哪个方向调、为什么有效,而不是替代测量。你的任务落在哪个衰减阶段、你的模型首因近因谁强,一组把同一信息换位置的对照实验就能测出来——比任何论文数字都可靠。


上篇的结论是”写给模型的每条规则都是有保质期的负债”;这篇再加一句:放进上下文的每个 token 都是有利息的贷款——它按位置计息,按总量稀释。 上下文工程的两条腿,一条管放什么,一条管放在哪。现在两条都齐了。