人人都会AI编程

14.1 分块优化

更新时间:2026-07-12

分块(chunking)是 RAG 系统中承上启下的关键环节。它直接影响检索精度、上下文完整度以及最终回答的质量。分块策略没有“万能公式”,需要根据文档类型、问题特点和模型上下文窗口来综合权衡。本节从实践经验出发,梳理分块优化的核心原则与常见做法。

1. 分块的核心矛盾:完整性与精确性

分块时始终面临一对矛盾:

  • 块太小(如一两句话):检索时相关性判断更精准,但容易丢失上下文,导致生成答案时信息不完整,甚至出现断章取义。
  • 块太大(如整页甚至整篇):上下文完整,但检索时可能因为包含过多无关内容而降低相似度评分,且当多个长块被拼入提示时,容易超出模型上下文窗口限制。

优化的目标,是在这两者之间找到一个平衡点,使得检索到的片段既能独立构成完整的语义单元,又不携带过多噪声。

2. 常见分块方式及适用场景

按固定长度分块(基于 token 数或字符数)

  • 做法:设定每个块的最大 token 数(如 256、512),按顺序切割,可加上重叠区域(overlap)。
  • 优点:实现简单,适合大多数纯文本语料。
  • 缺点:容易在句子中间切断,破坏语义完整性。
  • 适用场景:文档结构简单、主要是段落式叙述,如新闻、博文、一般性说明文档。

按语义边界分块

  • 做法:以段落、句子为边界,保证每个块是一个完整的意思单元。可以借助句子分割模型或简单的换行、句号规则。
  • 优点:保留了自然的语言边界,上下文更完整。
  • 缺点:块的长度不均匀,个别段落可能过长或过短。
  • 适用场景:结构化较好的文档(如手册、规章制度、学术文章),其中段落本身就是自包含的信息单元。

按文档结构分块

  • 做法:基于文档特有的结构标记,如标题层级(Markdown 的 #、##)、表格、列表、分页符等,按章节或节来切分。
  • 优点:每个块通常是一个完整的主题单元,天然适合溯源(可直接引用章节标题)。
  • 缺点:依赖文档格式,预处理成本较高。
  • 适用场景:技术文档、产品说明书、法律条款等结构清晰的资料。

混合策略

  • 做法:优先按结构切分,若某章节太大,再降级为按段落或固定长度切分。
  • 优点:结合多种方式的优势,兼顾语义完整性和长度控制。
  • 典型实践:先按一级标题切分,若某部分超过 N 个 token,再以段落为单位切分,段落之间保留少量重叠。

3. 重叠窗口(overlap)的设置

重叠是指在相邻块之间保留一部分重复内容。例如每个块 512 token,重叠 64 token。

  • 为什么需要重叠:防止检索时关键信息被切到两个块的边界而丢失匹配,尤其是在按固定长度切分时。
  • 设置建议:重叠大小通常设置为块长度的 10%–20%。不宜过大,否则会增加索引冗余和检索时的信噪比。
  • 真实案例:在密集的技术文档中,将重叠设为 50–100 token,能显著减少因切分导致的关键词漏检。

4. 元数据标注:分块不可遗忘的一步

分块时,务必保留或生成丰富的元数据,并和向量一同存储:

  • 来源标识:文档名、路径、版本号。
  • 位置信息:章节标题、页码、段落序号。
  • 时间戳:文档创建或修改时间(用于时效性控制)。
  • 自定义标签:如文档类型(政策/技术/营销)。

这些元数据在生成时可以用来提供出处,也能在高级检索时作为过滤条件(如只搜索某段时间内的文档)。

一个实际操作示例

在处理《员工手册 v3.2》时,为每个块附加 source: 员工手册_v3.2.pdfsection: 考勤制度page: 12。当助手回答年假相关问题时,能够输出“根据《员工手册 v3.2》‘考勤制度’章节……”。

5. 分块优化中的调试思路

分块策略的优劣,最终要通过检索和生成效果来评判。可以从以下方面入手调试:

  • 检索命中率测试:准备一组标准问题,人工检查检索返回的块是否真正包含答案。如果大量命中块遗漏了关键信息,可能块太小或重叠不够;如果返回的块内容庞杂、相关性低,则块可能太大。
  • 生成质量观察:分析失败案例的回答,判断是检索未命中,还是命中了但因上下文不足导致生成错误。后者常指向分块缺少完整上下文。
  • 动态分块与静态分块的对比实验:对于结构复杂的文档集,可以对比“仅按长度分块”和“按标题+段落分块”的效果,用最终回答的准确率作为评价指标。

6. 工具与自动化辅助

  • 通用文本分割器:如 LangChain 提供的 RecursiveCharacterTextSplitter,能优先按段落、换行、空格、字符的顺序递归切分,并支持重叠控制,适合大多数文本。
  • 文档格式解析库:如 PyPDF2python-docxmarkdown 解析器等,用于提取结构信息(目录、标题等),供定制化分块使用。
  • 语义分块探索:部分团队会训练一个轻量级分类器,判断两句是否属于同一主题,以实现更智能的语义边界划分,但这通常在没有明确结构且内容混杂的语料中才会使用。

7. 注意事项

  • 不要过度优化:在大多数场景中,一个简单的按段落分块(500 token 左右,重叠 50 token)就能取得不错的效果。先跑通基线,再根据问题迭代调整。
  • 与检索策略协同:分块大小还应与 embedding 模型擅长处理的文本长度匹配(常用模型通常适合 512 token 以内的输入)。同时,也要考虑生成模型上下文窗口能容纳多少块。
  • 版本管理与更新:文档更新时,若分块方式发生变化,旧索引可能无法直接替换,需计划好重建索引的流程和时机。

分块优化看似基础,却是决定 RAG 系统检索命中率和生成完整性最重要的前处理步骤。花少量时间分析文档特点、设计合理的分块策略,往往能带来远大于模型调优的收益。