agentic_huge_data_base / wiki
页面 LightRAG · 2.2 文档处理管线·DeepWiki 中文全文译文

2.2 · 文档处理管线(Document Processing Pipeline)

轻量图谱增强检索 · 聚焦本章的模块关系、源码依据与实现要点。

项目LightRAG 章节2.2 状态全文译文 模块入库与解析、检索、召回与索引、模型调用与提供方适配、图谱与关系
源码线索
  • lightrag/base.py
  • lightrag/exceptions.py
  • lightrag/lightrag.py
  • lightrag/operate.py
  • lightrag/prompt.py
  • lightrag/utils.py
  • tests/test_chunking.py
  • tests/test_doc_status_chunk_preservation.py
  • tests/test_extract_entities.py
模块标签
  • 入库与解析
  • 检索、召回与索引
  • 模型调用与提供方适配
  • 图谱与关系
  • 测试、发布与运维

章节正文

实体与关系抽取

实体与关系抽取

相关源文件

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

  • MANIFEST.in
  • docs/ProgramingWithCore.md
  • lightrag/base.py
  • lightrag/lightrag.py
  • lightrag/multimodal_context.py
  • lightrag/operate.py
  • lightrag/prompt.py
  • lightrag/utils.py
  • tests/test_chunking_raw_lightrag_parity.py
  • tests/test_entity_extraction_stability.py
  • tests/test_extract_entities.py
  • tests/test_keyword_parsing.py
  • tests/test_llm_cache_identity.py
  • tests/test_multimodal_content_truncation.py
  • tests/test_multimodal_surrounding_context.py
  • tests/test_parse_native_lightrag_e2e.py

实体与关系抽取是 LightRAG 管线的核心阶段,它将非结构化的文本片段转化为结构化的知识。该过程利用大语言模型(LLM)识别有意义的实体及其相互关联,随后将这些实体和关系索引到知识图谱和向量数据库中。

抽取流程概览

抽取逻辑主要由 lightrag/operate.py 中的 extract_entities 函数编排 lightrag/operate.py:106-111。它通过一个多阶段管线处理文本片段,包括初始抽取、"拾遗"(迭代优化)和去重。

数据流:从自然语言到代码实体

下图展示了在抽取过程中,原始文本如何被转化为内部代码结构。

图示:文本到知识图谱的转换

LightRAG · 数据流:从自然语言到代码实体 · 图 1
LightRAG · 数据流:从自然语言到代码实体 · 图 1

来源:lightrag/operate.py:106-111lightrag/base.py:53-53lightrag/operate.py:448-460

基于 LLM 的抽取

抽取过程由 LightRAG 实例中配置的 EXTRACT 角色驱动 lightrag/lightrag.py:140-148

提示模板

系统使用两个主要的提示模板,位于 lightrag/prompt.py 中:

  • entity_extraction_system_prompt:定义了知识图谱专家的角色身份和严格的格式规则 lightrag/prompt.py:34-95
  • entity_extraction_user_prompt:提供具体的任务说明和输入文本 lightrag/prompt.py:97-103
抽取模式

LightRAG 支持两种输出格式进行抽取:

  1. 基于分隔符(默认): 使用自定义分隔符(默认为 <#>)在纯文本列表格式中分隔字段 lightrag/prompt.py:12-12
  2. JSON 格式: 利用 Pydantic 模式强制结构化输出,这对于某些 LLM 提供商来说更为稳健 tests/test_entity_extraction_stability.py:7-7
拾遗

为了确保高召回率,LightRAG 实现了一种"拾遗"机制。如果 entity_extract_max_gleaning 大于 0,系统会执行额外的 LLM 轮次 lightrag/lightrag.py:257-259。在后续的每一轮中,LLM 会被询问是否在前几轮中遗漏了任何实体或关系 lightrag/operate.py:465-475

Token 限制保护: 如果预计的输入 Token(系统提示 + 历史记录 + 继续提示)超过 MAX_EXTRACT_INPUT_TOKENS 限制,拾遗过程会自动跳过 lightrag/operate.py:483-500

来源:lightrag/prompt.py:34-103lightrag/operate.py:465-500lightrag/lightrag.py:257-259

实现细节

extract_entities 函数

lightrag/operate.py 中的核心实现遵循以下步骤:

  1. 预处理: 使用 strip_internal_multimodal_markup_for_extraction 清理片段中的多模态标记 lightrag/operate.py:420-425
  2. LLM 调用: 使用准备好的提示执行 extract 角色函数 lightrag/operate.py:440-445
  3. 解析: 使用 split_string_by_multi_markers 根据 DEFAULT_TUPLE_DELIMITER 将响应分解为元组 lightrag/operate.py:448-455
  4. 去重: 合并同一片段内或跨拾遗轮次找到的相同实体和关系 lightrag/operate.py:510-525
映射-归约摘要

当合并图中已存在的实体或关系时,LightRAG 使用 _handle_entity_relation_summary 来合并描述 lightrag/operate.py:198-205

该函数采用映射-归约策略:

  • 小上下文: 如果总描述 Token 数低于 summary_context_size,则将其拼接并在一次 LLM 调用中完成摘要 lightrag/operate.py:209-210
  • 大上下文: 如果描述超过限制,则将其拆分为多个片段,分别进行摘要("映射"),然后将摘要合并并再次进行摘要("归约")lightrag/operate.py:211-213

图示:映射-归约摘要数据流

LightRAG · 映射-归约摘要 · 图 2
LightRAG · 映射-归约摘要 · 图 2

来源:lightrag/operate.py:198-220lightrag/lightrag.py:88-90

关键配置常量

抽取行为通过 lightrag/constants.py 中的多个常量和环境变量进行调整:

常量默认值用途
DEFAULT_MAX_GLEANING1优化轮次数 lightrag/constants.py:40-40
DEFAULT_MAX_EXTRACTION_RECORDS100每次 LLM 响应的最大总行数(实体 + 关系)lightrag/constants.py:41-41
DEFAULT_MAX_EXTRACTION_ENTITIES40每次 LLM 响应的最大实体行数 lightrag/constants.py:42-42
GRAPH_FIELD_SEP&nd_sp&用于内部存储多字段字符串的分隔符 lightrag/constants.py:113-113
MAX_EXTRACT_INPUT_TOKENS20480防止拾遗期间 LLM 上下文溢出的安全限制 lightrag/operate.py:63-63

来源:lightrag/constants.py:40-43lightrag/operate.py:63-63lightrag/lightrag.py:38-74