← 返回小小橘新闻
🔬 本喵手记 · 喵闻社 · 技术深挖

字节抓住了 DeepSeek 的「小辫子」

同样一个问题,前面多敲几个等号,模型就从对变错。这不是玄学,是一个能画成周期表、也能被绕开的缺陷。

📅 2026.10.17 · 📄 arXiv:2609.36322 · 论文 65 页 20 图
文 / 小小橘 · 喵闻社

📋 先看重点

🐾 三句话讲完
  • 出了什么事:字节 Seed 团队发现,DeepSeek V4 系列在长文本里找信息时,准确率会随目标位置的「余数」周期性起伏。同样一条信息,放对格子能答对九成,放错格子掉到三成。
  • 为什么会这样:DeepSeek 为了省显存,把模型读过的内容(KV 缓存)按固定步长切块压缩。压缩让每个 token 多出一个坐标,叫「相位」。模型在训练中学会了偏好某些相位,其余相位就成了盲区。
  • 跟你有什么关系:你审长合同、喂长文档、做检索,都可能踩到盲区。而且看平均分看不出来,因为平均分恰好把最差的那一档摊平了。

本喵把这篇论文从头翻到尾,顺手核了它引用的每一个数。有一件事要先说清楚:这不是 DeepSeek 一家的病,是「分块压缩」这一类方案的共性代价。论文自己用 23 个从零训练的小模型复现了同一现象,全注意力对照组一次都没抖。

🔍 一、这个 Bug 是怎么撞见的

起点非常随意:让 DeepSeek-V4-Flash-Base 补全它自己的一段推理代码——就是它做低精度计算(FP8)用的那部分。光标停在 T.Cast(FP 后面,正确答案是 8,因为写成 32 会把外层的类型转换套两遍。

橘猫拿着放大镜观察一长卷被切成方格的纸带
本喵的视角:一长卷文字被切成一个个格子,能不能被看见,取决于它落在哪一格。
// 光标停在这里,要补的是什么数字? y = T.Cast(FP█ // 正确:8 —— 写 32 会和外层 Cast 重复

反常识的部分来了。研究员在代码前面垫了一段毫无意义的填充文本,然后一个 token 一个 token 地加长。代码一个字没改,模型的答案却在 8 和 32 之间来回翻,而且每隔 4 个 token 翻一次。

原论文给的是概率幅度,不是百分比:P(8) − P(32) 在 −0.79 到 +0.95 之间摆动。翻译一下,同一个位置,模型对它原本笃定的答案,置信度可以从「九成确定是 8」掉到「八成确定是 32」。四组不同的填充文本、每组 16 种长度,一共 64 个输入,其中 60 个都踩着这个四拍的节奏。

4
答案翻转的周期
= 压缩步长
60/64
4 组填充 × 16 长度中
符合该规律的数量
4/64
没有分块压缩的
DeepSeek-V3.1 出错次数

对照组很干净:DeepSeek-V3.1-Base 没有做分块压缩,同样 64 个输入里只错了 4 个,而且每次的置信度差距都不到 0.07。也就是说,问题不是「这段话怪」,是「模型看这段话的方式怪」。

先把「相位」这个词说清楚

一个 token 在句子里的位置,我们习惯用绝对位置表示:第 1 个、第 2 个、第 100 个。

分块压缩之后,模型不再逐字看,而是每 8 个 token 打包成一条缓存,每 4 个 token 就开一个新包。于是每个 token 多出一个坐标:它落在这一包的第几格。这个格子编号,论文叫相位(phase),算法就是「位置 ÷ 步长 的余数」。

关键在于:你在前面多打一个字,整段文字的相位就集体挪一格。内容没变、顺序没变、距离没变,只有格子变了。如果模型的检索能力依赖格子,那这个依赖就是模型自己的毛病,不是文本的毛病。

原文
起相0
点相1
在相2
这相3
里相0
8相1
是相2
对相3
的相0
窗口 A(第 0–7 个 token)
窗口 B(第 4–11 个)
前面多 1 个字
起相1
点相2
在相3
这相0
里相1
8相2
是相3
对相0
的相1
相位 0 相位 1 相位 2 相位 3 🔴 关键 token
同一个「8」,前面多打一个字就从相位 1 滑到相位 2。文字内容一个字没变,变的是它落在压缩窗口的第几格。DeepSeek V4 的窗口是 8 个 token、步长是 4,所以相邻两个窗口有 4 格重叠。

本喵第一次看懂这里的时候,后背有点凉。我们一直以为「模型读到了没」,结果它读到多少,取决于这条信息站在队伍的第几个位置。这不是理解力问题,是排队问题。

⚙️ 二、为什么偏偏是「格子」出了事

先补一句 KV 缓存是什么

大模型每吐一个字,都要把前面所有字重新「看」一遍。为了不重复算,它把算过的中间结果存起来,这就是 KV 缓存。上下文越长,这份缓存越大:128K 上下文的缓存,能吃掉几十 GB 显存。所以「省缓存」几乎等于「省成本」,全行业都在卷这个。

DeepSeek V4 的两把省钱刀

论文里点得很具体:V4 的注意力层在两种压缩之间交替。

层类型窗口 / 步长压缩率怎么干活
CSA压缩稀疏注意力 8 / 4 4 : 1 8 个 token 打包成 1 条缓存,每隔 4 个 token 开一个新包,相邻包有 4 格重叠
HCA重度压缩注意力 — 128 : 1 更狠的一档,128 个 token 压成 1 条。论文发现这类层对检索几乎不贡献,盲区主要来自 CSA 层
偶数层 · CSA → 8 进 1 → 压缩率 4:1 每 4 个 token 滑一格,窗口重叠一半
奇数层 · HCA → 128 进 1 → 压缩率 128:1 更省,但对「精确捞出一条信息」几乎帮不上忙
压缩不是把文字删掉,而是把一格里 8 个 token 的信息加权揉成一条。揉的时候每个位置一个权重,这个权重就是「门控」。门控偏向谁,谁的信息就留得下来。

真正的病根:门控学会了「偏心」

每打包一次,模型都要决定这 8 个 token 谁占多少分量。这个决定由门控做,而门控里有一组按位置固定的参数:第 1 格一套、第 2 格一套,一直排到第 8 格。它跟 token 内容无关,只跟「你站在第几格」有关。

论文把 23 个从零训练的压缩模型剖开看,发现了两种情况:

1
大多数头学会了「看内容」:同一份输入里,它挑哪几格是不固定的,平均下来比较均匀。这种头不绑死任何相位。
2
少数头学会了「站队」:不管读什么,它永远偏爱同一格,比如永远给第 2 格最高分。论文管这叫静态集中。
3
出问题的正是后者:一个头只在第 2 格使劲,第 2 格里的信息就活得很好;第 1、3、4 格的信息,除非别的头恰好管它,否则等于没进缓存。
4
而且这事能预测:把某个模型的「偏爱格子」整体挪一格,它的准确率曲线也跟着挪一格,相关性 R² 在 0.66 到 1.00 之间。等于把病情和一个开关对上了。

论文还给了个更扎心的结论

作者没停在实验上,写了两个定理。大意是:在理想化模型里,最优的压缩策略本来就是「极度集中」,把所有分量押到一个位置上;而且训练的动力会把这个集中固化下来,跟输入无关。更麻烦的是,让不同头去覆盖不同位置,对训练损失的收益只有 1/N 量级,几乎没有动力去优化。

换句话说,模型不是没学好,是学得太好了。它精确地学会了怎么省事,而省事的代价就是一部分格子没人管。这也是为什么做「敲掉某个头」的实验时,损失会集中出现在某几个相位上:那些相位本来就只有一两个头在管。

这里要纠正一个流行但不准确的说法:不是「每段开头结尾看得仔细,中间糊弄」。真实机制更像「8 个人一组写会议纪要,负责记录的那位永远坐第 2 把椅子」。第 2 把椅子上的人说什么都被记下来,第 1、3、4 把椅子上的话,全看他心情。人挪了位置,纪要质量就变了。

📊 三、数据:到底差多少

论文做的是标准的大海捞针(NIAH):每个提示塞满 128K token,里面有 16000 条「键:值」记录,然后问其中某一把钥匙对应的值。关键设计是只改钥匙的位置,其它全部固定:总长度固定、提问位置固定、每组 256 条提示,连钥匙绝对位置的平均值和方差都对齐。

然后按「钥匙位置 ÷ 8 的余数」分成 8 组,看每组的准确率。8 组刚好覆盖 DeepSeek V4 的两个压缩周期。

模型 余0余1余2余3余4余5余6余7 最高−最低
V4-Flash-Base 43.7569.5366.02 29.6944.9269.92 64.4532.81 40.2
V4-Flash-0731 80.4788.6798.05 96.4881.2590.23 99.6196.09 19.1
V4-Pro-Base 60.9488.2878.91 56.2562.5091.02 80.4758.20 34.8
V4-Pro-0813 78.1389.8491.41 77.3477.3489.45 92.1979.69 14.8
V4.1-Flash步长 2 95.0089.2295.12 89.6994.6990.31 95.3189.73 6.1
0% 100%

数据来自论文附录 C.1 表 7,同一批 2048 条提示,取答案前缀匹配率。V4.1-Flash 单独跑,每组 2560 条。

看第一行就够了:V4-Flash-Base 最好的一组 69.9%,最差的一组 29.7%。同一条信息、同一句话、同一个提问,只因为它在文档里偏了几个字,准确率掉一半还多。

后训练确实救了一截:V4-Flash-0731 的差距从 40.2 收到 19.1,V4-Pro-0813 收到 14.8。V4.1 把步长从 4 砍到 2,差距压到 6.1 个点。但你注意最后一行的节奏——偶数余数全部在 94.7 到 95.3,奇数余数全部在 89.2 到 90.3。步长变成 2,周期就变成 2。病没走,只是拍子变快了。

为什么这事比看上去严重:上面这五个模型的平均分分别是 52.6%、91.4%、72.1%、84.4%、92.4%。只看平均分,V4-Flash-Base 是个「中等偏上」的模型。但它有一整组位置只考 29.7 分。平均分不是把缺点抹平了,是把缺点摊到看不见的地方去了。

论文自己训练的模型把这个道理演示得更狠:有一个 W8/S8、8 个 KV 头的配置,平均分 59.4、验证损失 2.431,跟全注意力同配置的 61.1 / 2.437 几乎打平,听起来是「压缩白赚」。可它的最差相位只有 9.9%,全注意力那一版最差还有 58.4%。平均分一样,底线差五倍。

橘猫在档案书架间用手电筒照亮其中一格
检索这件事,本来像是在一座巨大的档案库里找一页纸。相位敏感意味着:这页纸在不在,取决于它被塞进第几号抽屉。

🌍 四、这到底是谁的问题

不是 DeepSeek 一家,但也不是「所有模型」

先把边界划清楚,因为网上传的版本有点走形。论文测的是两类对象:一是 DeepSeek V4 全家(Flash / Pro / 后训练版 / V4.1),二是作者从零训练的 23 个压缩模型,骨架是 Qwen3-0.6B,训了 100B token。

结论是:只要用了固定步长的分块压缩,就有这个现象;不用的对照组,一条都没抖。步长取 4、6、8、12,周期就分别是 4、6、8、12。这跟厂商无关,跟方案有关。

所以「Llama 也中招」这种说法,本喵在论文里没找到依据,论文压根没测 Llama 系列。它测的是自己训的那批模型和 DeepSeek 的开源权重。这个区别很重要:前者证明「机制成立」,后者证明「某个具体产品确实有」。

证据强度,也得分清楚

🟢
硬的部分
23 个自训模型 + 全注意力对照,同一套评测、同样的位置统计量。全注意力差距不超过 6.1 个点,压缩模型最高 78 个点。这条链是闭合的。
🟡
要打折的部分
DeepSeek 上的机制分析只能做到「整层替换」,做不到单头。而且论文是 preprint,65 页 20 图,还没过同行评审。作者在局限性一节写得很实在。

对用模型的人,具体是什么后果

⚠️
长文档审阅:关键条款刚好落进盲区,模型会给出一个语气很确定的错误结论。它不会说「我没看到」,它只是没看到,然后照着看到的编。
⚠️
代码补全和改写:前面多几行注释、多几个空行,补全结果就可能换一个。这在天天改代码的场景里最难查,你会以为是自己的逻辑问题。
⚠️
RAG 检索:知识库切块的方式,直接决定命中率。同一段内容换个位置插进去,召回效果能差一截。切块器的参数,可能比模型选型更影响结果。

本喵想了想最坏的情况:你让模型审一份 50 页合同,免责条款在某个不利的位置,模型回你一句「没有发现明显风险」。它没有撒谎,它只是没看见。这种错误比报错难发现一百倍。

🚀 五、解药在哪,为什么不好吃

病根是「固定」,不是「压缩」

既然问题是「每 4 个 token 一个固定节拍」,那最直接的想法就是:别固定,跟着内容走。这个方向叫动态分块 / 语义分块,现在确实是最热的路线。

但先说清楚为什么它不好做。压缩是在「还不知道你会问什么」的时候就做完了:一条缓存写下去,后面任何问题都得靠它。你想按内容挑重要的留,可当时的模型并不知道哪个重要。这是先手劣势,不是算法偷懒。

已经跑出来的几件东西

方案它解决什么代价 / 边界
ChunkKV语义块保留 按语义块整块保留或丢弃,不再一个字一个字挑。LLaMA-3-8B 在 8K 上下文、缓存只留 128 条时,NIAH 准确率 73.8%,SnapKV 是 58.9% 解决「丢掉整句话」,不解决「同一窗口内位置偏心」。而且要看末尾的 query 才能打分,属于事后压缩
MInference微软亚研院 针对百万级上下文的 prefill 阶段,按注意力模式稀疏化,A100 上最高 10 倍加速,精度基本不掉 加速「读进去」这一段,不改缓存的内容结构,相位问题原样保留
Late ChunkingJina AI 先让嵌入模型读完整篇再切块,让每块的向量带上全文语境。这是检索层的做法,不是模型内部压缩 只改善 RAG 的召回质量,跟 KV 缓存压缩是两回事。很多文章把这两个混着讲
✅
能缓解的
减小步长(4→2,差距 40→6 个点)、增强后训练、保留局部精确窗口、评测时按相位分组看最差值而不是只看平均。
❌
目前根治不了的
只要压缩是固定步长、且在提问前完成,就一定有某个相位吃亏。论文的理论部分解释了为什么训练不会自动修好它:修补的收益太小,动力不足。

论文自己也没给「解药」,它给的是「诊断方法」。这点本喵觉得反而诚实:先承认这是架构层面的取舍,再谈怎么在工程上绕。

🧰 六、那你能做什么

以下五条不需要你换模型,也不需要你看论文,今天就能用。

  • 关键信息别只出现一次。要模型必须遵守的约束(金额、日期、禁止项),在开头和结尾各说一遍,中间再提一次。三个不同相位,至少能覆盖两处。
  • 长文档分段喂,别一把梭。与其塞 10 万字让它自己找,不如按章节切开、逐段提问。段越短,压缩窗口的副作用越小,也方便你抽查它读没读。
  • 让它复述,别让它直接下结论。问「把和免责有关的条款原文抄给我」,比问「有没有风险」可靠得多。抄原文你能一眼看出它漏没漏,下结论你只能信它。
  • 做评测时看最差值,不看平均分。同一批问题,把关键信息放在 4 到 8 个不同位置各测一遍。平均分一样、最差值差五倍的两个模型,实际体验完全不同。
  • 重要决定留人工复核。模型说「没问题」的时候,恰恰最该抽查,因为盲区里的错误,输出看起来和正确答案一样自信。
一句话版本:把它当一个「位置敏感的实习生」,别当一个「读过全文的专家」。位置敏感这件事你改不了,但你可以决定把要紧的东西放在哪,以及信它到什么程度。

🐱 本喵的结论

一,字节这波抓得准。不是抓了个营销点,是抓到一个可以画成周期表、可以用定理解释、可以在 23 个自训模型上复现的机制。而且它用的是 DeepSeek 自己开源的权重,敢把底牌亮出来,就得接受全世界来验。

二,但这不是「DeepSeek 菜」。整个行业都在用分块压缩换长上下文,这是算力账本逼出来的选择。论文测的 23 个自训模型里,全注意力对照组一次都没抖,说明问题出在方案,不出在厂商。

三,最该记住的是那句「平均分掩盖弱点」。这不只是模型评测的问题。任何用一个总数概括一堆分布的做法,都可能把最差的那一档藏起来。看榜单的时候多问一句:最差的情况是多少?

至于要不要因为这个换模型,本喵觉得不必。V4 系列的后训练版已经把 40 个点的差距收到 15 上下,V4.1 收到 6 个点。真正要改的是用法:别把要紧的事交给「平均分很好」这四个字。

论文:Periodic Weak Spots: Phase Sensitivity from Chunked KV-Cache Compression,arXiv:2609.36322(2026 年 9 月底提交,65 页 20 图,preprint 未经同行评审)| 作者:Xingyu Zhu、Pu (Luke) Yi、Ziheng Cheng、Ang Lv、Jing Liu、Lexing Ying、Yiyuan Ma、Xin Dong | 机构:ByteDance Seed · 普林斯顿 · 斯坦福 · UC 伯克利

数据核对至论文附录 C.1 表 7 与正文图 2 | 核对日期 2026.10.17 | 延伸阅读:《前线与总部:大模型只收到一封封电报》 · 《AI 两周「克隆」出 Adobe 全家桶》 · 小小橘新闻 · 全部条目

🐾

本喵手记 · 喵闻社 · 用猫爪扒开技术真相