【论文阅读】Agent 记忆机制(34):MemoryBank——用遗忘曲线管理可强化的长期对话记忆

文章目录


前言

当我们与大模型只进行一轮对话时,模型是否拥有长期记忆似乎并不重要。用户提出问题,模型根据当前上下文生成回答,一次交互便结束了。

但如果希望构建一个能够长期陪伴用户的 Agent,问题就会发生变化。

假设用户几天前告诉 Agent:

我最近准备参加研究生复试,压力有点大。

几天后,用户再次提到睡眠不好。一个没有长期记忆的 Agent,只能把它当成一次独立问题,给出通用的睡眠建议;而一个能够记住过去经历的 Agent,则可能将睡眠问题与复试压力联系起来,给出更加连续和个性化的回应。

这说明,长期对话 Agent 需要解决的不只是"如何保存聊天记录",还包括以下问题:

  • 如何从大量历史对话中找到当前真正相关的信息;
  • 如何将零散对话整理为更稳定的事件摘要;
  • 如何逐渐形成对用户偏好和性格的整体认识;
  • 如何避免记忆无限增长;
  • 如何让被反复使用的记忆保留得更久;
  • 如何让长期未使用的信息逐渐淡出。

传统的上下文窗口只能保存有限长度的对话。即使上下文足够长,将全部历史记录直接放入提示词,也会带来成本增加、噪声干扰和注意力分散等问题。

MemoryBank 将长期记忆设计为一个独立于大模型参数的外部系统:它保存历史对话、总结用户经历、生成用户画像,并根据当前问题检索相关记忆。更有特点的是,作者借鉴艾宾浩斯遗忘曲线,为记忆引入了随时间衰减、随召回增强的更新机制。

因此,这篇论文的核心并不只是"为对话系统增加一个向量数据库",而是尝试回答:

Agent 的记忆能否像人类记忆一样,在时间中遗忘,并在反复回忆后得到强化?


零、论文基本信息


一、背景与问题

1. 大模型的上下文不等于长期记忆

大语言模型通常依赖上下文窗口理解当前对话。这种方式适合短期交互,但很难支持持续数天、数周甚至数月的关系。

主要原因包括:

上下文容量有限

随着对话不断积累,完整历史最终会超过模型允许的上下文长度。系统必须截断、压缩或筛选早期内容。

全量上下文成本过高

即使模型能够接收很长的上下文,每轮都重新输入全部聊天记录,也会增加 Token 消耗和推理延迟。

历史信息存在大量噪声

过去的对话并非都与当前问题有关。直接输入全部内容,可能让真正重要的信息淹没在无关细节中。

用户状态会不断变化

用户偏好、计划和情绪都可能改变。记忆系统不仅需要写入信息,还要处理时间、重复、强化和遗忘。

因此,长期记忆不能简单等同于"保存全部聊天记录"。

2. 个性化陪伴需要多种粒度的记忆

在长期陪伴场景中,Agent 需要记住的内容至少包含三个层次:

  • 原始对话:用户具体说过什么;
  • 经历和事件:一段时间内发生了什么;
  • 用户画像:用户长期表现出什么偏好、性格与情绪特点。

例如,用户多次提到自己在人多的场合感到紧张。单条对话只是局部事实,而多次经历可能共同反映出一个相对稳定的社交倾向。

如果系统只保存原始对话,就需要在大量细节中反复检索;如果只保存高度概括的用户画像,又可能丢失具体事件和证据。

MemoryBank 因而同时保存对话、事件摘要和用户画像,让不同粒度的记忆承担不同职责。

3. 记忆不能只增加,还需要更新与遗忘

很多早期记忆系统只有写入和检索两个动作:

text 复制代码
新对话 → 写入数据库 → 相似度检索 → 拼接到提示词

这种机制没有回答:

  • 一条记忆应该保存多久?
  • 很久没有使用的记忆是否还需要保留?
  • 被反复提及的信息是否应该更加稳定?
  • 记忆库越来越大时,应该怎样控制规模?

MemoryBank 的关键尝试,是使用遗忘曲线估计记忆的保留程度,并在记忆被成功召回后增加其强度。

这样,记忆系统便不再是一个只增不减的静态仓库,而开始具有简单的生命周期。


二、相关工作与研究定位

1. 参数化记忆

大模型在预训练过程中,会将大量知识隐式编码在模型参数中。这类知识适合保存通用事实,但不适合记录某个用户不断变化的个人经历。

如果要通过微调让模型记住每个用户的新信息,不仅成本很高,还会遇到更新速度、知识冲突和隐私隔离等问题。

因此,MemoryBank 没有修改基础模型的参数,而是在模型外部维护用户记忆。

2. 基于检索的外部记忆

检索增强生成通常采用以下流程:

text 复制代码
文档切分
   ↓
向量编码
   ↓
相似度检索
   ↓
相关内容加入提示词
   ↓
大模型生成答案

这种方法能够突破模型上下文和参数知识的限制,但传统 RAG 更关注知识文档,而不是持续变化的用户经历。

长期对话记忆还需要处理:

  • 时间顺序;
  • 用户身份;
  • 个性化信息;
  • 事件演化;
  • 记忆强化与遗忘。

MemoryBank 将检索增强的思路应用到个人对话历史中,并增加了事件摘要、用户画像和遗忘机制。

3. 对话摘要与用户建模

对话摘要可以将冗长聊天压缩为较短的事件描述,用户建模则尝试从长期行为中提取偏好和性格特征。

两者分别解决不同问题:

  • 事件摘要回答"用户经历了什么";
  • 用户画像回答"用户可能是怎样的人"。

MemoryBank 将二者同时放入记忆系统,使 Agent 在回答时既能引用具体经历,也能根据用户的长期特点调整表达方式。

4. MemoryBank 的研究定位

MemoryBank 可以概括为一个面向长期陪伴场景的外部记忆框架:

组成部分 主要作用
历史对话 保存具体交互细节
事件摘要 压缩一段时间内的重要经历
用户画像 表示相对稳定的性格和情绪特点
向量检索 从记忆库中找到与当前问题相关的信息
遗忘曲线 让记忆随时间衰减
召回强化 让反复使用的记忆保留更久

与只做相似度检索的方法相比,MemoryBank 的主要增量是:

为外部记忆增加了基于时间衰减和召回强化的更新机制。

不过,它仍然是较早期的长期记忆框架。其更新能力主要体现在"增强或者遗忘",尚未形成后来记忆系统中常见的 ADD、UPDATE、DELETE、冲突检测和事实合并等完整生命周期操作。


三、方法总览

为了理解 MemoryBank 如何连接记忆存储、检索和遗忘,可以先看论文 Figure 1。

图源:论文 Figure 1,MemoryBank 整体架构。

左侧的 MemoryBank 保存历史对话、事件摘要和用户画像;下方模块根据遗忘曲线更新记忆强度;右侧的 SiliconFriend 检索相关记忆,并将其加入提示词辅助回答。

MemoryBank 的整体运行流程可以整理为:

text 复制代码
用户与 Agent 持续对话
        ↓
按时间保存原始对话
        ↓
生成每日事件摘要和每日用户特征
        ↓
逐步汇总为全局事件摘要与用户画像
        ↓
将对话和摘要编码为向量并建立索引
        ↓
根据当前问题检索相关记忆
        ↓
将相关记忆、事件摘要和用户画像加入提示词
        ↓
大模型生成个性化回答
        ↓
被召回的记忆强度增加,未使用记忆逐渐衰减

这个框架主要包括三个核心模块:

  1. 记忆存储:保存和组织长期对话信息;
  2. 记忆检索:根据当前问题找回相关内容;
  3. 记忆更新:按照时间和召回情况调整记忆强度。

论文还构建了一个名为 SiliconFriend 的长期陪伴系统,用于验证 MemoryBank 能否增强不同基础模型的持续对话能力。


四、记忆存储:从原始对话到用户画像

1. 设计动机

如果只保存全部原始对话,信息虽然完整,但记忆库会快速膨胀,检索也容易受到冗余内容影响。

如果只保存摘要,虽然节省空间,却可能丢失回答具体问题所需的细节。

MemoryBank 因而使用不同粒度的记忆表示,让原始对话、事件摘要和用户画像互相补充。

2. 历史对话记忆

MemoryBank 首先按照时间顺序保存用户与 Agent 的多轮对话,并记录相应时间戳。

这类记忆保留最详细的信息,例如:

text 复制代码
时间:5 月 3 日

用户:最近准备面试,我每天都很焦虑。
Agent:你最担心的是哪个环节?
用户:我害怕技术面试时突然答不上来。

原始对话的优点是信息完整,可以支持细粒度事实查询;缺点是数据量较大,而且很多内容只在短期内有用。

3. 分层事件摘要

设计动机

长期对话通常由大量零散消息组成,但用户真正关心的是持续发生的事件。

例如,一周内关于"找工作"的多次对话,可能共同构成一个长期事件:

text 复制代码
用户正在准备软件工程师面试,对技术面试缺乏信心,
已经开始复习算法并进行模拟面试。

因此,MemoryBank 使用大模型对对话进行分层总结。

方法流程

text 复制代码
当天的多轮对话
      ↓
生成每日事件摘要
      ↓
多个每日事件摘要
      ↓
形成更完整的全局事件总结

每日摘要用于保留近期发生的重要事情,全局摘要则提供跨时间的整体经历。

这种设计的本质,是在原始对话与高度抽象画像之间增加一个中间层:

text 复制代码
原始话语 → 事件 → 长期经历

举例说明

假设用户三天内分别提到:

text 复制代码
第一天:下周要参加面试。
第二天:今天复习了动态规划。
第三天:模拟面试时有点紧张。

事件摘要可以整理为:

text 复制代码
用户正在准备即将到来的技术面试,
已经复习动态规划并参加模拟面试,但仍有紧张情绪。

当用户随后问"我最近为什么总是睡不好"时,这段摘要可能比某一条孤立对话更容易被检索出来。

4. 动态用户画像

设计动机

仅仅记住用户经历过什么,并不足以实现稳定的个性化交互。陪伴型 Agent 还需要理解用户长期表现出的偏好、性格和情绪特征。

MemoryBank 因此从每日对话中提取用户特征,再将多天的观察合并为一个全局用户画像。

方法流程

text 复制代码
当天对话
   ↓
提取当日性格特征和情绪状态
   ↓
汇总多天的局部观察
   ↓
生成全局用户画像

例如,系统可能得到:

text 复制代码
用户做事认真,对不确定性较为敏感;
遇到压力时容易自我怀疑,但愿意接受具体建议。

生成回答时,系统可以根据该画像调整语气和建议方式。

需要注意的问题

用户画像是一种模型推断,而不是客观事实。

如果用户某一天因为考试表现出焦虑,模型可能错误地将"短期焦虑"概括为"长期性格焦虑";如果摘要不断引用这一结论,还可能进一步强化错误判断。

因此,在实际系统中,用户画像最好具备:

  • 来源证据;
  • 时间范围;
  • 置信度;
  • 用户确认机制;
  • 修改和删除入口。

MemoryBank 提出了动态画像的方向,但还没有完整解决这些治理问题。


五、记忆检索:让历史信息重新进入当前对话

1. 设计动机

存储记忆并不意味着模型能够使用记忆。

如果每轮都把所有历史记录放入提示词,会带来过高的 Token 成本和大量噪声。因此,系统需要根据当前对话,只选择少量相关内容。

2. 记忆向量化

论文将每一轮历史对话和事件摘要视为一个记忆单元,并使用编码器将其转换为向量。

对于记忆单元 (m),其向量表示可以写为:

h m = E ( m ) h_m=E(m) hm=E(m)

其中:

  • (m) 表示一条历史对话或事件摘要;
  • (E) 表示文本编码器;
  • (h_m) 表示该记忆的向量表示。

当前对话上下文 (c) 同样会被编码:

h c = E ( c ) h_c=E(c) hc=E(c)

其中:

  • (c) 表示当前对话内容;
  • (h_c) 是当前查询的向量表示。

系统随后根据向量相似度检索与当前问题最相关的记忆。

3. 建立向量索引

MemoryBank 使用 FAISS 对记忆向量建立索引,从而减少在大量记忆中进行相似度搜索的成本。

论文开源实现基于 LangChain,并根据语言选择不同编码模型:

  • 英文版本使用 MiniLM;
  • 中文版本使用 Text2vec。

这里的编码器并不是 MemoryBank 的固定组成,可以替换为其他文本嵌入模型。

4. 记忆增强提示词

检索完成后,系统会将以下信息组合进提示词:

  • 当前对话;
  • 检索到的相关历史记忆;
  • 全局事件摘要;
  • 用户画像。

整体过程可以表示为:

text 复制代码
当前问题
   ↓
向量检索相关对话和事件
   ↓
加入全局事件摘要
   ↓
加入用户画像
   ↓
构造 Memory-Augmented Prompt
   ↓
基础模型生成回答

这种设计让不同能力承担不同任务:

  • 检索器负责"找出可能相关的过去";
  • 用户画像负责"提供相对稳定的个性信息";
  • 大模型负责"理解这些信息并组织当前回答"。

5. 一个 Agent 场景

假设用户几天前说:

text 复制代码
我不喜欢在工作结束后继续讨论工作,
那会让我一直无法放松。

今天用户问:

text 复制代码
同事约我晚上继续讨论项目,我应该答应吗?

MemoryBank 可以检索出过去的偏好,并将其加入提示词。Agent 不再只给出通用社交建议,而可以回答:

text 复制代码
你之前提到,晚上继续讨论工作会让你很难放松。
如果这次并不紧急,可以说明自己晚上需要休息,
并建议明天上班后再讨论。

这里真正产生价值的,不是记忆被保存了,而是相关记忆在正确时间重新进入了生成上下文。


六、记忆更新:遗忘、召回与强化

1. 为什么需要遗忘?

如果 Agent 永久保留所有历史内容,会出现三个问题:

  • 记忆库不断膨胀;
  • 旧信息可能与用户当前状态冲突;
  • 大量低价值记忆会干扰检索。

人类记忆并不会等概率地永久保存所有经历。长期不被使用的信息会逐渐模糊,而经常回忆的内容通常会保留得更久。

MemoryBank 借鉴这一现象,为每条记忆引入记忆强度和保留概率。

2. 艾宾浩斯遗忘曲线

论文采用的记忆保留公式为:

R = e − t S R=e^{-\frac{t}{S}} R=e−St

其中:

  • (R) 表示记忆的保留程度;
  • (t) 表示从最近一次记忆形成或召回开始经过的时间;
  • (S) 表示记忆强度;
  • (e) 是自然常数,约等于 2.71828。

当记忆强度 (S) 固定时,随着时间 (t) 增大,保留程度 (R) 会逐渐下降。

例如,当 (S=1) 时:

经过时间 (t) 保留程度 (R)
0 1.000
1 0.368
2 0.135
3 0.050

这意味着,一条从未被再次使用的记忆会快速衰减。

3. 召回强化

每条新记忆的初始强度被设置为:

S = 1 S=1 S=1

当这条记忆被重新召回时,MemoryBank 会执行两项更新:

S ← S + 1 S\leftarrow S+1 S←S+1

t ← 0 t\leftarrow 0 t←0

也就是说:

  • 记忆强度增加;
  • 距离上次召回的时间重新开始计算。

假设一条记忆的强度已经从 1 增加到 3,那么经过相同时间后,它的保留程度会更高。

当 (t=2) 时:

R S = 1 = e − 2 ≈ 0.135 R_{S=1}=e^{-2}\approx0.135 RS=1=e−2≈0.135

R S = 3 = e − 2 3 ≈ 0.513 R_{S=3}=e^{-\frac{2}{3}}\approx0.513 RS=3=e−32≈0.513

这体现了 MemoryBank 的基本思想:

被反复回忆的内容会得到强化,从而在系统中保留更久。

4. 从生命周期角度理解该机制

MemoryBank 的记忆生命周期可以表示为:

text 复制代码
对话产生
   ↓
写入记忆库,S=1
   ↓
随时间推移,R逐渐下降
   ↓
是否被当前问题召回?
   ├── 是:S增加,t归零,记忆得到强化
   └── 否:继续衰减,最终可能被遗忘

与静态向量数据库相比,这已经引入了时间维度。

但它仍然是一种相对简单的更新规则:

  • 没有区分事实的重要程度;
  • 没有判断记忆是否已经过时;
  • 没有处理新旧记忆之间的冲突;
  • 没有区分正确记忆与错误记忆;
  • 没有给出充分实验来确定最佳遗忘阈值。

5. "经常被召回"不一定等于"更加重要"

这一机制存在一个容易忽视的问题。

如果某条错误记忆因为检索模型的偏差而被频繁召回,它的强度同样会不断增加;相反,一条很少被询问但非常关键的信息,例如严重过敏史,可能因为长期没有被检索而逐渐衰减。

因此,更稳健的记忆强度不应只由召回次数决定,还可以综合考虑:

S = f ( 召回频率 , 任务重要性 , 置信度 , 时效性 , 用户确认 ) S=f(\text{召回频率},\text{任务重要性},\text{置信度},\text{时效性},\text{用户确认}) S=f(召回频率,任务重要性,置信度,时效性,用户确认)

这不是论文已经实现的公式,而是从工程应用角度对其机制的扩展思考。


七、SiliconFriend:长期陪伴 Agent

1. 系统定位

为了验证 MemoryBank,作者构建了长期陪伴系统 SiliconFriend。

该系统希望在长期交流中实现:

  • 记住用户过去的经历;
  • 理解用户长期性格与情绪;
  • 在后续对话中引用相关记忆;
  • 根据不同用户特点调整回答。

实验分别将 MemoryBank 接入三类基础模型:

  • ChatGPT;
  • ChatGLM 6.2B;
  • 基于 7B LLaMA 微调的 BELLE。

这样可以观察同一套外部记忆框架在不同生成模型上的表现。

2. 开源模型的心理对话微调

对于 ChatGLM 和 BELLE,作者首先使用约 3.8 万条中文心理对话数据进行 LoRA 微调,使模型更加适合陪伴和心理交流场景。

普通线性层可以表示为:

y = W x y=Wx y=Wx

LoRA 在不直接更新原始权重 (W) 的情况下,引入低秩矩阵 (A) 和 (B):

y = W x + B A x y=Wx+BAx y=Wx+BAx

其中:

  • (W\in\mathbb{R}^{d\times k}) 是原始权重;
  • (B\in\mathbb{R}^{d\times r});
  • (A\in\mathbb{R}^{r\times k});
  • (r) 远小于 (d) 和 (k)。

论文设置的 LoRA 秩为 (r=16),训练 3 个 Epoch,并使用单张 A100 GPU。

需要说明的是,LoRA 微调主要用于改善开源模型的陪伴对话能力,而不是 MemoryBank 本身的必要组成部分。MemoryBank 作为外部记忆模块,可以接入不同基础模型。

3. 记忆能力与生成能力是两个模块

SiliconFriend 的最终表现取决于两个环节:

text 复制代码
是否检索到正确记忆
          ×
基础模型能否正确使用记忆

即使检索器找到了正确内容,较弱的基础模型也可能误解记忆或生成不连贯回答;相反,即使基础模型能力很强,如果检索阶段没有找到相关历史,它也无法凭空知道用户过去的经历。

后续实验结果也反映了这两个环节之间的差异。


八、实验设置

1. 定性评估

作者通过线上平台与真实用户进行长期对话,并展示了三类案例:

  • 心理陪伴;
  • 历史记忆召回;
  • 根据不同用户画像生成个性化回答。

这些案例用于说明 SiliconFriend 能够在后续对话中引用早期信息,并根据用户特点调整表达方式。

不过,定性案例只能说明系统具备这种可能性,不能单独证明其在大规模真实用户中的稳定性。

2. 定量评估数据

论文构造了一个持续 10 天的模拟对话环境:

  • 共设置 15 个具有不同性格的虚拟用户;
  • 使用 ChatGPT 扮演用户;
  • 每天的对话至少涉及两个主题;
  • 同时生成英文和中文对话;
  • 人工编写 194 个记忆探测问题;
  • 其中英文问题 97 个,中文问题 97 个。

这些探测问题用于检查 Agent 能否回忆过去对话中的具体信息,并生成合理回答。

3. 对比模型

实验比较了接入相同 MemoryBank 框架的三个 SiliconFriend 版本:

  • SiliconFriend ChatGLM;
  • SiliconFriend BELLE;
  • SiliconFriend ChatGPT。

严格来说,这里主要比较的是不同基础模型接入 MemoryBank 后的效果,而不是 MemoryBank 与其他记忆框架之间的对比。

4. 评价指标

Retrieval Accuracy

判断系统是否检索到了回答问题所需的正确记忆,取值为 0 或 1。

Response Correctness

判断最终回答是否正确,评分取值为:

  • 0:错误;
  • 0.5:部分正确;
  • 1:正确。

Contextual Coherence

判断回答是否与当前上下文连贯,评分同样为:

  • 0:不连贯;
  • 0.5:部分连贯;
  • 1:连贯。

Model Ranking Score

人工标注者对三个模型的回答进行相对排序,排名得分为:

s = 1 r s=\frac{1}{r} s=r1

其中:

  • (r) 表示模型排名;
  • 第一名得 1 分;
  • 第二名得 0.5 分;
  • 第三名约得 0.333 分。

九、实验结果与分析

1. 主要实验结果

论文 Table 2 的结果如下。

英文对话

模型 检索准确率 回答正确性 上下文连贯性 排名得分
SiliconFriend ChatGLM 0.809 0.438 0.680 0.498
SiliconFriend BELLE 0.814 0.479 0.582 0.517
SiliconFriend ChatGPT 0.763 0.716 0.912 0.818

中文对话

模型 检索准确率 回答正确性 上下文连贯性 排名得分
SiliconFriend ChatGLM 0.840 0.418 0.428 0.510
SiliconFriend BELLE 0.856 0.603 0.562 0.565
SiliconFriend ChatGPT 0.711 0.655 0.675 0.758

2. 检索准确率不等于最终回答质量

一个值得注意的结果是,ChatGPT 版本的检索准确率并不是最高的:

  • 英文检索准确率为 0.763;
  • 中文检索准确率为 0.711。

但它的回答正确性、上下文连贯性和综合排名都明显更高。

例如,在英文实验中:

  • BELLE 的检索准确率为 0.814,高于 ChatGPT 的 0.763;
  • ChatGPT 的回答正确性达到 0.716,高于 BELLE 的 0.479;
  • ChatGPT 的连贯性达到 0.912,高于 BELLE 的 0.582。

这说明:

检索正确只是长期记忆系统成功的第一步,模型还必须能够理解、筛选和使用检索结果。

在工程系统中,不能只优化 Recall@K、命中率等检索指标,还要评估记忆最终是否真正改善了决策和回答。

3. BELLE 的检索表现最好

BELLE 版本在两种语言上的检索准确率都是最高的:

  • 英文:0.814;
  • 中文:0.856。

由于三个版本的基础模型和具体查询表达可能影响检索输入,最终检索差异未必完全由向量模型造成。

论文没有提供更细粒度的误差分析,因此不能简单得出"BELLE 更擅长记忆"的结论。更准确的说法是:

在论文构造的探测问题中,BELLE 版本取得了最高的记忆检索准确率,但检索到记忆后,其回答利用能力仍弱于 ChatGPT。

4. 开源模型仍存在明显的生成瓶颈

ChatGLM 和 BELLE 的检索准确率普遍超过 0.8,但回答正确性明显低于检索准确率。

这意味着部分问题并不是"没有找到记忆",而是:

  • 模型没有正确理解记忆;
  • 模型无法将记忆与当前问题组合;
  • 模型生成了与证据不一致的内容;
  • 对话能力和指令遵循能力不足。

因此,长期记忆系统至少存在两个独立优化方向:

text 复制代码
记忆层:怎样找到正确的信息?
生成层:怎样正确使用找到的信息?

5. 论文实验没有充分验证遗忘机制

论文的实验展示了 MemoryBank 能够保存和召回历史信息,但没有提供严格的消融实验比较:

  • 使用遗忘曲线;
  • 不使用遗忘曲线;
  • 只按时间删除;
  • 只按检索次数强化;
  • 使用不同衰减速度。

因此,当前实验还不能充分回答:

  • 遗忘曲线是否提高了回答质量;
  • 遗忘是否减少了检索噪声;
  • 遗忘机制节省了多少存储和 Token;
  • 哪一种记忆强度更新规则最好;
  • 是否会错误删除低频但重要的记忆。

所以,这篇论文最有价值的是提出了一个方向和原型,而不是已经通过完整实验确定了最优记忆更新策略。


十、与其他 Agent 记忆方法的对比

方法类型 核心思想 主要解决的问题 典型限制
完整对话历史 将历史消息持续加入上下文 保留近期对话连续性 上下文和成本不断增长
传统向量记忆 嵌入历史内容并按相似度检索 从大量历史中查找相关内容 缺少时间和生命周期管理
摘要记忆 将多轮对话压缩为摘要 减少上下文长度 可能丢失细节或产生摘要偏差
MemoryBank 对话、事件、画像与遗忘曲线结合 个性化长期陪伴与记忆衰减 更新规则简单,缺少冲突处理
后续生命周期记忆 显式执行新增、更新、删除与合并 维护持续变化的事实 决策复杂,依赖模型判断
结构化关联记忆 使用图或动态链接组织记忆 表示实体、事件和因果关系 构建与维护成本较高

MemoryBank 的历史价值在于,它较早地把几个后来经常出现的模块组合到一个完整系统中:

  • 原始情节记忆;
  • 分层摘要;
  • 用户画像;
  • 向量检索;
  • 时间衰减;
  • 召回强化。

但与后来的记忆系统相比,它还没有处理以下问题:

  • 用户新信息与旧信息冲突时如何更新;
  • 相似记忆如何去重;
  • 错误摘要如何纠正;
  • 记忆之间如何建立实体和事件关系;
  • 不同任务应该使用哪一种记忆;
  • 记忆写入和删除如何由 Agent 主动决策。

十一、局限性与未来方向

1. 方法限制

遗忘曲线过于简化

论文将记忆强度初始化为 1,并在每次召回后加 1。这种规则容易实现,但不一定符合真实任务中的记忆价值。

高频信息可能只是经常被提及,并不一定重要;低频信息也可能具有关键意义。

缺少显式冲突处理

假设用户以前说:

text 复制代码
我喜欢早上跑步。

后来又说:

text 复制代码
因为工作时间变化,我现在改成晚上跑步了。

MemoryBank 可以同时存储两条记忆,却没有明确的 UPDATE 或冲突消解机制。检索时可能同时返回新旧事实。

摘要误差会长期传播

事件摘要和用户画像由大模型生成。一旦模型错误理解了用户,错误内容可能进入全局摘要,并在未来不断被使用。

用户画像可能固化偏见

根据有限对话推断用户性格,可能把临时状态误认为稳定特征。系统一旦形成固定画像,还可能倾向于用已有标签解释用户的新行为。

2. 实验限制

对话周期较短

实验只模拟了 10 天对话,与真正持续数月或数年的长期记忆仍有较大差距。

用户主要由 ChatGPT 模拟

虚拟用户便于控制实验,但不能完全代表真实用户在长期交互中的行为变化、表达差异和矛盾信息。

缺少无记忆基线

论文主要比较三个接入 MemoryBank 的基础模型,没有系统比较:

  • 无记忆;
  • 仅保留最近对话;
  • 仅向量检索;
  • 仅事件摘要;
  • 完整 MemoryBank。

因此,很难量化每个模块分别贡献了多少性能。

缺少遗忘机制消融

论文没有单独验证遗忘与强化策略的有效性,也没有展示其对存储规模、检索质量和推理成本的长期影响。

3. 工程限制

隐私和数据安全

长期陪伴系统可能保存:

  • 心理状态;
  • 人际关系;
  • 健康信息;
  • 工作经历;
  • 个人偏好。

这些信息具有较高隐私敏感性。实际部署时需要提供加密、权限隔离、数据导出和彻底删除能力。

心理陪伴不等于专业治疗

SiliconFriend 使用心理对话数据进行微调,但这并不意味着系统经过临床验证。对于严重心理问题,Agent 不应替代专业心理咨询或医疗服务。

长期成本仍需评估

事件摘要、用户画像更新、向量编码和检索都会产生额外成本。论文没有对长期运行中的 Token、延迟和存储开销进行系统分析。

4. 未来方向

MemoryBank 的思路可以沿以下方向继续扩展:

  • 从固定遗忘公式发展为可学习的记忆更新策略;
  • 为记忆增加重要性、置信度和有效期;
  • 使用 ADD、UPDATE、DELETE、MERGE 管理记忆生命周期;
  • 建立用户可查看、编辑和删除的记忆控制面板;
  • 对用户画像保留来源证据,避免无依据概括;
  • 区分事实记忆、事件记忆、偏好记忆和任务经验;
  • 在长期真实用户环境中评估数月级记忆效果;
  • 使用矛盾检测处理用户状态变化;
  • 将向量检索与时间、实体和因果关系结合。

十二、我的理解和启发

1. 记忆系统需要同时回答"记住什么"和"忘掉什么"

很多 Agent 项目在设计记忆时,第一反应是接入向量数据库。

但向量数据库只解决了:

如何从已保存的信息中找到相似内容?

它没有解决:

  • 什么内容值得写入;
  • 什么内容已经失效;
  • 什么内容应该强化;
  • 什么内容应该删除;
  • 相互冲突的记忆应该保留哪一个。

MemoryBank 最大的启发,是把遗忘视为记忆系统的一部分。

一个不会遗忘的系统,并不一定拥有更好的记忆。它可能只是拥有越来越大的历史数据库。

2. 记忆应该分层,而不是只保存一种表示

MemoryBank 同时保存原始对话、事件摘要和用户画像,这种分层方式很适合实际 Agent 项目。

我会将它进一步抽象为:

text 复制代码
短期上下文:当前正在处理什么
情节记忆:过去具体发生过什么
语义记忆:从多次经历中总结出什么稳定事实
用户模型:对用户偏好和约束的长期认识

不同问题需要不同记忆。

例如:

  • "我上周推荐过哪本书?"需要具体情节记忆;
  • "我平时喜欢什么类型的书?"需要语义化偏好;
  • "接着完成刚才的任务"需要短期上下文;
  • "怎样给我解释这个概念更合适?"可能需要用户画像。

如果把所有内容都混在同一个向量库中,检索结果很容易出现粒度混乱。

3. 检索命中不代表 Agent 真正使用了记忆

论文结果中,ChatGPT 的检索准确率低于部分开源模型,但最终回答质量明显更高。

这说明实际评估记忆系统时,至少要同时观察三层指标:

层级 需要回答的问题
检索层 是否找到了正确记忆?
使用层 模型是否正确理解并引用记忆?
任务层 记忆是否改善了最终任务结果?

如果只评估向量检索的命中率,就无法判断记忆是否真正改变了 Agent 行为。

4. 记忆强度应该由多种信号决定

MemoryBank 使用"召回一次,强度加一"的规则,适合作为简单原型。

但在实际 Agent 中,我更倾向于将记忆优先级拆成多个因素:

text 复制代码
记忆优先级
=
相关性
×
任务重要性
×
置信度
×
时效性
×
用户确认程度

例如:

  • 用户明确确认的偏好应该拥有较高置信度;
  • 涉及安全约束的信息不应因为长期未使用而被自动遗忘;
  • 从一次模糊对话中推断出的性格特征应该具有较低置信度;
  • 已被新信息覆盖的旧偏好应该降低有效性,而不只是等待自然衰减。

5. 可以如何应用到自己的 Agent 项目

如果要在自己的 Agent 中借鉴 MemoryBank,我会设计以下流程:

text 复制代码
新交互产生
   ↓
判断是否值得写入长期记忆
   ↓
提取结构化事实、事件和经验
   ↓
与已有记忆进行重复和冲突检测
   ↓
执行新增、更新、合并或删除
   ↓
根据任务检索候选记忆
   ↓
结合相关性、时间和重要性排序
   ↓
将少量高价值记忆加入上下文
   ↓
根据使用结果更新记忆置信度和强度

对于每条记忆,至少可以保存:

text 复制代码
{
  "content": "用户现在习惯晚上跑步",
  "type": "preference",
  "source": "2026-08-09 对话",
  "created_at": "...",
  "updated_at": "...",
  "last_accessed_at": "...",
  "confidence": 0.92,
  "importance": 0.65,
  "strength": 3,
  "status": "active"
}

这比只保存文本和向量更适合长期运行。

6. MemoryBank 的核心价值

从今天的视角看,MemoryBank 的方法并不复杂:

  • 对话存储;
  • LLM 摘要;
  • 用户画像;
  • 向量检索;
  • 指数衰减;
  • 召回强化。

但考虑到论文发表于 2023 年,它已经较早地意识到:

长期记忆不是无限保存历史,而是让记忆在写入、召回、强化和遗忘之间持续变化。

这一认识后来成为很多 Agent 记忆系统继续研究的核心问题。


十三、总结

MemoryBank 面向长期个性化对话,提出了一个由记忆存储、记忆检索和记忆更新组成的外部记忆框架。

它主要包含以下设计:

  1. 按时间保存详细的历史对话;
  2. 将每日对话压缩为分层事件摘要;
  3. 从长期对话中提取动态用户画像;
  4. 使用向量索引检索与当前问题相关的记忆;
  5. 使用艾宾浩斯遗忘曲线模拟记忆随时间衰减;
  6. 在记忆被召回后提高其强度,使其保留更久;
  7. 将记忆接入 ChatGPT、ChatGLM 和 BELLE,构建长期陪伴系统 SiliconFriend。

论文实验表明,MemoryBank 能够支持一定程度的历史信息召回和个性化回答。同时,实验也揭示了一个重要现象:检索到正确记忆,并不意味着基础模型一定能够正确使用它。

不过,这篇论文的实验规模较小,缺少无记忆基线和遗忘机制消融,也没有处理记忆冲突、事实更新和画像偏差等复杂问题。因此,它更像是一个具有启发性的早期长期记忆框架,而不是已经完善的生产级记忆系统。

如果用一句话概括 MemoryBank:

MemoryBank 将长期对话记忆从静态的信息存储,推进为一个能够随时间遗忘、随召回强化的动态记忆过程。


参考资料

相关推荐
用户938515635071 小时前
手写一个 LLM Harness 框架:用工程化手段把大模型幻觉踩在脚下
javascript·人工智能·后端
前端开发江鸟1 小时前
我能解释 RAG、MCP 和 Eval,却画不出一条完整的 Agent 链路
人工智能
寒月小酒1 小时前
AnythingLLM 学习
学习
ivywriter2 小时前
【具身智能】物理AI具体指什么,和具身智能是什么关系?
人工智能
new_zhou2 小时前
C++ 项目 AI 协作指南(Windows / MSVC 环境)
c++·人工智能·windows
洛阳泰山2 小时前
AI 应用层被 Python 卷成红海,为什么我偏要用 Java 造一个 RAG + 工作流引擎?
java·人工智能·后端
wangray1997droid3 小时前
让 AI 拥有“真实记忆“:一次从碎片到叙事的记忆系统质变
人工智能
一次旅行3 小时前
AI 前沿日报 | 2026年08月08日 星期六
人工智能
hyuk的AI工坊3 小时前
Agent/Tool Calling 深度实战:LangChain4j 生产级工具设计
人工智能
manyingAi3 小时前
AIGC 落地影视内容行业:漫映 AI 漫剧全链路工作流技术架构解析
人工智能·架构·aigc