目录

Mem0

从这一节开始我们学习另一个 Agent 长期记忆的开源工具 Mem0

1. Mem0 原理

依据 Mem0 Paper 中的介绍按照是否基于图,Mem0 分为两种架构。两种架构下都分为Extracttion 和 Update 两个阶段。

1.1 无图架构

/images/langgraph/mem0-1.avif

  1. 提取阶段

    • 输入:新消息对 $(m_{t-1}, m_t)$,包含用户消息与助手响应

    • 上下文来源:

      1. 会话摘要 $S$:全局主题理解,由异步摘要生成模块定期刷新
      2. 最近消息序列:${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}$

  2. 更新阶段

    • 对每个候选记忆 $\omega_i$:

      1. 通过向量检索获取 top-s 相似记忆

      2. 将候选记忆与相似记忆提交给 LLM

      3. LLM 决策存储操作(工具调用接口实现):

        • ADD:创建新记忆
        • UPDATE:增强现有记忆
        • DELETE:删除与新信息冲突的记忆
        • NOOP:无需修改
    • 执行 LLM 指定的操作 → 保证知识库的一致性与时间连贯性

1.2 有图架构

/images/langgraph/mem0-2.avif

📌 架构与核心思想

  • Mem0g 是一种基于图的记忆方法,用于捕捉、存储和检索自然语言交互中的上下文信息。

  • 记忆表示为有向带标签图 $G = (V, E, L)$。

    • 节点 V:实体(Alice, San_Francisco)
    • 边 E:实体关系(lives_in)
    • 标签 L:语义类型(Person, City)

📌 节点结构

每个实体节点包含:

  1. 类型分类(Person, Location, Event 等)
  2. 语义嵌入向量 $e_v$
  3. 元数据 $t_v$(创建时间)

📌 关系表示

  • 关系以三元组形式 $(v_s, r, v_d)$ 表示:

    • $v_s$:源实体
    • $v_d$:目标实体
    • $r$:带标签的边(如 lives_in, prefers)

📌 信息提取流程

  1. 实体提取器

    • 利用 LLM 从文本中识别语义上重要的实体(人、地点、事件、属性等)
    • 实体筛选标准:语义重要性、唯一性、持久性
    • 示例:旅行计划对话 → 城市、交通方式、日期、活动、偏好
  2. 关系生成器

    • 分析上下文,生成语义关系三元组
    • 关系类型:lives_in, prefers, owns, happened_on
    • 使用提示工程,引导 LLM 提取显性与隐含关系

📌 更新机制

  • 对每个新三元组:

    • 计算实体嵌入,搜索相似节点(阈值 $t$)
    • 选择创建新节点或复用已有节点
  • 冲突检测与解析

    • 识别新旧关系的矛盾
    • 通过更新解析器决定废弃关系(标记为无效而非删除),支持时间推理

📌 检索机制

  1. 面向实体检索

    • 从查询中提取关键实体
    • 通过语义相似性定位节点
    • 遍历节点的入边和出边,构建相关子图
  2. 语义三元组检索

    • 将整个查询编码为嵌入向量
    • 与图中每个三元组的文本编码比对
    • 返回相似度超过阈值的三元组(按相似度排序)

📌 系统实现细节

  • 数据库:Neo4j 用作底层图数据库

  • LLM 引擎:GPT-4o-mini,用于实体提取与关系更新

  • 检索优化:结合语义嵌入与图结构实现高效推理

  • 实验配置

    • 上下文消息数 $m=10$
    • 相似记忆数 $s=10$
    • 使用密集嵌入向量数据库进行相似搜索