RAG 的文档处理流程是怎样的?
- 标签:后端、编程导航
🏛 业务架构师
我的文档处理流水线五步,每步都对齐一个业务目标:
- 加载(Extract):多格式接入(Markdown/PDF/HTML/Docx)——PDF 的表格与图文混排是重灾区,抽取器选型直接设定了知识质量上限;
- 清洗(Transform):去页眉页脚、去乱码、统一编码、合并断行——噪声文档=噪声答案,这步的 ROI 常被低估;
- 切分(Split):按文档类型差异化——FAQ 按"问答对"整块切(拆散问答等于毁掉语义单元)、操作手册按章节标题切、长文按 512 token 滑窗(10% 重叠保上下文连续);
- 元数据(Enrich):自动标注关键词、来源、更新时间、分类——支撑检索过滤、权限隔离、时效判断("2024 年的政策"这类问题靠元数据路由);
- 入库(Load):Embedding 批量向量化写入。
业务视角我最强调的两点:
- "垃圾进垃圾出"是 RAG 第一定律:模型再强也救不了切坏的语料。我建库前先做语料质量评审(抽样人工看切分效果),比事后调检索算法有效十倍;
- 流水线要可重跑:切分策略调整、Embedding 模型升级都需要全量重建——所以每一步设计为幂等的批处理任务,源文档版本化管理。RAG 不是建完就完的项目,是持续运营的知识资产——文档在变、业务在变,流水线不变就是慢性死亡。
一句话:文档处理流程的价值公式 = 切分质量 × 更新时效 × 权限可控,三个乘数任何一个为零,整个知识库就是零。
🏗 系统架构师
RAG 文档处理流水线我按数据流顺序讲:Load → Transform → Enrich → Embed → Store。
1. 加载(Load):DocumentReader 按格式读取——TikaReader(PDF/Office/HTML 通用)、TextReader、JSON/Markdown Reader;大文件流式处理,扫描件 PDF 需 OCR 前置(Tika 不做 OCR,接 Tesseract)。产出 Document(内容 + Metadata)。
2. 切分与转换(Transform):
- 切分策略是效果第一变量:TokenTextSplitter 固定 token 窗口(默认 1000/400 overlap);更优做法是结构感知切分——按标题/段落/代码块边界切,保证 chunk 语义完整;
- 参数经验:chunk 500~1000 token、overlap 10~20%;太短检索准但上下文碎,太长召回粗但信息全,按验收集调优;
- 表格处理:转 Markdown 保结构,或表格整体成 chunk。
3. 元数据富化(Enrich):注入来源文件、章节路径、时间;LLM 自动摘要/关键词标注(MetadataEnricher)——为混合检索过滤与溯源服务。
4. 向量化(Embed):EmbeddingModel 批量转换;批处理(一文档多 chunk 一次调用)控制 API 成本与限流。
5. 存储(Store): VectorStore 写入向量 + chunk 原文 + 元数据;建立"文档 → chunk"关联(doc_id 外键),支持按文档删除更新。
工程要点:全流程做成异步任务(消息队列驱动),文档解析与 embedding 都慢(分钟级),进度落库可观测;失败重试与断点续传(按 chunk 记录状态)——这条流水线本质是个小型数据工程管道,可靠性与可观测性按 ETL 标准建设。
💻 全栈开发专家
我的处理流水线五步,每步都有参数细节:
1. Load(解析):TikaDocumentReader 通吃 pdf/docx/html/txt;扫描版 PDF 是图片,要接 OCR(PaddleOCR)先转文本——这是最容易"文档进去了但检索不到"的根因,上线前用样例文档回归验证。
2. Clean(清洗):去页眉页脚、目录、水印、连续乱码;PDF 表格用表格感知解析(否则表格变一串无意义文字,检索命中率暴跌)。
3. Split(切分):
java
TokenTextSplitter splitter = TokenTextSplitter.builder()
.withDefaultChunkSize(600) // 每块约 600 token
.withMinChunkSizeChars(200)
.withOverlap(20) // 块间重叠,避免关键句被切断
.build();经验值:500~800 token + 10~20% overlap;同时把章节标题、来源文件名写进 metadata,检索时能按结构过滤。
4. Enrich(增强):KeywordMetadataEnricher 提取关键词;有条件再加 SummaryMetadataEnricher(对长文档生成每节摘要块,专供粗召回)。
5. Embed & Store:批量向量化(20 条/批)入 PGVector。
验证闭环(别人常漏的):准备 30~50 条"问题-应命中文档"的黄金测试集,每次调整切分/参数跑一遍 recall@5,用数据决策——RAG 效果优化不靠感觉,靠回归集。