在 RAG 系统中,知识库的质量直接决定回答质量。无论检索算法多么精准、生成模型多么强大,如果入库的文档本身混乱、重复、含有错误或无关信息,最终回答一定受影响。数据清洗与预处理就是将原始文档转化为“干净、结构化、可检索”的知识片段的过程,是 RAG 落地中最容易被低估却极为关键的环节。
6.3.1 为什么要专门做清洗与预处理
企业真实文档往往不是为建设知识库而生,通常存在以下问题:
- 格式杂乱:PDF 里的表格、图片、页眉页脚;Word 文档中的修订痕迹、批注;网页中的导航栏、广告、脚本代码。
- 内容重复或冲突:不同时期版本的同一政策共存,员工手册新旧条款混在一起。
- 无意义信息:空白页、纯标点、版权声明、免责声明等频繁出现。
- 碎片化描述:某些文档中关键信息分散在各处,单一 chunk 不完整。
如果不加处理直接切块入库,检索出的片段可能只包含半个表格的无意义数字,或者是一段夹杂了页眉页脚的正文。清洗的目的就是让每个 chunk 变成一段自包含、语义完整、可独立理解的文本。
6.3.2 典型清洗步骤
1. 格式提取与统一
将 PDF、Word、网页、Markdown 等不同来源的文档提取为纯文本或结构化文本。这一阶段需要关注:
- 保留段落结构、列表、标题层级。
- 表格尽可能转为 Markdown 表格或键值对文本,避免直接丢弃或截断。
- 去除页眉页脚、页码、水印,可以使用正则或文档解析库的版面分析功能。
2. 去除噪音信息
- 删除无意义的特殊字符、连续空格、乱码。
- 移除与业务知识无关的固定模板话术,如“本文档最终解释权归某司所有”“翻印必究”等,但需注意这些可能是需要保留的合规内容,视场景决定。
- 去掉小于一定字数的片段(如仅剩一个标题而没有内容的 chunk)。
- 清除文档中的图片、非文本附件描述(可保留图片的替代文字描述)。
3. 去重处理
知识库中经常存在内容完全或高度一致的文档,例如同一份政策被多次上传,或者同一条款出现在多个文档中。如果不处理,检索结果可能被同一信息的不同副本占满,浪费上下文窗口,也可能让回答偏重某一方面。
- 基于文本哈希(如 SimHash)或向量相似度对 chunk 进行聚类,标记重复片段。
- 可以保留较优版本(如更新时间最新的、最完整的),删除其余。
- 也可以将重复片段在检索时后处理去重,但直接入库前处理更节省资源。
4. 处理冲突信息
当多份文档描述同一事物但给出矛盾信息(例如旧版产品手册和新版规格表),系统本身难以自动判断哪份正确。这时需要:
- 通过元数据标注文档的有效时间范围或版本号。
- 在检索阶段,优先选用“最新有效版本”作为上下文。
- 如果可能,在回答中注明信息版本,避免用户单一采纳过时内容。
5. 分块与补充上下文(预处理的一部分)
严格来说,分块属于索引构建,但它和清洗紧密相连。为了让每个 chunk 语义完整:
- 按自然段落、章节划分,避免硬切在中途。
- 对于短小条目(如 FAQ 问答对),保留完整的一问一答。
- 给每个 chunk 附加上下文元信息(如文档标题、章节名),这可以显著提升检索和生成质量。例如将“二、报销流程”前缀到每个相关 chunk 开头。
6.3.3 处理非文本内容的建议
许多企业文档含有大量图表、扫描件图片。彻底解析这些内容往往需要 OCR 或多模态模型,成本较高。实用的做法是:
- 优先处理已有文字的内容。
- 对于关键图表,由人工或自动化生成文字摘要描述,放入对应 chunk。
- 扫描版 PDF 若无法提取文字,先跑 OCR 流程转为文本再进入常规清洗。
6.3.4 清洗原则与尺度把握
清洗不是越“干净”越好,过度清洗可能丢失重要信息。几个经验原则:
- 保留结构:标题、编号、项目符号尽量维持,这些信息对模型理解层次非常重要。
- 不能改变语义:清洗只做格式修正、噪音删除,不可改动词句含义。
- 标记而非丢弃:不确定是否要删除的内容可以先标记,后续由人工审核决定,避免误删。
- 保留回溯能力:记录每个 chunk 的原始文档位置,方便发现错误后回溯源文件修正。
6.3.5 真实处理示例
假设一份《员工考勤制度》PDF,提取到如下片段:
第 3 页 | 公司内部资料
第四章:加班规定
* 工作日加班按小时计算加班费,每小时为日薪的 1.5 倍。
* 休息日加班可安排调休,无法调休的按日薪的 2 倍计发。
清洗后,去除页眉页脚,保留章节标题和列表结构,最终入库的 chunk 类似:
【来源:员工考勤制度 v3.2,第四章】
加班规定:
- 工作日加班:每小时按日薪的 1.5 倍计算加班费。
- 休息日加班:优先安排调休,无法调休则按日薪的 2 倍计发。
这样的 chunk 语义清晰、自包含,检索命中后能给模型提供高质量的回答依据。
6.3.6 维护与迭代
数据清洗不是一次性工作。随着文档更新、新来源接入,需要持续进行:
- 建立清晰的入库处理流水线,自动化常规清洗步骤。
- 对清洗环节的改动保持版本记录,便于回溯。
- 定期抽样检查入库 chunk 的质量,根据问答反馈调整清洗规则。
投入时间做好数据清洗与预处理,后续检索和生成的麻烦会少很多。一位有经验的工程师曾总结:“RAG 项目 80% 的问题出在知识库质量上,而这 80% 里的 80% 又出在预处理没做到位。” 这个说法可能略有夸张,但的确点出了这项工作的重要性。