实体与关系抽取
实体与关系抽取
相关源文件
以下文件为本 Wiki 页面的生成提供了上下文:
MANIFEST.indocs/ProgramingWithCore.mdlightrag/base.pylightrag/lightrag.pylightrag/multimodal_context.pylightrag/operate.pylightrag/prompt.pylightrag/utils.pytests/test_chunking_raw_lightrag_parity.pytests/test_entity_extraction_stability.pytests/test_extract_entities.pytests/test_keyword_parsing.pytests/test_llm_cache_identity.pytests/test_multimodal_content_truncation.pytests/test_multimodal_surrounding_context.pytests/test_parse_native_lightrag_e2e.py
实体与关系抽取是 LightRAG 管线的核心阶段,它将非结构化的文本片段转化为结构化的知识。该过程利用大语言模型(LLM)识别有意义的实体及其相互关联,随后将这些实体和关系索引到知识图谱和向量数据库中。
抽取流程概览
抽取逻辑主要由 lightrag/operate.py 中的 extract_entities 函数编排 lightrag/operate.py:106-111。它通过一个多阶段管线处理文本片段,包括初始抽取、"拾遗"(迭代优化)和去重。
数据流:从自然语言到代码实体
下图展示了在抽取过程中,原始文本如何被转化为内部代码结构。
图示:文本到知识图谱的转换
来源:lightrag/operate.py:106-111,lightrag/base.py:53-53,lightrag/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 支持两种输出格式进行抽取:
- 基于分隔符(默认): 使用自定义分隔符(默认为
<#>)在纯文本列表格式中分隔字段lightrag/prompt.py:12-12。 - 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-103,lightrag/operate.py:465-500,lightrag/lightrag.py:257-259
实现细节
extract_entities 函数
lightrag/operate.py 中的核心实现遵循以下步骤:
- 预处理: 使用
strip_internal_multimodal_markup_for_extraction清理片段中的多模态标记lightrag/operate.py:420-425。 - LLM 调用: 使用准备好的提示执行
extract角色函数lightrag/operate.py:440-445。 - 解析: 使用
split_string_by_multi_markers根据DEFAULT_TUPLE_DELIMITER将响应分解为元组lightrag/operate.py:448-455。 - 去重: 合并同一片段内或跨拾遗轮次找到的相同实体和关系
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/operate.py:198-220,lightrag/lightrag.py:88-90
关键配置常量
抽取行为通过 lightrag/constants.py 中的多个常量和环境变量进行调整:
| 常量 | 默认值 | 用途 |
|---|---|---|
DEFAULT_MAX_GLEANING | 1 | 优化轮次数 lightrag/constants.py:40-40。 |
DEFAULT_MAX_EXTRACTION_RECORDS | 100 | 每次 LLM 响应的最大总行数(实体 + 关系)lightrag/constants.py:41-41。 |
DEFAULT_MAX_EXTRACTION_ENTITIES | 40 | 每次 LLM 响应的最大实体行数 lightrag/constants.py:42-42。 |
GRAPH_FIELD_SEP | &nd_sp& | 用于内部存储多字段字符串的分隔符 lightrag/constants.py:113-113。 |
MAX_EXTRACT_INPUT_TOKENS | 20480 | 防止拾遗期间 LLM 上下文溢出的安全限制 lightrag/operate.py:63-63。 |
来源:lightrag/constants.py:40-43,lightrag/operate.py:63-63,lightrag/lightrag.py:38-74