前言
记忆系统(Memory System)是 Agent 保持多轮任务连贯性的核心组件,解决了模型上下文窗口有限的问题。它把 Agent 历史交互上下文保存起来,并在必要时召回,让 Agent 具备了人类的记忆能力。

市面上的记忆系统很多,采用的技术也各不相同。
它们总说自己是最好的,但真的这样吗?
对好坏的评价,目前业界更多的把效果,即 Agent 任务成功率,作为唯一的标准,忽略了时延、成本等关键系统因素。
如果你增加 100% 的成本才换来 5% 的成功率提升,这通常不会被看作是个好的设计。
本文首先会介绍记忆的生命周期。然后从系统架构、记忆存储、记忆构建、记忆检索、记忆维护等六个维度对比当前主流记忆系统的技术实现。
通过多维度的综合考虑,尝试探讨到底怎样才算是好的 Agent 记忆系统。
记忆系统的实现方式
记忆的生命周期
记忆系统中,记忆的生命周期大致是这样的:

-
记忆摄入:Agent 把交互上下文输入给记忆系统。
-
记忆构建:将交互上下文转换记忆单元,可以是简单的分块,也可以基于 LLM 做摘要。
-
记忆存储:把记忆单元存储到存储系统中,并完成索引更新。
-
记忆检索:Agent 调用记忆系统接口,检索出相关记忆,追加到 Prompt 中发给 LLM 做生成。
-
记忆维护:更新记忆,完成不同记忆之间的流转、遗忘。 不同的记忆系统使用不同的技术实现这套流程。
系统架构的分类
朴素架构
最朴素的记忆系统实现是,记忆构建时把原始上下文原封不动保存下来,并在此之上建立索引。
Agent 每次访问 LLM 前都根据用户问题在记忆系统中找到 top-k 个相似记忆,追加到 Prompt 中。

朴素架构的主要问题是,原始上下文可能有大量的冗余和噪声,导致记忆效果并不好。
可以引入 LLM 解决这个问题。
基于 LLM 的架构

在该架构里,LLM 会被用作记忆抽取,比如对原始上下文做摘要、提取事件、提取实体+关系用于构建图索引等。
另外,LLM 也可以被用作记忆调度,根据用户的原始问题,做意图分析,提炼成更精确的子查询,从而提升检索效果。
目前为止,不管是朴素的架构还是基于 LLM 的架构,记忆更新和检索流程都是固定的。
然而,并非所有的任务、问题都需要用到记忆。这种固定流程有时反而会成为一种负担。
基于 Agent 的架构

基于 Agent 的架构会把记忆更新和记忆检索做成工具,由 Agent 自己判断是否需要调用。
当然,Agent 判断是否需要工具调用也会有额外的成本。
记忆存储的分类
平铺型记忆
平铺型记忆存储下,原始上下文会被分块或 LLM 提取成独立的记忆单元,随后建立向量、全文等索引,存储在文件系统和数据库中。

平铺型记忆的问题是,记忆单元之间缺少关联关系,无法应对多跳推理等场景。
关系型记忆
可以基于图或者树来构建关系型记忆,把割裂的记忆单元关联起来。这时,普通的分块已经无法满足,需要用到模型做实体、关系的抽取。

混合型记忆
平铺型记忆具备更好的语义/关键字匹配,关系型记忆则能让孤立的记忆关联起来。所以,要想达到更好的效果,可以结合两者。

记忆构建的分类
固定大小分块
最简单的方式是按照固定大小对原始上下文做切片,比如按照每切片大小固定为 n 个 token。

这种方式的优点是快,记忆构建时延低。但这种一刀切的方式容易造成记忆单元语义不连贯,记忆检索效果一般。
松散 LLM 抽取
一种解决方法是引入 LLM,利用 LLM 的语义理解能力,从原始上下文中抽取出摘要、事件、用户偏好等关键信息。

松散的意思是,给 LLM 输入上下文,输出也是一段文本,无 JSON 这种强结构化的格式。
松散的输出格式对模型能力要求更低,小模型即可完成。
这种方法对应的是记忆存储中平铺型记忆,存在缺少关联关系的缺点。
结构化 LLM 抽取
结构化 LLM 抽取会将原始上下文转成类似 JSON 这类结构化的输出,方便后续记忆系统处理。常见如基于图的记忆(实体-关系三元组)。

结构化输出对模型能力要求更高,这也意味着成本和时延更高。
记忆检索的分类
单阶段索引检索
最简单的检索是,根据具体的记忆存储方式,做一次索引检索。
如果是全文索引,就做一次关键字匹配;如果是向量索引,就做一次语义匹配;如果是图索引,就做一次多跳推理。

单阶段索引检索的优点是快、简单。
但前面也有提过,不是所有的问题都需要检索记忆,过度检索记忆有时反而会降低效果。
Agent 按需检索
可以把记忆检索做成 Agent 的一项工具,由 Agent 判断是否需要进行工具调用,按需做检索。

不过,只做一次索引检索到的 top-k 记忆,受限于索引本身,可能还是不够精确。
另外,用户问题本身可能也存在一定的模糊性,这样会导致检索到的记忆不准确。
多阶段混合检索
更精准的记忆检索是:
-
检索前,利用 LLM 做意图分析,把原始问题扩展成更精确的子查询。
-
检索时,多路多模检索,充分利用全文索引的关键字匹配、向量索引的语义匹配、图索引的关系匹配。
-
检索后,使用 Rerank 模型对多路检索结果做一次重排序,找到全局最优的 top-k。

记忆维护的分类
Agent 在执行任务过程中会持续产生新的记忆,如果一直放任不管,记忆会膨胀,成为一团大泥球,检索精度也会随之下降。 所以,记忆也需要维护。
基于时序的多版本管理
如果不想删除旧记忆,可以为每个记忆注入时间戳。当新记忆与旧记忆冲突时,通过时间戳判断新记忆有效。

容量驱动记忆淘汰
基于时序的多版本管理简单粗暴,但只追加会导致记忆容量越来越大。可以按照一定的策略,比如 FIFO、LRU 等,对旧记忆做淘汰。

LLM 驱动记忆维护
前面两种是偏传统的、基于规则的维护策略。另一个流派是让 LLM 主动理解记忆内容含,然后进行记忆合并、压缩、更新或删除。
可以选择在闲时、记忆达到一定容量、超过 N 轮对话后,用 LLM 对记忆做离线整合,合并冗余记忆、解决记忆冲突。

也可以每次更新记忆时,在线做一次整合。这样能够时刻保持记忆是最优的。代价是更高的成本。

当然,还能把决策权交给 Agent,把记忆维护的操作作为 Agent 的工具。

哪种实现方式最好?
从效果来看
很多人会有这样的直觉:
- 记忆一定比把长上下文好
- 基于图的记忆组织一定比基于向量的好
- 用 LLM 做记忆摘要一定比保存原始上下文好
- 混合记忆一定比单一记忆好
- Agent 工具按需调用一定比固定流程好
但真的是这样吗?
下面是不同记忆系统在 LongMemEva、LoCoMo、 DB-Bench 三个 Benchmark 上的表现:

可以看到,不同记忆方式在不同 Benchmark 上的表现可以差异很大。
LongMemEva 主要考量跨 Session 时的关键事实的召回、推导能力。
LoCoMo 主要考量语义连续的长对话的关键事实的召回能力。
DB-Bench 主要考量记忆系统是否能帮助 Agent 按步骤完成操作流程,而不仅是记住一条静态事实。
首先,记忆系统不一定比长上下文好。以 Mem0 为例,除了在 LongMemEva 中表现比 Long Context 稍微好点,LoCoMo 和 DB-Bench 表现要比 Long Context 更差。原因是 Mem0 会对记忆做 LLM 压缩,导致丢失细节,在关注细节的 LoCoMo 表现不佳。
另外,关系型记忆在 LongMemEva 这类存在跨 Session 事实推导的场景变现更好,比如 Zep 拿到了最高的 48.0 分。
而Letta 的分层记忆架构 使记忆能在Recall Memory 、Core Memory 、Archival Memory之间自动下沉,而不是直接遗忘,更能保留关键状态,所以更适合 DB-Bench 这类多步骤执行的场景。
最后,MemOS、MemoryOS 这类混合型记忆系统在所有任务中的表现都能接近最优,说明混合型记忆比单一型记忆效果更好。
那么,混合型记忆系统就是最好的吗?
不一定!
加入成本和时延维度
记忆系统的实现会影响 LLM 生成的时延和成本。比如,对比 Mem0 这类用 LLM 摘要的记忆系统,长上下文的 LLM 生成阶段 Prefill 时延会更长,对应的成本也会更大。
所以,对记忆系统成本和时延的考量,可以分成三个阶段:记忆构建(含记忆维护)、记忆检索、LLM 生成。

现有的记忆系统更多关注记忆检索和LLM 生成阶段,所以,你会看到 MemOS 和 MemoryOS 这类混合型记忆系统会更有优势,它们记忆检索时延不高,LLM 生成效果又好。
但是,它们都选择性忽略了关键的一步,记忆构建。
论文《Agent Memory: Characterization and System Implications of Stateful Long-Horizon Workloads》数据显示,类似于 Letta 这类混合型记忆系统,记忆构建的成本和时延占比要远高于记忆检索 + LLM 生成的成本和时延!

所以,对比不同记忆系统时延更适合用端到端时延/请求来算,即每个请求带来的记忆构建时延 + 记忆检索时延 + LLM 生成时延。
综合端到端时延和效果来衡量记忆系统的好坏,会得到下面这个图:

目前论文《Are We Ready For An Agent-Native Memory System?》只考虑了记忆构建和记忆检索时延,如果把 LLM 生成时延也加进来,图中 Long Ctx 的位置应该要右移,Prefill 成本更高。
所以,虽然 MemoryOS 效果很好,但时延也很高,也就意味着成本更大。
另外,Cognee 和 Zep 成本是最高的,它们都是基于图索引的记忆系统,涉及 LLM 抽取实体-关系,以及图索引的构建。所以,当你要引入基于图的记忆系统时,需要慎重考虑成本问题。
在这个图中,Mem0 无疑是最尴尬的存在,时延/成本很高,但记忆效果很低!
最后
回到我们最初的问题,怎样才算是好的 Agent 记忆系统?
如果想要更好的记忆效果,那么,混合型、基于图记忆系统是更好的选择,比如 MemOS、MemoryOS、Zep。
如果想要更低的成本,那么,基于向量索引的朴素记忆系统可能是更好的选择。
如果你既要记忆效果好,又要低成本,对不起,做不到。
所以,记忆系统的好坏,尽在在权衡!
参考
(完)