作者/机构: Prateek Chhikara, Dev Khant, Saket Aryan, Taranjeet Singh, and Deshraj Yadav (research@mem0.ai memo)

A1 主要贡献

本文旨在解决大型语言模型(LLMs)因固定上下文窗口而在跨会话的长时间对话中难以保持连贯性的根本问题。为应对这一挑战,研究者引入了名为 Mem0 的新型记忆架构,该架构能够动态地从持续的对话中提取、整合和检索关键信息。在此基础上,研究者进一步提出了增强版 Mem0g,它利用基于图的记忆表示来更有效地建模对话元素之间复杂的相互关系。

核心贡献如下
1. 提出新颖的记忆架构:设计并实现了 Mem0 和 Mem0g 两种架构,前者专注于高效提取和管理自然语言记忆,后者通过图结构增强了对复杂关系和时序信息的建模能力。
2. 全面的实验验证:在 LOCOMO 基准测试上,将 Mem0 和 Mem0g 与六大类基准系统(包括已有的记忆增强系统、多种配置的 RAG、全上下文方法、开源记忆方案、专有模型系统和专用记忆管理平台)进行了系统性比较。
3. 卓越的性能表现:实验结果表明,Mem0 和 Mem0g 在单跳、时序、多跳和开放域四种问题类型上均一致优于所有现有记忆系统。特别地,Mem0 在 LLM-as-a-Judge 指标上相比 OpenAI 实现了 26% 的相对提升,而 Mem0g 的总体得分比基础版 Mem0 高出约 2%。
4. 显著的计算效率优势:与全上下文方法相比,Mem0 在实现高准确率的同时,大幅降低了计算开销,其 p95 延迟降低了 91%,Token 成本节省超过 90%,实现了先进推理能力与实际部署限制之间的有效平衡。
5. 推动 AI 代理发展:研究结果强调了结构化、持久化记忆机制对于实现长期对话连贯性的关键作用,为开发更可靠、更高效的 LLM 驱动的 AI 代理铺平了道路。

A2 方法细节

本文介绍两种用于 AI 代理的记忆架构。(1) Mem0 实现了一种新颖的范式,通过专用的记忆提取和更新模块,从对话中提取、评估和管理关键信息。该系统处理用户之间或用户与助手之间的消息对。(2) Mem0g 在此基础上进行了扩展,引入了基于图的记忆表示,其中记忆被存储为有向标记图,实体为节点,关系为边。这种结构能够更深入地理解实体之间的联系。通过显式地对实体及其关系进行建模,Mem0g 支持更高级的推理,尤其适用于需要在多个记忆之间导航复杂关系路径的查询。

2.1. Mem0

增量处理流程与上下文构建。我们的架构遵循增量处理范式,使其能够无缝地在进行中的对话中运行。如图 2 所示,完整的流水线架构包括提取和更新两个阶段。提取阶段在新消息对 (mt−1, mt)(其中 mt 是当前消息,mt−1 是前一条消息)被接收时启动。该消息对通常由用户消息和助手响应组成,捕捉了一个完整的交互单元。为了给记忆提取建立适当的上下文,系统使用了两种互补的来源:(1) 从数据库中检索到的对话摘要 S,它概括了整个对话历史的语义内容;(2) 对话历史中最近的一系列消息 {mt−m, mt−m+1, ..., mt−2},其中 m 是一个控制近时窗口的超参数。为了支持上下文感知的记忆提取,我们实现了一个异步摘要生成模块,该模块会定期刷新对话摘要。该组件独立于主处理流水线运行,确保记忆提取能够持续受益于最新的上下文信息,而不会引入处理延迟。S 提供了贯穿整个对话的全局主题理解,而最近的消息序列则提供了细粒度的时间上下文,其中可能包含未被整合进摘要的相关细节。这种双重上下文信息与新的消息对相结合,构成了一个全面的提示 P = (S, {mt−m, ..., mt−2}, mt−1, mt),用于一个通过 LLM 实现的提取函数 ϕ。然后,函数 ϕ(P) 在保持对对话更广泛上下文认知的同时,专门从新的交流中提取一组关键记忆 Ω = {ω1, ω2, ..., ωn},从而产生可能被纳入知识库的候选事实。

图2:Mem0系统的架构概览,展示了提取和更新阶段。提取阶段处理消息和历史上下文以创建新记忆。更新阶段将这些提取的记忆与相似的现有记忆进行评估,通过工具调用机制应用适当的操作。数据库作为中央存储库,为处理过程提供上下文并存储更新后的记忆。
图2:Mem0系统的架构概览,展示了提取和更新阶段。提取阶段处理消息和历史上下文以创建新记忆。更新阶段将这些提取的记忆与相似的现有记忆进行评估,通过工具调用机制应用适当的操作。数据库作为中央存储库,为处理过程提供上下文并存储更新后的记忆。

更新阶段的记忆管理。提取之后,更新阶段会评估每个候选事实与现有记忆的关系,以保持一致性并避免冗余。该阶段为每个提取的事实 ωi ∈ Ω 确定适当的记忆管理操作。附录 B 中的算法 1阐释了此过程。对于每个事实,系统首先使用数据库中的向量嵌入检索出 s 个语义上最相似的记忆。然后,这些检索到的记忆连同候选事实一起,通过我们称之为“工具调用”的函数调用接口呈现给 LLM。LLM 自行决定执行四种不同操作中的哪一种:当不存在语义上等价的记忆时,执行 ADD 操作创建新记忆;当需要用补充信息增强现有记忆时,执行 UPDATE 操作;当新信息与现有记忆矛盾时,执行 DELETE 操作移除记忆;当候选事实不需要修改知识库时,执行 NOOP 操作。我们没有使用单独的分类器,而是利用 LLM 的推理能力,根据候选事实与现有记忆之间的语义关系直接选择合适的操作。在确定操作后,系统执行所提供的操作,从而维护知识库的连贯性和时间一致性。

图3:Mem0g的基于图的记忆架构,展示了实体提取和更新阶段。提取阶段使用 LLM 将对话消息转换为实体和关系三元组。更新阶段在将新信息集成到现有知识图时,采用冲突检测和解决机制。
图3:Mem0g的基于图的记忆架构,展示了实体提取和更新阶段。提取阶段使用 LLM 将对话消息转换为实体和关系三元组。更新阶段在将新信息集成到现有知识图时,采用冲突检测和解决机制。

实现细节与配置。在我们的实验评估中,我们将系统配置为使用 m = 10 条先前的消息作为上下文参考,并使用 s = 10 个相似的记忆进行比较分析。所有语言模型操作均使用 GPT-4o-mini 作为推理引擎。向量数据库采用密集嵌入,以便在更新阶段进行高效的相似性搜索。

2.2. Mem0g

图记忆表示。Mem0g 流水线(如图 3 所示)实现了一种基于图的记忆方法,能够有效地从自然语言交互中捕获、存储和检索上下文信息【Zhang et al., A study of zero-shot adaptation with commonsense knowledge, 2022, AKBC】。在该框架中,记忆被表示为一个有向标记图 $G = (V, E, L)$,其中:
- 节点 $V$ 代表实体(例如,Alice, San _Fr anc isco)
- 边 $E$ 代表实体之间的关系(例如,l ives _ in)
- 标签 $L$ 为节点分配语义类型(例如,Al ice - Person, San _Fr anc isco - City)

每个实体节点 $v \in V$ 包含三个组成部分:(1) 一个实体类型分类,用于对实体进行分类(例如,Person, Location, Event);(2) 一个嵌入向量 $e_v$,用于捕捉实体的语义含义;(3) 包括创建时间戳 $t_v$ 在内的元数据。我们系统中的关系被结构化为 $(v_s, r, v_d)$ 形式的三元组,其中 $v_s$ 和 $v_d$ 分别是源实体节点和目标实体节点,r 是连接它们的带标签的边。

实体提取。提取过程采用一个两阶段的流水线,利用 LLM 将非结构化文本转换为结构化的图表示。首先,一个实体提取器模块处理输入文本,以识别一组实体及其对应的类型。在我们的框架中,实体代表对话中的关键信息元素——包括人物、地点、物体、概念、事件以及值得在记忆图中表示的属性。实体提取器通过分析对话中元素的语义重要性、独特性和持久性来识别这些多样化的信息单元。例如,在一个关于旅行计划的对话中,实体可能包括目的地(城市、国家)、交通方式、日期、活动和参与者偏好——基本上是任何可能与未来参考或推理相关的离散信息。

关系生成。接下来,一个关系生成器组件推导出这些实体之间有意义的连接,建立一组能够捕捉信息语义结构的关系三元组。这个基于 LLM 的模块分析提取出的实体及其在对话中的上下文,以识别具有重要语义的连接。它通过检查语言模式、上下文线索和领域知识来确定实体之间如何相互关联。对于每个潜在的实体对,生成器会评估是否存在有意义的关系,如果存在,则用适当的标签(例如,‘lives_in’、‘prefers’、‘owns’、‘happened_on’)对这种关系进行分类。该模块采用提示工程技术,引导 LLM 对对话中的显式陈述和隐式信息进行推理,从而生成关系三元组,这些三元组构成了我们记忆图中的边,并支持跨越相互关联信息的复杂推理。

存储、更新与冲突解决。在整合新信息时,Mem0g 采用了一种复杂的存储和更新策略。对于每个新的关系三元组,我们计算源实体和目标实体的嵌入,然后搜索语义相似度高于预定义阈值 t 的现有节点。根据节点是否存在,系统可能会创建两个新节点、只创建一个节点或使用现有节点,然后再建立带有适当元数据的关系。为了维护一个一致的知识图谱,我们实现了一个冲突检测机制,当新信息到达时,该机制会识别出可能存在冲突的现有关系。一个基于 LLM 的更新解析器会确定某些关系是否应该过时,将它们标记为无效而不是物理删除,以便进行时间推理。

双重检索策略。Mem0g 中的记忆检索功能实现了一种双重方法策略,以实现最佳信息访问。实体中心方法首先识别查询中的关键实体,然后利用语义相似性在知识图中定位相应的节点。它系统地探索这些锚节点的传入和传出关系,构建一个捕捉相关上下文信息的综合子图。作为补充,语义三元组方法采用更全面的视角,将整个查询编码为一个密集的嵌入向量。然后,将此查询表示与知识图中每个关系三元组的文本编码进行匹配。系统计算查询与所有可用三元组之间的细粒度相似性得分,仅返回那些超过可配置相关性阈值的三元组,并按相似性降序排列。这种双重检索机制使 Mem0g 能够同等有效地处理针对性强的实体焦点问题和更广泛的概念性查询。

实现技术栈。从实现的角度来看,该系统使用 Neo4j1 作为底层图数据库。基于 LLM 的提取器和更新模块利用了具有函数调用功能的 GPT-4o-mini,从而可以从非结构化文本中进行结构化信息提取。通过将基于图的表示与语义嵌入和基于 LLM 的信息提取相结合,Mem0g 既实现了复杂推理所需的结构丰富性,又具备了自然语言理解所需的语义灵活性。

A3 实验环境

数据集

  • 名称与用途:使用 LOCOMO (Long-Term Conversational Memory) 数据集【Maharana et al., Evaluating very long-term conversational memory of llm agents, 2024, ACL】进行评估。该数据集专为评测对话系统的长期对话记忆能力而设计。
  • 规模:包含 10 个扩展对话,每个对话平均包含约 600 轮对话和 26000 个 Token,分布在多个会话中。每个对话后附有平均 200 个问题及其标准答案,问题类型分为单跳、多跳、时序和开放域。

模型架构

  • 核心模型:所有语言模型操作均使用 GPT-4o-mini 作为推理引擎。
  • 嵌入模型:所有文本块均使用 OpenAI 的 text-embedding-small-3 进行嵌入,以确保向量质量的一致性。

硬件配置

论文未明确提供硬件配置信息(如 GPU 型号/数量、CPU 型号等)。

软件配置

  • 代码实现:在 https://mem0.ai/research">https://mem0.ai/research 上提供了代码。
  • 依赖库/平台
    • 使用 tiktoken 库的 cl100k_base 编码来测量 Token 消耗。
    • Mem0g 使用 Neo4j1 作为底层图数据库。
    • 对比了开源方案 LangMem (Hot Path) 和商业平台 Zep

A4 实验结果

4.1 跨记忆系统性能比较

如表 1 所示,Mem0 和 Mem0g 在单跳、多跳、开放域和时序四类问题上,与一系列基准系统进行了比较。总体而言,这两种模型在大多数问题类型的三项评估指标(F1, B1, J)上都创造了新的最佳记录。

  • 单跳问题:Mem0 凭借其密集的自然语言记忆获得了最佳结果(F1=38.72, B1=27.13, J=67.13)。Mem0g 的性能略有下降,表明对于答案仅存在于单轮对话中的简单查询,关系结构提供的帮助有限。
  • 多跳问题:Mem0 表现最佳(F1=28.64, J=51.15),展示了其有效检索和整合分散在多个会话中信息的能力。Mem0g 在此并未展现优势,表明对于复杂的综合任务,图结构可能引入了效率开销。
  • 开放域问题:基准系统 Zep 在此类别中以微弱优势领先,其 J 值为 76.60,略高于 Mem0g 的 75.71。这表明 Zep 在整合对话记忆与外部知识方面有轻微优势,但 Mem0g 仍然是强有力的竞争者。
  • 时序推理:Mem0g 在此类别中表现突出,取得了最高的 F1(51.55)和 J(58.13)分数。这证实了结构化的关系表示(图记忆)对于准确建模事件序列和时间关系至关重要。

表1:在LOCOMO数据集中,不同问答类型下启用记忆的系统性能比较。评估指标包括F1分数(F1)、BLEU-1(B1)和LLM-as-a-Judge分数(J),数值越高表示性能越好。A-Mem* 代表我们通过将温度设置为0重新运行A-Mem生成的LLM-as-a-Judge分数。Mem0g 表示我们提出的采用图记忆增强的架构。粗体表示每个指标在所有方法中的最佳性能。(↑)表示分数越高越好。
表1:在LOCOMO数据集中,不同问答类型下启用记忆的系统性能比较。评估指标包括F1分数(F1)、BLEU-1(B1)和LLM-as-a-Judge分数(J),数值越高表示性能越好。A-Mem* 代表我们通过将温度设置为0重新运行A-Mem生成的LLM-as-a-Judge分数。Mem0g 表示我们提出的采用图记忆增强的架构。粗体表示每个指标在所有方法中的最佳性能。(↑)表示分数越高越好。

4.2 跨类别分析与 RAG 及全上下文模型的比较

  • Mem0 vs. Mem0g:分析表明 Mem0 和 Mem0g 具有互补优势。Mem0 的密集自然语言记忆对于简单的单跳和多跳查询效率很高。而 Mem0g 的图结构在需要精细时序和上下文整合的复杂任务(如时序推理和开放域问答)中表现更优。
  • vs. RAG:如表 2 所示,Mem0 (J≈67%) 和 Mem0g (J≈68%) 的整体性能均优于所有 RAG 配置,即使是表现最好的 RAG 配置,J 分数也仅在 61% 左右。这凸显了提取关键事实而非检索大块原始文本的优势,因为精确的记忆表示减少了噪声。
  • vs. 全上下文模型:全上下文方法虽然在 J 分数上取得了最高分(约 73%),但其代价是极高的延迟和 Token 成本(见图 4b,p95 延迟约 17 秒)。相比之下,Mem0 的 p95 延迟仅为 1.44 秒(降低 92%),Mem0g 为 2.6 秒(降低 85%)。这表明记忆系统在准确性和效率之间提供了更实用的权衡,特别适合需要响应速度和成本控制的生产环境。

表2:各种基准与我们提出的方法的性能比较。延迟测量显示了搜索时间(获取记忆/块所需时间)和总时间(生成完整响应所需时间)的p50(中位数)和p95(95百分位数)值(单位:秒)。整体LLM-as-a-Judge分数(J)代表在整个LOCOMO数据集上生成响应的质量指标。
表2:各种基准与我们提出的方法的性能比较。延迟测量显示了搜索时间(获取记忆/块所需时间)和总时间(生成完整响应所需时间)的p50(中位数)和p95(95百分位数)值(单位:秒)。整体LLM-as-a-Judge分数(J)代表在整个LOCOMO数据集上生成响应的质量指标。

4.3 延迟与开销分析

  • 延迟分析:如图 4a 和 4b 所示,Mem0 在所有方法中实现了最低的搜索延迟(p50: 0.148s)和总延迟(p50: 0.708s),这得益于其高效的选择性记忆检索机制。Mem0g 的延迟略高,但其性能仍优于所有其他基准记忆系统,同时实现了除全上下文方法外最高的 J 分数。
  • 系统开销:在内存开销方面,Mem0 平均每个对话仅占用 7k Token,Mem0g 约为 14k Token。相比之下,Zep 因其冗余设计(在每个节点缓存摘要并在边上存储事实)消耗超过 600k Token。此外,Zep 存在严重的运行瓶颈,记忆在添加后需要数小时才能有效检索,而 Mem0 和 Mem0g 的记忆构建在最坏情况下也不到一分钟,可立即使用。

图4a:不同记忆方法(Mem0、Mem0g、最佳RAG变体、Zep、LangMem和A-Mem)在p50(中位数)和p95(95百分位数)的搜索延迟比较。条形图的高度代表J分数(左轴),而线图显示搜索延迟(秒,右轴为对数刻度)。
图4a:不同记忆方法(Mem0、Mem0g、最佳RAG变体、Zep、LangMem和A-Mem)在p50(中位数)和p95(95百分位数)的搜索延迟比较。条形图的高度代表J分数(左轴),而线图显示搜索延迟(秒,右轴为对数刻度)。

图4b:不同记忆方法(Mem0、Mem0g、最佳RAG变体、Zep、LangMem、OpenAI、全上下文和A-Mem)在p50和p95的总响应延迟比较。条形图的高度代表J分数(左轴),而线图捕捉端到端延迟(秒,右轴为对数刻度)。
图4b:不同记忆方法(Mem0、Mem0g、最佳RAG变体、Zep、LangMem、OpenAI、全上下文和A-Mem)在p50和p95的总响应延迟比较。条形图的高度代表J分数(左轴),而线图捕捉端到端延迟(秒,右轴为对数刻度)。

A5 结论

本文介绍了 Mem0 和 Mem0g 两种互补的记忆架构,它们通过动态提取、整合和检索紧凑的记忆表示,克服了 LLM 固定上下文窗口的内在限制。在 LOCOMO 基准测试中,Mem0 在单跳和多跳推理中表现出色,而 Mem0g 的图结构在时序和开放域任务中取得了显著优势。与全上下文基准相比,我们的方法在 p95 延迟上降低了超过 91%,在精确度和响应速度之间实现了强大的平衡。

Mem0 的密集记忆流水线擅长快速检索简单查询,而 Mem0g 的结构化图表示则为复杂任务提供了精细的关系清晰度。它们共同构成了一个多功能的记忆工具包,能够适应不同的对话需求,并具备大规模部署的可行性。

未来工作将包括:优化 Mem0g 中的图操作以降低延迟开销,探索融合效率与关系表示的层级化记忆架构,以及开发受人类认知过程启发的更复杂的记忆整合机制。此外,将这些记忆框架扩展到对话场景之外的领域,如过程推理和多模态交互,将进一步验证其广泛适用性。

A6 附录

A. Prompts

用于 LLM as a Judge 的提示模板。我们调整了 Packer et al. (2023) 发布的提示,用于开发我们的 LLM-as-a-Judge 提示。模板要求模型将一个问题的答案标记为“CORRECT”或“WRONG”。输入数据包括:(1) 一个问题,(2) 一个“gold”(基准)答案,(3) 一个待评分的生成答案。模板指示模型,只要生成的答案触及与基准答案相同的主题,就应宽容地评分。对于时间相关问题,即使格式不同(例如,‘May 7th’ vs ‘7 May’),只要指代同一日期或时间段,也应视为正确。模型需要先提供一句简短的推理说明,然后以 JSON 格式返回标签“CORRECT”或“WRONG”。

用于结果生成的提示模板 (Mem0)。此模板将模型设定为一个智能记忆助手,任务是从对话记忆中检索准确信息。它提供了来自两名对话者的带有时间戳的记忆作为上下文。指令要求模型:仔细分析所有记忆,特别注意时间戳;如果问题涉及具体事件或事实,需在记忆中寻找直接证据;在信息矛盾时,优先采纳最新的记忆;将相对时间引用(如“去年”)根据记忆时间戳转换为具体日期;答案应少于 5-6 个词。模板还提供了一个分步思考的方法,指导模型检查相关记忆、分析时间戳和内容、进行必要的计算、并基于记忆中的证据形成精确简洁的答案。

用于结果生成的提示模板 (Mem0g)。此模板与 Mem0 的模板基本相同,但增加了一步思考指令:“分析知识图关系以理解用户的知识背景”。相应的,输入数据中除了包含用户的记忆外,还包括了用户的图关系数据。

用于 OpenAI ChatGPT 的提示模板。这是一个简单的提示,要求 ChatGPT 从一段对话中提取相关信息,并为每个提到的用户创建记忆条目。提示要求将这些记忆连同提供的时间戳一起存储到其知识库中,以备将来的参考和个性化交互。

B. 算法

算法 1 记忆管理系统:更新操作。该算法描述了记忆更新操作的流程。输入为提取出的事实集合 和记忆数据库 DB。算法遍历 中的每一个事实 ω。对于每个事实,它首先从 DB 中检索出 s 个最相似的记忆 M_similar。然后,它调用一个工具 DetermineUpdateOperation,该工具接收 ωM_similar 作为输入,并返回一个操作 op 和相应的参数 params。最后,算法在数据库上执行该操作,即 DB.execute(op, params)

算法1 记忆管理系统:更新操作
算法1 记忆管理系统:更新操作

C. 部分基准系统介绍

LoCoMo。LoCoMo 框架实现了一个复杂的记忆流水线,使 LLM 代理能够维持长期连贯的对话。其核心是将记忆分为短期和长期两部分。每次对话后,代理会生成摘要(作为短期记忆),并把对话轮次转化为关于说话者角色和生活事件的事实陈述(作为长期记忆)。生成新回复时,代理会利用最近的会话摘要和从长期记忆中选择性检索的相关观察。该系统还通过一个时间事件图来跟踪因果关联的生活事件,从而使代理能够保持一致的个性并回忆重要细节。

ReadAgent。ReadAgent 模仿人类处理长文本的方式,通过一个三阶段流水线来解决 LLM 的局限性。首先,在“情节分页”阶段,系统在自然的认知边界处分割文本。接着,在“记忆要点”阶段,它将每个片段提炼成简洁的摘要。最后,在“交互式查找”阶段,系统检查这些要点,并策略性地只检索最相关的原始文本片段进行详细处理。这种方法使 LLM 能够有效管理远超其上下文窗口长度的文档。

MemoryBank。MemoryBank 系统通过一个三部分流水线为 LLM 增强长期记忆。核心的“记忆存储”组件存放详细的对话日志、层级化的事件摘要和不断发展的用户个性画像。“记忆检索”机制使用双塔密集检索模型来提取上下文相关的过去信息。“记忆更新”组件提供了一个类似人类的遗忘机制,其中记忆在被回忆时会得到加强,如果未使用则会随时间自然衰退。

MemGPT。MemGPT 系统引入了一种受操作系统启发的方法来克服 LLM 的上下文窗口限制。它采用分层记忆系统,将可用内存分为“主上下文”(类似于 RAM)和“外部上下文”(类似于磁盘存储)。主上下文受 LLM 上下文窗口限制,而外部上下文可存储无限信息。当 LLM 需要主上下文中没有的信息时,它可以调用函数来搜索、检索或修改跨越这些记忆层级的内容,有效地将相关信息“调入”或“调出”其有限的上下文窗口。

A-Mem。A-Mem 模型引入了一种为 LLM 代理设计的代理式记忆系统。该系统通过相互连接的笔记来动态地结构化和演化记忆。每个笔记都捕捉了交互信息,并富含由 LLM 生成的结构化属性,如关键词、上下文描述和标签。当创建新记忆时,A-MEM 使用语义嵌入来检索相关的现有笔记,然后利用 LLM 驱动的方法根据相似性和共享属性建立有意义的链接。记忆演化机制会动态更新现有笔记,从而使记忆结构不断演化,实现更丰富、更深入的连接。