K3 七天课 · Day 3 / 7 课程首页 自测题 映射 K3
Day 3 · 一口气记住 100 万字

为什么「记得越多」,AI 就越慢越贵?

昨天学会了:AI 的注意力要「两两打分」,窗口越长越花钱。但 K3 的上下文窗口是 100 万 token——别人做不到的事,它凭什么?今天的主角是 K3 的看家本领:KDA(记笔记式注意力),以及它背后那两个平凡却关键的词:便签本(KV Cache)和遗忘。

学完你能回答
为什么上下文窗口越长,AI 越慢越贵?
学完你能回答
「便签本」KV Cache 是干什么的?
学完你能回答
KDA 怎么做到不抄全文、只记重点?

0起点:这些你早就会了

今天的故事,用一个字就能概括:记。你读书、听课、备考时的那套「记笔记」经验,就是理解 KDA 的全部钥匙:

你已经会的AI 世界里对应的东西
背单词:抄一遍不如多过几遍——先记下,反复用KV Cache(便签本):AI 把听过的内容「记下来」,下次直接用,不重算
错题本:只记重点和错点,不抄整本书KDA(记笔记式注意力):AI 只把「重点」写进一个固定大小的笔记本
记忆曲线:昨天背的还记得,上个月背的淡了衰减(遗忘):旧信息逐渐变淡,越久远越模糊,但不会完全消失
传话游戏:越传越走样 → 所以要挑关键句记Delta 规则:新信息来了,只「更新」旧笔记里相关的那部分
听讲座:抄全稿会累死,写摘要又快又够用MLA(摘要式注意力):把每个人的发言压缩成一句「摘要」再存
长跑:不能一口气冲到底,要分段提速渐进式上下文扩展:窗口不是一次拉满,是一段一段加长

核心就一句:AI 的「记忆」是有成本的——记什么、记多少、怎么忘,决定了它能不能看 100 万字。

1问题:为什么「看得越多」就越贵?

回忆 Day 2 的「全班讨论会」:每个词发言前,要跟其他所有词两两打分。这就有个数学问题——词一多,打分次数涨得飞快:

上下文变长,两两打分次数暴涨 4 个词需要 4×4=16 次打分,8 个词 64 次,16 个词 256 次——词数翻倍,次数翻四倍 词数翻一倍,打分次数翻四倍 4 个词 A B C D 4 × 4 = 16 次 8 个词 8 × 8 = 64 次 16 个词 ⋮ 太多格子,画不下了 16 × 16 = 256 次 词数翻一倍(4→8→16),打分次数翻四倍(16→64→256)——这就是「长文本贵」的根源
图 1 · 两两打分的「平方爆炸」:每个词都要和窗口里所有词打一次分,所以打分次数 ≈ 词数 × 词数。4 个词 16 次、8 个词 64 次、16 个词 256 次。100 万个词?那就是 100 万 × 100 万——天文数字。这也是为什么「窗口拉长」是所有 AI 都要面对的大难题。
打个比方
就像开班会:班里 4 个人,每人发言前听一遍全班,一共 16 次「听讲」;班里 16 个人,就是 256 次。人越多,这个「两两听讲」的工作量涨得越离谱。AI 的「班」就是上下文窗口——窗口越大,「班会」越难开。
进阶小注 ·这就是全量注意力的 O(L²) 复杂度(L = 序列长度):每个位置 q 要跟全部 L 个位置的 k 做内积,L 个位置共 L² 次。空间上还要存 L 个 (k, v)。L 从 8K 涨到 1M,开销不是涨 125 倍而是涨 15,625 倍。KDA 的目标,就是把这笔 L² 的账变成「固定成本」。

2第一笔账:推理时的「重复劳动」→ 便签本(KV Cache)

先处理一个「冤大头」问题。AI 跟你聊天是一个字一个字往外蹦的(Day 1 的接龙)。每蹦出一个字,它理论上要「重新听一遍」你之前说的所有话——而同样的内容,它上一轮已经听过一遍了。这不是浪费吗?

KV Cache:推理时把听过的话记下来,避免重复计算 没有便签本时每生成一个词都要重算前面全部;有便签本时第一遍记下 K 和 V,之后直接查 推理时:听过的话,为什么要一遍遍重听? 没有便签本 小 明 递 每蹦 1 个字, 前面所有字全部重听一遍 蹦到第 100 个字 = 重算了 99 遍 😵 有便签本(KV Cache) 小 明 递 便签本 第一遍就记下「名片+发言」 之后直接查笔记,不再重算 😌 便签本里记的,就是每个词的 K(名片)和 V(发言)——所以它叫 KV Cache(KV 缓存)
图 2 · 便签本(KV Cache):AI 第一次「听」你的话时,顺手把每个词的 K(名片)和 V(发言)记下来;之后每蹦一个新字,直接查便签本就行——省掉了「重听一遍」的重复劳动。几乎所有 AI 都用这招,但注意:便签本会随对话变长而越记越厚——这就是下一笔账。
记一下这个术语:「便签本」在 AI 行话里叫 KV Cache(K 和 V 的缓存)。以后读到这个词,心里翻译成「便签本」就行。它解决了「重复劳动」的问题,但它自己有个新问题——越记越厚,厚到内存装不下。
进阶小注 ·推理时每生成一个 token,都要用它的 q 与历史所有 k 算注意力。若不缓存,复杂度退化为对全历史的重复预填充;KV Cache 把增量解码变成「读缓存 + 一次点积」,解码阶段每 token 是 O(L)(L 为已生成长度)。代价是显存占用随 L 线性增长——这也是 100 万上下文下 KV Cache 可能比模型权重还占显存的原因。

3第二笔账:便签本越记越厚 → KDA 的「固定大小笔记本」

KV Cache 解决了「重复劳动」,但便签本自己越记越厚——看 100 万字,就要记 100 万张卡片,内存照样爆。K3 的 KDA 换了个思路:干脆不要「每词一张卡片」,改用一本固定大小的笔记本——边读边写,写不下就把旧笔记冲淡一点。笔记本就那么大,文章再长也不变。

KDA:固定大小的笔记本,边读边写、旧笔记变淡 左侧 token 依次进入,中间是固定大小的笔记本 S,新词写入时旧笔记被冲淡 KDA 的笔记本:大小固定,文章再长也不变大 读 完 这 句 写笔记 笔记本 S 刚写的 变淡了 快忘了 ① 读到新词,写进本子 (更新的只是相关那一格) ② 旧笔记随时间变淡 (越久远越模糊) ③ 本子就这么多格 文章再长,大小不变 笔记本 = 一个固定大小的「记忆矩阵」。读 1 万字还是 100 万字,它都是同一块大小——这是 K3 能看长文还不爆内存的关键
图 3 · KDA 的「固定大小笔记本」:左边是正在读的文章,中间是笔记本 S——几行几列是固定的。读到新词时,① 把重点写进相关格子;② 旧笔记按「遗忘曲线」变淡;③ 笔记本大小从头到尾不变。KV Cache 是「每词一张卡、越记越厚」,KDA 是「一本固定大小的本、边读边更新」——这就是两种思路的本质区别。
打个比方
KV Cache 像录音笔:原原本本记下每个人说的每句话,时间越长录音越长。KDA 像会议纪要本:永远只有那几页,听到新重点就更新,旧内容越翻越淡。录音笔一字不漏但撑不长,纪要本永远装得下但会「漏细节」——K3 正是靠「纪要本」撑起了 100 万字。
进阶小注 ·KDA 的递归更新是 S_t = (I − β_t k_t k_tᵀ)·Diag(α_t)·S_{t−1} + β_t k_t v_tᵀ:Diag(α_t) 是逐通道衰减(遗忘),β_t 是写入强度(Delta 规则),S 的尺寸 d_k×d_v 与序列长度无关——所以是 O(1) 状态、O(L) 计算(分块后)。这正是「固定大小笔记本」的数学长相。

4遗忘不是缺点,是设计:记忆曲线与「隐式座位号」

你可能觉得「旧笔记变淡」是坏毛病——不,在 K3 里,遗忘恰恰是它最聪明的设计。原因有二:

第一,近的比远的更重要。聊到第 50 句时,第 3 句的细节已经没那么关键了;把「记忆力」匀给刚说的话,性价比更高。就像你复习考试:昨天讲的比上个月讲的重要。

遗忘曲线:越久远越模糊,但有下限不会完全消失 清晰度随距离衰减,接近下限但不完全归零 记忆清晰度:越久远越模糊,但不会彻底忘光 现在(近) 很久以前(远) 下限 刚才的话:很清楚 开头的话:很模糊,但还记得 这条「遗忘曲线」同时就是位置信息:离现在越远的词,在笔记里的痕迹越淡——顺序就这样被记下来了
图 4 · 遗忘曲线(衰减):横轴 = 距离现在多远,纵轴 = 记忆清晰度。刚看过的词清楚,早先的词模糊,但不会完全归零(K3 给遗忘设了个下限,防止旧信息彻底丢失)。这条曲线还暗中帮了大忙——见下面第 2 点。

第二,遗忘本身就编码了「顺序」。回想 Day 2 的难题:AI 怎么知道「猫追狗」和「狗追猫」的区别?绝大多数模型要给每个词发「座位号」(位置编码)。K3 却不用——因为它的遗忘曲线就是天然的座位号:越靠后的词越清晰、越靠前的词越模糊,顺序信息就藏在清晰度里。这一招让它省掉了位置编码那一大块内存,还让上下文窗口想拉多长拉多长(不用改座位号规则)。

记住这个词 NoPE(No Position Encoding,无位置编码):K3 不给词发显式座位号,靠 KDA 的遗忘机制「隐式」记住顺序。好处是省内存、窗口可无限外推——这也是 K3 能直接冲到 100 万 token 的原因之一。
进阶小注 ·KDA 的每步保留因子 α ∈ (0,1) 使第 t 步写入的信息在第 T 步时的残留 ≈ α 的连乘积,即指数衰减。K3 还给对数衰减设了下界(g_min = −5),保证 16-token 块内累积衰减落在 BF16 动态范围内,从而能用稠密 Tensor Core 矩阵乘法。这个「有下界的遗忘」在数学上等价于带近因偏置的位置编码——NoPE 的严格依据。

5另一种省法:不记原话,记摘要(MLA)

KDA 是「固定大小笔记本」。K3 还有第二招省内存——用在它那 1/4 的「全记录式」注意力(MLA)上:把每个人的「名片+发言」压缩成一小段摘要再存。就像听讲座不抄全稿,只写三行要点。

MLA:把每个词的 K/V 压缩成低维摘要存储 传统方式每词存一张完整卡片;MLA 每词压成一个小摘要,用的时候再展开 MLA 的省法:不记原话,记「摘要」 传统 K/V:每人一张完整卡片 每个词一大张 → 越记越占地方 MLA:每词压成一个小摘要 摘要 摘要 摘要 用的时候再「展开」成完整名片 一小段 → 100 万字也装得下 摘要 = 把完整 K/V 压缩成的「潜向量」。压缩了但不丢全局——所以 K3 用它做「全记录式」那一层
图 5 · MLA 的「摘要式存储」:传统方式每个词存一张完整卡片(左),MLA 把每个词的 K/V 压成一小段摘要(右,深色小方块),需要时再展开。压缩有损失但损失可控,换来的是缓存大幅瘦身。K3 的注意力是「双轨」:大部分层用 KDA 记笔记,隔几层用 MLA 做「全记录」——MLA 也压缩,KDA 也省地方,两头都占。
进阶小注 ·MLA 用低维投影 c_t = W_c x_t 压缩每个 token 的 K/V,缓存存 c_t 而非完整的逐头 K/V,注意力计算时再通过升投影重构。K/V 缓存从「每头一份」降为「每 token 一份潜向量」,显存占用显著下降。K3 还给它加了依赖输入的全秩输出门(Gated MLA)。

6100 万不是一天练成的:窗口一点点拉长

有了 KDA 的固定笔记本和 MLA 的摘要,内存问题解决了。但还有最后一关:100 万 token 的「长文本理解力」,模型一开始是没有的——得靠训练喂出来。K3 的做法是「渐进式」:像长跑一样分段提速,不让某一阶段被长文拖垮。

渐进式上下文扩展:8K→64K→256K→1M 四阶段 上下文窗口随训练推进从 8K 逐步扩展到 64K、256K、100 万 上下文窗口:四步拉长,而不是一步到位 预训练早期 8K 预训练后期 64K 收尾(cooldown) 256K 最终目标 1,000,000(100 万)
图 6 · 渐进式上下文扩展:窗口从预训练早期的 8K 起步 → 预训练后期 64K → 收尾阶段 256K → 最终 100 万。长文本计算又贵又慢,K3 把「烧钱的长序列训练」压缩在总预算的一小段里,其余时间专心学短文本——先学会读短文,再逐步挑战长文。

还有个配套细节:光长不够,还要「会读」。长文档里废话很多,K3 的团队会专门合成一些「必须看完整 100 万字才能答对」的训练题,逼着模型真的学会利用超长上下文——防止它「假装读了开头就瞎猜」。

今天的核心记忆点:
① 注意力要两两打分 → 窗口越长越贵(O(L²));
② KV Cache 便签本 → 省掉重复劳动,但越记越厚;
③ KDA 固定笔记本 → 大小不变,边读边写、旧笔记变淡;
④ 遗忘 = 位置信息(NoPE)→ 不用发座位号,窗口随便拉长;
⑤ MLA 摘要存储 → 全记录那一层也瘦身;
⑥ 渐进式扩展 → 8K → 64K → 256K → 100 万。
进阶小注 ·长上下文训练的关键权衡:把 8K 训练翻到 1M,计算量不是线性增长而是二次增长,所以 K3 采用「课程式」策略——大部分算力花在短序列,cooldown 阶段才上长序列(256K→1M),并用合成长程依赖数据防注意力退化。KDA 的 O(1) 状态 + 分块并行,让这个课程在工程上可负担。

7映射到 K3:原文里的「记笔记」长什么样

今天讲的每一件事,都能在 K3 报告里找到对应的原文。选三段最核心的,逐词翻译给你看:

K3 原文(§2.1.1 KDA 第一段)
「KDA 在 delta 规则递归的基础上扩展了逐通道遗忘门……KDA 在 delta 规则更新之前施加逐通道衰减。」

逐词翻译:

  • delta 规则递归:写笔记时「只更新相关那部分」——新词来了,改动笔记本里跟它相关的格子,不是全部重写。
  • 逐通道遗忘门:图 4 那条遗忘曲线——每个「记忆通道」按自己的节奏变淡。
  • 施加在更新之前:先让旧笔记淡一点,再把新内容写进去——顺序很关键,保证「旧的淡一点、新的鲜一点」。
K3 原文(§3.4 长上下文扩展 · 位置编码)
「Kimi K3 不使用显式位置嵌入(NoPE),而是通过 KDA 的循环门控与衰减机制隐式编码位置信息。因此,模型无需对位置编码做任何修改……即可直接外推至 100 万 token 的上下文。」

逐词翻译:

  • NoPE + 隐式编码位置:不另买「座位号」,把顺序藏在遗忘曲线里(图 4 的彩蛋)。
  • 无需修改即可外推:别的模型拉到超长上下文,常常要改座位号规则(RoPE 重缩放、插值),K3 完全不用——这是它能轻松冲到 100 万的直接原因。
K3 原文(§5.1 基础设施 · 为什么值得这么干)
「KDA 用固定大小的循环状态 S 取代 softmax 注意力中不断增长的键值缓存。」

逐词翻译:一句话把今天讲完:「固定大小的循环状态 S」= 图 3 的固定笔记本;「不断增长的键值缓存」= 图 2 越记越厚的便签本。KDA 的存在意义,就是拿「固定大小」换掉「不断增长」。

1M
上下文窗口
100 万 token
3:1
每 4 层注意力:
3 层 KDA + 1 层 MLA
NoPE
无显式位置编码
遗忘曲线当座位号
8K→1M
窗口四步渐进拉长
8K→64K→256K→100万
一句话总结今天的 K3 印象 K3 的长上下文不是靠蛮力堆出来的,是靠「记账」记出来的:KV Cache 解决重复劳动,KDA 固定笔记本解决越记越厚,遗忘曲线顺手解决顺序,MLA 压缩解决全记录层的开销,渐进式训练把 100 万慢慢教出来。明天我们去看另一座大山:2.8 万亿个数字,凭什么每次只动 1040 亿?

8自测题(先自己答,再点开看解析)

Q1为什么上下文窗口越长,AI 越慢越贵?
因为注意力要「两两打分」:每个词都要和窗口里其他所有词打一次分。打分次数 ≈ 词数 × 词数:4 个词 16 次,8 个词 64 次,16 个词 256 次——词数翻一倍,次数翻四倍。100 万个词就是 100 万 × 100 万次,天文数字。
Q2「便签本」KV Cache 解决什么问题?它自己有什么新问题?
解决「重复劳动」:AI 一个字一个字往外蹦,如果没有便签本,每蹦一个字都要把前面所有内容重听一遍。有了便签本,第一次听时把每个词的 K(名片)和 V(发言)记下来,之后直接查。新问题:便签本越记越厚(每词一张卡片),上下文一长,内存就爆了。
Q3KDA 和 KV Cache 的本质区别是什么?
KV Cache 像录音笔:每个词一张完整卡片,越记越多、大小随文章变长。KDA 像固定大小的会议纪要本:永远就那么多格,读到新词只更新相关格子,旧笔记按遗忘曲线变淡。笔记本大小与文章长度无关——这就是 KDA 能看 100 万字还不爆内存的根本原因。
Q4「遗忘」为什么反而是 K3 的优点?
两个原因:① 近的比远的更重要,把记忆力匀给刚说的话性价比更高;② 遗忘曲线本身编码了顺序——越靠后的词越清晰、越靠前的词越模糊,位置信息藏在清晰度里。这让 K3 不用显式发「座位号」(NoPE),省内存,而且上下文窗口想拉多长拉多长。
Q5K3 的 100 万上下文是怎么「练」出来的?
不是一步到位,而是渐进式拉长:预训练早期 8K → 预训练后期 64K → 收尾阶段 256K → 最终 100 万。长序列计算又贵又慢,所以只在总训练预算的一小段里做。同时还会专门合成「必须读完整 100 万字才能答对」的题目,逼模型真正学会利用超长上下文,防止它「读了开头就瞎猜」。
返回课程首页 · 本课程基于《Kimi K3 技术报告》编写,概念图均为原创示意