从“会算”到“会查”:读懂 DeepSeek 的 Engram
DeepSeek的工作
DeepSeek 在 2026 年 1 月提出的 Engram,针对的是一个很基础、但过去常被埋在模型细节里的问题:现在的大语言模型已经很擅长 computation(计算),却没有一种原生的 knowledge lookup(知识查表) 能力。论文把这个问题直接写成一句话:“Transformers lack a native primitive for knowledge lookup.”(Transformer 缺少一种原生的知识查表原语。)意思是,很多本来更适合直接“取出来”的局部静态模式,例如固定短语、常见实体名、重复出现的代码模板,最后还是被迫交给网络一层一层重新算出来。为了解决这件事,论文提出了 conditional memory(条件记忆) 这条新路线,而 Engram 就是这种路线的具体实现。
找到“二级结论”
先看它为什么会成为问题。传统 Transformer(转换器架构) 的强项是用 attention(注意力机制) 和前馈层不断组合上下文,逐步形成更抽象的表示;这很适合处理动态推理,但不等于它擅长处理“本来就很固定”的局部模式。假设模型读到一句话:“Only Alexander the Great could tame the horse Bucephalus.”(只有亚历山大大帝才能驯服那匹名叫布西法拉斯的马。)对人来说,“Alexander the Great”通常会被直接当作一个整体概念来识别;但对标准 Transformer 来说,它往往还是先把这几个 token(词元) 分别编码成 embedding(嵌入表示),再依靠多层 attention(注意力机制) 和前馈网络,在当前上下文里逐步恢复出“这是一个固定历史人物名称”的整体含义。也就是说,本来更像“整体调取”的工作,被迫走了一遍“拆开编码—再重新拼合”的流程。论文的 mechanistic analysis(机制分析) 也明确指出,模型早层确实承担了很多 static reconstruction(静态模式重建) 的工作。
Engram 的切入点,就是把这条链改掉。它不是让模型完全不算,而是把“局部且稳定”的那一部分先交给查表。还是以上面的实体名为例:当模型处理到当前位置时,Engram 会先从当前位置前面的局部上下文里抽取 suffix n-gram(后缀 N 元片段),也就是取连续的几个 token 组成一个短模式;然后把这个短模式压缩、规范化,再通过 hashing(哈希映射) 去静态 memory table(记忆表) 里查出一个候选向量。这样一来,模型就不必每次都靠主干网络从零重建“Alexander the Great”这种局部固定模式,而是先得到一个可复用的候选表示,再看当前上下文是否支持它。论文把整个过程拆成 retrieval(检索) 和 fusion(融合) 两步,并说明 Engram 的作用就是“retrieving static N-gram memory and fusing it with dynamic hidden states”(检索静态 N 元片段记忆,并把它与动态隐藏状态融合)。



代码场景下,这条逻辑会更明显。比如模型看到 for i in range(len(x)): 或 try: ... except: 时,真正重要的往往不是单个 token,而是这整段局部组合已经形成了一个高度稳定的语法模板。标准 Transformer 仍然要逐个 token 编码,再依赖多层 attention 去恢复“这是循环头”“这是异常处理结构”这样的整体意义;Engram 则把这类高频、局部、重复出现的模板,当作适合直接调用的静态模式。它先把局部上下文映射为 suffix n-gram,再通过 deterministic hashing(确定性哈希) 从嵌入表里取回候选记忆,后续由当前上下文决定是否采纳。于是,Engram 不是替代 reasoning(推理),而是先接走那些本来更像“查表”的工作,把主干网络的计算预算留给真正需要跨句、跨段整合的复杂推理。
注意力的节流
Engram 的第一阶段,本质上是在做“把局部短模式变成可查表的记忆线索”。它不会直接拿原始分词结果去拼 n-gram,因为同一个意思可能会被分成不同的 token。比如 Apple 和带前导空格的 apple,在普通分词器里可能是不同 ID,但它们的语义其实很接近。Engram 会先做 tokenizer compression(分词压缩) 和 vocabulary projection(词表投影),把这些表面不同但意义接近的 token 尽量压到更统一的表示上,再从当前位置前面的局部上下文中抽出几个短模式,用 multi-head hashing(多头哈希) 分别算出地址,去嵌入表里直接取回对应的 embedding vector(嵌入向量)。取回来的不是具体文本,而是模型内部可以直接参与后续计算的向量表示;不同长度短模式取回的向量再被拼接起来,形成最终的 memory vector(记忆向量)。
但“取到了记忆”不等于“这段记忆现在就一定对”。因为这些向量是静态的,只反映这个短模式通常意味着什么,却不知道当前句子到底在表达什么,所以它们可能因为 hash collision(哈希冲突) 带来错误信息,也可能因为 polysemy(一词多义) 和当前语境不一致。为了解决这个问题,Engram 在第二阶段加入了 context-aware gating(上下文感知门控):它用当前 hidden state(隐藏状态) 去判断取回来的记忆和当前上下文是否匹配。匹配的,就放大它的作用;不匹配的,就把它压低,甚至接近不用。也就是说,Engram 不是“查到什么就直接塞回模型”,而是“先查,再由当前上下文决定该用多少”。
这也解释了为什么 Engram 不是“死记硬背”。还是以“apple”为例,如果一句话是 “Apple released a new phone.”(Apple 发布了新手机。)那么静态记忆里可能同时存在与水果和公司相关的局部模式;真正决定该选哪一边的,不是记忆表本身,而是当前 hidden state(隐藏状态) 已经聚合起来的上下文信息。因为句子里有 “released” 和 “phone” 这样的线索,context-aware gating(上下文感知门控) 就更可能放大“Apple 公司”相关的记忆,压低“水果”相关的噪声。换句话说,Engram 的完整链条不是“看见局部模式就直接套用记忆”,而是“先查到候选记忆,再由当前上下文做筛选和调制”。
理解了这条链之后,就更容易明白一个看似反直觉的实验结果:为什么一个 memory module(记忆模块) 不只提升知识题,反而对 reasoning(推理)、code(代码)、math(数学) 也帮助很大。论文在 iso-parameter and iso-FLOPs(等参数量、等计算量) 的对照下报告,Engram-27B 相比 MoE 基线在 MMLU 上提升 3.4 分、CMMLU 提升 4.0 分,而在 BBH、ARC-Challenge、HumanEval、MATH 等推理、代码和数学任务上也出现了明显收益。论文给出的解释不是“它背了更多知识”,而是它减轻了主干早层的 static reconstruction(静态模式重建) 负担,因此“effectively deepening the network for complex reasoning”(在功能上让网络对复杂推理显得更深)。这里的意思不是物理层数增加了,而是说:原来前几层要分出很多能力去重建局部静态模式;现在这部分工作被条件记忆接走,主干层就能更早把容量投入真正复杂的抽象与推理。
同样的分工变化,也解释了它在长上下文上的提升。论文写得很直接:by delegating local dependencies to lookups, Engram frees up attention capacity to focus on global context(把局部依赖交给查表后,Engram 释放了注意力容量,使其更专注于全局上下文)。这句话背后的逻辑是,attention(注意力机制) 的能力本来就有限;如果它既要重复处理很多固定局部模式,又要负责远距离信息整合,那么全局建模会被局部负担挤压。Engram 接走一部分局部依赖后,attention 就能把更多精力花在长距离关联上。论文给出的结果是,Multi-Query NIAH 从 84.2 提升到 97.0,Variable Tracking 也有明显提升。
与其余工作的区分
再往外看,Engram 真正新颖的地方,还在于它把“稀疏化”多拆出了一条轴。以前谈 sparse models(稀疏模型),很多人首先想到的是 MoE(Mixture-of-Experts,专家混合模型),因为它通过只激活少数专家来节省每步计算;而这篇论文提出,除了 conditional computation(条件计算),还可以有 conditional memory(条件记忆)。于是就出现了一个新的问题:在总参数量和总计算量固定时,到底该把多少稀疏容量分给 neural computation(神经计算),多少分给 static memory(静态记忆)?论文把它称为 Sparsity Allocation(稀疏分配) 问题,并报告了一个 U-shaped scaling law(U 形缩放规律):容量全压在 MoE 上未必最优,全压在 Engram 上也未必最优,中间存在更好的平衡点。
因此,Engram 与几种常见概念必须分开看。它不是 MoE 的替代品。MoE 解决的是“怎样更高效地算”,Engram 解决的是“哪些东西本来就不该反复算,而该直接查”。它也不是 RAG(Retrieval-Augmented Generation,检索增强生成) 的变体。RAG 去的是模型外部的文档库、数据库、网页;Engram 查的是模型内部训练出来的静态记忆表。前者更像“翻资料”,后者更像“脑内固定模式的快速调用”。它同样也不是 KV cache(键值缓存);KV cache 是推理阶段缓存已经算过的注意力键值,优化的是“同一段上下文别重复算”,而 Engram 优化的是“有些局部模式本来就更适合查表,不必每次都靠主干重建”。这些区别虽然有一部分是推论,但都直接建立在论文对 Engram、MoE 和内部静态记忆机制的定义之上。
向工程的一些探索
除了建模意义,Engram 还有很强的工程意义。论文和官方 README 都强调,它使用 deterministic addressing(确定性寻址)。这意味着,对于给定的局部片段,系统可以提前知道需要访问哪些 memory slot(记忆槽位),从而进行 runtime prefetching(运行时预取):在 GPU 计算之前或同时,先从 host memory(主机内存) 把相关嵌入拉过来。论文给出的结论是,把一个 100B 参数量级的表下放到主机内存,额外开销仍然可以做到很小;README 也把这一点总结为可以将 massive embedding tables(大规模嵌入表) offload(下放) 到 host memory(通常指CPU内存),并保持 minimal inference overhead(很小的推理额外开销)。这说明 Engram 不只是理论上增加了一块静态记忆,它连系统层面的访问方式也一并设计了。
不过,现阶段它更像一个很清晰的架构方向,而不是现成可直接工业部署的完整方案。DeepSeek 官方仓库已经公开了 demo implementation(演示版实现),但 README 和示例代码都明确说明,这份实现主要用于说明 core logic and data flow(核心逻辑和数据流),很多标准组件被 mock(模拟) 或简化,真正的 production use(生产使用) 还需要进一步优化,例如自定义 CUDA kernel、分布式训练支持等。也就是说,Engram 的思想已经很完整,但它距离通用高性能工程化,还有一段实现工作。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)