agentic_huge_data_base / wiki
页面 Mem0 · 4.3 实体与关系抽取·DeepWiki 中文全文译文

4.3 · 实体与关系抽取(Entity and Relationship Extraction)

长期记忆与上下文管理 · 聚焦本章的模块关系、源码依据与实现要点。

项目Mem0 章节4.3 状态全文译文 模块图谱与关系、智能体运行时、存储与持久化、检索、召回与索引
源码线索
  • mem0-ts/src/oss/src/memory/index.ts
  • mem0-ts/src/oss/src/tests/better-sqlite3-migration.test.ts
  • mem0-ts/src/oss/src/tests/sqlite-backward-compat.test.ts
  • mem0-ts/src/oss/src/utils/entity_extraction.ts
  • mem0-ts/src/oss/src/vector_stores/memory.ts
  • mem0-ts/src/oss/src/vector_stores/redis.ts
  • mem0-ts/src/oss/tests/vector-store.unit.test.ts
  • mem0-ts/src/oss/tests/vector-stores-compat.test.ts
  • mem0/__init__.py
  • mem0/configs/prompts.py
模块标签
  • 图谱与关系
  • 智能体运行时
  • 存储与持久化
  • 检索、召回与索引
  • 模型调用与提供方适配

章节正文

实体与关系抽取

实体与关系抽取

相关源文件

以下文件为本维基页面的生成提供了上下文:

  • mem0-ts/src/oss/src/memory/index.ts
  • mem0-ts/src/oss/src/tests/better-sqlite3-migration.test.ts
  • mem0-ts/src/oss/src/tests/sqlite-backward-compat.test.ts
  • mem0-ts/src/oss/src/utils/entity_extraction.ts
  • mem0-ts/src/oss/src/vector_stores/memory.ts
  • mem0-ts/src/oss/src/vector_stores/redis.ts
  • mem0-ts/src/oss/tests/vector-store.unit.test.ts
  • mem0-ts/src/oss/tests/vector-stores-compat.test.ts
  • mem0/__init__.py
  • mem0/configs/prompts.py
  • mem0/memory/main.py
  • mem0/memory/storage.py
  • mem0/memory/utils.py
  • tests/configs/test_prompts.py
  • tests/memory/test_main.py
  • tests/test_chatty_llm_parsing.py
  • tests/test_main.py
  • tests/test_memory.py
  • tests/test_proxy.py

本文档介绍了 Mem0 如何从自然语言文本中抽取实体与关系,并将其转换为结构化图数据。实体与关系抽取由大语言模型(LLM)工具调用驱动,并在启用图记忆时执行。

有关配置图存储和启用图记忆的信息,请参阅 4.2 图存储提供商。有关查询已抽取图数据的信息,请参阅 4.4 图搜索与检索

目的与范围

实体与关系抽取是将非结构化对话文本转换为结构化知识图谱的过程。该系统:

  1. 识别命名实体(人物、地点、概念)及其类型。
  2. 建立实体间的有向关系。
  3. 对文本进行消毒处理,以确保安全构建 Cypher 查询。
  4. 使用 user_idagent_idrun_id 维护会话范围。

MemoryConfig 中配置了 graph_store.config 时,该抽取过程会在 Memory.add() 操作期间自动执行 mem0/memory/main.py:199-206

抽取管线总览

抽取管线包含多个阶段,将原始文本转换为图节点和边。在 MemoryGraph 类(或其特定于提供商的实现)中,add() 方法负责编排整个流程 mem0/memory/graph_memory.py:76-94

Mem0 · 抽取管线总览 · 图 1
Mem0 · 抽取管线总览 · 图 1

实体与关系抽取流程

来源:mem0/memory/graph_memory.py:76-94

实体抽取

实体抽取会识别输入文本中提到的所有实体,并为其分配语义类型。_retrieve_nodes_from_data() 方法使用大语言模型(LLM)工具调用来执行此抽取 mem0/memory/graph_memory.py:196-227

实体抽取过程
Mem0 · 实体抽取过程 · 图 2
Mem0 · 实体抽取过程 · 图 2

使用大语言模型(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 · 关系抽取过程 · 图 3
Mem0 · 关系抽取过程 · 图 3

关系抽取过程

来源: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_TOOLazure_openai_structuredopenai_structuredmem0/graphs/tools.py:281-308

来源:mem0/graphs/tools.py:124-150mem0/graphs/tools.py:281-308

关系抽取工具
工具名称提供商定义
RELATIONS_TOOL标准提供商mem0/graphs/tools.py:85-121
RELATIONS_STRUCT_TOOLazure_openai_structuredopenai_structuredmem0/graphs/tools.py:238-278

来源:mem0/graphs/tools.py:85-121mem0/graphs/tools.py:238-278

数据消毒

在将关系存储到 Neo4j 等图数据库之前,系统会使用 sanitize_relationship_for_cypher() 对文本进行消毒处理,以防止 Cypher 语法错误 mem0/memory/utils.py:159-207

字符映射
Mem0 · 字符映射 · 图 4
Mem0 · 字符映射 · 图 4

字符消毒过程

来源: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 · 并行执行 · 图 5
Mem0 · 并行执行 · 图 5

并行的向量与图记忆操作

来源:mem0/memory/main.py:369-384mem0/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-206GraphStoreFactory 用于创建适当的提供商实例 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-206mem0/utils/factory.py:112-132