微信扫码
添加专属顾问
我要投稿
掌握RAG知识库构建的关键一步:数据分块策略详解,提升检索效率与精准度。核心内容: 1. 数据分块的必要性与应用场景分析 2. 分块三大原则与最佳实践案例解析 3. 数据清洗预处理与常见分块策略对比
上一篇文章我们介绍了RAG的基本概念和原理, 感兴趣的同学也可以回去补补课。
今天咱们就继续来聊聊知识库的数据清洗与分块策略。
为了精准召回知识库的内容!
事实上,如果我们不做分块,直接把整个知识库丢给大模型,让他参照执行,在知识内容较少的情况下,是完全可行的。
但在真实使用场景,往往知识库都非常复杂,比如在AI医疗场景,知识库会收录上万本权威医疗指南,每个指南都是一本厚厚的医术或者权威论文。
把这么多指南一股脑都丢给大模型是不现实的,所以我们只能根据要搜索的内容,召回跟搜索内容最相关的知识片段,达到动态调用海量知识库的效果。
那么就需要对知识进行结构化存储。
每个分块都应该是一个完整的内容片段
举个例子:
# Original
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
周六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
公司加班调休政策:
...
# GoodCase
- block1
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
周六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
- block2
公司加班调休政策:
...
# BadCase1
> 相关性高的内容应该放在同一分块
- block1
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
- block2
周六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
公司加班调休政策:
...
# BadCase2
> 单个分块应保证语义的完整性
- block1
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
周六10:00 - 17:00, 午休
周日及法定节假日休息。
公司加
- block2
班调休政策:
...
在进行数据分块之前,通常会先进行数据清洗。数据清洗的目的是:
数据的结构化处理。同时去除无效、低质量、非语义化和不利于检索的内容。
数据清洗的好处是能够消除数据噪音,节约知识库嵌入成本 & 提高检索效率。
举个例子:
可以看到清洗之后的数据去除了不必要的符号和不利于检索的内容,只保留了结构化的文档内容,方便后续做分块处理。
可以通过程序代码或者大模型对源数据进行批量清洗。
其实就是规则匹配模式,这也是各大智能体开发平台普遍都支持的模式。
优点: 是简单效率高,不消耗Token。
缺点: 不智能,对源数据的要求高。
常见的正则表达式分块方式:
其中,按固定长度分块一般会通过预留一部分冗余数据的方式来解决语义化的问题。
# Original
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
周六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
公司加班调休政策:
...
# Block1
公司上班时间为:
周一至周五9:00 - 18:00, 午休1小时。
周六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
公司加
> 冗余字段为:六10:00 - 17:00, 午休1小时。周日及法定节假日休息。公司加
# Block2
六10:00 - 17:00, 午休1小时。
周日及法定节假日休息。
公司加班调休政策:
...
对于结构化良好的高质量文档内容,使用最简单的正则表达式分割法是最经济高效的选择。
使用自然语言处理工具对文档的语义进行理解。从而达到更好的分块效果。
如使用NLTK、spaCy等工具,可以识别句子边界和段落结构。
这种方式对比正则表达式,能够兼容部分非结构化文档。
通过大模型的能力,对句子、段落的边界进行识别的判断,生成更符合语义化的分段结果。
这种方式也是小编比较推荐普通人尝试的模式,由于大模型的能力日益强大,适用于各种非结构化文档的快速分块。
但也需要注意大模型的幻觉问题和不稳定问题。
虽然掌握了常见的数据分块方法,已经基本上可以搞定大多数的文档了。
但实际操作的时候由于数据源多种多样,所以依然会面临很多的挑战。
很多知识都是图文混排的,如PPT格式和PDF格式,里面都会存在大量的架构图、说明图片等内容。
如果单纯的过滤掉图片,文字内容就会显得支离破碎,缺乏必要的语义和上下文。
如果把图片单独做向量化存储,那么直接检索的意义和效果都非常差。
有时候相同的数据会由于时效性的原因存在多个副本。例如:
> 相同的数据由于数据的时效性问题可能存在多个不同的副本。
上证指数今天上涨5%,达到3700点...
上证指数今天下跌4%,以3300点收官...
上证指数今天维持3500点上下不动...
相同的数据片段在不同的知识库中存在类似的描述,产生歧义。
# 问题:
今年的苹果啥时候上市?
# 知识库A
> 《苹果手机最新资讯》
最新的Iphone将在秋季苹果新闻发布会上跟大家见面....
# 知识库B
> 《农副产品销售计划》
今年的红富士苹果将在1个月后上市销售...
有些问题需要跨多文档进行检索,并且针对检索到的内容进行推理和加工。
由于知识库的分块和切割存储特性,很难建立起多个知识库文档之间的关联关系,面对复杂问题很有可能得不到想要的结果。
为了解决上面这些复杂问题,又有不少优化的策略和手段,需要根据使用场景单独处理。
可以使用多模态大模型或者OCR能力对文档中的图片进行识别和处理。
给图片生成一个摘要描述并加入到原文中,尽可能的保留语义并提高检索效果。
也可以使用一些开源工具,通过工具进行PDF/PPT等文档的识别和格式化转换。例如PDF-Extract-Kit
和 OmniParse
。
通过把不同领域的知识拆分到不同的知识库中,每次查询时,根据查询的内容仅检索特定的知识库,避免出现知识歧义问题。
例如:
《农产品销售计划》和《Iphone新品发布计划》中都有关于“苹果上市计划”的描述,但其实完全是两个领域的知识,在设计的时候需要做知识库隔离。
大模型在检索的时候,会根据上下文信息&知识库的描述信息判断到底应该检索哪个知识库。
通过给知识分块添加对应的关键词标记(人工添加或者程序添加)能够优化检索时的召回效果,除了向量的相似度检索,还可以通过关键词做关键词精确匹配。
知识库图谱既Graph RAG, 需要在设计知识库的时候,除了存储知识本身(实体),还可以额外存储知识之间的关联关系(关联关系)。从而形成一个知识库图谱。
每当需要检索知识的时候,会以最相关的知识片段为起点,对知识图谱做N跳以内的知识检索,确保检索到跨多个文档的相关性知识。
这种方式可以大大提高检索知识的质量。这块比较复杂,后续会单开文章专门进行讲解。
把每一行作为单独的召回记录保存在一个分片中,每次检索都只召回对应的记录。每个分块都需要保留完整的表头信息。
数据分块质量的好坏,直接关系到知识库检索和召回的质量。
在设计知识库的时候,可能最大头的工作量反而是做知识的清洗和分块工作。
上面介绍了一些常见的分块策略和思想,但这里并没有银弹。最佳实践是根据自己的业务场景&数据类型选择最合适的分块策略。
如果想要达到比较好的分块效果,还是需要编写数据预处理代码来实现。对于代码不熟悉的同学,也可以直接去用Coze、dify之类的智能体平台,通过UI界面配置自己的知识库,但缺点就是只能使用平台内置的分块、嵌入策略。
系列文章:
DeepSeek幻觉率高达21%?聊聊大模型的幻觉问题" data-itemshowtype="0" linktype="text" data-linktype="2">DeepSeek幻觉率高达21%?聊聊大模型的幻觉问题
如果觉得还不错,记得点点关注哦!
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-05-30
2025-06-05
2025-06-06
2025-05-19
2025-06-05
2025-05-20
2025-06-05
2025-05-27
2025-05-13
2025-05-19
2025-08-05
2025-07-28
2025-07-09
2025-07-04
2025-07-01
2025-07-01
2025-07-01
2025-07-01