系列导航

  • 第 0 章 前言:为什么企业 AI 工程师必须掌握 RAGFlow
  • 第 1 章:安装部署与基础配置**——从零跑通第一个 RAG Pipeline
  • 第 2 章:RAGFlow RAGFlow 代码介绍
  • 第 3 章:攻克企业复杂文档——理解 DeepDoc、Naive、MinerU 与 Docling 的区别
    • 第一节 RAGFlow 配置参数全景图与实验结论
    • 第二节 实验Chunk Method (解析方法与布局识别)(本文)
    • 第三节 实验Chunk Token Num & Overlap (切片与重叠)
    • 第四节 实验Similarity Threshold (相似度阈值)
    • 第五节 实验Vector/Keyword Weight (混合搜索权重)
    • 第六节 MinuerBridge安装配置与运行使用
  • 第 4 章:理解 Agentic RAG 核心——定义与低代码实现
  • 第 5 章:工作流编排——构建基于图(Graph)的 RAG
  • 第 6 章:Deep Research 模板应用——部署自动拆解子问题的深度研究智能体
  • 第 7 章:企业级扩展——API 接入与外部工具集成(MCP)
  • 第 8 章:评估与复盘——从"玄学"到量化 RAG 性能指标评测

1. 官方定义与通俗理解

官方定义:决定系统如何将上传的文件识别并切分为有意义的语义块(Chunks)。
通俗理解:这是给 RAGFlow 戴上不同精度的“眼镜”。

  • 如果你选 Naive,它把文档看作一串长字符,机械地按长度切,不管哪里是标题,哪里是表格。
  • 如果你选 Paper,它能识别出这是“摘要”、那是“图表注释”,并把它们分别打包,保持语义的完整。
  • 如果你选 General,它能在机械切分与语义识别之间找到平衡——既能识别出常见的段落、标题和列表结构,又不会像 Paper 那样对学术元素做深度解析,适合大多数日常办公文档。

2. 核心架构流转图 (Code Flow)

下面的 Mermaid 图标展示了代码中是如何通过 parser_id 从用户界面传递到后端执行引擎的:

Parser Dispatcher (FACTORY)

API Request

Update DB

Task Queue

Lookup

naive

paper

laws

...

Output

Vectorization

Web UI: 用户选择解析策略

API: kb_app.py / document_app.py

Database: parser_id 存储

rag/svr/task_executor.py: 任务执行器

FACTORY Map

rag/app/naive.py

rag/app/paper.py

rag/app/laws.py

...

P1/P2/P3

语义切片结果

向量化并入库

3. 关键代码位置证明

rag/svr/task_executor.py 中,你可以看到这个核心的分发逻辑:

  • (Line 84-101): FACTORY 字典建立了 UI ID 到 Python 模块的映射。
  • (Line 251): chunker = FACTORY[task["parser_id"].lower()] 实现了动态加载。
  • (Line 272): await thread_pool_exec(chunker.chunk, ...) 执行了具体的算法。

4. 实验测试方案:如何实际感受差异?

首先我们的目标是处理好企业文档:特点是大量PDF格式文档, 绝大部分文档是有清晰章节和段落结构的, 并且文档中包含大量的表格(文字表格、数据表格、 多页表格、以及合并单元格后的表格 )。
为了让你切身体会解析策略的重要性,我们设计以下实验:

A. 实验数据源准备

  • 文件名: 某企业年报.pdf
  • 内容要求:
    1. 表格类型: 包含文字表格、数据表格、 以及合并单元格后的表格。
    2. 跨页: 各种表格都有跨页的情况, 甚至是多页表格。
    3. 文字: 有章节+段落组织的文本内容。

B. 参数对比设置

我们针对同一份文件,创建三个不同的知识库(或在同一知识库中多次上传并修改设置):

  1. 对照组 0: Chunk Method = Naive
  2. 对照组 A: Chunk Method = Paper
  3. 实验组 B: Chunk Method = Generallayout_recognize = deepdoc
  4. 实验组 C: Chunk Method = General; layout_recognize = MinerU

注: 实验组C是后来添加的, 由于实验组B并不能达到处理复杂表格的最低期望, 所以在实验过程中引入了MinerU。对于MinerU的安装和使用我们会在后继的章节中详细说明。

C. 观测指标

切片预览 (Chunk Preview):

  • 观察表格是否被切割成碎片?(Naive 往往会把表格行和列拆碎)。
  • 观察段落是否在行间被腰斩?

5. 实验记录

根据 4. 实验测试方案 中的参数对比设置,我们对同一份 某企业年报.pdf 进行了切片预览观测,结果如下:

实验组 解析配置 表格处理表现 文字段落处理表现
对照组 0 Naive 无法处理表格。表格被拆散为碎片化的文字行/列,丧失原有行列结构。 仅做简单的文字切片,段落可能被机械截断。
对照组 A Paper 多页表格存在截断。能识别技术文档的版面结构,但对于日常办公文档中跨页的表格,会出现表格被截断的现象(同一逻辑表格被拆成多个独立切片)。 段落识别相对完整,学术元素(摘要、图表注释)打包较好。
实验组 B General & deepdoc 可处理大部分表格,但识别不准。典型问题包括:多列被错误识别为一列,多行被合并为一行,导致表格内容错位。 段落与标题识别均衡,无明显截断问题。
实验组 C General && MinerU ✅ 可正确处理测试文档中所有表格。包括复杂合并单元格、多页长表格均能还原为完整语义块,无截断或行列错乱。 段落识别准确,与文字切片无异常。
  • Paper 解析后跨页表格被截断为多段
    在这里插入图片描述

  • Deepdoc / Docling 将两列合并成一列, 两行合并成一行的错误表现
    在这里插入图片描述
    在这里插入图片描述

  • Deepdoc / Docling 复杂表格识别失败
    在这里插入图片描述

补充观察

  • ✅ 文字解析准确性:以上所有解析方式对于 PDF 中的普通文字内容(段落、标题、列表等)解析效果都比较准确,未发现明显文字错漏或乱码等差异。
  • ✅ ChunkSize 参数影响:经过对比实验,ChunkSize(切片最大长度)对于表格或文字段落的语义完整性没有影响。因为:
    • 一个表格(即使跨多页)在识别后被视为 一个原子级的语义单元,不会被 ChunkSize 强行截断;
      在这里插入图片描述
    • 一个完整的文字段落(即便长度超过 ChunkSize)同样不会被截断,系统会保留其整体性。
      在这里插入图片描述
    • 换言之,ChunkSize 仅在拆分连续的非结构化文本(如无段落边界的长文本)时发挥作用,对已有明确语义边界的内容不生效。 所以复杂表格成功解析入库的主要依赖是"布局分析"工具,在本次实验中,General+MinerU是表格识别效果最好的组合

6. 总结与建议

  • 默认处理方式标准文档 (pdf/docx) -> General +MinerU(表格识别能力最好)。
  • 简单文本 (txt/md) -> Naive (速度最快)。
  • 表格数据严重 -> Table (专门针对 Excel/CSV 优化)。
  • 学术/技术文档 -> Paper (结构化能力最强)。

[!TIP]
实验结论:RAG 垃圾进,垃圾出 (GIGO)。如果 Parser 没选对,后面无论怎么调 Similarity Threshold 都是徒劳。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐