Graph 记忆(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/mem0ai/mem0/4-graph-memory
翻译时间:2026-05-27T08:44:58.888Z
翻译模型:deepseek-chat
原文字符数:11020
项目:Mem0 (mem0)
---
图记忆(Graph 记忆)
相关源文件
以下文件为本 Wiki 页面生成时使用的上下文:
docs/components/vectordbs/dbs/neptune_analytics.mdxexamples/graph-db-demo/neptune-example.ipynbmem0/__init__.pymem0/configs/enums.pymem0/configs/prompts.pymem0/configs/vector_stores/neptune.pymem0/configs/vector_stores/supabase.pymem0/memory/main.pymem0/memory/storage.pymem0/memory/utils.pymem0/vector_stores/neptune_analytics.pytests/configs/test_prompts.pytests/memory/test_main.pytests/test_chatty_llm_parsing.pytests/test_main.pytests/test_memory.pytests/test_proxy.pytests/vector_stores/test_neptune_analytics.py
图记忆是 Mem0 的知识图谱层,用于存储实体-关系数据,同时支持向量嵌入。向量存储可以实现语义相似性搜索,而图记忆则能捕获显式关系,例如 "Alice -- works_at -- Google" 或 "Bob -- manages_team -- Engineering"。这种双存储架构同时提供了语义检索和结构化关系查询能力。
本文概述了图记忆的集成方式。详细文档请参考:
- 图记忆概述 —— 解释什么是图记忆、何时使用以及它与基于向量的记忆的区别
- 图存储提供商 —— 记录支持的图数据库:Neo4j、Kuzu、Memgraph、Neptune 及其配置
- 实体与关系提取 —— 解释基于大语言模型(LLM)的实体提取、关系建立和 Cypher 查询构建
- 图搜索与检索 —— 记录图遍历、BM25 重排序以及向量与图搜索结果的结合
- 相似性阈值 —— 解释用于实体去重和图节点匹配的向量相似性阈值
来源: mem0/memory/main.py:199-207、mem0/memory/utils.py:73-82
架构总览
mem0/memory/main.py 中的 Memory 类在提供 config.graph_store.config 时会条件性地启用图存储。图操作与向量操作通过 ThreadPoolExecutor 并发执行,以最小化延迟影响。
双存储架构
graph LR
Memory["Memory"]
subgraph "记忆操作"
add["add()"]
search["search()"]
get_all["get_all()"]
end
subgraph "并发执行"
ThreadPoolExecutor["ThreadPoolExecutor"]
vector_future["future1:<br/>_add_to_vector_store()"]
graph_future["future2:<br/>_add_to_graph()"]
end
subgraph "存储层"
VectorStoreFactory["VectorStoreFactory"]
GraphStoreFactory["GraphStoreFactory"]
end
subgraph "实现"
vector_impl["Qdrant、Pinecone、<br/>Chroma 等"]
graph_impl["MemoryGraph<br/>(基于 Neo4j)"]
end
Memory --> add
Memory --> search
Memory --> get_all
add --> ThreadPoolExecutor
ThreadPoolExecutor --> vector_future
ThreadPoolExecutor --> graph_future
vector_future --> VectorStoreFactory
graph_future --> GraphStoreFactory
VectorStoreFactory --> vector_impl
GraphStoreFactory --> graph_impl
来源: mem0/memory/main.py:199-207、mem0/memory/main.py:369-384
初始化
图记忆通过 enable_graph 标志启用,该标志在 config.graph_store.config 存在时设置:
# 来自 mem0/memory/main.py 中的 Memory.__init__()
self.enable_graph = False
if self.config.graph_store.config:
provider = self.config.graph_store.provider
self.graph = GraphStoreFactory.create(provider, self.config)
self.enable_graph = True
else:
self.graph = None
来源: mem0/memory/main.py:199-207
GraphStoreFactory 将提供商名称映射到实现类。默认提供商使用 MemoryGraph,它与 LlmFactory 和 EmbedderFactory 集成以处理关系数据。
来源: mem0/utils/factory.py:36-41
核心组件
图记忆逻辑
图系统是关系操作的主要接口。它连接到图数据库,并使用基于大语言模型(LLM)的实体提取。
关键依赖:
| 组件 | 来源 | 用途 |
|---|---|---|
LlmFactory | mem0/utils/factory.py:38 | 生成实体提取调用 |
EmbedderFactory | mem0/utils/factory.py:37 | 创建用于匹配的实体嵌入向量 |
BM25 工具 | mem0/utils/scoring.py:45-47 | 按相关性重排序搜索结果 |
Entity Extraction | mem0/utils/entity_extraction.py:35 | 识别节点和边的逻辑 |
来源: mem0/memory/main.py:35-48
图记忆的工作原理
图记忆使用多阶段大语言模型(LLM)管线从对话文本中提取实体和关系。该过程包括实体提取、关系建立、冲突检测和图更新。
实体与关系提取管线
sequenceDiagram
participant add as "Memory.add()"
participant _add_to_graph as "_add_to_graph()"
participant GraphLogic as "GraphStore 实现"
participant LLM as "LlmFactory"
participant DB as "图数据库"
add->>_add_to_graph: messages、filters
_add_to_graph->>GraphLogic: data、filters
Note over GraphLogic,LLM: 提取实体
GraphLogic->>LLM: extract_entities()
LLM-->>GraphLogic: entities、types
Note over GraphLogic,LLM: 建立关系
GraphLogic->>LLM: 识别关系
LLM-->>GraphLogic: to_be_added
Note over GraphLogic,DB: 搜索现有数据
GraphLogic->>DB: 搜索相似节点
DB-->>GraphLogic: search_output
Note over GraphLogic,DB: 更新图
GraphLogic->>DB: _delete_entities()
GraphLogic->>DB: _add_entities()
DB-->>GraphLogic: results
GraphLogic-->>_add_to_graph: added_entities
_add_to_graph-->>add: graph_result
来源: mem0/memory/main.py:599-608、mem0/utils/entity_extraction.py:35
管线阶段如下:
- 实体提取 —— 使用
extract_entities从对话中识别实体和类型mem0/utils/entity_extraction.py:35。 - 关系建立 —— 根据对话上下文确定提取的实体如何连接。
- 冲突检测 —— 使用嵌入向量相似性搜索相似实体,防止重复。
- 图更新 —— 执行数据库特定的查询以更新关系存储。
有关提取管线的详细文档,请参见实体与关系提取。
搜索与检索
图搜索从查询中提取实体,通过嵌入向量搜索找到相似节点,并使用 BM25 按相关性重排序结果。
图搜索流程
graph TB
search["Memory.search()"]
graph_search["graph.search()"]
subgraph "图搜索实现"
extract["extract_entities()"]
embed["embedding_model.embed()"]
db_query["图数据库查询"]
bm25["normalize_bm25()"]
rank["score_and_rank()"]
end
search --> graph_search
graph_search --> extract
extract --> embed
embed --> db_query
db_query --> bm25
bm25 --> rank
rank --> search
来源: mem0/memory/main.py:93-118、mem0/utils/scoring.py:43-48
搜索过程如下:
- 使用
extract_entities从查询中提取实体mem0/memory/main.py:103。 - 使用配置的
EmbedderFactory为每个实体生成嵌入向量mem0/memory/main.py:100。 - 执行带有向量相似性匹配的图查询。
- 使用
score_and_rank重排序结果,该函数结合了语义分数和 BM25 分数mem0/utils/scoring.py:47。
有关搜索机制的详细文档,请参见图搜索与检索。
配置
图记忆通过提供 graph_store 配置来启用。系统通过 GraphStoreFactory 支持多个图数据库提供商。
基本配置
from mem0 import Memory
config = {
"graph_store": {
"provider": "neo4j",
"config": {
"url": "bolt://localhost:7687",
"username": "neo4j",
"password": "password"
}
}
}
m = Memory(config)
来源: mem0/memory/main.py:199-207、tests/test_main.py:31-32
支持的提供商
| 提供商 | 实现 | 描述 |
|---|---|---|
neo4j | Neo4jGraph | 行业标准图数据库 |
memgraph | Memgraph | 内存图数据库 |
neptune | NeptuneGraph | AWS 托管图服务 |
kuzu | KuzuGraph | 嵌入式图数据库 |
有关提供商特定的配置详情,请参见图存储提供商。
使用示例
图记忆与常规记忆操作集成。启用后,会同时返回向量和图结果。
添加带图的记忆
# 添加包含关系的对话
messages = [
{"role": "user", "content": "我是 Alice,我在 Google 担任工程师。"}
]
result = m.add(messages, user_id="alice")
当 enable_graph 为 true 时,输出结构包含 relations。
来源: mem0/memory/main.py:378-384
基于会话的过滤
图记忆会尊重会话标识符(user_id、agent_id、run_id)以实现多租户隔离。这些参数必须通过 filters 传递,以避免使用 _reject_top_level_entity_params 进行校验时出错。
来源: mem0/memory/main.py:100-110
与记忆操作的集成
Memory 类使用 ThreadPoolExecutor 并发执行图操作:
# 来自 mem0/memory/main.py 中的 Memory.add()
with concurrent.futures.ThreadPoolExecutor() as executor:
future1 = executor.submit(self._add_to_vector_store, messages, metadata, filters, infer)
future2 = executor.submit(self._add_to_graph, messages, filters)
concurrent.futures.wait([future1, future2])
来源: mem0/memory/main.py:369-377
这种并行执行方式可以最小化延迟。结果会在响应中合并:
if self.enable_graph:
return {
"results": vector_store_result,
"relations": graph_result,
}
来源: mem0/memory/main.py:378-384