type
status
date
slug
summary
tags
category
icon
password
1. 摘要
- 大语言模型固定的上下文窗口限制了在长时间,多轮对话中保持一致性的能力
- 提出了一个可扩展,以记忆为中心的架构【mem0】,核心在于:动态提取,整合,和检索对话中的关键信息(dynamically extracting, consolidating, and retrieving salient information from ongoing conversations)
- 此外,还有一个增强变体【mem0s】,基于图的记忆表征捕捉对话间复杂的关联结构(leverages graph-based memory representations to capture complex relational structures among conversational elements.)
- 对比了六种不同的基线,发现在四种问题类型(single-hop, temporal, multi-hop, and open-domain)的效果都有增强
2. 引言
- 记忆是人智能的基石
- LLM虽然可以生成流利的语言,但从根本上受限于固定的上下文窗口,导致长期互动中无法保持连贯
- 没有记忆,AI 代理会忘记用户偏好、重复提问甚至与先前确认的事实相矛盾
- 此外,拥有记忆功能的AI会更聪明,更好地预测用户需求、从错误中学习、跨任务泛化知识等 。记忆增强的智能体通过利用行动与结果间的因果关系来改进决策 。分层记忆架构和能自主进化的智能体记忆系统进一步证明,记忆能支持跨多个对话会话的更连贯、长期的推理
- 现在的模型上下文虽然越来越长,但不解决根本问题,原因有几个:
- 有意义的人机关系可能持续数周或者数月,不可避免的超出上下文限制
- 现实世界的对话很少保持主题连续性,有可能先聊饮食,再聊几个小时编程,再聊饮食
- 超长的上下文还是会影响效果,因为注意力机制在处理距离较远的token时性能会下降 。这在医疗、教育和企业支持等高风险领域尤其成问题,因为在这些领域保持连续性和信任至关重要
- 因此,AI智能体必须采用超越静态上下文扩展的记忆系统 。一个强大的AI记忆系统应该能选择性地存储重要信息,整合相关概念,并在需要时检索相关细节——模仿人类的认知过程 。
到这里为止,长记忆的需求已经讲的很明白了,但是这里和RAG有什么差别呢?就是不断更新的RAG? 还是有其他想法呢?
3. 方法
3.1. Mem0
Memo 的核心思想是模仿人类记忆的某些方面,通过专门的模块来动态地提取、评估和管理对话中的重要信息,从而实现可扩展的长期记忆,整个工作可以分为两个阶段:提取阶段 和 更新阶段

3.1.1. 提取阶段
假设现在user输入了一句话,那么这句话加上上一句模型回复的话会形成一个【对话】输入mem0
mem0会收集补充上下文信息,分为两类上下文:
- 长期对话摘要:mem0的数据库会提供一份关于我们整个对话至今的【摘要】,包含了对话的背景,用户的身份信息,用户的目标等等
- 注意,这个模块是异步执行的,也就是用户对话和摘要是分开独立处理的,虽然不会带来操作延迟,但有可能有信息延迟
- 近期消息补充:Mem0会调取我们之前m条(默认10条)对话记录,作为更细致的短期对话
- 【对话摘要,近期消息,当前消息对】会被整合起来,形成一个完整的提示,交付给一个大模型
- 大模型会从这些内容中分析你的问题,并提取关键信息作为【候选事实】(candidate facts),可能有多个候选事实
3.1.2. 更新阶段
这个阶段主要是评估提取出来的候选事实,并于已有的记忆进行比较,以保持数据库的一致性并避免重复
对于每一个候选事实,要走以下流程:
- 相似性搜索:Memo 会使用向量嵌入技术,从它现有的知识库中检索出语义上最相似的 s 条(比如 s=10)已有记忆
- 调用 LLM 的“工具”:这个候选事实以及检索到的 s 条相似记忆,会通过一个“工具调用”(一种函数调用接口)提交给另一个 LLM 。
- LLM 决定操作类型:这个 LLM 会判断对这个候选事实执行以下四种操作中的哪一种最合适 :
- 添加:如果事实是全新的,并且与现有记忆没有显著重叠,那么它会被作为一条新记忆添加进去
- 更新:如果已有一条相似但不够具体的记忆,这个新的、更详细的事实可能会用来更新或补充旧记忆
- 删除:如果新的事实与现有记忆相矛盾,那么旧的记忆可能会被标记为删除或过时
- 无操作:如果发现这个候选事实是重复的(已经被完美记录过了)或者是无关紧要的
- 获取到操作指令后,系统更新知识库
- 大模型在回答用户问题的时候,会调用这个知识库,进而达成【记忆】功能
3.2. Mem0s
Mem0处理的主要是相对扁平化的文本记忆,而Mem0s的核心创新在于引入了【基于图的记忆表示方法】(graph-based memory)
这样做的好处是可以深刻理解对话中各个信息点之间的复杂连接和关系,从而支持更高级的推理能力
3.2.1. 什么是 graph-based memory

一个带标签的图 G=(V,E,L) ,这个图由节点 (Nodes)、边 (Edges) 和标签 (Labels) 构成 :
- 节点 (V):代表对话中出现的各种实体 (entities),比如人名 (ALICE)、地名 (SAN_FRANCISCO)、概念、事件等 。每个实体节点会包含:
- 实体类型分类 (例如:ALICE 是“人物”,SAN_FRANCISCO 是“城市”) 。
- 一个嵌入向量 ev,用来捕捉这个实体的语义含义 。
- 元数据,比如这个实体被创建的时间戳 tx 。
- 边 (E):代表实体之间的关系 (relationships),比如“居住在 (LIVES_IN)” 。
- 标签 (L):给节点分配语义类型
整个记忆库的关系通常以三元组 (triplets) 的形式表示,即
(源实体, 关系类型, 目标实体)
,例如 (ALICE, LIVES_IN, SAN_FRANCISCO)
。
注意:这个三元组代表的是一条有效记忆,而不是一个最小单位的图,对应关系是这样的,假设有条记忆:“小明喜欢吃苹果。“,过程如下:- 识别实体,并赋予语义类型:小明是一个node,label是【人物】;苹果也是一个node,label是 水果
- 识别他们之间的关系(边),赋予关系类型:小明和苹果之间是 喜欢吃
那么三元组就是(小明,喜欢吃,苹果)
3.2.2. 如何提取
Mem0s的信息提取还可以分为两个阶段,分别需要调用两次大模型
- 第一阶段:实体提取器
- 这个模块负责处理输入的文本,识别出其中包含的关键实体以及这些实体的类型 。这些实体可以是人、地点、物体、概念、事件、属性等任何在对话中值得被记录和追踪的信息单元 。实体提取器会分析信息单元的语义重要性、独特性和持久性来决定是否将其视为一个实体
- 第二阶段:关系生成器
- 在实体被提取出来之后,这个模块会推断这些实体之间有意义的连接,从而生成一系列关系三元组 。它通过分析实体在对话中的上下文、语言模式、甚至领域知识来识别和标记实体间的关系
可以理解为一个workflow,第一个节点提取实体,第二个节点补充实体直接的关系
判断实体是否需要被记录知识库有三个重要的维度:
- 重要性:指这个信息单元在当前对话或长期用户画像中的核心程度。一个重要的实体通常是对话焦点,或者与用户的关键偏好、目标、经历紧密相关
- 独特性:指这个信息单元是否能被清晰地识别并与对话中的其他信息区分开来。它不应该是一个非常模糊或泛泛的指代
- 持久性:指这个信息单元是否可能在后续的对话中被再次提及或对未来的交互产生影响。一些信息可能只是短暂提及,而另一些则可能成为长期记忆的一部分
将这些提取出的实体和它的对应label输入第二个节点,由他来构建这些实体之间的 关系
可能的提示词如下,或许会包含一些shot
3.2.3. 存储和更新策略
- 当新的关系三元组被提取出来后,系统会为源实体和目标实体计算嵌入向量,并与图数据库中已有的节点进行语义相似度比较,看是否存在相似度足够高的已有节点 。
- 根据比较结果,系统可能会创建新的实体节点,或者复用已有的节点,然后再建立它们之间的关系,并附加上元数据
- 为了保持知识图的一致性,MemOS 包含一个冲突检测机制 (conflict detection mechanism) 当新的信息(比如一个新的关系)加入时,这个机制会检查它是否与图中已有的关系发生潜在冲突
- 如果检测到冲突,一个基于 LLM 的更新解析器 (update resolver) 会介入,判断某些旧的关系是否应该被视为“过时 (obsolete)” 。重要的是,这些过时的关系通常不会被物理删除,而是被标记为无效,这样做的好处是能够支持基于时间的推理(比如理解用户偏好的变化)
3.2.4. 检索功能
Mem0s采用双重策略来进行信息检索,以达成最佳效果:
- 实体中心方法
- 首先在客户的查询中识别出关键实体,根据相似性,找到知识图中对应的节点
- 系统从节点出发,探索关联性,构建一个包含相关上下文信息点 子图
- 语义三元组方法
- 这种方法将整个用户查询编码成一个稠密的向量表示 。然后,这个查询向量会与知识图中每一个关系三元组的文本编码进行匹配 。系统会计算查询和所有三元组之间的相似度得分,并返回那些超过预设相关性阈值、且按相似度排序的三元组
- 两个机制并行,适用于不同的场景
这里有个藏着的点,论文里面没有说明两种检索是如何运行的,系统应该在什么场景下用什么检索方式
3.2.5. 优势
相较于Mem0,这套方案的优势有几个点:
- 更深层次的理解:不只是扁平的文本,而是更高维度的知识图,一张由不同节点组成的网
- 支持高级推理:图结构天然适合进行多步推理。例如,如果知道“用户A住在城市B”以及“城市B在国家C”,那么系统可以推断出“用户A在国家C”。这种能力对于回答需要整合分散信息的多跳问题尤其有用
- 处理复杂查询:对于那些涉及多个实体和它们之间复杂关系的问题,Mem0S 的图结构和双重检索机制能提供更精确的答案
4. 小结
到这里为止,阅读并理解了Mem0s的运行机制,论文后半部分就是实验和比赛了,后续有机会再补充
在读完摘要之后我一直有个根本性的问题:知识库,知识图谱这些概念很早之前就有了,Mem0到底做了什么创新呢?接下来就以回答这个问题作为本次阅读的结束
4.1. 更新机制
原有知识库和知识图谱的更新视角偏向于【仓库视角】,有新的资料了,统一进货,加工,保存,Mem0十分强调从持续对话中动态提取、评估和管理记忆的过程 ,随着对话持续进行,记忆在不断的被提取,评估,和更新,
4.2. LLM的深度融合
Mem0中没有涉及到重大算法逻辑的创新,里面的核心判断都是交给LLM处理的。但并不是说这就没有价值了,恰恰相反的是这是一种很棒的巧思,一种工程思维发挥价值的典型案例
LLM的能力必然是愈发精进的,如果说当下LLM可以比较好的处理这个需求,并且未来还会变得更加优秀,那么采用LLM何尝不是一种【演进算法】呢?
4.3. 效果与效率的平衡
除了融合RAG,知识图谱,llm之外,团队还做了很多工程效率方面的思考和工作,有几个典型的例子:
- Mem0是通过异步的方式生成长期摘要的,这样就可以降低【记忆层】对主线耗时的影响
- Mem0会不断的提取筛选关键信息,而非保留全盘信息,可以有效降低调用的token和耗时
- Author:培风
- URL:http://preview.tangly1024.com/article/1fba80cd-73cf-80c5-8269-db4ed87265ad
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!