文档解析策略
文档解析策略
相关源文件
以下文件为本维基页面的生成提供了上下文:
common/data_source/dropbox_connector.pycommon/data_source/rdbms_connector.pydeepdoc/parser/__init__.pydeepdoc/parser/docx_parser.pydeepdoc/parser/excel_parser.pydeepdoc/parser/html_parser.pydeepdoc/parser/json_parser.pydeepdoc/parser/markdown_parser.pydeepdoc/parser/pdf_parser.pydeepdoc/parser/resume/__init__.pydeepdoc/parser/resume/entities/corporations.pydeepdoc/parser/resume/entities/degrees.pydeepdoc/parser/resume/entities/industries.pydeepdoc/parser/resume/entities/regions.pydeepdoc/parser/resume/entities/schools.pydeepdoc/parser/resume/step_one.pydeepdoc/parser/resume/step_two.pydeepdoc/parser/txt_parser.pydeepdoc/vision/layout_recognizer.pydeepdoc/vision/ocr.pydeepdoc/vision/recognizer.pydeepdoc/vision/t_ocr.pydeepdoc/vision/t_recognizer.pydeepdoc/vision/table_structure_recognizer.pyrag/app/book.pyrag/app/laws.pyrag/app/manual.pyrag/app/naive.pyrag/app/one.pyrag/app/paper.pyrag/app/picture.pyrag/app/presentation.pyrag/app/qa.pyrag/app/table.pyrag/flow/chunker/__init__.pyrag/flow/chunker/schema.pyrag/flow/parser/parser.pyrag/flow/parser/pdf_chunk_metadata.pyrag/flow/parser/utils.pyrag/flow/tests/dsl_examples/general_pdf_all.jsonrag/flow/tokenizer/schema.pyrag/flow/tokenizer/tokenizer.pyrag/nlp/__init__.pyrag/settings.pytest/testcases/test_sdk_api/common.pytest/testcases/test_sdk_api/conftest.pytest/testcases/test_sdk_api/test_chat_assistant_management/conftest.pytest/testcases/test_sdk_api/test_chunk_management_within_dataset/conftest.pytest/unit_test/common/test_dropbox_connector.pytest/unit_test/rag/test_sync_data_source.pyweb/src/pages/agent/canvas/edge/index.tsxweb/src/pages/agent/canvas/node/handle.tsxweb/src/pages/agent/constant/pipeline.tsxweb/src/pages/agent/form/parser-form/common-form-fields.tsxweb/src/pages/agent/form/parser-form/index.tsxweb/src/pages/agent/form/parser-form/pdf-form-fields.tsxweb/src/pages/agent/form/parser-form/spreadsheet-form-fields.tsxweb/src/pages/agent/form/parser-form/text-html-form-fields.tsxweb/src/pages/agent/form/parser-form/word-form-fields.tsxweb/src/pages/agent/store.tsweb/src/pages/agent/utils.ts
本文档详细介绍了 RAGFlow 的文档解析策略子系统。它说明了如何使用工厂模式(FACTORY pattern)根据文件格式和解析配置来选择解析器。支持的格式包括 PDF、DOCX、Excel、Markdown、EPUB 和 PPT。本文还描述了解析器配置管理,以及为增强灵活性而引入的新的基于管线/流程(Pipeline/flow)的解析系统。
解析器选择架构
RAGFlow 使用两级工厂模式组织其解析逻辑,实现了模块化、可扩展的文档解析。
两级工厂模式
1. 片段切分策略工厂
该工厂根据 parser_id 设置选择高级文档片段切分策略。每种策略对应 rag/app/ 目录下的一个模块,专门针对特定领域或文档类型。
| 模块 | 策略 | 典型使用场景 |
|---|---|---|
naive.py | 通用 | 默认的通用解析,适用于许多简单或未知格式 |
book.py | 书籍 | 具有层级结构的长文档,例如书籍 |
paper.py | 论文 | 学术论文,包括标题、摘要、章节 |
presentation.py | 演示文稿 | 幻灯片,每张幻灯片作为一个片段(PPT、PDF 幻灯片) |
manual.py | 手册 | 具有复杂标题的结构化技术手册 |
qa.py | 问答 | 从 Excel、PDF、Docx 中提取问答对 |
table.py | 表格 | 电子表格数据处理(Excel、CSV) |
laws.py | 法律 | 具有编号条款的法律文档 |
one.py | 单块 | 整个文档作为一个片段 |
这些工厂根据文件扩展名或配置,将文档路由到这些模块中实现的方法。
2. PDF 解析器工厂
PDF 文件通过选择合适的 PDF 布局分析解析器进行解析,该解析器从 rag/app/naive.py 中的 PARSERS 字典中选择。该字典将布局识别器或解析器后端映射到可调用的解析器函数。
片段切分策略选择流程图
*来源:rag/app/naive.py:254-261, rag/app/naive.py:782-1330, rag/app/table.py:40-128, rag/app/book.py:63-175, rag/app/one.py:59-168*
PDF 解析器工厂模式
PDF 解析器的选择是动态的,它使用 PARSERS 字典将布局识别器键映射到解析器函数实现。这使得系统能够支持多种 PDF 解析引擎,并根据配置或文档特征选择合适的解析器。
解析器 中注册的关键解析器:
by_deepdoc— RAGFlow 的主要布局和表格提取解析器。by_mineru— 基于大语言模型(LLM)的 OCR 解析器集成(MinerU)。by_docling— IBM Docling 解析器集成。by_tcadp— TCADP 解析器集成。by_paddleocr— 基于 PaddleOCR 的解析器。by_plaintext— 简单的纯文本提取回退方案。
PDF 解析器工厂图
*来源:rag/app/naive.py:86-261, deepdoc/parser/pdf_parser.py:36-38, deepdoc/parser/docling_parser.py:35, deepdoc/parser/tcadp_parser.py:37, deepdoc/parser/mineru_parser.py:138*
支持的文件格式和解析器
| 格式 | 扩展名 | 主要解析器(类/模块) | 显著特性 |
|---|---|---|---|
.pdf | 多种,通过 layout_recognizer 配置。示例:deepdoc(RAGFlowPdfParser)、mineru、docling | 支持布局识别、OCR、表格和图形提取 | |
| Word | .docx, .doc | rag/app/naive.py 中的 Docx 类 | 段落/片段提取、图片处理 |
| Excel | .xls, .xlsx, .csv | rag/app/table.py 中的 Excel 类 | 多工作表、表头、合并单元格、基于视觉描述的图片 |
| Markdown | .md, .markdown, .mdx | rag/app/naive.py 中的 Markdown 类 | Markdown 结构、内联图片、表格 |
| PowerPoint | .ppt, .pptx | rag/app/presentation.py 中的 RAGFlowPptParser | 按幻灯片切分,回退到 Apache Tika 进行文本提取 |
| EPUB | .epub | deepdoc.parser 中的 EpubParser | 基于章节的解析 |
| 文本 | .txt | deepdoc.parser 中的 TxtParser | 基于行的纯文本解析 |
*来源:rag/app/naive.py:782-1330, rag/app/table.py:40-128, deepdoc/parser/excel_parser.py:31-153, rag/app/presentation.py:140-171*
主要解析实现的详细信息
DeepDOC PDF 解析器
- 使用先进的布局识别,结合 OCR、表格检测和文本合并。
- 管线阶段:
- OCR 图像提取和识别(
__images__) - 布局识别(基于 ONNX 或 Ascend 的模型)
- 通过
TableStructureRecognizer进行表格检测 - 使用特征和 XGBoost 模型进行文本块合并
- OCR 图像提取和识别(
- 返回元组列表:
(文本, 布局信息, 位置元数据),表格单独返回。 - 在
deepdoc/parser/pdf_parser.py中作为RAGFlowPdfParser类实现。
MinerU OCR 解析器
- 通过
LLMBundle大语言模型(LLM)系统集成的基于大语言模型(LLM)的 OCR 解析器。 - 支持依赖于租户的模型配置,用于 OCR 提取。
- 提供回退机制到环境配置,以获取最佳 OCR 模型。
- 封装在
by_mineru()工厂函数中。 - 使用
deepdoc/parser/mineru_parser.py中的MinerUParser类。
Docling 解析器
- IBM Docling 集成,用于 PDF 解析。
- 提供增强的文档理解能力。
- 工厂方法:
by_docling()。 - 解析器类
DoclingParser位于deepdoc/parser/docling_parser.py。
解析器配置系统
用于基于流程解析的 ParserParam 类
在新的流程/管线解析框架(rag/flow/parser/parser.py)中,解析器配置被封装在 ParserParam 类中。该类集中管理不同文件类型和输出格式的解析器设置。
关键特性:
- 允许的输出格式:按媒体类型定义(例如,PDF 支持
json和markdown,电子表格支持json、html和markdown)。 - 默认设置:按文件类别定义默认的解析器方法和设置。
- 参数:
- 解析方法(例如
deepdoc、ocr) - 语言设置
- 是否将图片扁平化为文本
- 移除目录或页眉/页脚等
- 解析方法(例如
这些设置驱动下游管线组件中的动态解析器选择和解析行为。
解析器类型和默认设置示例
| 媒体类型 | 默认解析器方法 | 默认输出格式 | 支持的后缀 |
|---|---|---|---|
"deepdoc" | "json" | .pdf | |
| 电子表格 | "deepdoc" | "html" | .xls, .xlsx, .csv |
| Word 文档 | ""(通用) | "json" | .doc, .docx |
| Markdown | ""(通用) | "json" | .md, .markdown, .mdx |
| 图片 | "ocr" | "json" | .jpg, .jpeg, .png, .gif |
| 音频 | (多种) | "json" / "text" | .wav, .mp3, .aac, .flac 等 |
解析器配置流程图
*来源:rag/flow/parser/parser.py:60-230, rag/app/naive.py:740-752, [common/parser_config_utils.py]*
管线系统中支持的解析器
新的管线解析系统支持多种由 parser_config 配置的精细调整解析器。例如:
- PDF 解析策略:
"deepdoc"、"plain_text"、"tcadp_parser"、"vlm"等。 - Word 和 Office 格式:使用
rag/app/naive.py(Docx)和rag/app/table.py(Excel)中的类,输出格式为 HTML 或 JSON。 - Markdown、文本:由 MarkdownParser 或 TxtParser 解析。
- 图片解析:使用 OCR,可选地结合大语言模型(LLM)辅助的文本识别。
- 音频和视频:主要支持元数据提取,此处不详细说明。
每个解析器管线都可以通过回调钩子、页面过滤和语言设置进行自定义。
集成视觉和媒体增强功能
RAGFlow 通过支持基于视觉的图形、图片和表格增强功能来扩展解析能力,为文本片段添加媒体上下文。
- 视觉-语言模型(VLM)集成:用于生成嵌入在文档或电子表格中的图片的自然语言描述。
- 图形和表格解析包装器:诸如
vision_figure_parser_pdf_wrapper和vision_figure_parser_docx_wrapper之类的函数,为从 PDF 和 DOCX 文件中解析出的表格和图形附加描述。 - Excel 图片提取和描述:
Excel类提取工作表图片,并使用基于视觉的描述对其进行标注,以丰富片段上下文。 - 上下文附加:可以将周围的文本上下文附加到图片或表格描述中,为下游的检索增强生成(RAG)入库形成更丰富的片段。
这种多模态解析确保了非文本信息能够被正确捕获和呈现。
总结
RAGFlow 的文档解析子系统在片段切分策略和 PDF 解析器两个层面都利用了工厂模式,以灵活处理包括 PDF、DOCX、Excel、Markdown、EPUB 和 PPT 在内的多种文档格式。解析器的选择由文件扩展名和 parser_config 设置驱动,支持多种解析引擎以满足特定需求。集中式配置类 ParserParam 通过策略特定参数促进了基于流程的解析。基于视觉的增强功能进一步用媒体上下文丰富了文本片段,确保了健壮的端到端文档入库管线。
参考资料
- 片段切分策略代码:
rag/app/naive.py、rag/app/book.py、rag/app/paper.py、rag/app/presentation.py、rag/app/manual.py、rag/app/qa.py、rag/app/table.py、rag/app/laws.py、rag/app/one.py - PDF 解析器和
PARSERS字典:rag/app/naive.py:254-261 - PDF 解析器类:
deepdoc/parser/pdf_parser.py、deepdoc/parser/docling_parser.py、deepdoc/parser/mineru_parser.py、deepdoc/parser/tcadp_parser.py - ParserParam 配置:
rag/flow/parser/parser.py - 视觉和图形解析:
deepdoc/parser/figure_parser.py、rag/app/naive.py、rag/app/table.py - Excel 图片提取:
deepdoc/parser/excel_parser.py
来源: rag/app/naive.py:86-261, 740-1330 rag/app/table.py:40-128 rag/app/book.py:63-175 rag/app/presentation.py:140-171 deepdoc/parser/pdf_parser.py:36-38 deepdoc/parser/docling_parser.py:35 deepdoc/parser/mineru_parser.py:138 rag/flow/parser/parser.py:60-230 common/parser_config_utils.py deepdoc/parser/figure_parser.py deepdoc/parser/excel_parser.py:31-153