2. 数据处理流水线
"数据质量是 RAG 系统性能的基石。 垃圾进,垃圾出。" — 机器学习基本原理
本章探讨 RAG 系统的完整数据处理流水线,重点关注处理逻辑、问题解决方法和架构决策,而非实现细节。
2.1 数据处理流水线简介
为什么数据处理很重要
在实际的 RAG 应用中,80% 的开发工作量花在数据处理上,只有 20% 花在检索和生成上。这是因为:
- 原始数据是杂乱的:真实文档格式多样、包含噪声、缺乏结构
- 检索质量取决于分块:糟糕的分块会导致不相关或碎片化的上下文
- 元数据实现高效过滤:没有适当的元数据,每个查询都需要昂贵的向量搜索
- Embedding 成本会累积:处理数百万文档需要优化策略
端到端流水线
2.2 Document Loading
Multi-Format Support
Spring AI Reader Architecture:
Spring AI provides a unified DocumentReader interface with multiple format-specific implementations:
public interface DocumentReader {
List<Document> read(String resource);
}
| Format | Reader | Pros | Cons | Best For |
|---|---|---|---|---|
| PagePdfDocumentReader | 表格提取好 | 复杂布局较差 | 学术论文、报告 | |
| Markdown | MarkdownDocumentReader | 结构保留好 | 简单 | 技术文档、博客 |
| HTML | JsoupDocumentReader | 清理标签好 | 可能丢失语义 | 网页、博客 |
| DOCX | ApacheTikaDocumentReader | 格式全面 | 需要额外依赖 | Word 文档 |
| JSON | JsonDocumentReader | 结构化 | 仅限 JSON | API 响应、配置文件 |
| TXT | TextDocumentReader | 简单 | 无结构 | 纯文本日志 |
Spring AI Implementation
@Service
public class DocumentLoadingService {
private final PagePdfDocumentReader pdfReader;
private final MarkdownDocumentReader markdownReader;
private final JsonDocumentReader jsonReader;
public DocumentLoadingService(
PagePdfDocumentReader pdfReader,
MarkdownDocumentReader markdownReader,
JsonDocumentReader jsonReader
) {
this.pdfReader = pdfReader;
this.markdownReader = markdownReader;
this.jsonReader = jsonReader;
}
public List<Document> loadDocuments(String path) {
String extension = getFileExtension(path);
return switch (extension.toLowerCase()) {
case "pdf" -> pdfReader.read(path);
case "md", "markdown" -> markdownReader.read(path);
case "json" -> jsonReader.read(path);
default -> throw new UnsupportedOperationException(
"Unsupported format: " + extension);
};
}
private String getFileExtension(String path) {
return path.substring(path.lastIndexOf(".") + 1);
}
}
2.3 Data Cleaning
噪声类型与清洗策略
| 噪声类型 | 描述 | 影响 | 解决方案 |
|---|---|---|---|
| 编码错误 | @, → 正常的字符映射错误 | 导致 Token 刭碎 | 编码规范化(UTF-8) |
| HTML 标签残留 | HTML 标签未被完全移除 | 影响语义质量 | 正则/解析器清理 |
| 特殊字符 | ASCII 0-31 中的控制字符 | 影响 Token 化 | 正则移除 |
| 额外空白 | 多个空格/制表符 | 役响分块质量 | 空白规范化 |
| 样板文本 | "Copyright 2024..." | 影响嵌入质量 | 基于模式的移除 |
| 格式不一致 | 日期格式、缩写不统一 | 妨碍元数据过滤 | 规范化处理 |