切分方法
片段切分方法
相关源文件
以下文件为本维基页面的生成提供了上下文:
deepdoc/parser/excel_parser.pyrag/app/book.pyrag/app/laws.pyrag/app/manual.pyrag/app/naive.pyrag/app/one.pyrag/app/paper.pyrag/app/presentation.pyrag/app/qa.pyrag/app/table.pyrag/nlp/__init__.pyweb/src/components/auto-keywords-form-field.tsxweb/src/components/chunk-method-dialog/index.tsxweb/src/components/chunk-method-dialog/use-default-parser-values.tsweb/src/components/delimiter-form-field.tsxweb/src/components/entity-types-form-field.tsxweb/src/components/excel-to-html-form-field.tsxweb/src/components/llm-setting-items/slider.tsxweb/src/components/max-token-number-from-field.tsxweb/src/components/originui/number-input.tsxweb/src/components/page-rank-form-field.tsxweb/src/components/parse-configuration/graph-rag-form-fields.tsxweb/src/components/parse-configuration/raptor-form-fields.tsxweb/src/components/slider-input-form-field.tsxweb/src/constants/form.tsweb/src/hooks/parser-config-utils.tsweb/src/interfaces/database/document.tsweb/src/interfaces/request/document.tsweb/src/pages/dataset/dataset-setting/configuration/common-item.tsxweb/src/pages/dataset/dataset-setting/configuration/naive.tsxweb/src/pages/dataset/dataset-setting/form-schema.tsweb/src/pages/dataset/dataset-setting/index.tsxweb/src/pages/dataset/dataset-setting/saving-button.tsxweb/src/pages/dataset/dataset/use-change-document-parser.tsweb/src/pages/datasets/dataset-creating-dialog.tsxweb/src/pages/datasets/hooks.tsweb/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-1028、rag/app/manual.py:137-236、rag/app/qa.py:109-250、rag/app/table.py:39-128、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。
片段切分架构
片段切分过程由后台任务执行器编排,该执行器根据数据集中配置的 parser_id 选择应用程序模块。
片段切分逻辑流程
来源: rag/app/naive.py:86-184、rag/app/manual.py:137-173、rag/nlp/__init__.py:31-31、common/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 感知的方式合并文本段落,直到达到片段大小限制。
数据流和关键函数
naive_merge()遵循自然分隔符和 Token 长度,基于语义边界生成片段。- 位置信息编码为标签:
@@page\tleft\tright\ttop\tbottom##附加到片段文本中rag/app/naive.py:820-825。
来源: rag/app/naive.py:763-1028、rag/nlp/__init__.py:1145-1300、common/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-134、rag/nlp/__init__.py:169-233。
问答片段切分
此模式针对结构化为显式问答对的文档,例如测验或常见问题解答(FAQ)。
实现细节
- 使用
rag/nlp/__init__.py中QUESTION_PATTERN下定义的正则表达式模式来检测问题项目符号和编号rag/nlp/__init__.py:75-87。 rag/app/qa.py解析 PDF 和 Excel 表格:- 将 PDF 解析为段落,检测问题项目符号并关联答案。
- 解析 Excel 表格,提取列作为(问题,答案)对。
- 在适用时将图片和表格合并到问答片段中。
关键处理步骤
- OCR 和布局分析提取文本块。
- 使用
has_qbullet()方法检测问题项目符号及其索引。 - 使用位置和项目符号模式逻辑将问题与答案配对。
- 在合并文本之前,按页面和顶部位置对关联的表格进行排序。
来源: rag/nlp/__init__.py:75-87、rag/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 单元格中。
数据流
来源: rag/app/table.py:39-128、deepdoc/parser/excel_parser.py:110-153。
演示文稿片段切分
专为幻灯片(PPT/PDF)设计,此模式将每个幻灯片或 PDF 页面视为一个独立的片段,捕获完整的视觉上下文。
实现细节
rag/app/presentation.py提供了Pdf解析器,运行 OCR、布局和表格分析。- 每个页面的文本和表格/图表内容按页码分组。
- 文本和表格按垂直
top和水平x0位置排序,以保持页面上的阅读顺序。 - 返回一个片段列表,其中每个片段是幻灯片/页面的拼接文本内容及其缩略图。
关键步骤
- 提取每个页面上的图片和文本块。
- 提取表格和图表并合并到页面分组中。
- 按位置对页面上的所有项目进行排序。
- 聚合并返回完整的页面文本以及页面图片。
来源: rag/app/presentation.py:35-115。
法律文档片段切分
法律文档需要保留层次化的条文和章节,非常适合法律法规。
实现细节
- 使用
docx_question_level()识别段落层级(例如,章、条)。 - 使用
rag/nlp中的Node构建文档的树形表示,以捕获深度和子节点rag/app/laws.py:56-85。 - 将层次化树展平为语义片段,保留问答风格。
- 支持 DOCX 和 PDF 输入,具有专门的布局合并功能。
处理流程
来源: rag/app/laws.py:56-85、rag/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_wrapper、vision_figure_parser_figure_xlsx_wrapper)提供自动图片描述增强。 - 集成在表格和通用片段切分管线中。
Token 化和 Token 计数
rag_tokenizer提供所有片段切分方法使用的 Token 化函数。- 通过
num_tokens_from_string()计算 Token 数量,用于 Token 预算控制。
上下文附加
attach_media_context()在配置的 Token 限制内,在图片和表格周围添加附近的文本上下文,以丰富片段内容。
图表:将自然语言空间桥接到代码实体空间以进行片段切分
图表:任务执行器中的片段切分管线和集成
汇总表:片段切分模式与特性
| 模式 | 支持的文件类型 | 描述 | Token 处理 | 特殊功能 |
|---|---|---|---|---|
| 通用 | PDF、DOCX、TXT、HTML、Markdown | 通用片段切分 | 基于 Token 的拆分 | 位置标签、基于分隔符 |
| 手动 | PDF、DOCX | 保留标题的结构化片段切分 | 层次化堆叠 | 基于布局的垂直合并 |
| 问答 | PDF、Excel | 问答对提取 | 与项目符号关联 | 项目符号正则表达式检测 |
| 表格 | Excel、CSV | 表格数据的基于行片段切分 | 每行 Token | 带 LLM 描述的图片 |
| 书籍 | DOCX、PDF、TXT、HTML | 带层次化合并的长文档 | 层次化合并 | 目录移除、视觉图表解析 |
| 法律 | DOCX、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 中实现的片段切分方法,将面向用户的自然语言策略桥接到精确的后端代码路径和功能。