模型架构 · 长上下文
学习舱 / 模型架构 / 长上下文

长上下文:稀疏注意力 / DSA / IndexShare

整理中 深度 · 应用 更新 2026-09-22

前置 Attention

长上下文:稀疏注意力 / DSA / IndexShare

一句话定位:上下文窗口从几千 token 涨到百万级,但注意力的账单涨得更快——本篇讲清两堵墙(n² 打分与键值显存),以及 2025 年以来让长上下文落地成为主流的稀疏注意力路线(MoBA 块路由 / NSA 压缩选择 / DSA 索引挑选 / IndexShare 跨层共享),末尾回答「大海捞针测试为什么靠不住」。前置:Attention 与 Transformer——先知道打分、键值缓存与平方复杂度从哪来。

先看一个「装得下、算不起」的差距

模型的上下文窗口一路狂奔:GPT-3 时代两千 token,2025 年起主流模型 128K,旗舰级到了 1M——一整本长篇小说塞得进去。窗口数字成了发布会上的标配参数。

可是前面算过的账没有变:注意力要对序列两两打分,计算量随 n² 增长;键值缓存按每个 token 约 56 KiB(Qwen2-7B 官方配置推算)线性累积。1M token 意味着一万亿对打分加 53.4 GiB 缓存——窗口标称值翻着倍涨,账单涨得更快。

怎么让模型看得远,又看得省?

核心思路四个字:少看几眼。一百万 token 里,与当前要写的这个字真正相关的往往只有几百上千个——稀疏注意力不再全员互看,而是先挑出相关的少数、再对它们细算。「怎么挑、挑出来看什么」,就是各家路线的分野。先看墙有多高:

长上下文的两堵墙(以 Qwen2-7B 配置推算) 训练侧:两两打分墙(按 n² 计量级) 打分对数 = n²,序列翻十倍开销翻百倍 4K → 1600 万对 128K → 160 亿对 1M → 万亿对 长序列训练贵在「配对数」平方爆炸 推理侧:键值显存墙 缓存随长度线性涨,每步生成读全量 4K → 0.2 GiB 128K → 7.0 GiB 1M → 53.4 GiB(单请求!) 显存乘 batch 更爆:并发 8 路就要 400+ GiB 两堵墙的公共解法:让大部分 token 免于「逐字细看」——稀疏注意力 缓存计算式:层数 × 键值头数 × 头维 × K/V 两份 × 2 字节 × token 数;打分对数按十进制 K/M 计、缓存按二进制 GiB 计 读法:训练怕「对数」平方涨,推理怕「缓存」占显存——两墙都源于「全员逐字互看」

图:长上下文成本结构——训练墙(n² 打分对数)与推理墙(键值缓存线性累积且每步全读);稀疏注意力是两墙的公共解法

渐进拆解:从全员互看到点名发言

键值显存墙(KV 显存墙)再细看一眼

键值缓存的体积公式是死的:层数 × 键值头数 × 每头维度 × 2(K 与 V 各一份)× 每参数字节数 × token 数。Qwen2-7B 用 GQA 把键值头压到 4 组(缓存缩到 1/7),单请求 1M 上下文仍要 53.4 GiB——这还只是一个用户的一次请求,服务端同时服务几十路请求,显存立刻见底。

两个阶段各付一笔:

  • prefill(读入整段上下文建缓存):做完整 n² 打分
  • decode(逐 token 生成):每写一个字都要把整条缓存读一遍——「读」比「算」更慢,这是推理加速公开的秘密

稀疏化的两轴框架

所有稀疏路线都在回答两个问题:怎么挑(固定模式还是动态挑)与看什么(原始 token 还是压缩摘要)。两轴一摆,2025 年的路线图立刻清晰:

滑动窗口:最朴素的基线

只看最近 w 个 token,更早的一概不看——Mistral 系用得最多。它落在「固定挑 + 原始」格里:挑法写死、看的全是原文,胜在简单可预测,代价是窗口外的历史彻底失忆。它是所有动态路线的对照组:动态挑法必须证明自己比「无脑看最近」强,才有存在的意义。

稀疏路线两轴定位:怎么挑 × 看什么 怎么挑:固定模式 → → 动态选择 看什么 ↑ 原始 token(细) 看什么 ↓ 压缩摘要(省) 滑动窗口 固定只看最近 w 个:Mistral 系 DSA(DeepSeek-V3.2) 动态挑 token:索引器打分 MoBA(Kimi) 动态挑块:门控选最相关块 NSA(DeepSeek×北大) 动态挑 + 压缩选择混用 滑窗=固定+原始;DSA=动态+原始(token 粒度);MoBA=动态+原始(块粒度);NSA=动态+混合(原始与压缩并用) 框架价值:新路线出来先问两问——怎么挑?看什么?归位即可对比 读法:越靠右挑得越聪明(更多计算花在「挑」上);越靠上看得越细(不丢内容),越靠下越省显存(代价是丢细节)

图:稀疏路线两轴框架——横轴「固定到动态」、纵轴「压缩到原始」;滑窗 / DSA / MoBA / NSA 按两问落位,新路线同样先归位再对比

MoBA:把 MoE 的思想搬进注意力

月之暗面(Kimi)2025 年 2 月提出的 MoBA(混合块注意力)把上下文切成一块块,用一个无参数的门控网络为每个查询动态挑选最相关的若干块——门控即「按分数决定开哪扇门」,MoBA 的门控不带可学习参数(这点与 MoE 的路由不同),挑块的思想与 MoE(混合专家,下一篇的主角)一脉相承。它落在框架「动态 + 原始(块粒度)」格里:块是原始 token 的集合,挑是动态的但只精确到块。官方口径:prefill 100 万 token 时比全注意力快 6.5 倍。

NSA:压缩与选择并用

同月「撞车」发布的 NSA(原生稀疏注意力,DeepSeek 与北大合作)走「动态 + 混合」:把远处的 token 压缩成粗摘要、近处和被选中区域保持原始细粒度,两层信息叠加使用,并为硬件对齐做了专门设计。成绩:64K 输入的解码(decode)阶段最高提速 11.6 倍,且多项基准不输全注意力——这篇论文拿了 ACL 2025 最佳论文奖。

DSA 与 IndexShare:细粒度挑 token,GLM 的工程化

DeepSeek 在 V3.2(2025 年 9 月)把 NSA 的路线做成产品:DSA(DeepSeek 稀疏注意力)用一个轻量索引器(lightning indexer)给全部历史 token 打「相关度分」,每个查询只挑出 top-k 个细算——思想与采样篇的 top-k 剪枝同源(那边挑「下一个生成谁」,这边挑「该细看谁」),只是粒度和位置不同。官方口径:核心注意力的计算复杂度从 O(L²) 降到 O(Lk)——k 是远小于 L 的选中数——API 价格下调超 50%。

第三方工作 IndexCache 也独立佐证了这条路线的价值:跨层复用索引最高可消除 DSA 75% 的索引计算(见参考条目)。GLM-5.2 沿这条路线再进一步:细算之前先挑,挑的成本也不便宜——IndexShare 让每 4 个稀疏注意力层共享同一个索引器的结果(相邻层的挑法大体相似,重复挑四次是浪费),1M 上下文下每 token 计算量再降 2.9 倍:

DSA + IndexShare:先点名,再细看;点名结果不重复算 ① 索引器打分 轻量小网络给全部 历史 token 评相关度 ② 挑 top-k 每个查询只留最相关的 k 个 token(细粒度) ③ 只细算选中者 注意力只对 k 个 token 做完整打分加权 IndexShare 相邻 4 层共用①的结果 点名成本降为 1/4 省多少(官方口径) DSA:核心注意力 O(L²) → O(Lk),API 降价 50%+ IndexShare:1M 下每 token 计算量再降 2.9 倍 关键洞察:相邻层「该看谁」高度相似——各层各挑一遍是重复劳动 GLM-5.2 的取舍:4 层共享一次点名,省了计算,代价是层间差异化变小 读法:①②是「挑」的成本,③是「看」的成本——稀疏化把两笔账都砍小

图:DSA 三步(索引器打分 → 挑 top-k → 只细算选中者)与 IndexShare(每 4 层共享索引结果);挑与看两笔账都被砍小

大白话:全员互看像开会人人发言、句句必听——人多到听不过来。稀疏注意力改成点名发言:先请一位「点名员」挑出最相关的人(DSA 索引器、MoBA 门控、NSA 分层摘要都是不同流派),再只对点到名的细听。IndexShare 则发现相邻几层想点的人差不多——一份点名单,四层共用。

技术定义:稀疏注意力是一族把 O(n²) 两两打分约束为「每个查询只对选中子集打分」的机制,按两轴分类:挑法(固定模式 / 动态选择)× 看什么(原始 token / 压缩摘要)。DSA 的 O(L²) → O(Lk) 与 IndexShare 的 4 层共享(开销降为 1/4)见上文各节与配图。

大海捞针:出了名的测试,和它的局限

长上下文好不好,怎么验?最出名的是「大海捞针」(Needle in a Haystack):往长文本深处藏一句无关的话(「回形针工厂的密码是 3857」),问模型密码是什么。早期模型在 128K 上一捞就漏,如今头部模型已能满分通过这类测试——但满分不等于真本事,这题至少有三处失真:

  • 针太扎眼:藏的密码与全文毫无关系;真实要找的信息嵌在语义网络里,没有这么突兀
  • 只考位置检索:问句与针是简单对应;真实任务是跨段落的信息综合
  • 只考「找回」,不考推理与拒答:信息不在时该说「没有」,而不是硬编

RULER 基准把三点难度全加满(多针、嵌套、聚合推理),同一模型在 RULER 下的「有效上下文」往往明显短于标称值——「窗口 1M」与「1M 内都好使」是两句话:

大海捞针:满分的测试,三处失真 藏针测试 针 长文档某处藏一句无关密码 破绽一:针太扎眼 真实要找的信息嵌在语义网络里,不会像密码一样突兀 破绽二:只考位置检索 问句与针是简单对应;真实任务是跨段落综合 破绽三:不考推理与拒答 找回 ≠ 理解;信息不在时该说「没有」而不是编 RULER:把三点难度全加满 多针、嵌套、聚合推理——有效上下文常短于标称窗口 读法:左侧是「考什么」,右侧是「为什么这考不出真本事」

图:大海捞针测试与其三处失真——针太扎眼、只考位置检索、不考推理拒答;RULER 加满难度后暴露「有效上下文」与标称的差距

动手:算清两堵墙

KV 缓存的体积公式透明,任何模型套进去就能算(与注意力篇同一条式子):

def kv_gib(n_layers, kv_heads, head_dim, n_tok, bytes_per=2):
    return n_layers * kv_heads * head_dim * 2 * bytes_per * n_tok / 1024**3
# Qwen2-7B:28 层 / 4 组键值头 / 每头 128 维 / bf16(2 字节)
for tok in (4096, 131072, 1_000_000):
    print(tok, f"{kv_gib(28, 4, 128, tok):.1f} GiB")

实测输出:4096 → 0.2 GiB、131072 → 7.0 GiB、1000000 → 53.4 GiB——窗口翻 32 倍,缓存同步翻 32 倍(线性增长的算术)。

再感受一下稀疏化的收益,1M token 下的打分对数:

  1. 全注意力:1 万亿对
  2. 滑窗(只看最近 8192 个):82 亿对——1/122
  3. top-k 稀疏(每个查询只细看 2048 个):20.5 亿对——1/488

后者正是 O(Lk) 中 k=2048 的直接体现:挑得越准、k 越小,省得越多——这是各家路线竞赛的主线。

边界与取舍

「路线对比」框架能装下 MoBA / NSA 这类新路线吗?

能——「路线对比」框架就是上文的两轴框架,它的价值正在于此:MoBA 落「动态挑 + 原始块」,NSA 落「动态挑 + 压缩与选择混用」,DSA 落「动态挑 + 原始 token」,滑窗落「固定挑 + 原始」——任何新路线出来,先问「怎么挑、看什么」就能归位对比。框架也有边界:GLM-5.3 系开始把稀疏注意力与线性注意力(把 n² 打分换成随长度线性增长的近似计算)混编(长文用稀疏省成本、短文保精准),这类「混架构」要用第三问「哪段文本用哪种注意力」来补充刻画——框架装得下大部分,装不下全部,给下一代留了空间。

稀疏不是免费的

挑错就丢信息:检索类任务(大海捞针式)稀疏化几乎无损;全局推理(通读全书归纳主线)依赖长程交叉信息,是稀疏路线被反复质疑的软肋——不过这一点尚无定论:NSA 论文的 LongBench 多跳问答成绩不降反升,RULER 这类把聚合推理难度加满的基准正把这一层单独拉出来考。选型三问:

  1. 任务偏「找回」还是偏「综合」?
  2. 上下文真正用多长?
  3. 预算瓶颈在显存还是计算?

模型层之外还有一条路

本篇讲的是「把注意力本身变稀疏」(模型层机制);另一条路线完全不动模型——在应用层把对话历史摘要、裁剪后再塞回窗口。那是运行时外壳工程的手艺(上下文预算、分层压缩、可跳过细节的取舍),见运行时外壳的上下文压缩专篇,两篇互为补充:模型层决定「装得下多少」,工程层决定「该装什么」。

坏味道预警:把「标称窗口」当「有效窗口」

发布会上的 1M 是位置编码撑起的容量上限;RULER 式实测的「有效上下文」往往短一截,且随任务难度缩水。评估自己业务的上下文需求时,用真实任务灌满窗口测一遍,比信任何标称数字都可靠。

自测

合上文章先自己答,再展开对照:

「路线对比」框架能装下 MoBA / NSA 这类新路线吗?

能。框架只有两问:怎么挑(固定模式还是动态选择)、看什么(原始 token 还是压缩摘要)。MoBA 落「动态挑 + 原始块」——上下文切块、门控路由挑块,块内是原始 token;NSA 落「动态挑 + 压缩与选择混用」——远处压缩成摘要、近处与选中区细粒度原始,两层并用;DSA 落「动态挑 + 原始 token(细粒度)」;滑窗落「固定挑 + 原始」。框架的用处是让新路线一出来就能与旧路线同轴对比(省在哪、贵在哪)。边界也有:稀疏与线性注意力的混编架构需要补第三问「哪段文本用哪种注意力」,框架装得下大部分但不是全部。

1M token 的键值缓存有多大?为什么「能装下」不等于「装得起」?

按体积公式算:层数 × 键值头数 × 每头维度 × 2(K 与 V)× 字节数 × token 数。Qwen2-7B(28 层 / 4 组键值头 / 每头 128 维 / bf16)约 56 KiB/token,1M 上下文约 53.4 GiB——这是单请求的量,服务端还要乘并发。装得起(窗口标称 1M)装不起(显存与计算):训练侧打分对数 n² 在 1M 时达万亿对;推理侧每写一个 token 都要读全量缓存,「读」的带宽是 decode 的真瓶颈。所以需要稀疏注意力:滑窗把对数降到 1/122,top-k 稀疏到 1/488——DSA 的官方口径就是核心注意力从 O(L²) 降到 O(Lk)。

参考与延伸

  • Yuan 等《Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention》(2025,ACL 最佳论文):压缩 + 选择双层的原生可训练稀疏化 — arxiv.org/abs/2502.11089
  • Lu 等《MoBA: Mixture of Block Attention for Long-Context LLMs》(2025,月之暗面):块级门控路由 — arxiv.org/abs/2502.13189
  • DeepSeek-V3.2 发布公告(2025-09):DSA 细粒度稀疏注意力,官方定性「长文本训练和推理效率大幅提升」、API 成本降低 50% 以上 — api-docs.deepseek.com
  • Z.ai 官方博客《GLM-5.2: Built for Long-Horizon Tasks》:IndexShare 每 4 层共享索引、1M 下每 token 计算量降 2.9 倍 — z.ai/blog/glm-5.2
  • 《IndexCache: Accelerating Sparse Attention via Cross-Layer Index Reuse》(2026):跨层索引复用,消除 DSA 最高 75% 索引计算 — arxiv.org/abs/2603.12201
  • GLM-5.3-Flash 官方文档:首个稀疏注意力与线性注意力混合架构的开源前沿模型 — docs.bigmodel.cn
  • Hsieh 等《RULER: What’s the Real Context Size of Your Long-Context Language Models?》(2024):超越大海捞针的多任务有效上下文基准 — arxiv.org/abs/2404.06654
  • 大海捞针测试的原始实现(藏针矩阵可视化) — github.com/gkamradt/LLMTest_NeedleInAHaystack

下一站:MoE:稀疏激活——注意力之外,FFN 层才是参数大头;MoBA 里「MoE 式路由」的那套思想,正篇登场。

本节点大纲与自测题(3 个子点 · 1 问)

大纲

  • KV 显存墙与长上下文的成本结构
  • 稀疏注意力谱系(GLM 三篇产出:拆解 / 路线对比 / DSA+IndexShare)
  • 长上下文评估:大海捞针及其局限

自测——答不上来就是缺口

  • 「路线对比」框架能装下 MoBA / NSA 这类新路线吗?