字节抓住了 DeepSeek 的「小辫子」
同样一个问题,前面多敲几个等号,模型就从对变错。这不是玄学,是一个能画成周期表、也能被绕开的缺陷。
📋 先看重点
- 出了什么事:字节 Seed 团队发现,DeepSeek V4 系列在长文本里找信息时,准确率会随目标位置的「余数」周期性起伏。同样一条信息,放对格子能答对九成,放错格子掉到三成。
- 为什么会这样:DeepSeek 为了省显存,把模型读过的内容(KV 缓存)按固定步长切块压缩。压缩让每个 token 多出一个坐标,叫「相位」。模型在训练中学会了偏好某些相位,其余相位就成了盲区。
- 跟你有什么关系:你审长合同、喂长文档、做检索,都可能踩到盲区。而且看平均分看不出来,因为平均分恰好把最差的那一档摊平了。
本喵把这篇论文从头翻到尾,顺手核了它引用的每一个数。有一件事要先说清楚:这不是 DeepSeek 一家的病,是「分块压缩」这一类方案的共性代价。论文自己用 23 个从零训练的小模型复现了同一现象,全注意力对照组一次都没抖。
🔍 一、这个 Bug 是怎么撞见的
起点非常随意:让 DeepSeek-V4-Flash-Base 补全它自己的一段推理代码——就是它做低精度计算(FP8)用的那部分。光标停在 T.Cast(FP 后面,正确答案是 8,因为写成 32 会把外层的类型转换套两遍。

反常识的部分来了。研究员在代码前面垫了一段毫无意义的填充文本,然后一个 token 一个 token 地加长。代码一个字没改,模型的答案却在 8 和 32 之间来回翻,而且每隔 4 个 token 翻一次。
原论文给的是概率幅度,不是百分比:P(8) − P(32) 在 −0.79 到 +0.95 之间摆动。翻译一下,同一个位置,模型对它原本笃定的答案,置信度可以从「九成确定是 8」掉到「八成确定是 32」。四组不同的填充文本、每组 16 种长度,一共 64 个输入,其中 60 个都踩着这个四拍的节奏。
= 压缩步长
符合该规律的数量
DeepSeek-V3.1 出错次数
对照组很干净:DeepSeek-V3.1-Base 没有做分块压缩,同样 64 个输入里只错了 4 个,而且每次的置信度差距都不到 0.07。也就是说,问题不是「这段话怪」,是「模型看这段话的方式怪」。
先把「相位」这个词说清楚
一个 token 在句子里的位置,我们习惯用绝对位置表示:第 1 个、第 2 个、第 100 个。
分块压缩之后,模型不再逐字看,而是每 8 个 token 打包成一条缓存,每 4 个 token 就开一个新包。于是每个 token 多出一个坐标:它落在这一包的第几格。这个格子编号,论文叫相位(phase),算法就是「位置 ÷ 步长 的余数」。
关键在于:你在前面多打一个字,整段文字的相位就集体挪一格。内容没变、顺序没变、距离没变,只有格子变了。如果模型的检索能力依赖格子,那这个依赖就是模型自己的毛病,不是文本的毛病。
⚙️ 二、为什么偏偏是「格子」出了事
先补一句 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 层 |
真正的病根:门控学会了「偏心」
每打包一次,模型都要决定这 8 个 token 谁占多少分量。这个决定由门控做,而门控里有一组按位置固定的参数:第 1 格一套、第 2 格一套,一直排到第 8 格。它跟 token 内容无关,只跟「你站在第几格」有关。
论文把 23 个从零训练的压缩模型剖开看,发现了两种情况:
论文还给了个更扎心的结论
作者没停在实验上,写了两个定理。大意是:在理想化模型里,最优的压缩策略本来就是「极度集中」,把所有分量押到一个位置上;而且训练的动力会把这个集中固化下来,跟输入无关。更麻烦的是,让不同头去覆盖不同位置,对训练损失的收益只有 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.75 | 69.53 | 66.02 | 29.69 | 44.92 | 69.92 | 64.45 | 32.81 | 40.2 |
| V4-Flash-0731 | 80.47 | 88.67 | 98.05 | 96.48 | 81.25 | 90.23 | 99.61 | 96.09 | 19.1 |
| V4-Pro-Base | 60.94 | 88.28 | 78.91 | 56.25 | 62.50 | 91.02 | 80.47 | 58.20 | 34.8 |
| V4-Pro-0813 | 78.13 | 89.84 | 91.41 | 77.34 | 77.34 | 89.45 | 92.19 | 79.69 | 14.8 |
| V4.1-Flash步长 2 | 95.00 | 89.22 | 95.12 | 89.69 | 94.69 | 90.31 | 95.31 | 89.73 | 6.1 |
数据来自论文附录 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。病没走,只是拍子变快了。
论文自己训练的模型把这个道理演示得更狠:有一个 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 的开源权重。这个区别很重要:前者证明「机制成立」,后者证明「某个具体产品确实有」。
证据强度,也得分清楚
对用模型的人,具体是什么后果
本喵想了想最坏的情况:你让模型审一份 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 缓存压缩是两回事。很多文章把这两个混着讲 |
论文自己也没给「解药」,它给的是「诊断方法」。这点本喵觉得反而诚实:先承认这是架构层面的取舍,再谈怎么在工程上绕。
🧰 六、那你能做什么
以下五条不需要你换模型,也不需要你看论文,今天就能用。
- 关键信息别只出现一次。要模型必须遵守的约束(金额、日期、禁止项),在开头和结尾各说一遍,中间再提一次。三个不同相位,至少能覆盖两处。
- 长文档分段喂,别一把梭。与其塞 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 全家桶》 · 小小橘新闻 · 全部条目
本喵手记 · 喵闻社 · 用猫爪扒开技术真相
本喵第一次看懂这里的时候,后背有点凉。我们一直以为「模型读到了没」,结果它读到多少,取决于这条信息站在队伍的第几个位置。这不是理解力问题,是排队问题。