文档分块策略实验:分块方式对 RAG 效果的巨大影响

谭老师192 阅读

RAG 项目里最容易忽视、但对效果影响最大的一个环节,就是文档分块(chunking)。分块分得好,检索质量直线上升;分得不好,再好的 embedding 也白搭。我把四种分块方式在真实数据上做了对比实验。

四种分块方式

  1. 固定长度分块。每 500 字符切一块。最简单,但会把段落、代码、表格从中间截断,检索出来的片段经常是残缺的。

  2. 递归字符分块。按分隔符优先级切:先按段落

切,段落太长再按 切,再按句子切。这个比固定长度好很多,能保留段落完整性。LangChain 的 RecursiveCharacterTextSplitter 就是这个思路。

  1. 按结构分块。如果文档是 Markdown 或 HTML,按标题层级切分,每块是一个完整章节。对结构化文档效果最好,但要求文档本身有清晰的标题结构。

  2. 语义分块。用 embedding 找语义边界,在语义变化大的地方切分。效果好但对计算资源要求高,适合高质量文档。

实测数据(200 篇技术文档,50 个测试问题):

  • 固定 500 字符:回答准确率 52%
  • 递归切分 + 10% 重叠:准确率 71%
  • 按 Markdown 标题结构切分:准确率 78%
  • 语义分块:准确率 80%

几个关键点

  1. 重叠(overlap)很重要。相邻块之间保留 10-20% 的重叠,能避免关键信息正好在切分边界上被拆散。

  2. 块大小要按内容定。代码为主的文档,块可以大一点(保留完整函数);问答类内容,块小一点更精准。我最后是按内容类型分开配的分块参数。

  3. 标题要带进块里。分块时把章节标题作为前缀带进每一块,这样检索出来的片段自带上下文。比如 "## 安装步骤

第一步……"。这个提升很明显。

  1. 分块后的清洗。空行、多余空格、乱码要清理,不然 embedding 会把这些噪声也编码进去。

总结:别一上来就用默认参数。先看你的文档是什么结构,再选分块策略。结构清晰的用标题切,杂乱的用递归切。

评论0

还没有评论,来抢沙发~