MemT让记忆成为模型内生能力

你跟AI聊了两个小时,从项目背景聊到代码细节,关掉窗口再打开,它又把你当陌生人,客客气气问你"请问有什么可以帮您"。大模型读遍万卷书,记性却像金鱼,每次对话都从零开始。

记忆张量10月发布的首个记忆原生基座模型 MemT 1.0,代表了一种大模型记忆机制的范式转移:不再把记忆当成"数据问题",而是让模型"长出记忆的器官"。目前MemT 1.0在智能体任务基准SWE-bench Verified 中平均成功率已经能从 66.07% 提升至 69.33%。

1 核心理念:为什么说这是"长出记忆的器官"

过去的方式:把记忆当成"数据问题"(外挂备忘录)

无论是长上下文窗口还是检索增强(RAG),本质上都是明文塞入。

  • 做法:把以前的对话记录原封不动(或摘要后)做成文本,拼接在当前问题的最前面,让模型重新读一遍。
  • 痛点:对话越长,计算量越大(成本高、速度慢);检索出来的文本往往是机械的片段,模型很难将几百轮前的多个零散经验"融会贯通"。
方案 记忆存在哪里 历史变长后的代价
无经验 没有记忆,每次从零开始 重复犯同样的错
外接记忆(RAG/文本经验) 外部数据库或上下文窗口 存储随历史线性增长,检索和预填充越来越慢
原生记忆(MemT-1.0) 模型内部的动态状态矩阵 状态大小恒定,与历史长度无关

MemT-1.0 的方式:把记忆变成"原生状态"

MemT-1.0 不再把历史当文本存,而是把历史直接编码进模型每一层内部的一个固定大小的矩阵状态 M_t 中。

  • 效果:无论聊了 10 轮还是 10,000 轮,模型都不需要回头翻看旧文本。所有过往经验都已经"消化"成了矩阵 M_t 里的数值。每生成一个新词(Token),模型都会直接从这个矩阵里提取直觉和经验。

外接记忆像开卷考试,资料齐全但翻书要花时间;原生记忆像知识已经进了脑子,调取速度快,需要接受容量上限。过去几年,推理、多模态能力陆续从外部系统被内化进模型本身,记忆是下一个待内化的基础能力。

2 架构拆解:MemT-1.0 是如何工作的

双轨并联结构

在传统 Transformer 层中,输入经过注意力机制处理当前上下文。而在 MemT-1.0 中,输入特征被分成了两条并联的支路:

  • 左支路(原有注意力):负责看"眼前":处理当前这一轮对话输入的文本。

  • 右支路(记忆注意力):负责想"过去":拿着当前的语境去查询持久化的历史记忆矩阵。

  • 融合(相加):两条支路的结果直接相加得到 A,再往下传递。这意味着过去的记忆在模型思考的每一层、每一个 Token 上,都在直接干预和塑造当前的回答。

    A = A_original + A_memory

基座模型的注意力、归一化、前馈网络全部保持原样,原有能力不受干扰。

"局部记忆"与"超记忆"的分工

很多人会疑惑:"把记忆存进参数里,难道每聊一句话都要重新训练(微调)一次大模型吗?算力根本扛不住!"MemT-1.0 用极为巧妙的双层记忆结构解决了这个问题:

记忆组件 数学表示与性质 通俗比喻
动态局部记忆 (Local Memory) 矩阵 M ∈ R^(H_kv × d_k × d_v),新任务开始时初始化为 0,随每轮对话动态变化 "空白笔记本" 每个用户/每个任务发一本,内容因人而异,随聊随改
超记忆 (Hyper Memory) 包含投影矩阵和门控参数,离线训练好,在线聊天时完全固定 "记笔记与查笔记的技能" 怎么提炼重点、怎么划掉过时信息、怎么查阅,训练时练好,用的时候不变

关键突破:在线推理(部署聊天)时,基座模型和"超记忆"完全不动(无需微调),只需通过一次普通的前向计算(Forward Pass)就能更新"局部记忆"矩阵 M_t → M_{t+1}。

3 记忆的读取与写入

读取过程(边想边生成)

  1. 当前输入状态通过超记忆中的投影矩阵生成查询向量 Q。

  2. 矩阵读出:拿 Q 直接与当前的局部记忆矩阵 M 相乘,提取相关历史信息 R。

    R = Q · M / sqrt(d_k)

  3. 输出门控:模型同时计算一个门控信号 G(判断当前这句话需不需要历史记忆:聊日常寒暄时门控关闭,聊专业偏好时门控打开),两者相乘后输出给主干网络。

整个过程没有检索动作、没有数据库查询,记忆读取就是一次矩阵乘法,和普通神经网络运算没有区别。

写入与更新过程

一轮对话结束时,模型把这轮状态转化为键(K)和值(V),通过三个学出来的门控按 Token 顺序更新记忆矩阵:

  1. 擦除门(Erase β):精准抹除记忆中旧的、冲突的信息。
  2. 写入门(Write ω):决定把当前多少新信息写进矩阵。
  3. 遗忘门(Forget λ):对整体旧记忆进行自然衰减,腾出容量。
python 复制代码
erase  = sigmoid(hidden @ W_beta)    # 擦除门 β:清理旧位置
write  = sigmoid(hidden @ W_omega)   # 写入门 ω:控制刻多深
forget = decay(hidden)               # 遗忘门 λ:让旧记忆衰减

这套更新法则叫 Gated DeltaNet-2(GDN-2),"先擦后写"的结构让它能修正已有记忆,而不是只会往上堆。矩阵反复连乘可能数值发散,论文加入对称化修正保证稳定。消融实验还显示:把逐 token 更新改成整轮结束再汇总一次,平均分从 47 掉到 41,是所有架构改动里损失最大的:记得细,才能用得准。

用数字看记忆怎么写入(迷宫小鼠

一只智能小鼠第一次进迷宫,岔路口左转,撞墙。模型把"左转撞墙"压缩成钥匙向量 k 和内容向量 v(二维简化):

复制代码
k = [0.8, 0.6]   # 钥匙:标记"岔路口左转",归一化后长度为1
v = [-0.9, 0.1]  # 内容:第一个分量为负,表示"此路不通"

写入沿用联想存储规则 M = M + kᵀ·v,初始为零矩阵,写完得到:

复制代码
        ┌ -0.72   0.08 ┐
M  =    │              │
        └ -0.54   0.06 ┘

第二次站在同一个岔路口,查询 q = 0.8, 0.6,读取 q·M 恰好拿回 -0.9, 0.1,和当初的 v 一模一样,模型据此知道左转是死路、转向右边。这就是联想记忆的完整闭环:用 k 写入、用 q 检索、拿回 v。真实模型里有成千上万槽位、成百上千记忆通道,原理不变。

MoS:给记忆装上一排储物柜

单个记忆矩阵容量有限,MemT 用 Mixture of Storage(MoS)扩容成 E 个并行的"记忆专家",每个专家有独立矩阵和参数。与 MoE 每次稀疏激活少数专家不同,MoS 让所有专家都参与,路由权重只决定信息按什么比例分配:写入时存储路由决定经验分到哪个柜子,读取时各专家输出再按读取路由加权融合,两个路由器共享一张"门牌号"矩阵,存和取始终对得上号。

4 训练:把"数据问题"变成"优化问题"

让来自回答预测的误差梯度,沿记忆读出、再沿更早的存储操作更新回去。这就像让一次考试的错题反过来决定平时该记什么笔记。

  • 如果只是普通压缩:模型在第 1 轮看到一段话,它不知道哪个细节在第 10 轮有用,只能像录音机一样尽量全塞进去。
  • MemT-1.0 的训练方式(端到端反向传播) :假设模型经历一个 5 轮连续任务:
    1. 第 1 轮把信息写进 M₁ → M₂;
    2. 第 5 轮读取 M₅ 回答难题,结果答错了(产生预测误差 Loss);
    3. 误差梯度顺着时间线倒流:从第 5 轮的回答 → 倒流回第 5 轮的"记忆读取" → 穿过 M₅...M₂ → 一直倒流回第 1 轮的"写入门"和"投影矩阵(超记忆)";
    4. 梯度告诉第 1 轮的超记忆:"嘿!你第 5 轮这道题做错,是因为第 1 轮听课时把那句关键条件当成废话过滤掉了(Write Gate 没打开)!下次遇到这种结构的信息,必须重点记下来!"

通过成千上万次这样的跨轮次优化,超记忆就进化出一种极高维的直觉:它知道什么信息对未来推理有价值,以及如何把多个零散信息在矩阵空间里"融会贯通"。

具体做法上,MemT 让冻结的基座模型当老师:老师能看到完整历史,学生只凭记忆状态答题,用 KL 散度把老师的输出分布教给学生(老师目标只保留 Top-K 个 token 以降成本)。训练分两阶段:继续预训练让模型习惯"带着记忆做语言建模",后训练用摘要、续写、压缩等任务专门训练存取,再用记忆任务数据强化长程能力。

5 实例:AI 编程助手的"跨会话进化"

第 1 天(第 1 轮):建立初始记忆

  • 小张输入:"你好!我是个刚转行做后端的前端程序员。我平时最熟悉 TypeScript,讨厌看冗长的数学公式。另外,我们公司项目底层数据库用的是 PostgreSQL。"
  • 内部发生的事:模型逐个 Token 扫描。扫到"你好"时写入门 ω≈0(废话,不记);扫到"熟悉 TypeScript""讨厌数学公式""PostgreSQL"时写入门大开,通过 K、V 投影把三个特征编码成高维张量,写入小张专属的局部记忆矩阵 M₁。会话结束,矩阵序列化存到硬盘,与小张的账号绑定。

第 10 天(第 50 轮):更新与擦除记忆

  • 小张输入:"通知一下,我们架构重构了,数据库从 PostgreSQL 全面迁移到了 MongoDB。"
  • 内部发生的事:擦除门 β 被触发,精准定位 M₄₉ 中代表"数据库=PostgreSQL"的向量子空间并抹除;写入门 ω 将"数据库=MongoDB"写入同一位置,生成 M₅₀。

第 30 天(第 100 轮):融会贯通的原生读取

  • 小张打开新窗口,只问了一句:"怎么设计一个高效的向量检索表结构?"(没有任何背景铺垫)
  • 内部发生的事 :
    1. 系统瞬间加载小张的记忆矩阵 M₉₉ 到各层 Transformer;
    2. 生成每个 Token 时,左支路看到当前问题,右支路发出 Q 乘以 M₉₉,矩阵瞬间返回融合后的隐状态:
    3. 两路信号相加,模型直接流利地输出
相关推荐
墨流觞雪1 小时前
从 76,175 字符到 4,507:我把 AI 的记忆拆成四层
人工智能
DisonTangor1 小时前
FLUX 3 Image Klein 中文全解:5.6B 开源文生图与图像编辑模型实战指南
人工智能·ai作画·开源·aigc·1024程序员节
匠测AI说1 小时前
AI for Testing 提效实战 · 执行自动化(六):轻量 Mock 编排实战——WireMock 手工落地 + AI 加速
人工智能·测试
我是小邵1 小时前
1024 特辑:我写过的 Skill,正在变成 AI 编程的基础设施
人工智能·agent·ai编程·skill·知识沉淀·协作·开发者工具
八苦1 小时前
本地视频 → 序列帧动画精灵图
人工智能
一枕槐安4871 小时前
从 58% 爬回 84%:我们用 Contextual Retrieval + 混合检索 + 条件重排,修好了 RAG 最脏的两类病
人工智能·ai
程序员小袁1 小时前
05-实现一个Agent从最小闭环开始
人工智能
Shimeri1 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
deepdata_cn2 小时前
AI正在改写逆向工程的成本曲线
人工智能·软件逆向