Mem0
目录
从这一节开始我们学习另一个 Agent 长期记忆的开源工具 Mem0
1. Mem0 原理
依据 Mem0 Paper 中的介绍按照是否基于图,Mem0 分为两种架构。两种架构下都分为Extracttion 和 Update 两个阶段。
1.1 无图架构
-
提取阶段
-
输入:新消息对 $(m_{t-1}, m_t)$,包含用户消息与助手响应
-
上下文来源:
- 会话摘要 $S$:全局主题理解,由异步摘要生成模块定期刷新
- 最近消息序列:${m_{t-m}, …, m_{t-2}}$,提供细节与时间上下文
-
提示构造: $P = (S, {m_{t-m}, …, m_{t-2}}, m_{t-1}, m_t)$
-
通过 LLM 提取函数 $\phi(P)$ → 得到候选记忆集合 $\Omega = {\omega_1, …, \omega_n}$
-
-
更新阶段
-
对每个候选记忆 $\omega_i$:
-
通过向量检索获取 top-s 相似记忆
-
将候选记忆与相似记忆提交给 LLM
-
LLM 决策存储操作(工具调用接口实现):
- ADD:创建新记忆
- UPDATE:增强现有记忆
- DELETE:删除与新信息冲突的记忆
- NOOP:无需修改
-
-
执行 LLM 指定的操作 → 保证知识库的一致性与时间连贯性
-
1.2 有图架构
📌 架构与核心思想
-
Mem0g 是一种基于图的记忆方法,用于捕捉、存储和检索自然语言交互中的上下文信息。
-
记忆表示为有向带标签图 $G = (V, E, L)$。
- 节点 V:实体(Alice, San_Francisco)
- 边 E:实体关系(lives_in)
- 标签 L:语义类型(Person, City)
📌 节点结构
每个实体节点包含:
- 类型分类(Person, Location, Event 等)
- 语义嵌入向量 $e_v$
- 元数据 $t_v$(创建时间)
📌 关系表示
-
关系以三元组形式 $(v_s, r, v_d)$ 表示:
- $v_s$:源实体
- $v_d$:目标实体
- $r$:带标签的边(如 lives_in, prefers)
📌 信息提取流程
-
实体提取器
- 利用 LLM 从文本中识别语义上重要的实体(人、地点、事件、属性等)
- 实体筛选标准:语义重要性、唯一性、持久性
- 示例:旅行计划对话 → 城市、交通方式、日期、活动、偏好
-
关系生成器
- 分析上下文,生成语义关系三元组
- 关系类型:lives_in, prefers, owns, happened_on
- 使用提示工程,引导 LLM 提取显性与隐含关系
📌 更新机制
-
对每个新三元组:
- 计算实体嵌入,搜索相似节点(阈值 $t$)
- 选择创建新节点或复用已有节点
-
冲突检测与解析:
- 识别新旧关系的矛盾
- 通过更新解析器决定废弃关系(标记为无效而非删除),支持时间推理
📌 检索机制
-
面向实体检索
- 从查询中提取关键实体
- 通过语义相似性定位节点
- 遍历节点的入边和出边,构建相关子图
-
语义三元组检索
- 将整个查询编码为嵌入向量
- 与图中每个三元组的文本编码比对
- 返回相似度超过阈值的三元组(按相似度排序)
📌 系统实现细节
-
数据库:Neo4j 用作底层图数据库
-
LLM 引擎:GPT-4o-mini,用于实体提取与关系更新
-
检索优化:结合语义嵌入与图结构实现高效推理
-
实验配置:
- 上下文消息数 $m=10$
- 相似记忆数 $s=10$
- 使用密集嵌入向量数据库进行相似搜索