RAG只能分块方法
要求
- 基于句子边界段落结构拆分文本,长文本滑动窗口切割,保持语义完整
- 关注dify等框架的知识库是怎么做的
其他项目的切片方法
Dify
一、核心拆分原则
Dify 的文本拆分始终围绕 「语义完整性」和「检索实用性」 两大核心,所有规则都为这两个目标服务:
优先保证单个文本块是完整的语义单元(比如一个段落、一个知识点、一个问题的解答),避免拆分后语义断裂;
分块结果会适配大模型的上下文窗口限制(比如单块字符数不超过模型最大输入的 1/3~1/2,预留空间给检索提示词和对话历史);
兼顾检索效率:块太小会导致检索结果碎片化,块太大则会让大模型难以提取核心信息,Dify 会做平衡。
二、Dify 智能分块的分层拆分逻辑(核心)
Dify 的文本拆分不是单一规则,而是 「先按结构粗分,再按语义 / 字符精分,最后做边界修正」 的分层流程,适配所有主流文本格式(TXT/MD/PDF/Word/Excel 等),底层会先将非文本格式(如 PDF/Word)解析为结构化文本(保留标题、段落、列表、分页等信息),再执行拆分,整体流程如下:
步骤 1:结构级粗拆分(最外层,按文档天然结构切分)
这是 Dify 智能分块的核心特色 ——优先尊重文档的天然结构,避免跨结构拆分导致的语义混乱,也是和「纯字符数拆分」的核心区别。
Dify 会识别文档的结构化标记,按「大结构→小结构」做第一层粗切分,不同格式的结构识别逻辑一致,核心识别的结构包括:
- 标题层级:H1/H2/H3(MD/HTML)、Word 的一级 / 二级标题、PDF 的标题样式;
- 天然分隔:段落(换行 / 空行)、列表项(有序 / 无序列表)、表格(整表 / 行)、分页符、章节分隔;
- 特殊标记:MD 的代码块 ```、引用 >、分割线 ---,PDF 的页眉页脚、图片说明。
拆分规则:不同结构单元不会被强行合并,比如一个 H2 标题 + 下属 3 个段落,会被视为一个「结构单元组」,不会和上一个 H2 的内容混合拆分。
步骤 2:语义 / 长度精拆分(核心层,切分具体文本块)
对步骤 1 得到的「结构单元组」,Dify 会判断其长度:
- 如果长度≤预设的「最大块大小」:直接作为一个完整的文本块,不拆分;
- 如果长度>最大块大小:执行智能精拆分,而非简单按字符数切割,核心拆分逻辑包括:
- 优先按「语义分隔符」拆分:这是「智能」的核心,Dify 会按语义从强到弱的顺序匹配分隔符,切割后保证每块的语义独立。
通用语义分隔符优先级(中文场景为主):\n\n(空行,代表段落结束) > \n(换行,代表行结束) > 。!?;(中文句末标点) > ,、(中文句内标点); - 按最大块大小做「软切割」:如果按语义分隔符拆分后,某块仍超过最大块大小,才会按字符数做兜底切割(但会尽量靠近句末标点,减少语义断裂);
- 保留「块重叠」:拆分时会让相邻两个文本块保留少量重叠内容(默认重叠率~10%),解决「跨块语义断裂」问题。
比如原文本:A段落内容。B段落内容。C段落内容。,拆分后块 1:A段落内容。B段落内容。,块 2:B段落内容。C段落内容。,重叠的「B 段落内容」能让大模型理解跨块的语义关联。
- 优先按「语义分隔符」拆分:这是「智能」的核心,Dify 会按语义从强到弱的顺序匹配分隔符,切割后保证每块的语义独立。
步骤 3:边界修正与后处理(最终层,优化分块结果)
对步骤 2 拆分后的文本块,做最后一轮优化,保证分块质量:
过滤无效块:剔除空白块、纯标点块、字符数<「最小块大小」的碎片块(避免检索到无意义内容);
合并过小块:如果某块字符数远小于最小块大小,且和下一块属于同一结构单元(比如同一标题下的两个短段落),会将其合并为一个块;
保留元信息:给每个最终的文本块附加文档元信息(文档名称、标题层级、页码、位置索引等),方便检索时溯源和排序。
三、Dify 分块的关键配置参数(可自定义,核心可调)
Dify 的知识库分块规则并非完全固定,在「知识库设置→文本处理」中,你可以自定义核心参数(不同版本的 Dify 界面名称略有差异,但核心参数一致),参数直接影响分块结果,重点关注 4 个:
参数名称 作用 官方默认值(中文)
最大块大小 单个文本块的最大字符数(核心),适配大模型上下文窗口 2000~3000 字符(可改 1000~8000)
最小块大小 单个文本块的最小字符数,过滤碎片块 100~200 字符
块重叠长度 相邻文本块的重叠字符数,解决跨块语义断裂 200~300 字符(或按比例)
分隔符自定义 可添加 / 删除 / 调整语义分隔符的优先级(比如针对专业文档添加###作为分隔符) 内置默认分隔符(可自定义)
参数适配建议:如果你的文档是短文本知识点(如 FAQ、产品手册),可将最大块调小(10002000);如果是长文本干货(如技术文档、论文),可调大(30005000),但不建议超过大模型上下文窗口的 1/2(比如 GPT-3.5 的 4k 窗口,最大块建议≤2000)。
四、特殊场景的智能处理
针对知识库中常见的特殊文本类型 / 格式,Dify 会做专属的拆分适配,避免分块失效,核心场景包括:
PDF 扫描件 / OCR 文本:先做 OCR 解析(保留行、段结构),再按普通文本拆分;如果 OCR 结果杂乱,会自动过滤无意义的乱码,再尝试拆分;
代码块 / 公式块:MD/PDF 中的代码块(```)、数学公式会被整体保留,不会被拆分(避免代码 / 公式断裂),如果代码块过长,会单独作为一个块;
表格:按行 / 列拆分,小型表格整体作为一个块,大型表格按行拆分(保留每行的表头 + 内容,保证语义完整);
多语言文本:自动识别中英文,分别匹配对应的分隔符(英文分隔符:\n\n > \n > . ! ? ; > ,),避免中英文混合拆分导致的语义混乱;
长文档(10w + 字符):先按章节 / 分页做粗拆分,再对每个章节做精细化拆分,避免单文档拆分后块数过多,影响检索效率。
总结
- 前置解析:将 PDF/Word/MD 等非文本格式解析为结构化纯文本(保留段落 / 标题 / 换行,由 Dify 的文档解析模块实现);
- 通用清洗:调用CleanProcessor清洗文本(去空行 / 乱码 / 不可见字符);
- 结构级粗拆分:通过ParentChildIndexProcessor按parent_mode拆分为父块(段落 / 全文),过滤空父块;
- 语义 / 长度精拆分:对每个父块,调用FixedRecursiveCharacterTextSplitter做精拆分,按「固定分隔符→语义分隔符→字符」拆分,保证长度≤chunk_size,并添加块重叠;
- 边界修正与后处理:对精拆分后的子块做最终过滤(空块)、边界修正(去多余标点)、元数据补充(父块 ID / 哈希 / 源信息);
- 最终入库:将处理后的块(父块 + 子块)写入向量数据库,用于 RAG 检索。
浙公网安备 33010602011771号