agentic_huge_data_base / wiki
页面 Graphiti · 5.3 边抽取与消解·DeepWiki 中文全文译文

5.3 · 边抽取与消解(Edge Extraction and Resolution)

时序知识图谱与动态事实记忆 · 聚焦本章的模块关系、源码依据与实现要点。

项目Graphiti 章节5.3 状态全文译文 模块图谱与关系、测试、发布与运维、界面与交互、模型调用与提供方适配
源码线索
  • graphiti_core/prompts/dedupe_edges.py
  • graphiti_core/prompts/dedupe_nodes.py
  • graphiti_core/prompts/extract_edges.py
  • graphiti_core/prompts/extract_nodes.py
  • graphiti_core/prompts/extract_nodes_and_edges.py
  • graphiti_core/prompts/lib.py
  • graphiti_core/prompts/summarize_nodes.py
  • graphiti_core/utils/maintenance/combined_extraction.py
  • graphiti_core/utils/maintenance/edge_operations.py
  • graphiti_core/utils/maintenance/node_operations.py
模块标签
  • 图谱与关系
  • 测试、发布与运维
  • 界面与交互
  • 模型调用与提供方适配
  • 评测、反馈与人工复核

章节正文

边抽取与消解

边提取与解析

相关源文件

本章引用的主要源码文件:

  • graphiti_core/prompts/dedupe_edges.py
  • graphiti_core/prompts/dedupe_nodes.py
  • graphiti_core/prompts/extract_edges.py
  • graphiti_core/prompts/extract_nodes.py
  • graphiti_core/prompts/extract_nodes_and_edges.py
  • graphiti_core/prompts/lib.py
  • graphiti_core/prompts/summarize_nodes.py
  • graphiti_core/utils/maintenance/combined_extraction.py
  • graphiti_core/utils/maintenance/edge_operations.py
  • graphiti_core/utils/maintenance/node_operations.py
  • graphiti_core/utils/text_utils.py
  • tests/utils/maintenance/test_edge_operations.py
  • tests/utils/maintenance/test_node_operations.py
  • tests/utils/test_concatenate_episodes.py

本文档详细介绍了从片段内容中提取关系(边)并将其解析到时间知识图谱中的过程。extract_edges() 函数使用大语言模型(LLM)识别实体间的事实关系,而 resolve_extracted_edges() 则利用 Graphiti 的双时间模型处理去重、矛盾检测和时间有效性。

边提取与解析管线

边提取与解析管线通过多阶段流程将片段内容转换为结构化的 EntityEdge 关系,该流程涉及基于大语言模型(LLM)的提取和用于解析的双时间逻辑。

整体管线流程

Graphiti · 边提取与解析管线 · 图 1
Graphiti · 边提取与解析管线 · 图 1

来源:graphiti_core/utils/maintenance/edge_operations.py:116-288, graphiti_core/utils/maintenance/edge_operations.py:290-467

边提取过程

extract_edges 函数 graphiti_core/utils/maintenance/edge_operations.py:116-288 使用大语言模型(LLM)识别实体间的事实关系。该过程会验证提取的源名称和目标名称是否与提供的 EntityNode 列表匹配,并过滤掉自引用边 graphiti_core/utils/maintenance/edge_operations.py:214-250

提取组件
组件类型描述
episodeEpisodicNode | list[EpisodicNode]要提取的片段。多个片段会被拼接处理 graphiti_core/utils/maintenance/edge_operations.py:135-186
nodeslist[EntityNode]已提取的实体,用于建立关系。用于名称验证 graphiti_core/utils/maintenance/edge_operations.py:167-167
edge_type_mapdict[tuple[str, str], list[str]](source_label, target_label) 映射到允许的边类型 graphiti_core/utils/maintenance/edge_operations.py:144-150
edge_typesdict[str, type[BaseModel]]自定义边类型模式,包含属性和描述 graphiti_core/utils/maintenance/edge_operations.py:151-164

来源:graphiti_core/utils/maintenance/edge_operations.py:116-164

大语言模型(LLM)提取与响应模型

提取过程使用 prompt_library.extract_edges.edge() graphiti_core/prompts/extract_edges.py:94-164,该函数指示大语言模型(LLM)使用 REFERENCE_TIME 来解析相对时间表达式 graphiti_core/prompts/extract_edges.py:108-110。对于多片段处理,大语言模型(LLM)会被指示使用 episode_indices 将事实归因到特定的片段索引 graphiti_core/prompts/extract_edges.py:48-52

ExtractedEdges 响应模型

Graphiti · 大语言模型(LLM)提取与响应模型 · 图 2
Graphiti · 大语言模型(LLM)提取与响应模型 · 图 2

来源:graphiti_core/prompts/extract_edges.py:25-56, graphiti_core/utils/maintenance/edge_operations.py:214-215

边解析过程

resolve_extracted_edges 函数 graphiti_core/utils/maintenance/edge_operations.py:290-467 负责去重边、检测矛盾并管理时间有效性。

解析管线
Graphiti · 解析管线 · 图 3
Graphiti · 解析管线 · 图 3

来源:graphiti_core/utils/maintenance/edge_operations.py:290-467

快速路径去重

在并行处理之前,resolve_extracted_edges 会在新提取的边内执行精确去重,以最小化冗余的大语言模型(LLM)调用 graphiti_core/utils/maintenance/edge_operations.py:298-312

# 快速路径:去重精确匹配
seen: dict[tuple[str, str, str], EntityEdge] = {}
deduplicated_edges: list[EntityEdge] = []

for edge in extracted_edges:
    key = (
        edge.source_node_uuid,
        edge.target_node_uuid,
        _normalize_string_exact(edge.fact),
    )
    if key not in seen:
        seen[key] = edge
        deduplicated_edges.append(edge)

来源:graphiti_core/utils/maintenance/edge_operations.py:298-312

单条边解析

resolve_extracted_edge 函数 graphiti_core/utils/maintenance/edge_operations.py:507-711 会对照已有的图知识处理每条边。

解析阶段

阶段 1:快速路径逐字检查 如果相同源节点和目标节点之间已存在一条边,且其事实在语义上相同(通过 _normalize_string_exact 规范化后),则会复用该边,并将新片段的 UUID 追加到其 episodes 列表中 graphiti_core/utils/maintenance/edge_operations.py:545-557

阶段 2:大语言模型(LLM)去重与矛盾检测 大语言模型(LLM)使用 prompt_library.dedupe_edges.resolve_edge() graphiti_core/prompts/dedupe_edges.py:43-101 判断新事实是否是已有事实的重复,或者是否与之前的信息矛盾。

Graphiti · 解析阶段 · 图 4
Graphiti · 解析阶段 · 图 4

来源:graphiti_core/utils/maintenance/edge_operations.py:560-637, graphiti_core/prompts/dedupe_edges.py:24-33

阶段 3:属性提取 如果识别到自定义边类型,并且其 Pydantic 模型中定义了属性,则会使用大语言模型(LLM)从事实文本中提取这些特定属性 graphiti_core/utils/maintenance/edge_operations.py:657-677

时间矛盾解析

resolve_edge_contradictions 函数 graphiti_core/utils/maintenance/edge_operations.py:469-505 实现了双时间逻辑来管理冲突事实。

时间矛盾逻辑

当新事实与已有事实矛盾时,已有事实的 invalid_at 时间戳会被更新为新事实的 valid_at 时间戳,其 expired_at 会被设置为当前系统时间 graphiti_core/utils/maintenance/edge_operations.py:494-497

Graphiti · 时间矛盾逻辑 · 图 5
Graphiti · 时间矛盾逻辑 · 图 5

来源:graphiti_core/utils/maintenance/edge_operations.py:469-505

边过期

系统还会检查*新*解析的边是否应立即过期。如果某个矛盾候选边的 valid_at 时间戳比新边的 valid_at 更近,则新边在入库时会被标记为已过期 graphiti_core/utils/maintenance/edge_operations.py:688-703

边维护操作

Graphiti 维护结构边以组织图谱和片段上下文。

片段边与社区边
  • build_episodic_edges:在 EntityNodeEpisodicNode 之间创建 MENTIONED_IN 边(由 EpisodicEdge 类表示)graphiti_core/utils/maintenance/edge_operations.py:51-95
  • build_community_edges:在 CommunityNodeEntityNode 之间创建 HAS_MEMBER 边(由 CommunityEdge 类表示)graphiti_core/utils/maintenance/edge_operations.py:98-113
重复边过滤

filter_existing_duplicate_of_edges 函数 graphiti_core/utils/maintenance/edge_operations.py:713-775 通过检查数据库中节点对之间是否已存在关系,来防止插入冗余的 IS_DUPLICATE_OF 边。

来源:graphiti_core/utils/maintenance/edge_operations.py:51-113, graphiti_core/utils/maintenance/edge_operations.py:713-775