文章目录
- 前言
- 零、论文基本信息
- 一、背景与问题
-
- [1. 大模型的上下文不等于长期记忆](#1. 大模型的上下文不等于长期记忆)
- [2. 个性化陪伴需要多种粒度的记忆](#2. 个性化陪伴需要多种粒度的记忆)
- [3. 记忆不能只增加,还需要更新与遗忘](#3. 记忆不能只增加,还需要更新与遗忘)
- 二、相关工作与研究定位
-
- [1. 参数化记忆](#1. 参数化记忆)
- [2. 基于检索的外部记忆](#2. 基于检索的外部记忆)
- [3. 对话摘要与用户建模](#3. 对话摘要与用户建模)
- [4. MemoryBank 的研究定位](#4. MemoryBank 的研究定位)
- 三、方法总览
- 四、记忆存储:从原始对话到用户画像
- 五、记忆检索:让历史信息重新进入当前对话
-
- [1. 设计动机](#1. 设计动机)
- [2. 记忆向量化](#2. 记忆向量化)
- [3. 建立向量索引](#3. 建立向量索引)
- [4. 记忆增强提示词](#4. 记忆增强提示词)
- [5. 一个 Agent 场景](#5. 一个 Agent 场景)
- 六、记忆更新:遗忘、召回与强化
-
- [1. 为什么需要遗忘?](#1. 为什么需要遗忘?)
- [2. 艾宾浩斯遗忘曲线](#2. 艾宾浩斯遗忘曲线)
- [3. 召回强化](#3. 召回强化)
- [4. 从生命周期角度理解该机制](#4. 从生命周期角度理解该机制)
- [5. "经常被召回"不一定等于"更加重要"](#5. “经常被召回”不一定等于“更加重要”)
- [七、SiliconFriend:长期陪伴 Agent](#七、SiliconFriend:长期陪伴 Agent)
-
- [1. 系统定位](#1. 系统定位)
- [2. 开源模型的心理对话微调](#2. 开源模型的心理对话微调)
- [3. 记忆能力与生成能力是两个模块](#3. 记忆能力与生成能力是两个模块)
- 八、实验设置
-
- [1. 定性评估](#1. 定性评估)
- [2. 定量评估数据](#2. 定量评估数据)
- [3. 对比模型](#3. 对比模型)
- [4. 评价指标](#4. 评价指标)
-
- [Retrieval Accuracy](#Retrieval Accuracy)
- [Response Correctness](#Response Correctness)
- [Contextual Coherence](#Contextual Coherence)
- [Model Ranking Score](#Model Ranking Score)
- 九、实验结果与分析
- [十、与其他 Agent 记忆方法的对比](#十、与其他 Agent 记忆方法的对比)
- 十一、局限性与未来方向
-
- [1. 方法限制](#1. 方法限制)
- [2. 实验限制](#2. 实验限制)
- [3. 工程限制](#3. 工程限制)
- [4. 未来方向](#4. 未来方向)
- 十二、我的理解和启发
-
- [1. 记忆系统需要同时回答"记住什么"和"忘掉什么"](#1. 记忆系统需要同时回答“记住什么”和“忘掉什么”)
- [2. 记忆应该分层,而不是只保存一种表示](#2. 记忆应该分层,而不是只保存一种表示)
- [3. 检索命中不代表 Agent 真正使用了记忆](#3. 检索命中不代表 Agent 真正使用了记忆)
- [4. 记忆强度应该由多种信号决定](#4. 记忆强度应该由多种信号决定)
- [5. 可以如何应用到自己的 Agent 项目](#5. 可以如何应用到自己的 Agent 项目)
- [6. MemoryBank 的核心价值](#6. MemoryBank 的核心价值)
- 十三、总结
- 参考资料
前言
当我们与大模型只进行一轮对话时,模型是否拥有长期记忆似乎并不重要。用户提出问题,模型根据当前上下文生成回答,一次交互便结束了。
但如果希望构建一个能够长期陪伴用户的 Agent,问题就会发生变化。
假设用户几天前告诉 Agent:
我最近准备参加研究生复试,压力有点大。
几天后,用户再次提到睡眠不好。一个没有长期记忆的 Agent,只能把它当成一次独立问题,给出通用的睡眠建议;而一个能够记住过去经历的 Agent,则可能将睡眠问题与复试压力联系起来,给出更加连续和个性化的回应。
这说明,长期对话 Agent 需要解决的不只是"如何保存聊天记录",还包括以下问题:
- 如何从大量历史对话中找到当前真正相关的信息;
- 如何将零散对话整理为更稳定的事件摘要;
- 如何逐渐形成对用户偏好和性格的整体认识;
- 如何避免记忆无限增长;
- 如何让被反复使用的记忆保留得更久;
- 如何让长期未使用的信息逐渐淡出。
传统的上下文窗口只能保存有限长度的对话。即使上下文足够长,将全部历史记录直接放入提示词,也会带来成本增加、噪声干扰和注意力分散等问题。
MemoryBank 将长期记忆设计为一个独立于大模型参数的外部系统:它保存历史对话、总结用户经历、生成用户画像,并根据当前问题检索相关记忆。更有特点的是,作者借鉴艾宾浩斯遗忘曲线,为记忆引入了随时间衰减、随召回增强的更新机制。
因此,这篇论文的核心并不只是"为对话系统增加一个向量数据库",而是尝试回答:
Agent 的记忆能否像人类记忆一样,在时间中遗忘,并在反复回忆后得到强化?
零、论文基本信息
- 论文名称:MemoryBank: Enhancing Large Language Models with Long-Term Memory
- 发表平台:arXiv,2023
- 代码仓库:MemoryBank-SiliconFriend
- 作者信息:Wanjun Zhong、Lianghong Guo、Qiqi Gao、He Ye、Yanlin Wang
一、背景与问题
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 持续对话
↓
按时间保存原始对话
↓
生成每日事件摘要和每日用户特征
↓
逐步汇总为全局事件摘要与用户画像
↓
将对话和摘要编码为向量并建立索引
↓
根据当前问题检索相关记忆
↓
将相关记忆、事件摘要和用户画像加入提示词
↓
大模型生成个性化回答
↓
被召回的记忆强度增加,未使用记忆逐渐衰减
这个框架主要包括三个核心模块:
- 记忆存储:保存和组织长期对话信息;
- 记忆检索:根据当前问题找回相关内容;
- 记忆更新:按照时间和召回情况调整记忆强度。
论文还构建了一个名为 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 面向长期个性化对话,提出了一个由记忆存储、记忆检索和记忆更新组成的外部记忆框架。
它主要包含以下设计:
- 按时间保存详细的历史对话;
- 将每日对话压缩为分层事件摘要;
- 从长期对话中提取动态用户画像;
- 使用向量索引检索与当前问题相关的记忆;
- 使用艾宾浩斯遗忘曲线模拟记忆随时间衰减;
- 在记忆被召回后提高其强度,使其保留更久;
- 将记忆接入 ChatGPT、ChatGLM 和 BELLE,构建长期陪伴系统 SiliconFriend。
论文实验表明,MemoryBank 能够支持一定程度的历史信息召回和个性化回答。同时,实验也揭示了一个重要现象:检索到正确记忆,并不意味着基础模型一定能够正确使用它。
不过,这篇论文的实验规模较小,缺少无记忆基线和遗忘机制消融,也没有处理记忆冲突、事实更新和画像偏差等复杂问题。因此,它更像是一个具有启发性的早期长期记忆框架,而不是已经完善的生产级记忆系统。
如果用一句话概括 MemoryBank:
MemoryBank 将长期对话记忆从静态的信息存储,推进为一个能够随时间遗忘、随召回强化的动态记忆过程。
参考资料
- Zhong W, Guo L, Gao Q, et al. MemoryBank: Enhancing Large Language Models with Long-Term Memory. arXiv, 2023.
- MemoryBank-SiliconFriend 代码仓库