记忆系统
记忆系统
相关源文件
本章引用的主要源码文件:
docs/core-concepts/memory-operations/add.mdxdocs/core-concepts/memory-operations/delete.mdxdocs/core-concepts/memory-operations/search.mdxdocs/core-concepts/memory-operations/update.mdxdocs/core-concepts/memory-types.mdxdocs/open-source/configuration.mdxdocs/open-source/overview.mdxdocs/platform/advanced-memory-operations.mdxdocs/platform/features/platform-overview.mdxdocs/platform/overview.mdxmem0/__init__.pymem0/configs/prompts.pymem0/memory/main.pymem0/memory/storage.pymem0/memory/utils.pytests/configs/test_prompts.pytests/memory/test_main.pytests/test_chatty_llm_parsing.pytests/test_main.pytests/test_memory.pytests/test_proxy.py
概述
记忆系统是核心子系统,负责在 Mem0 中存储、检索和管理记忆数据。它协调用户消息、基于大语言模型(LLM)的事实提取、冲突解决以及多后端存储(包括向量存储、图存储和历史数据库)之间的数据流。
该系统通过智能管线处理对话消息,具体流程如下:
- 使用大语言模型(LLM)提取关键事实
mem0/memory/main.py:423-456 - 解决与现有记忆的冲突
mem0/memory/main.py:496-590 - 并发地将数据存储到向量和图后端
mem0/memory/main.py:369-377 - 通过
SQLiteManager维护所有变更的审计追踪mem0/memory/storage.py:11-19
关键组件:
Memory类:开源实现,提供直接存储访问mem0/memory/main.py:172MemoryClient类:用于托管部署的平台 API 客户端。- 向量存储:支持语义相似性搜索
mem0/utils/factory.py:101-131 - 图存储:捕获实体关系
mem0/memory/graph_memory.py:29 - 历史数据库:提供审计追踪和会话消息持久化
mem0/memory/storage.py:128-148
子页面:
- 记忆类(开源) — 直接存储配置与使用
- MemoryClient(平台) — 托管 API 客户端使用
- 记忆操作 — 详细操作参数与示例
- 会话作用域与过滤器 — user_id、agent_id、run_id 过滤
- 异步操作 — 异步模式与性能
- 代理集成 — 在大语言模型(LLM)调用中自动注入记忆
- 智能记忆处理 — 基于大语言模型(LLM)的事实提取与去重
来源: mem0/memory/main.py:172-234、mem0/memory/storage.py:11-19、docs/core-concepts/memory-operations/add.mdx:8-56
核心架构
记忆系统主要通过 Memory mem0/memory/main.py:172(用于开源部署)和 MemoryClient(用于平台部署)实现。两者提供相同的核心操作,但在存储访问方式上有所不同。
图表:记忆系统组件依赖关系
来源: mem0/memory/main.py:172-234、mem0/utils/factory.py:10-140
组件职责
| 组件 | 实例属性 | 主要职责 | 初始化方式 |
|---|---|---|---|
| 向量存储 | self.vector_store | 通过嵌入向量进行语义相似性搜索 | VectorStoreFactory.create() mem0/memory/main.py:183-185 |
| 图存储 | self.graph | 实体关系查询 | GraphStoreFactory.create() mem0/memory/main.py:201-204 |
| 历史数据库 | self.db | 审计追踪与消息存储 | SQLiteManager() mem0/memory/main.py:187 |
| 大语言模型(LLM) | self.llm | 事实提取与冲突解决 | LlmFactory.create() mem0/memory/main.py:186 |
| 嵌入器 | self.embedding_model | 为存储和搜索生成向量 | EmbedderFactory.create() mem0/memory/main.py:178-182 |
| 重排序器 | self.reranker | 搜索结果优化(可选) | RerankerFactory.create() mem0/memory/main.py:191-197 |
来源: mem0/memory/main.py:172-234、mem0/memory/storage.py:11-19
记忆生命周期
记忆系统通过一个多阶段管线处理数据,该管线涉及基于大语言模型(LLM)的智能处理、冲突解决以及双存储写入。
图表:添加操作生命周期
来源: mem0/memory/main.py:281-598、mem0/memory/main.py:599-608、docs/core-concepts/memory-operations/add.mdx:39-49
图表:搜索操作生命周期
来源: mem0/memory/main.py:758-857、mem0/memory/main.py:832-851、docs/core-concepts/memory-operations/search.mdx:32-45
双存储架构
记忆系统使用两个并发运行的主要存储后端,外加一个用于变更追踪和消息历史的审计数据库。
存储后端
| 后端 | 实例属性 | 数据模型 | 操作 |
|---|---|---|---|
| 向量存储 | self.vector_store | 嵌入向量 + 元数据载荷 | search()、get()、list()、insert()、update()、delete() |
| 图存储 | self.graph(可选) | 实体(节点)+ 关系(边) | add()、search()、get_all()、delete_all() mem0/memory/graph_memory.py:29-700 |
| 历史数据库 | self.db | SQLite 审计日志与消息 | add_history()、get_history()、save_messages() mem0/memory/storage.py:150-219 |
图表:并发存储执行
来源: mem0/memory/main.py:369-377、mem0/memory/storage.py:150-219、mem0/memory/graph_memory.py:29-194
会话作用域
记忆系统要求至少提供一个会话标识符(user_id、agent_id 或 run_id)来限定所有操作的作用域。这确保了记忆能够在适当的上下文中被组织和检索。
会话标识符要求
所有记忆操作至少需要以下之一:
user_id:限定到特定用户。agent_id:限定到特定 AI 代理。run_id:限定到对话或工作流会话。
_build_filters_and_metadata() 函数 mem0/memory/main.py:87-165 会校验这些要求并构建:
base_metadata_template:在存储期间附加到新记忆的元数据。effective_query_filters:在搜索或列出记忆时应用的过滤器。
图表:过滤器构建流程
有关包含逻辑运算符(AND/OR/NOT)和比较运算符的高级过滤功能,请参阅会话作用域与过滤器。
来源: mem0/memory/main.py:87-165、mem0/memory/main.py:100-110
智能记忆处理
默认情况下,记忆系统使用大语言模型(LLM)进行事实提取和冲突解决,而不是存储原始消息。
两阶段大语言模型(LLM)处理
阶段 1:事实提取 mem0/memory/main.py:423-456
- 将对话消息转换为结构化事实。
- 使用专用提示词,如
USER_MEMORY_EXTRACTION_PROMPT或AGENT_MEMORY_EXTRACTION_PROMPTmem0/memory/utils.py:15-29。 - 支持通过
self.custom_instructionsmem0/memory/main.py:186提供自定义事实提取提示词。
阶段 2:冲突解决 mem0/memory/main.py:496-590
- 将新事实与通过向量搜索检索到的现有记忆进行比较。
- 大语言模型(LLM)确定操作:
ADD、UPDATE、DELETE或NONE。 - 由
PROCEDURAL_MEMORY_SYSTEM_PROMPTmem0/configs/prompts.py:20引导。
有关用于确定记忆操作的逻辑详情,请参阅智能记忆处理。
来源: mem0/memory/main.py:423-456、mem0/memory/main.py:496-590、mem0/memory/utils.py:15-29
审计追踪
SQLiteManager mem0/memory/storage.py:11 维护所有记忆修改的完整审计日志,并持久化对话历史。
历史数据库模式
历史表追踪所有记忆生命周期事件:
| 列名 | 类型 | 内容 |
|---|---|---|
| id | TEXT | 唯一历史记录 ID |
| memory_id | TEXT | 受影响记忆的 ID |
| old_memory | TEXT | 先前内容(ADD 操作为 NULL) |
| new_memory | TEXT | 新内容(DELETE 操作为 NULL) |
| event | TEXT | ADD、UPDATE 或 DELETE |
| actor_id | TEXT | 进行更改的实体 |
| role | TEXT | user 或 assistant |
访问历史
# 获取某个记忆的完整历史
history_records = memory.history(memory_id="mem_123")
每个记忆操作(添加/更新/删除)都会调用 self.db.add_history() mem0/memory/storage.py:150-191 来记录更改。
来源: mem0/memory/storage.py:102-149、mem0/memory/main.py:1091-1123
部署选项
记忆系统提供两种部署模式:开源(本地 SDK)和平台(托管服务)。
部署对比
| 特性 | 开源 (Memory) | 平台 (MemoryClient) |
|---|---|---|
| 入口点 | Memory(config) mem0/memory/main.py:172 | MemoryClient(api_key="...") |
| 存储 | 用户管理的向量/图数据库 | 完全托管的基础设施 |
| 配置 | 通过 MemoryConfig mem0/configs/base.py:15 进行精细控制 | 通过仪表盘进行项目级设置 |
| 操作 | add、search、update、delete、get_all、history | 所有操作 + batch_update、batch_delete |
| 异步支持 | AsyncMemory 类 mem0/memory/main.py:1411 | AsyncMemoryClient 类 |
有关每种部署模式的详细用法,请参阅:
来源: mem0/memory/main.py:172-234、mem0/memory/main.py:1411、docs/platform/overview.mdx:18-26
性能与高级特性
并发执行
记忆系统使用 ThreadPoolExecutor mem0/memory/main.py:369-377 并行执行向量和图操作:
# 在 add() 期间并发存储
with concurrent.futures.ThreadPoolExecutor() as executor:
future1 = executor.submit(self._add_to_vector_store, ...)
future2 = executor.submit(self._add_to_graph, ...)
concurrent.futures.wait([future1, future2])
原始消息存储
设置 infer=False 可以绕过基于大语言模型(LLM)的事实提取,直接按原样存储消息 mem0/memory/main.py:387-421:
# 存储原始对话数据,不经过智能层处理
memory.add(messages, user_id="alice", infer=False)
此模式会跳过冲突解决,将每条消息作为单独的条目存储在向量存储中。
来源: mem0/memory/main.py:369-377、mem0/memory/main.py:387-421、docs/core-concepts/memory-operations/add.mdx:117-120