读完这篇,你能搞懂 Kimi K3 记忆架构凭什么把 1M 上下文管明白:哪部分负责记住,哪部分负责精确翻旧账,哪部分负责回读。先上一个刺痛的数字:22580。GPT-2 是 124M 参数,Kimi K3 是 2.8T,2.8T ÷ 124M ≈ 22580,一个 K3 顶两万多个 GPT-2,这是七年涨出来的倍数。
但参数翻两万倍,不等于记得住的东西翻两万倍。K3(07-16 发布,07-27 开放权重)真正值得写进笔记的,是它把”记什么、忘什么、怎么取回”这三件事从外挂工具挪进了模型权重。这三件事分别由三个机制负责,先看地图。
Kimi K3 记忆架构总览:KDA、MLA、AttnRes 各管什么
K3 的记忆系统是三个机制分工。骨架是 23 个四层宏循环,每个宏循环里 3 层 Kimi Delta Attention (KDA) 配 1 层 Multi-head Latent Attention (MLA);每 12 层插一个 Attention Residual (AttnRes) 块,全模型共 8 个。
至于首层 dense FFN、其余层换潜在空间 Mixture-of-Experts (MoE)、SiTU 激活这些改动,跟记忆关系不大,本文按下不表。
三个机制的分工一句话说清。KDA 是恒定状态的递归记忆,把该记的东西蒸馏进一块大小不变的状态里;MLA 保留完整 softmax,每 4 层安排一次对原始上下文的精确检索,相当于随时能查原文。
AttnRes 在深度方向回读早前层的输出,缓解残差稀释(residual dilution),只花约 2% 推理延迟,换来选择性读取和 1.25 倍算力优势。
为什么非要三个一起上?因为恒定状态必然有损,总会有东西装不下,MLA 的周期性精确检索就是给”装不下”兜底的。3 比 1 的配比也有讲究:精确检索只发生在四分之一的层上,开销被摊薄,恒定记忆省下来的资源占大头。
对天天用 Claude Code 这类工具的人来说,这些机制看着远,其实直接决定两件事:上下文拉长之后的延迟账单,和长任务里模型还抓不抓得住重点。这套配比不是拍脑袋,是 KDA 谱系一路演化出来的结果,下一节拆。
KDA 谱系速查:遗忘如何变成学出来的能力
七月我反复啃 @waterloo_intern 07-27 那篇长文,啃了三遍才敢动笔。它最有价值的部分不是讲 K3 本身,而是把 KDA 的家谱摆了出来:每一代机制都在修上一代的病。
顺手修正一个流传很广的误解:softmax 注意力并不是天生的 O(N²) 罪犯,FlashAttention 在 2020 年就解决了训练时物化 N×N 矩阵的问题,长文作者也承认自己在这里绕晕过。线性注意力的真正卖点,是把 KV Cache 的线性增长压成一块固定状态。
| 机制 | 核心操作 | 解决的问题 | 代价 |
|---|---|---|---|
| 线性注意力(Linear Attention) | 用 ELU+1 这类特征映射拆开 q 和 k,把全部历史折叠进固定 D×D 状态 | KV Cache 随序列线性增长,长上下文的显存和带宽吃不消 | 特征映射是 softmax 的粗糙近似;加法写入,状态一满就互相干扰 |
| DeltaNet | delta 规则:先读旧值,再差量覆写 | 新信息定点顶掉旧信息,而不是无限叠加 | 一次只能替换一个 key 位置的值,没法批量遗忘 |
| Gated DeltaNet | 叠加 Mamba 式衰减门,系数取 1 是纯 delta 规则,取 0 直接清空 | 上下文切换时能整体”擦黑板”,状态不再无界增长 | 衰减是全状态一个标量,颗粒度太粗 |
| Kimi Delta Attention (KDA) | 衰减门细化到每个通道 | 不同记忆按不同速度遗忘,淘汰策略细粒度化 | 仍是 softmax 的近似,表达力有损失 |
delta 规则是整个谱系的转折点,值得单独抄一遍。下面是最小伪码,忽略多头、归一化和数值细节的简化版:
# delta rule 最小伪码(简化版,非 K3 实际实现)v_old = k @ S # 先读:这个 key 位置上已有什么u = beta * (v - v_old) # 算差量:beta 是学出来的写入强度S = S + k.T @ u # 覆写:新信息顶掉旧信息后续的重参数化式子 S_t = S_{t-1}(I − β k kᵀ) + β v kᵀ,我一开始死活不肯手抄,觉得是数学炫技。
后来对着上面三行伪码看懂了:它说的就是”先读、算差量、覆写”,改写成那个形式只是为了让这三步能分块并行,是训练效率问题,不改变直觉。长文作者自己说 chunked parallel 那节他花了七个小时才搞懂,我卡得比他久,你卡住不用自责。
再往上游追一步,Schlag 等人的 Fast Weight Programmers 论文早就把问题挑明了:序列长度超过存储容量时,模型必须学会选择哪些关联保留、哪些删除。KDA 这一整条谱系,就是在把这句话变成可训练的模块。淘汰从工程杂务变成了学出来的能力,这是我看懂谱系那天最兴奋的一件事。
误区一:上下文窗口等于记忆
常见理解:窗口有 1M token,把整个代码库塞进去,Agent 就”记住”了这个项目。1M 窗口的模型发布之后,这个说法越来越流行。
为何错:窗口解决的是”装得下”,不是”记得住”。注意力要在一百万个位置之间分配权重,关心的东西一多就会被稀释;缓存随序列长度线性增长,每一步推理都背着越来越重的包袱。更要命的是,会话一结束这些全部清零,一个连”上次聊到哪”都续不上的东西,凭什么叫记忆。
这笔账算下来很直白。塞满 1M 上下文,成本和首 token 延迟跟着序列一起涨;要紧的信息和无关的噪声在注意力眼里待遇相同,谁也不比谁优先,也没有任何机制替你决定什么值得留。窗口只是容量,容量本身不产生优先级。
正确理解:记忆至少是三件事的组合:装得下(窗口)、忘得对(淘汰)、取得出(检索),窗口只是原材料仓库。K3 的做法是 KDA 负责”忘得对”,MLA 负责”取得出”,这两条能力都长在权重里。1M 窗口解决装得下,KDA 解决记得住,这是全文我最想让你带走的一句话。
下次看到”把文档全塞窗口就是记忆”的说法,用三件套检验一下:它忘得对吗?取得出吗?会话结束还在吗?
误区二:Agent 记忆必须靠向量库加 RAG 外挂
常见理解:模型自己管不好记忆,就外挂一套:向量库存历史,检索到相关片段再注入窗口,相似度阈值和重要性分数决定去留。2026 年上半年我深信这一套,还专门写过文章。
外挂流行有它的历史原因。窗口只有 8K 到 128K 的年代,模型自己装不下也记不住,向量库加 RAG 是唯一现实的选择。问题是这套方案被惯性带进了 1M 时代:成本和复杂度留下来了,必要性却在消失。
为何错:外挂的淘汰规则是人手写死的。阈值定 0.8 还是 0.6,重要性怎么打分,向量库并不知道当前任务里什么才要紧,它只知道字符串像不像。而 K3 展示的前沿做法是把选择机制直接烧进权重:逐通道衰减是学出来的淘汰策略,delta 覆写是学出来的更新策略。07-28 的 MCP 无状态化改版也是同一个风向,记忆不该长在中间件里。
更实际的是维护成本:阈值调一轮、语料清洗一轮,每次换任务都得重来;学进权重的淘汰策略跟着模型一起迭代,零维护。
长文收尾那句话我抄在了笔记本第一页:固定容量的联想记忆必须有淘汰策略(eviction policy),learned selection(门控、路由、衰减)是必须的,而注意力是最有效的选择性读取机制。向量库那套,恰恰把淘汰策略留在了模型外面。
正确理解:外挂方案应该降级成补充手段,而不是默认架构;该忘什么、该取什么,让模型在训练里自己学。我 6 月那篇 Agent 记忆架构全景 里的 MCP-RAG 外挂方案正好踩在误区二里——一句话总结:淘汰和检索应该长在权重里,而不是我的 compact() 函数里。
KDA 的三个代价:恒定状态有损,外挂没死
代价一:表达力损失是真实存在的。 KDA 用特征映射近似 softmax,这条路从线性注意力的 ELU+1 开始就比精确 softmax 粗糙。attention 的基本契约是三步:把分数变成非负、除以总和、对 value 做加权平均;线性注意力保住了契约,只是把非负化从指数运算换成便宜的特征映射,表达力就是从这里开始掉的。
Kimi Linear 论文在受控对比里跑赢了 full attention,解码吞吐最高到 6 倍,但受控对比不等于你的任务。需要逐字精确对照的场景,K3 靠每 4 层一次的 MLA 兜底,兜不住的部分就是代价。
代价二:恒定状态必然丢信息。 一块固定大小的状态装不下 1M token 的全部细节,这是物理限制,不是工程问题。写满了还往里写,就是 Fast Weight Programmers 说的超容量状态:旧关联互相干扰。
丢什么、留多少,全看模型学出来的衰减和写入强度,这既是它聪明的地方,也是它不可控的地方:你没法像查数据库一样审计它到底丢了什么。K3 的三层机制本质上都在给”丢”打补丁,但补丁不等于无损。
代价三:有些场景外挂记忆仍然是正解。 跨会话长期记忆,窗口和 KDA 状态都活在单次会话里,昨天的任务今天要续上,还是得落盘。多 Agent 共享记忆,权重里的状态导不出来,A 和 B 要看同一份事实,只能靠外部存储。记忆需要人工编辑或合规审计的场景同理,落盘的文件随便改,权重里的状态改不动。
这些事窗口再大也管不了。个人开发者的最小可行起点其实是文件式记忆,我写过一篇 CLAUDE.md 使用指南,穷,但诚实。
想本地跑 Kimi K3:两种社区部署方案对比
权重 07-27 开放后,社区把”跑起来”这件事玩出了花。2.8T 参数按半精度算就是 TB 级,消费级显卡没戏,但路是人走出来的:
| 方案 | 思路 | 适合谁 | 来源日期 |
|---|---|---|---|
| NVMe 流式加载 | 笔记本加大容量固态,权重从盘上按需流进内存,能跑全量 | 有大固态、不赶时间的周末玩家 | 2026-07-30 |
| kimi-k3-in-c | 纯 C 实现,8GB 内存的 CPU 也能跑,慢到怀疑人生 | 想通读每一行实现的人 | 2026-08-03 |
全量权重的瓶颈从来不是算,是搬:TB 级数据在硬盘和内存之间流动,带宽说了算,所以社区方案全是围绕”怎么把权重搬进内存”做文章。这些玩法的共同前提是 07-27 的权重开放,之前这一切无从谈起。
本地跑的价值不在性能,在于你能亲眼验证”状态恒定”这件事:对话拉到很长,KDA 那部分的占用纹丝不动,这在纯 softmax 模型上不可能。我的建议按目的选:想看热闹抄作业,选 NVMe 流式;想读懂实现,选 kimi-k3-in-c;只想用,别折腾。
你的 Agent 要不要外挂记忆:三条判断加三个动作
判断清单,按顺序问自己:
- 记忆要不要跨会话活下来? 要,就外挂。另外把记忆交给 Agent 自主管理之前,先想清楚权限和审计,我在这上面栽过跟头,过程写在 一次 rm -rf 桌面…安全事故复盘 里:Agent 有了持久状态,犯错也是持久的。
- 是不是多个 Agent 要共享同一份事实? 是,就外挂。权重里的状态导不出也改不动,共享只能靠外部存储。
- 只是单会话上下文太长? 那先别外挂。优先换长上下文处理得好的模型、精简注入内容,向量库是最后一步,不是第一步。长上下文这半年的进步肉眼可见,先把窗口和模型本身用好,再考虑加存储。
把判断顺序画成图就是:
三个动作。想在线体验,kimi.com 直接试 1M 上下文,土办法是把一段三天前的对话细节混进上下文,看它能不能一次答对,选型纠结可以对照我写的 Claude 和 GPT 的区别。
想本地折腾,去 HuggingFace 的 moonshotai/Kimi-K3 权重页下载,抄 NVMe 流式加载的作业,周末项目刚好。想读懂实现,看 kimi-k3-in-c 的源码,代码量小到真能读完。
一句话结论(2026-08-05):Kimi K3 用 KDA 恒定状态 + MLA 周期精确检索 + AttnRes 深度回读,把记忆的淘汰与检索机制从外挂工具移进了模型权重。
最后留个预告。8 月 3 日 Qwen3.8-Max 刚发布,社区喊它是 “Coding and Cowork” 新标杆。我准备用啃 K3 的同一套方法去拆它,重点看它在记忆这件事上怎么接 KDA 这招,正好拿两个模型对比着测长上下文。拆完见。
参考链接
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时





