现在很多企业在做知识库检索时,都会考虑通过RAG提高准确率。那你知道RAG很关键的一点是什么吗?
没有错,就是前期的数据处理。你的数据清洗得越干净,后期检索准确率越高。
那今天阿群带你一起搞定数据清洗~
文档转Markdown原因
我们首先要处理文档的格式,那就有很多人有疑问🤔,为什么要把它转换成Markdown的格式。
这边的话主要有几点:
-
保留结构化信息:
① 标题、列表、表格等语义结构:Markdown通过简单的语法(如#、-、|)明确标识文档的层级结构(标题、段落、列表等),这些结构信息能帮助模型更好地理解内容逻辑。例如,标题可分割长文档,列表项可明确并列关系。
② 避免纯文本的扁平化:纯文本可能丢失原始文档的分段或缩进,而Markdown保留这些视觉线索,便于后续分块(chunking)时按结构切分。
-
清除噪音,保留核心内容
① 剥离冗余格式:PDF/HTML等格式常包含无关元素(页眉、广告、CSS代码),转换为Markdown可过滤大部分噪音,仅保留文本和基础排版。
② 统一处理多源数据:不同来源的文档(Word/HTML/PDF)转为MD后,格式标准化,简化后续清洗和嵌入(embedding)流程。
-
适配分块(Chunking)策略
① 按结构分块更高效:Markdown的标题(##)天然适合作为分块边界。例如,可按## 章节将长文档分割为语义连贯的块,提升检索准确性。
② 避免截断语义单元:相比固定长度分块,基于MD结构的分块能防止句子或段落被切断。
-
提升模型处理效率
① 减少无关符号干扰:MD的简洁语法比HTML/XML等更接近自然语言,降低模型解析负担。
② 兼容标记与纯文本:MD的粗体(text)等标记可保留关键术语的强调信息,同时不影响可读性。
-
后续处理兼容性
① 嵌入(Embedding)优化:干净的MD文本生成的向量更能反映语义,减少格式噪音对嵌入模型(如BERT)的干扰。
② 支持下游任务:MD是通用格式,便于后续标注、人工审核或导入其他工具(如向量数据库)。
PDF转Markdown操作
转换格式的文档有这些:Marker、MinerU、MarkItDown以及Docling。
我们今天用的是MinerU(建议使用客户端)
🤔为什么要用客户端呢?
网页端的图片存在CDN上面,云端会定期清理数据缓存,会造成图片过期无法查看,图片裂开情景。
我们在生产环境(企业应用)等需要保证图片不丢失,而用客户端的话图片会保存到客户,不用有这个顾虑。
我们正在文档转换之前,需要修改一下设置。
① 点击右下角的设置按钮:这边的话ocr识别建议不要开启,开启之后会把识别图片转换成提取的文字;
② 然后公式识别的话,大家可以根据你的文档信息来选择,如果不是有公式的文档也不要开,不然会把你文中有特殊符号的内容转换成公式;
设置完之后,我们直接点击上传,把PDF文件上传给MinerU解析,运行
运行之后,在这里打开文件路径,我们就可以看到解析后的文档了
我们这边用的就是这个解析完的full.md的文档
Markdown格式清洗
我们用sublime编辑文档的工具打开这个full.md的文档,会发现两个问题:
① 所有的标题转换之后默认都是一级标题,但原文档里4.1应该到2级标题了,4.1.1应该是3级标题。
② 图片的标注和链接被拆分成两行(需要整合为一个规范格式)
💡 让AI写清洗脚本,解决人工处理慢、耗时长的问题
1.撰写清洗脚本
我们撰写脚本主要是为了处理上面关于标题分级和图片标注的问题,所以这个时候我们把这两个问题清楚罗列出来,然后把想要解决的也告诉AI,如果你担心表达的不够清楚,可以把出来前后的示例也一并发给它。
对应脚本提示词
帮我写一个 Python 脚本,实现如下功能
:对"C:\Users\86156\MinerU\海康威视\full.md"的full.md文档进行处理
- 标题级别处理,规则如下:
- 把以`# 2.1 文字`结构的一级标题改为二级标题
- 把以`# 2.1.1 文字`结构的一级标题改为三级标题
- 保留`# 2 文字`结构的一级标题
- 去掉所有其他不符合以上规则一级标题的标题级别
- 优化文档中的图片表达式
- 把文档中所有符合以下规则的文本格式进行调整
```

图 4-1 通过 SADP 激活设备
```
- 修改为
```

```
- 注意:有些图片表达式之后不包含关于这个图片的备注信息,可以直接忽略
2.保存运行代码
我们让deepseek撰写脚本,脚本撰写完之后复制代码
复制完的代码,粘贴到前面文档的地址下面,把格式改为mdbetter.py
在终端/sublim编辑器中运行python脚本:python mdbetter.py/Ctrl+B
脚本运行完之后,就会生成清洗完的 full_processed.md文档
我们打开清洗完的full_processed.md文档,就会看到我们标题级别处理好了,以及图片的标识格式也处理了。
3.遇到bug修复代码
部分同学会遇到图片的标识格式有部分没有处理的情况,这个是因为咱们给的示例中图片标识文字的空格导致代码以为这个是另外的格式;
遇到这种情况,我们就把这个情况复制发给AI,让它再修改代码。
你可以这样跟deepseek说:
图片没有处理好,目前有的图片是这个种的

图6-5 强光抑制
我们想要的格式是

然后deepseek一顿哐哐给你修改,把修改之后的代码替换原先的之后,保存继续执行就完事了~
当然,如果还有其他问题,一样的操作就能解决。
图片云托管
前面的数据清洗都做完了之后,我们要解决的就是图片的问题。目前图片都存储到本地,用户没有办法访问我们本地的图片!
这个时候我们就需要把图片上传到云端,让用户可以随时访问。
我们这次用阿里云OSS作为示例(其他平台同理)。
我们把图片的文件夹直接上传到创建好的阿里云的Bucket列表中,速度很快~
我们可以在详情中看到云端服务的图片url跟本地图片的url的区别,云端的多了一些前缀(XXX.aliyuncs.com/images),其他的…
目前的操作中,我们要在清洗好的文档中把本地图片链接换成线上的就很简单了。只要用替换功能就可以实现。
替换前:
](images
替换后:
](https://XXX.aliyuncs.com/images
选择全部替换就OK了🤏
智能分段(RAG核心)
1.分段准则:
上面的基础工作都完了之后,我们就要开始给数据做分段了。对知识库进行合理的分段(Chunking)是影响检索效果和生成质量的关键步骤。
我们在分段的时候需要注意这些准则:
- 语义完整性:我们一般以标题级别做分段;
- 长度权衡:短分段更易被精准检索,但可能丢失上下文;而长分段能保留更多上下文,但可能引入噪声并且影响搜索时长和消耗token。所以我们一般长度控制在1000左右字;
- 分隔符:我们一般以罕见符号或者内容中没有的符合作分隔符(如¥¥¥、===);
2.分段及检验
① 我们这个文档有一级标题、二级标题以及三级标记。我们先以二级标题作为分段标准。
在文档中二级标题前面加上¥¥¥,一键替换全文。
备注:这边空格和换行符都要保留
② 分段好了之后我们就需要知道每个分段的字数是怎么样子的?这个时候我们可以让deepseek用一个脚本来处理。
帮我写一个 Python 脚本,实现如下功能:
读取文档`full_processed.md`的内容,统计使用`¥¥¥`作为分隔符的段落内容的字符数,存储到Excel 中。
保存写好的代码之后,运行脚本。
③ 打开运行出来的Excel表中查看统计情况,发现按照二级标题分割,大段落居然有1w+字符数的,这个字数太大了,我们需要进一步细分。所以,我们调整为按三级标题分段。
我们在三级标题加上¥¥¥,然后一键替换全文。
④ 接着运行脚本,查看三级标题分段的字数。这次看起来就相对集中一些,基本集中在一千多。
我们初步以2000字符为界限,有几个超长段落的,需要手动处理,在合适的位置手动放上分隔符 ¥¥¥ 和对应的三级标题。
修改完之后,需要再次运行脚本,检查一下。可以看到没有超长段落了。
⑤ 但是发现有像这样的超短段落,分段只剩下标题,没有内容。那二级标题就需要调整,调整方式是复制到每一个三级标题之上。如果二级标题下本身是有内容的,那就单独成段。
⑥ 同样把这个规则抛给大模型,写一个脚本批处理。
在原文档`full_processed.md`中,有一级标题#、二级标题##、三级标题### ,有的内容中,二级标题下方没有三级标题。
帮我写一个Python脚本,实现以下功能:
- 如果二级标题下方不存在三级标题则不做调整;如果二级标题下方存在三级标题,则在每一个三级标题上方,把二级标题重复一遍。
- 执行后,另存为`full_processed_better.md`文件中
- 示例如下:
- 原文档
"""
## 4.3 登录
### 4.3.1 浏览器登录
介绍通过浏览器登录的步骤和辅助工具的使用。
操作步骤
1. 在浏览器中输入设备的IP 地址,显示登录画面。
2. 根据界面提示,安装插件。
3. 再次打开浏览器,输入设备的IP 地址。
4. 输入用户名和密码,单击登录。
5. 可选操作: 使用辅助工具栏。

¥¥¥
### 4.3.2 插件安装说明
不同的浏览器版本安装插件的操作不同,不同插件对应显示的功能不同。为保证您所需的功能能正常显示和使用,请根据使用情况安装插件。
说明
插件安装情况视型号和浏览器版本而定,安装后实现的功能请以实际设备为准。
表4-1 插件安装说明
"""
- 调整后
"""
## 4.3 登录
### 4.3.1 浏览器登录
介绍通过浏览器登录的步骤和辅助工具的使用。
操作步骤
1. 在浏览器中输入设备的IP 地址,显示登录画面。
2. 根据界面提示,安装插件。
3. 再次打开浏览器,输入设备的IP 地址。
4. 输入用户名和密码,单击登录。
5. 可选操作: 使用辅助工具栏。

¥¥¥
## 4.3 登录
### 4.3.2 插件安装说明
不同的浏览器版本安装插件的操作不同,不同插件对应显示的功能不同。为保证您所需的功能能正常显示和使用,请根据使用情况安装插件。
说明
插件安装情况视型号和浏览器版本而定,安装后实现的功能请以实际设备为准。
表4-1 插件安装说明
"""
生成的代码,运行脚本后,就得到了最后清洗万完的数据。
至此,RAG资料处理的第一阶段结束!🥳
▶️ 下期预告:《🔥RAG系统避坑指南!大模型问答居然可以这样优化?手残党也能学会!》
更多推荐:
新手必看喂饭级教程,原来这样用SSH推代码到GitHub才对!