实体与关系抽取
实体与关系抽取
相关源文件
以下文件为本维基页面的生成提供了上下文:
mem0-ts/src/oss/src/memory/index.tsmem0-ts/src/oss/src/tests/better-sqlite3-migration.test.tsmem0-ts/src/oss/src/tests/sqlite-backward-compat.test.tsmem0-ts/src/oss/src/utils/entity_extraction.tsmem0-ts/src/oss/src/vector_stores/memory.tsmem0-ts/src/oss/src/vector_stores/redis.tsmem0-ts/src/oss/tests/vector-store.unit.test.tsmem0-ts/src/oss/tests/vector-stores-compat.test.tsmem0/__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)工具调用驱动,并在启用图记忆时执行。
有关配置图存储和启用图记忆的信息,请参阅 4.2 图存储提供商。有关查询已抽取图数据的信息,请参阅 4.4 图搜索与检索。
目的与范围
实体与关系抽取是将非结构化对话文本转换为结构化知识图谱的过程。该系统:
- 识别命名实体(人物、地点、概念)及其类型。
- 建立实体间的有向关系。
- 对文本进行消毒处理,以确保安全构建 Cypher 查询。
- 使用
user_id、agent_id和run_id维护会话范围。
当 MemoryConfig 中配置了 graph_store.config 时,该抽取过程会在 Memory.add() 操作期间自动执行 mem0/memory/main.py:199-206。
抽取管线总览
抽取管线包含多个阶段,将原始文本转换为图节点和边。在 MemoryGraph 类(或其特定于提供商的实现)中,add() 方法负责编排整个流程 mem0/memory/graph_memory.py:76-94。
实体与关系抽取流程
来源:mem0/memory/graph_memory.py:76-94
实体抽取
实体抽取会识别输入文本中提到的所有实体,并为其分配语义类型。_retrieve_nodes_from_data() 方法使用大语言模型(LLM)工具调用来执行此抽取 mem0/memory/graph_memory.py:196-227。
实体抽取过程
使用大语言模型(LLM)工具调用进行实体抽取
来源:mem0/memory/graph_memory.py:196-227
实体类型与自引用
系统会自动处理用户消息中的自引用。当文本包含"I"、"me"、"my"等词时,大语言模型(LLM)会被指示使用过滤器中的 user_id 作为源实体 mem0/memory/graph_memory.py:205。
示例:
- 输入:"I love playing chess"
filters = {"user_id": "alice"}- 抽取的实体:
{"alice": "person", "chess": "game"}
系统提示会明确指示大语言模型(LLM):
"如果用户消息包含自引用,例如'I'、'me'、'my'等,则使用 {filters['user_id']} 作为源实体。" mem0/memory/graph_memory.py:205
实体归一化
所有抽取的实体在存储前都会经过归一化处理,以确保图内的一致性 mem0/memory/graph_memory.py:225:
| 原始实体 | 归一化后的实体 |
|---|---|
"Alice Smith" | "alice_smith" |
"New York" | "new_york" |
"Machine Learning" | "machine_learning" |
来源:mem0/memory/graph_memory.py:225
关系抽取
在识别出实体后,系统会在它们之间建立有向关系。_establish_nodes_relations_from_data() 方法执行此抽取 mem0/memory/graph_memory.py:229-269。
关系抽取过程
关系抽取过程
来源:mem0/memory/graph_memory.py:229-269
用户身份组合
系统会构建一个包含可用会话标识符的用户身份字符串,以确保抽取的关系具有正确的作用域 mem0/memory/graph_memory.py:232-237:
user_identity = f"user_id: {filters['user_id']}"
if filters.get("agent_id"):
user_identity += f", agent_id: {filters['agent_id']}"
if filters.get("run_id"):
user_identity += f", run_id: {filters['run_id']}"
来源:mem0/memory/graph_memory.py:232-237
自定义提示
如果配置了 config.graph_store.custom_prompt,它会被作为附加指令插入到抽取提示中 mem0/memory/graph_memory.py:239-242:
if self.config.graph_store.custom_prompt:
system_content = EXTRACT_RELATIONS_PROMPT.replace("USER_ID", user_identity)
system_content = system_content.replace("CUSTOM_PROMPT",
f"4. {self.config.graph_store.custom_prompt}")
来源:mem0/memory/graph_memory.py:239-242
用于抽取的大语言模型(LLM)工具
抽取过程使用大语言模型(LLM)函数调用,并配合预定义的工具。根据大语言模型(LLM)提供商是否支持结构化输出,会使用不同的工具模式。
实体抽取工具
| 工具名称 | 提供商 | 定义 |
|---|---|---|
EXTRACT_ENTITIES_TOOL | 标准提供商 | mem0/graphs/tools.py:124-150 |
EXTRACT_ENTITIES_STRUCT_TOOL | azure_openai_structured、openai_structured | mem0/graphs/tools.py:281-308 |
来源:mem0/graphs/tools.py:124-150、mem0/graphs/tools.py:281-308
关系抽取工具
| 工具名称 | 提供商 | 定义 |
|---|---|---|
RELATIONS_TOOL | 标准提供商 | mem0/graphs/tools.py:85-121 |
RELATIONS_STRUCT_TOOL | azure_openai_structured、openai_structured | mem0/graphs/tools.py:238-278 |
来源:mem0/graphs/tools.py:85-121、mem0/graphs/tools.py:238-278
数据消毒
在将关系存储到 Neo4j 等图数据库之前,系统会使用 sanitize_relationship_for_cypher() 对文本进行消毒处理,以防止 Cypher 语法错误 mem0/memory/utils.py:159-207。
字符映射
字符消毒过程
来源:mem0/memory/utils.py:159-207
消毒字符映射表
该函数将存在问题的字符映射为安全的替代字符 mem0/memory/utils.py:161-207:
| 字符 | 替换为 | 原因 |
|---|---|---|
... | _ellipsis_ | Cypher 语法冲突 |
/ | _slash_ | 路径分隔符 |
\ | _backslash_ | 转义字符 |
& | _ampersand_ | 运算符 |
* | _asterisk_ | 通配符 |
(、) | _lparen_、_rparen_ | 表达式分隔符 |
来源:mem0/memory/utils.py:161-207
与记忆系统的集成
实体与关系抽取会集成到主记忆添加流程中,通常与向量存储操作并行执行。
并行执行
并行的向量与图记忆操作
来源:mem0/memory/main.py:369-384、mem0/memory/graph_memory.py:76-94
_add_to_graph 方法
Memory 类中的 _add_to_graph() 方法是入口点 mem0/memory/main.py:599-608:
def _add_to_graph(self, messages, filters):
added_entities = []
if self.enable_graph:
if filters.get("user_id") is None:
filters["user_id"] = "user"
data = "\n".join([msg["content"] for msg in messages
if "content" in msg and msg["role"] != "system"])
added_entities = self.graph.add(data, filters)
return added_entities
来源:mem0/memory/main.py:599-608
图记忆初始化
当 MemoryConfig 中存在 graph_store.config 时,图记忆会被初始化 mem0/memory/main.py:199-206。GraphStoreFactory 用于创建适当的提供商实例 mem0/utils/factory.py:112-132。
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
来源:mem0/memory/main.py:199-206、mem0/utils/factory.py:112-132