agentic_huge_data_base / wiki
页面 RAGFlow · 6.2 切分方法·DeepWiki 中文全文译文

6.2 · 切分方法(Chunking Methods)

复杂文档理解与引用检索 · 本章是 RAGFlow DeepWiki 中文译文的独立章节页,保留原始链接、源码锚点、模块标签和章节层级。

项目RAGFlow 章节6.2 状态全文译文 模块图谱与关系、界面与交互、入库与解析、文档对象与元数据
源码线索
  • deepdoc/parser/excel_parser.py
  • rag/app/book.py
  • rag/app/laws.py
  • rag/app/manual.py
  • rag/app/naive.py
  • rag/app/one.py
  • rag/app/paper.py
  • rag/app/presentation.py
  • rag/app/qa.py
  • rag/app/table.py
模块标签
  • 图谱与关系
  • 界面与交互
  • 入库与解析
  • 文档对象与元数据
  • 系统架构

中文译文

切分方法(中文译文)

原始 DeepWiki 页面:https://deepwiki.com/infiniflow/ragflow/6.2-chunking-methods
翻译时间:2026-05-27T08:44:46.895Z
翻译模型:deepseek-chat
原文字符数:21888
项目:RAGFlow (ragflow)

---

片段切分方法

相关源文件

以下文件为本维基页面的生成提供了上下文:

  • deepdoc/parser/excel_parser.py
  • rag/app/book.py
  • rag/app/laws.py
  • rag/app/manual.py
  • rag/app/naive.py
  • rag/app/one.py
  • rag/app/paper.py
  • rag/app/presentation.py
  • rag/app/qa.py
  • rag/app/table.py
  • rag/nlp/__init__.py
  • web/src/components/auto-keywords-form-field.tsx
  • web/src/components/chunk-method-dialog/index.tsx
  • web/src/components/chunk-method-dialog/use-default-parser-values.ts
  • web/src/components/delimiter-form-field.tsx
  • web/src/components/entity-types-form-field.tsx
  • web/src/components/excel-to-html-form-field.tsx
  • web/src/components/llm-setting-items/slider.tsx
  • web/src/components/max-token-number-from-field.tsx
  • web/src/components/originui/number-input.tsx
  • web/src/components/page-rank-form-field.tsx
  • web/src/components/parse-configuration/graph-rag-form-fields.tsx
  • web/src/components/parse-configuration/raptor-form-fields.tsx
  • web/src/components/slider-input-form-field.tsx
  • web/src/constants/form.ts
  • web/src/hooks/parser-config-utils.ts
  • web/src/interfaces/database/document.ts
  • web/src/interfaces/request/document.ts
  • web/src/pages/dataset/dataset-setting/configuration/common-item.tsx
  • web/src/pages/dataset/dataset-setting/configuration/naive.tsx
  • web/src/pages/dataset/dataset-setting/form-schema.ts
  • web/src/pages/dataset/dataset-setting/index.tsx
  • web/src/pages/dataset/dataset-setting/saving-button.tsx
  • web/src/pages/dataset/dataset/use-change-document-parser.ts
  • web/src/pages/datasets/dataset-creating-dialog.tsx
  • web/src/pages/datasets/hooks.ts
  • web/src/stories/number-input.stories.ts

目的与范围

本文档说明了 RAGFlow 中各种片段切分策略的技术实现和使用场景。片段切分是将解析后的文档内容拆分为离散、语义完整的片段,以便进行索引和检索的过程。RAGFlow 提供了多种专门的片段切分模式,每种模式都针对特定的文档结构(如法律条文、学术论文或电子表格行)进行了优化。

关于片段切分之前的文档解析信息,请参阅 6.1 文档解析策略。关于片段切分之后的嵌入向量生成信息,请参阅 6.3 内容增强与嵌入向量

片段切分模式概览

RAGFlow 将片段切分策略实现为 rag/app/ 目录下的专用模块。每个模块都包含一个 chunk() 函数,用于编排解析和拆分逻辑。

模式模块主要使用场景关键特性
通用naive.py通用文档基于 Token 的拆分、基于分隔符、支持大多数格式 rag/app/naive.py:763-1028
手动manual.py结构化文档通过章节层级保留层次结构 rag/app/manual.py:137-236
问答qa.py问答对使用正则表达式项目符号检测和布局提取问答对 rag/app/qa.py:109-250
表格table.py结构化数据基于行的 Excel/CSV 片段切分,支持图片和大语言模型(LLM)生成的图片描述 rag/app/table.py:39-128
书籍book.py长文本内容章节的层次化合并、目录移除、基于视觉的图表解析 rag/app/book.py:63-162
法律laws.py法律文档基于树的片段切分,保留条文和层次化规则 rag/app/laws.py:56-85
论文paper.py学术论文元数据提取(包括标题、作者、摘要),以及基于 Token 的片段切分 rag/app/paper.py:149-260
演示文稿presentation.py幻灯片/演示文稿每个 PDF 页面作为一个片段,包含布局和表格分析以获取全页文本 rag/app/presentation.py:35-115
整篇one.py整篇文档单个片段,保留原始顺序,适用于小型文档 rag/app/one.py:59-167
知识图谱(未完全展示)知识图谱提取用于实体和关系提取(在 UI 配置中引用)

来源: rag/app/naive.py:763-1028rag/app/manual.py:137-236rag/app/qa.py:109-250rag/app/table.py:39-128rag/app/book.py:63-162rag/app/laws.py:56-85rag/app/paper.py:149-260rag/app/presentation.py:35-115rag/app/one.py:59-167

片段切分架构

片段切分过程由后台任务执行器编排,该执行器根据数据集中配置的 parser_id 选择应用程序模块。

片段切分逻辑流程
graph TB
    subgraph "入口点"
        TaskExecutor["任务执行器<br/>svr/task_executor.py"]
    end

    subgraph "片段切分路由器"
        ChunkSelector{"parser_id<br/>选择"}
    end

    subgraph "片段切分模块 (rag/app/)"
        NaiveChunk["naive.chunk()"]
        ManualChunk["manual.chunk()"]
        QAChunk["qa.chunk()"]
        TableChunk["table.chunk()"]
        BookChunk["book.chunk()"]
        LawsChunk["laws.chunk()"]
        PaperChunk["paper.chunk()"]
        PresentationChunk["presentation.chunk()"]
        OneChunk["one.chunk()"]
        KGChunk["knowledge_graph.chunk() (未显示)"]
    end

    subgraph "通用工具 (rag/nlp/)"
        Parsers["文档解析器<br/>by_deepdoc(), by_mineru() 等"]
        Tokenizer["rag_tokenizer<br/>tokenize(), fine_grained_tokenize()"]
        TokenCounter["num_tokens_from_string()"]
        ContextAttacher["attach_media_context()"]
    end

    TaskExecutor --> ChunkSelector
    ChunkSelector -->|"naive"| NaiveChunk
    ChunkSelector -->|"manual"| ManualChunk
    ChunkSelector -->|"qa"| QAChunk
    ChunkSelector -->|"table"| TableChunk
    ChunkSelector -->|"book"| BookChunk
    ChunkSelector -->|"laws"| LawsChunk
    ChunkSelector -->|"paper"| PaperChunk
    ChunkSelector -->|"presentation"| PresentationChunk
    ChunkSelector -->|"one"| OneChunk
    ChunkSelector -->|"knowledge_graph"| KGChunk

    NaiveChunk --> Parsers
    ManualChunk --> Parsers
    QAChunk --> Parsers
    TableChunk --> Parsers
    BookChunk --> Parsers
    LawsChunk --> Parsers
    PaperChunk --> Parsers
    PresentationChunk --> Parsers
    OneChunk --> Parsers

    Parsers --> Tokenizer
    Tokenizer --> TokenCounter
    TokenCounter --> ContextAttacher

来源: rag/app/naive.py:86-184rag/app/manual.py:137-173rag/nlp/__init__.py:31-31common/token_utils.py:21-21

---

通用片段切分

通用片段切分提供了一种广泛适用的方法,适用于 PDF、DOCX、TXT、Markdown 和 HTML 等通用文档类型。

实现细节
  • rag/app/naive.py 中的 chunk() 函数使用布局识别器(例如 DeepDOC 或纯文本)执行解析。
  • 文本使用可配置的分隔符和 Token 限制进行拆分,由以下参数控制:
  • - chunk_token_num(默认 512 个 Token) - delimiter(默认 "\n!?。;!?") - layout_recognize(默认 "DeepDOC"

  • 解析使用多种后端:DeepDOC、MinerU OCR 或根据配置回退到纯文本方法。
  • 解析后,naive_merge() 以 Token 感知的方式合并文本段落,直到达到片段大小限制。
数据流和关键函数
graph LR
    filename[/"文件名"/] --> Parser["根据 layout_recognize 选择解析器\nrag/app/naive.py by_plaintext() 或其他"]
    Parser -->|提取段落| Sections["(文本, 位置) 元组列表"]
    Sections --> Merger["naive_merge()\nrag/nlp/__init__.py"]
    Merger --> Chunks["受 Token 数量限制的文本片段列表"]
  • naive_merge() 遵循自然分隔符和 Token 长度,基于语义边界生成片段。
  • 位置信息编码为标签:@@page\tleft\tright\ttop\tbottom## 附加到片段文本中 rag/app/naive.py:820-825

来源: rag/app/naive.py:763-1028rag/nlp/__init__.py:1145-1300common/token_utils.py:21-21

---

手动片段切分

手动片段切分保留文档的层次化结构,适用于具有定义段落或问题的文档。

实现细节
  • 基于 rag/app/manual.py,解析器通过 PdfParser 或 DOCX 中的段落结构提取布局块。
  • 使用 docx_question_level() 识别标题或问题层级,并使用栈结构维护层次关系。
  • 使用布局坐标垂直合并文本,保留章节标题和子章节。
  • 表格和图片使用媒体上下文进行包装。
关键类和方法
  • Pdf 类扩展了 PdfParser,实现了 OCR、布局分析、表格提取和垂直文本合并 rag/app/manual.py:33-67
  • Docx 类解析问题层级并组装层次化的问答段落 rag/app/manual.py:70-134

来源: rag/app/manual.py:33-134rag/nlp/__init__.py:169-233

---

问答片段切分

此模式针对结构化为显式问答对的文档,例如测验或常见问题解答(FAQ)。

实现细节
  • 使用 rag/nlp/__init__.pyQUESTION_PATTERN 下定义的正则表达式模式来检测问题项目符号和编号 rag/nlp/__init__.py:75-87
  • rag/app/qa.py 解析 PDF 和 Excel 表格:
  • - 将 PDF 解析为段落,检测问题项目符号并关联答案。 - 解析 Excel 表格,提取列作为(问题,答案)对。

  • 在适用时将图片和表格合并到问答片段中。
关键处理步骤
  1. OCR 和布局分析提取文本块。
  2. 使用 has_qbullet() 方法检测问题项目符号及其索引。
  3. 使用位置和项目符号模式逻辑将问题与答案配对。
  4. 在合并文本之前,按页面和顶部位置对关联的表格进行排序。

来源: rag/nlp/__init__.py:75-87rag/app/qa.py:109-250

---

表格片段切分

表格片段切分专注于 Excel 或 CSV 等结构化表格数据,为每行生成片段,同时集成与单元格关联的图片。

实现细节
  • Excel 文件使用 rag/app/table.py 中的 Excel 类进行解析,该类扩展了 ExcelParser
  • 嵌入在 Excel 工作表中的图片使用基于大语言模型(LLM)的视觉图表解析器进行提取和描述 rag/app/table.py:58-67
  • 数据行转换为 pandas DataFrame,然后每行序列化为文本片段。
  • 带有描述的单元格图片被注入到相应的 DataFrame 单元格中。
数据流
graph TD
    ExcelFile[/"Excel 文件或二进制数据"/] --> ExcelParser["Excel.__call__()"]
    ExcelParser --> ExtractImages["_extract_images_from_worksheet() (deepdoc/parser)"]
    ExtractImages --> VisionParser["vision_figure_parser_figure_xlsx_wrapper() (LLM 增强)"]
    VisionParser --> ImgDescriptions["图片描述丰富图片元数据"]
    ExcelParser --> DataFrame["工作表转换为 pandas DataFrame"]
    DataFrame --> EmbedImages["将图片描述附加到单元格"]
    DataFrame --> Chunks["每行转换为一个文本片段"]

来源: rag/app/table.py:39-128deepdoc/parser/excel_parser.py:110-153

---

演示文稿片段切分

专为幻灯片(PPT/PDF)设计,此模式将每个幻灯片或 PDF 页面视为一个独立的片段,捕获完整的视觉上下文。

实现细节
  • rag/app/presentation.py 提供了 Pdf 解析器,运行 OCR、布局和表格分析。
  • 每个页面的文本和表格/图表内容按页码分组。
  • 文本和表格按垂直 top 和水平 x0 位置排序,以保持页面上的阅读顺序。
  • 返回一个片段列表,其中每个片段是幻灯片/页面的拼接文本内容及其缩略图。
关键步骤
  1. 提取每个页面上的图片和文本块。
  2. 提取表格和图表并合并到页面分组中。
  3. 按位置对页面上的所有项目进行排序。
  4. 聚合并返回完整的页面文本以及页面图片。

来源: rag/app/presentation.py:35-115

---

法律文档片段切分

法律文档需要保留层次化的条文和章节,非常适合法律法规。

实现细节
  • 使用 docx_question_level() 识别段落层级(例如,章、条)。
  • 使用 rag/nlp 中的 Node 构建文档的树形表示,以捕获深度和子节点 rag/app/laws.py:56-85
  • 将层次化树展平为语义片段,保留问答风格。
  • 支持 DOCX 和 PDF 输入,具有专门的布局合并功能。
处理流程
graph LR
    Paragraphs --> LevelDetection["docx_question_level() 检测层级"]
    LevelDetection --> TreeBuild["Node.build_tree() 构建章节树"]
    TreeBuild --> Flatten["Node.get_tree() 将树展平为片段列表"]
    Flatten --> Tokenize["tokenize_chunks() 生成最终片段"]

来源: rag/app/laws.py:56-85rag/nlp/__init__.py:24-25

---

论文片段切分

针对学术论文进行了优化,此模式提取元数据并保留语义结构。

实现细节
  • 通过扫描预定义关键词和布局线索,分别提取标题、作者和摘要。
  • 使用 Token 限制合并文本,并拼接表格和图表。
  • 必要时通过排序框来处理双栏布局。
  • 使用 DeepDOC 或其他布局解析器进行提取。
  • 返回包含元数据和段落的复合字典。

来源: rag/app/paper.py:149-260

---

整篇片段切分

整篇模式将整个文档视为一个片段,保持原始顺序。

实现细节
  • 支持 DOCX、PDF、Excel、TXT、Markdown 和 HTML。
  • 对于 DOCX,合并文本和表格表示,附加大语言模型(LLM)增强的图片描述。
  • 对于 PDF,使用布局识别并合并内容,保持顺序。
  • 对于 Excel,将工作表转换为 HTML 段落作为片段。
  • 对于其他文本文件,按行拆分并作为一个片段返回。
  • 最小化拆分,主要保留原始序列,之后进行 Token 化。

来源: rag/app/one.py:59-167

---

知识图谱片段切分(概念性)

虽然实现细节未完全展示,但此模式在 UI 配置中被引用,旨在将文档处理为实体和关系,以支持知识图谱提取。

---

通用处理工具

视觉图表解析
  • 大语言模型(LLM)增强的视觉图表解析器函数(例如 vision_figure_parser_pdf_wrappervision_figure_parser_figure_xlsx_wrapper)提供自动图片描述增强。
  • 集成在表格和通用片段切分管线中。
Token 化和 Token 计数
  • rag_tokenizer 提供所有片段切分方法使用的 Token 化函数。
  • 通过 num_tokens_from_string() 计算 Token 数量,用于 Token 预算控制。
上下文附加
  • attach_media_context() 在配置的 Token 限制内,在图片和表格周围添加附近的文本上下文,以丰富片段内容。
图表:将自然语言空间桥接到代码实体空间以进行片段切分
graph LR
    NL["自然语言:片段切分策略"] -->|对应| CM[片段切分方法模块]

    subgraph "片段切分方法模块 (rag/app/)"
        Naive["naive.py: chunk()"]
        Manual["manual.py: chunk()"]
        QA["qa.py: chunk()"]
        Table["table.py: chunk()"]
        Book["book.py: chunk()"]
        Laws["laws.py: chunk()"]
        Paper["paper.py: chunk()"]
        Presentation["presentation.py: chunk()"]
        One["one.py: chunk()"]
        KG["knowledge_graph.py: chunk()"]
    end

    CM --> NLP["rag/nlp/__init__.py"]
    NLP --> Tokenizer["rag_tokenizer, tokenize_chunks"]
    NLP --> Context["attach_media_context()"]
    NLP --> Pattern["QUESTION_PATTERN, BULLET_PATTERN"]

    Tokenizer -->|使用| TokenCount["num_tokens_from_string() (common/token_utils.py)"]
图表:任务执行器中的片段切分管线和集成
graph TD
    TE["任务执行器 (svr/task_executor.py 主循环)"] --> CR["基于 parser_id 的片段切分路由器"]
    CR -->|naive| NAIVE["rag/app/naive.py: chunk()"]
    CR -->|manual| MANUAL["rag/app/manual.py: chunk()"]
    CR -->|qa| QA["rag/app/qa.py: chunk()"]
    CR -->|table| TABLE["rag/app/table.py: chunk()"]
    CR -->|book| BOOK["rag/app/book.py: chunk()"]
    CR -->|laws| LAWS["rag/app/laws.py: chunk()"]
    CR -->|paper| PAPER["rag/app/paper.py: chunk()"]
    CR -->|presentation| PRESENT["rag/app/presentation.py: chunk()"]
    CR -->|one| ONE["rag/app/one.py: chunk()"]

    subgraph 通用组件
        PARSER["文档解析 (by_deepdoc, by_mineru, by_plaintext)"]
        TOKENIZER["rag_tokenizer, tokenize_chunks"]
        COUNT["num_tokens_from_string()"]
        CONTEXT["attach_media_context()"]
    end

    NAIVE --> PARSER --> TOKENIZER --> COUNT --> CONTEXT
    MANUAL --> PARSER --> TOKENIZER --> COUNT --> CONTEXT
    QA --> PARSER --> TOKENIZER --> COUNT --> CONTEXT
    TABLE --> PARSER --> TOKENIZER --> COUNT --> CONTEXT
    BOOK --> PARSER --> TOKENIZER --> COUNT --> CONTEXT
    LAWS --> PARSER --> TOKENIZER --> COUNT --> CONTEXT
    PAPER --> PARSER --> TOKENIZER --> COUNT --> CONTEXT
    PRESENT --> PARSER --> TOKENIZER --> COUNT --> CONTEXT
    ONE --> PARSER --> TOKENIZER --> COUNT --> CONTEXT

---

汇总表:片段切分模式与特性

模式支持的文件类型描述Token 处理特殊功能
通用PDF、DOCX、TXT、HTML、Markdown通用片段切分基于 Token 的拆分位置标签、基于分隔符
手动PDF、DOCX保留标题的结构化片段切分层次化堆叠基于布局的垂直合并
问答PDF、Excel问答对提取与项目符号关联项目符号正则表达式检测
表格Excel、CSV表格数据的基于行片段切分每行 Token带 LLM 描述的图片
书籍DOCX、PDF、TXT、HTML带层次化合并的长文档层次化合并目录移除、视觉图表解析
法律DOCX、PDF保留条文的法律文档树结构片段问题层级和节点树
论文PDF学术论文元数据和段落基于 Token 的片段切分元数据提取
演示文稿PPT、PDF基于幻灯片的片段切分,页面粒度每页一个片段页面图片作为缩略图
整篇DOCX、PDF、Excel、TXT整个文档作为一个片段单个片段保留阅读顺序
知识图谱(多种)用于知识图谱的实体和关系提取未完全展示实体类型过滤器(UI)

---

参考文献

  • rag/app/naive.py:763-1028 — 通用片段切分实现
  • rag/app/manual.py:137-236 — 保留布局层次的手动片段切分
  • rag/app/qa.py:109-250 — 问答片段切分逻辑
  • rag/app/table.py:39-128 — 带 Excel 和图片支持的表格片段切分
  • rag/app/book.py:63-162 — 带目录移除和层次结构的书籍片段切分
  • rag/app/laws.py:56-85 — 使用树结构的法律文档片段切分
  • rag/app/paper.py:149-260 — 带元数据的学术论文片段切分
  • rag/app/presentation.py:35-115 — 演示文稿幻灯片片段切分
  • rag/app/one.py:59-167 — 整个文档的单个片段
  • rag/nlp/__init__.py — Token 化器、项目符号模式、Token 计数
  • common/token_utils.py — Token 计数工具
  • deepdoc/parser/excel_parser.py:110-153 — Excel 图片提取和工作簿工具
  • web/src/components/chunk-method-dialog/index.tsx — 解析器参数的 UI 配置

---

本文档全面概述了 RAGFlow 中实现的片段切分方法,将面向用户的自然语言策略桥接到精确的后端代码路径和功能。