文档处理与分块策略:RAG 效果的第一道关
文档处理与分块策略RAG 效果的第一道关RAG 效果好不好第一步的文档处理和分块策略影响巨大。文档清洗不干净、分块太大太小、语义被切断都会导致检索不准、答案不完整。这篇讲文档解析、清洗、分块的各种策略以及实际项目里怎么选。大家好我是黒漂技术佬。很多人做 RAG上来就搞向量库、搞大模型调优结果效果一直不好。回头一看最基础的文档分块就没做好——一块里塞了好几个主题或者一句话被切成两半检索能准才怪。文档处理是 RAG 的第一道工序基础不牢地动山摇。这篇讲文档解析、清洗、分块的各种策略以及我做项目时的经验。一、文档解析从各种格式到纯文本常见格式与工具格式推荐工具特点Markdown / TXT直接读最简单格式干净PDF文字版pdfplumber、PyMuPDF能提取排版信息PDF扫描版OCRPaddleOCR、Tesseract先识别文字再处理Word (.docx)python-docx、Unstructured保留标题层级HTML / 网页BeautifulSoup、Trafilatura去广告提取正文PPTpython-pptx提取文字和备注Excel / CSVpandas表格数据特殊处理解析不只是提取文字好的解析不止是把文字抠出来还要保留结构信息标题层级H1/H2/H3知道哪段属于哪个章节列表有序无序列表不要挤成一坨表格表格转文字要保留行列关系代码块技术文档里的代码要完整图片描述有 alt 文本的提取出来这些结构信息对分块和检索都很重要。解析的坑PDF 排版错乱双栏、页眉页脚、脚注提取出来顺序乱扫描版 PDF纯图片必须 OCR网页噪声广告、导航、推荐阅读混进正文格式乱码特殊字符、编码问题二、文档清洗去掉噪声原始文档里有很多没用的东西混进去会影响检索质量。常见清洗操作1. 去重复完全重复的段落删掉页眉页脚每页都有去掉2. 去噪声版权声明、免责声明导航菜单、页脚链接广告、推荐阅读空白行、多余空格3. 格式统一统一换行符多余空格合并特殊字符处理全角半角统一4. 表格处理表格直接转纯文本容易乱。几种处理方式简单表格转 Markdown 表格格式复杂表格拆成行描述每行一段文字数值表格保留结构化数据单独处理清洗的度别洗太狠把有用信息洗没了。比如技术文档里的代码、命令不能当成噪声删了。原则影响理解的噪声去掉有用的格式信息保留。三、文本分块RAG 最关键的一步分块就是把长文档切成一段一段的每段是一个检索单元。为什么要分块Embedding 模型有长度限制比如 bge 最多 512 tokens超长的效果差检索精度一整篇文档一个向量太泛了检索不准上下文窗口有限大模型上下文塞不下太多只取相关的几段分块大小怎么选太大太小都不好分块大小优点缺点适用场景小100-256 tokens检索精准单块语义集中上下文不完整容易断章取义FAQ、短问答中512 tokens平衡精度和完整度-通用场景推荐大1024 tokens上下文完整语义全噪声多检索不准长文档、复杂主题我的经验通用知识库512 tokens 左右重叠 50-100 tokens技术文档、代码可以大一点768 tokensFAQ、产品手册小一点256 tokens先从 512 开始试效果不好再调重叠Overlap两块之间留一部分重叠防止语义被切断Chunk 1: [第1段 第2段 第3段] Chunk 2: [第3段 第4段 第5段] ↑ 重叠部分重叠大小一般是分块的 10-20%。比如 512 的块重叠 50-100 tokens。四、常见分块方法方法 1固定长度分块最简单按字符数或 token 数切到长度就切一刀。fromlangchain.text_splitterimportCharacterTextSplitter splitterCharacterTextSplitter(chunk_size500,chunk_overlap50,separator\n)chunkssplitter.split_documents(documents)优点简单快稳定缺点可能从句子中间切开语义断裂适合格式简单的纯文本。方法 2按语义分隔符分块推荐优先在段落、句子边界切尽量不切断完整语义。fromlangchain.text_splitterimportRecursiveCharacterTextSplitter splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50,separators[\n\n,\n,。,,, ,])分隔符按优先级排先按段落切太长再按行切还长按句子切最后按字切。优点尽量保持语义完整效果好缺点块大小不均匀这是最常用的分块方式一般场景推荐这个。方法 3按标题/结构分块利用文档的标题层级按章节分块。# 第一章 ## 1.1 功能介绍 这一段... ## 1.2 使用方法 这一段...每个二级标题下的内容作为一块或者拆成几块。优点语义天然完整自带标题上下文缺点依赖文档结构格式乱的不行适合结构清晰的文档Markdown、有标题的 Word。方法 4语义分块Semantic Chunking根据语义相似度分块语义变了就切。用 embedding 算相邻句子的相似度相似度骤降的地方切开。优点语义最准确缺点慢要先 embedding成本高适合对质量要求高、文档不太长的场景。方法 5父子分块Parent-Child大块父块存完整语义小块子块用来检索。检索时匹配子块精准返回给大模型用父块完整父块1024 tokens→ 完整上下文 ├─ 子块1256 tokens→ 用于检索 ├─ 子块2256 tokens→ 用于检索 └─ 子块3256 tokens→ 用于检索优点兼顾检索精度和上下文完整缺点实现复杂一点存储量大进阶方案效果提升明显。五、元数据给每个块加标签每个 chunk 不只是存文本还要带元数据{content:这是分块的正文内容...,metadata:{source:产品手册v2.3.pdf,page:15,chapter:第三章 安装部署,category:安装指南,update_time:2026-06-01}}元数据的作用检索过滤只搜某个分类、某个文档的内容答案溯源回答时引用来源用户知道出自哪权限控制不同用户看不同级别的文档更新管理文档更新了对应块重新索引常用元数据字段source来源文件名page/chapter页码/章节category分类update_time更新时间author作者tags标签六、分块策略选择指南场景 1FAQ / 问答库分块方法按问题分每条 FAQ 一个块块大小100-256 tokens特点短而精准检索直接命中场景 2产品手册 / 技术文档分块方法按标题 递归字符分块块大小512-768 tokens特点保留章节结构语义完整场景 3代码文档 / API 文档分块方法按函数/接口分块块大小512-1024 tokens特点一个函数一个块代码完整不切断场景 4长文章 / 研究报告分块方法父子分块 或 语义分块块大小父块 1024子块 256特点兼顾精度和上下文场景 5对话记录 / 客服日志分块方法按会话分多轮对话一个块块大小看对话长度特点上下文关联强不能切断对话七、实际项目经验企业知识库项目的分块方案我做的企业知识库文档类型杂手册、FAQ、技术文档、公告处理流程各种格式解析成 Markdown保留标题层级清洗去页眉页脚、去重复、统一格式按 H2 标题粗分每个章节单独处理章节内用 RecursiveCharacterTextSplitter 细分512 tokens重叠 10%提取元数据来源、章节、分类生成 Embedding存入向量库效果检索召回率比简单分块高 15% 左右答案完整度明显提升很少出现断章取义踩过的坑坑 1表格直接切碎了表格被切成好几块检索到一块也看不懂。解决表格整体作为一个块或者转成结构化描述。坑 2代码块被切断一段代码中间切开上下文全乱了。解决检测代码块整体保留超长的再按函数切。坑 3重叠太少导致断句两块刚好从一句话中间切开检索到了也看不懂。解决重叠加到块大小的 15-20%。坑 4块大小一刀切所有文档都用 512FAQ 太大、长文档太小。解决按文档类型用不同的分块策略。八、本篇小结文档解析不止提取文字结构信息标题、列表、表格很重要清洗去噪声重复、页眉页脚、广告、多余格式分块是 RAG 的关键直接影响检索质量常用分块方法固定长度 → 递归字符推荐 → 按标题 → 语义分块 → 父子分块块大小一般 512 tokens 起步重叠 10-20%元数据不能少来源、分类、章节、时间过滤溯源都靠它不同场景用不同分块策略不要一刀切下一篇讲向量数据库选型与索引优化各种向量库怎么选、索引怎么建、检索怎么加速。我是黒漂技术佬。