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

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

轻量图谱增强检索 · 本章是 LightRAG DeepWiki 中文译文的独立章节页,保留原始链接、源码锚点、模块标签和章节层级。

项目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
模块标签
  • 入库与解析
  • 检索、召回与索引
  • 模型调用与提供方适配
  • 图谱与关系
  • 测试、发布与运维

中文译文

实体与 Relation 抽取(中文译文)

原始 DeepWiki 页面:https://deepwiki.com/HKUDS/LightRAG/2.2-entity-and-relation-extraction
翻译时间:2026-05-27T08:45:13.149Z
翻译模型:deepseek-chat
原文字符数:7376
项目:LightRAG (lightrag)

---

实体与关系抽取

相关源文件

以下文件为本 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。它通过一个多阶段管线处理文本片段,包括初始抽取、"拾遗"(迭代优化)和去重。

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

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

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

graph TD
    subgraph "自然语言空间"
        A["TextChunkSchema (内容)"] -- "LLM 提示" --> B["LLM 原始响应"]
    end

    subgraph "代码实体空间 (lightrag/operate.py)"
        B -- "split_string_by_multi_markers" --> C["解析后的元组"]
        C -- "校验" --> D["实体存储映射"]
        C -- "校验" --> E["关系存储映射"]

        D -- "upsert_node" --> F["BaseGraphStorage"]
        E -- "upsert_edge" --> F

        D -- "upsert" --> G["BaseVectorStorage (entities_vdb)"]
        E -- "upsert" --> H["BaseVectorStorage (relationships_vdb)"]
    end

    style A fill:none
    style B fill:none
    style F fill:none
    style G fill:none
    style H fill:none

来源: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
  1. 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

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

graph TD
    subgraph "输入"
        DL["description_list (字符串列表)"]
    end

    subgraph "处理过程: _handle_entity_relation_summary"
        COND{"Token 数 > 限制?"}
        SIMPLE["直接 LLM 摘要"]
        MAP["拆分为片段"]
        REDUCE["递归合并"]
    end

    DL --> COND
    COND -- "否" --> SIMPLE
    COND -- "是" --> MAP
    MAP -- "摘要片段" --> REDUCE
    REDUCE -- "最终轮次" --> SIMPLE
    SIMPLE --> OUT["最终摘要字符串"]

来源: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