解析器引擎与路由
解析器引擎与路由
相关源文件
以下文件为本维基页面的生成提供了上下文:
docs/FileProcessingPipeline-zh.mddocs/FileProcessingPipeline.mddocs/LightRAGSidecarFormat.mddocs/ParagraphSemanticChunking-zh.mddocs/ParagraphSemanticChunking.mddocs/ParserDebugCLI-zh.mddocs/ParserDebugCLI.mdlightrag/api/routers/document_routes.pylightrag/external_parser/docling/cache.pylightrag/external_parser/docling/client.pylightrag/external_parser/docling/manifest.pylightrag/external_parser/mineru/cache.pylightrag/external_parser/mineru/client.pylightrag/external_parser/mineru/manifest.pylightrag/native_parser/docx/drawing_image_extractor.pylightrag/native_parser/docx/numbering_resolver.pylightrag/native_parser/docx/omml/cleaners.pylightrag/native_parser/docx/omml/ommlparser.pylightrag/native_parser/docx/omml/utils.pylightrag/native_parser/docx/parse_document.pylightrag/native_parser/docx/table_extractor.pylightrag/native_parser/docx/utils.pylightrag/parser_cli.pylightrag/parser_debug.pylightrag/parser_routing.pylightrag/pipeline.pylightrag/table_markup.pylightrag/utils_pipeline.pytests/external_parser/docling/test_cache.pytests/external_parser/docling/test_client.pytests/external_parser/docling/test_manifest.pytests/external_parser/mineru/test_cache.pytests/external_parser/mineru/test_client.pytests/native_parser/docx/test_native_docx_golden.pytests/test_document_routes_docx_archive.pytests/test_parse_docling_sidecar.pytests/test_parse_mineru_sidecar.pytests/test_parser_cli.pytests/test_pipeline_release_closure.py
LightRAG 文档入库管线采用了一套精密的路由机制,用于决定文件在被切分和索引之前如何解析为结构化中间表示(IR)。该系统支持多种解析引擎,从轻量级的原生提取器到重量级的外部多模态服务,并允许通过环境变量和文件名提示进行细粒度控制。
解析器指令解析
路由逻辑遵循严格的优先级层级,以确定应对特定文件应用哪种引擎和处理选项。该过程主要由 resolve_file_parser_directives 函数管理。
优先级层级
- 文件名提示:嵌入在文件名中的显式指令(例如
document.[mineru-iet].pdf)。 - 环境规则(
LIGHTRAG_PARSER):文件扩展名到引擎-选项对的全局映射。 - 传统回退:如果没有规则匹配,系统默认使用
legacy引擎和固定大小切分(F)。
文件名提示语法
用户可以通过在文件扩展名前添加方括号提示来覆盖全局设置:
[ENGINE]:设置引擎,使用默认选项(例如report.[docling].pdf)。[ENGINE-OPTIONS]:同时设置引擎和选项(例如memo.[native-teP].docx)。[-OPTIONS]:覆盖选项,但保留由全局规则确定的引擎(例如data.[-!].csv)。
全局路由:LIGHTRAG_PARSER
该环境变量接受一个逗号分隔的 扩展名:引擎-选项 规则列表。 示例: LIGHTRAG_PARSER="pdf:mineru-iteP,docx:native-teP,*:legacy-R"
pdf文件使用mineru引擎和iteP选项。docx文件使用native引擎和teP选项。- 所有其他文件(
*)使用legacy引擎和R(递归)切分。
来源: lightrag/parser_routing.py:40-67,lightrag/parser_routing.py:441-482,docs/FileProcessingPipeline.md:51-120
处理选项与标志
ProcessOptions 类解码一个由单字符标志组成的字符串,这些标志控制文本提取后管线的行为。
| 标志 | 名称 | 描述 |
|---|---|---|
i | 图片 | 启用基于视觉语言模型(VLM)的文档内图片分析。 |
t | 表格 | 启用结构化表格提取和分析。 |
e | 公式 | 启用 LaTeX 风格公式提取。 |
! | 跳过知识图谱 | 跳过知识图谱提取(仅进行向量索引)。 |
F | 固定 | 使用 FixedTokenChunking。 |
R | 递归 | 使用 RecursiveCharacterChunking(传统引擎的默认值)。 |
V | 向量 | 使用 SemanticVectorChunking。 |
P | 段落 | 使用 ParagraphSemanticChunking(需要 native 引擎或侧车 IR)。 |
来源: lightrag/parser_routing.py:72-102,lightrag/constants.py:22-34,docs/FileProcessingPipeline.md:121-140
解析器引擎
LightRAG 支持四种主要的解析引擎,每种引擎适用于不同复杂度的文档。
1. 原生引擎(原生)
一个内置的高性能解析器,专门用于 .docx 文件。它无需外部依赖即可提取结构化的标题、段落和表格。它是段落语义(P)切分策略所需元数据的主要提供者。
- 关键逻辑:
lightrag/native_parser/docx/parse_document.py - 能力: 表格提取、OMMAL 公式解析以及绘图/图片提取。
2. 外部解析器:MinerU 和 Docling
这些引擎通过调用外部微服务来处理复杂的多模态 PDF 和 Office 文档。
- MinerU(
mineru):支持local(自托管)和official(云端)API 模式。它会生成一个包含所有元素边界框的content_list.json包。 - Docling(
docling):连接到docling-serve。它针对高保真布局分析和 OCR 进行了优化。
3. 传统引擎(legacy)
回退引擎,使用标准 Python 库(如 python-docx、pdfplumber)提取原始文本。它不支持高级的多模态侧车 IR。
来源: lightrag/constants.py:37-41,lightrag/parser_routing.py:121-129,lightrag/external_parser/mineru/client.py:106-160,lightrag/external_parser/docling/client.py:83-112
技术数据流:从路由到提取
下图展示了在 _PipelineMixin 中,文件路径如何被转换为特定的解析器调用。
解析器选择逻辑
来源: lightrag/api/routers/document_routes.py:1022-1055,lightrag/pipeline.py:208-250,lightrag/parser_routing.py:441-460
调试与工具
parser_cli.py
LightRAG 提供了一个专用的命令行工具,供开发者在无需运行完整服务器的情况下测试解析器路由和提取。它允许检查生成的侧车 IR 和切分边界。
用法:
python -m lightrag.parser_cli parse my_doc.docx --engine native --options teP
路由优先级逻辑图
此图展示了解析器引擎的代码级决策树。
来源: lightrag/parser_routing.py:441-482,lightrag/parser_cli.py:1-50,tests/test_pipeline_release_closure.py:91-120
实现细节
resolve_file_parser_directives
该函数返回一个 (engine, process_options) 元组。它是路由的核心决策者。如果指定的引擎需要外部端点(如 mineru 或 docling),但环境中未配置该端点,函数会自动将引擎降级为 legacy,以防止管线停滞,同时记录一条警告日志。
ProcessOptions 数据类
ProcessOptions 对象是不可变的(frozen=True),并提供了辅助属性,如 chunking_explicit,用于区分默认的 F 策略和用户选择的 F 策略。这种区分对于管线决定是使用新的结构化切分契约还是传统的 chunking_func 至关重要。
来源: lightrag/parser_routing.py:72-102,lightrag/parser_routing.py:441-482,lightrag/pipeline.py:1005-1030