掌握RAG知识库构建的关键一步:数据分块策略详解,提升检索效率与精准度。
上一篇文章我们系统介绍了RAG的基本概念与工作原理,感兴趣的朋友可以翻阅历史记录回顾。今天我们将深入探讨知识库的数据清洗与分块策略。这两个环节是整个RAG项目落地的根基——基础不牢,后续优化再努力也难以奏效。
为什么要分块
简单来说,分块是为了实现知识库内容的精准召回。如果不进行分块,而是将整个知识库一股脑喂给大模型,让它自行处理,在知识量极少的情况下确实可行。但在真实业务场景中,这几乎不可能。以AI医疗领域为例,知识库可能收录了上万本权威医疗指南,每一本都是厚厚的医书或学术论文。将如此庞大的资料一次性塞给大模型,既不现实,也无必要。
正确的做法是:根据用户的具体问题,仅召回最相关的知识片段。这要求我们对知识进行结构化存储,将大块内容切割成小块,按需调用。
如何分块
分块原则
分块的核心原则是什么?每个分块都必须是一个完整的内容片段。具体来说,三条铁律需要遵守:
| 原则 | 说明 |
|---|---|
| 内容相关 | 高相关性的内容应尽量放在同一个分块内。 |
| 分块适当 | 分块不宜过长,通常512个Token以内最佳,具体长度需根据所选Embedding模型确定。 |
| 语义完整 | 每个分块都必须保证语义的完整性,不能断章取义。 |
举个简单的例子:
# 原始文档
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
周六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
公司加班调休政策:
...
# 好的分块方式
- block1
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
周六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
- block2
公司加班调休政策:
...
# 错误示范1:高相关性内容被拆散
- block1
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
- block2
周六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
公司加班调休政策:
...
# 错误示范2:分块破坏语义完整性
- block1
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
周六10:00 - 17:00, 午休
周日及法定节假日休息。
公司加
- block2
班调休政策:
...
数据清洗
在分块之前,通常需要先进行数据清洗。清洗的目标是什么?说白了就是实现数据结构化,同时去除无效、低质量、非语义化、不利于检索的内容。这一步做得好,不仅能消除噪音,还能节约向量化成本,提升检索效率。
比如下面这个例子,清洗前满是特殊符号和不必要的格式标记,清洗后只剩下干净的结构化内容,分块处理起来就顺畅多了。
清洗工作可以交给程序代码,也可以直接让大模型批量处理。总之,这一步千万不能省略。
常见的分块策略
正则表达式分块
这其实就是规则匹配模式,也是各大智能体开发平台普遍支持的方式。它的优点是简单高效,不消耗Token。缺点嘛,不够智能,对源数据质量要求较高。
常见的分割方式包括:
| 分割模式 | 说明 |
|---|---|
| 按长度分割 | 固定字符或固定Token数 |
| 按段分割 | 匹配双换行符 |
| 按行分割 | 匹配单换行符 |
| 按句分割 | 匹配句号 |
| 自定义分割 | 按自定义符号分割 |
其中按固定长度分块,通常需要预留一部分冗余数据来解决语义完整性问题,比如这样:
# 原始文档
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
周六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
公司加班调休政策:
...
# Block1 (含冗余)
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
周六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
公司加
# Block2 (带冗余前缀)
六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
公司加班调休政策:
...
对于结构化良好的高质量文档,正则表达式分割法是最经济高效的选择。具体到不同文档类型,也有对应方案:
| 文档类型 | 说明 |
|---|---|
| Markdown | 用专门的Markdown解析器分块 |
| 代码 | 用代码解析器分块 |
| 多维表格文档 | 按记录分块 |
| 数据库记录 | 按记录分块 |
| Excel文档 | 按行存储 |
NLP分块
利用自然语言处理工具理解语义,例如NLTK、spaCy等,可以识别句子边界和段落结构。这种方式比正则表达式更智能,能兼容部分非结构化文档。
大模型分块
直接让大模型判断句子和段落的边界,生成更符合语义的分段结果。如果你不擅长写代码,这可能是最推荐的入门方式。大模型能力越来越强,对各类非结构化文档都能应对。不过要注意,大模型存在幻觉问题,输出不够稳定,需要留个心眼。
数据分块的难点和挑战
掌握了上述方法,大部分文档都能处理。但实际操作中,麻烦事还真不少。
图文混排
很多知识文档都是图文混排的,比如PPT和PDF,里面有大量架构图、说明图。如果直接把图片过滤掉,文字内容会变得支离破碎,失去上下文。如果把图片单独向量化,检索效果又很差。这确实是个两难问题。
数据版本问题
同一份数据可能因时效性存在多个版本。比如:
上证指数今天上涨5%,达到3700点...
上证指数今天下跌4%,以3300点收官...
上证指数今天维持3500点上下不动...
这些版本都在知识库里,但它们的“有效时间窗口”不同,检索时该用哪条?
数据歧义问题
同一个关键词在不同知识库中可能指向完全不同的概念:
问题: 今年的苹果啥时候上市?
知识库A: 《苹果手机最新资讯》——最新的Iphone将在秋季苹果新闻发布会上跟大家见面...
知识库B: 《农副产品销售计划》——今年的红富士苹果将在1个月后上市销售...
这种歧义如果不处理好,检索结果会让人哭笑不得。
复杂问题检索
有些问题需要跨多个文档进行检索,并对检索到的内容做推理和加工。但知识库分块存储后,各个片段之间的关联关系就断了,面对复杂问题常常得不到满意答案。
进一步优化分块效果
针对上述难题,也有一些优化策略可以尝试。
图文混排文档的处理
可以用多模态大模型或OCR能力识别图片,为每张图生成一段摘要描述,然后加到原文中。这样既能保留语义,又能提高检索效果。
也可以借助一些开源工具,比如PDF-Extract-Kit、OmniParse,专门用来识别和转换PDF、PPT等文档格式。
知识库路由
将不同领域的知识拆分到不同的知识库中。每次查询时,系统根据问题的上下文先判断该检索哪个库。例如“苹果上市计划”这个关键词,在《农产品销售计划》和《Iphone新品发布计划》中意义完全不同,那就让大模型自己去判断该走哪条路。
知识库标签
给每个分块打上关键词标签,可以是人工添加的,也可以是程序自动生成的。这样除了向量相似度检索,还能通过关键词做精确匹配,提高召回精度。
知识图谱
这就涉及到Graph RAG的思路了。在设计知识库时,除了存储知识本身(实体),还要额外存储它们之间的关联关系(关系),从而形成一个知识图谱。检索时,以最相关的知识片段为起点,沿着关系做N跳内的扩展检索,确保能跨文档找到关联知识。

这种方式能显著提升检索质量,但实现起来也复杂得多,以后可以专门写一篇细聊。
Excel分块
Excel这种表格文档,最简单的做法是把每一行作为一个独立的分块,每条记录单独召回。同时,每个分块都要保留完整的表头信息,这样才能理解每条数据的含义。

结语
数据分块质量的好坏,直接决定了知识库的检索和召回效果。很多时候,整个知识库建设过程中工作量最大的,反而是数据清洗和分块这部分。本文介绍了不少策略和思路,但实话实说,这里面没有银弹。最佳实践永远是结合自己的业务场景和数据类型,选择最合适的方案。想达到理想效果,通常还是要写数据预处理代码。如果不懂代码,也可以直接用Coze、Dify这类智能体平台,通过UI界面配置知识库,不过就只能用平台内置的分块和嵌入策略,灵活性会差一些。
