文档分块策略实验:分块方式对 RAG 效果的巨大影响
谭谭老师192 阅读
RAG 项目里最容易忽视、但对效果影响最大的一个环节,就是文档分块(chunking)。分块分得好,检索质量直线上升;分得不好,再好的 embedding 也白搭。我把四种分块方式在真实数据上做了对比实验。
四种分块方式:
-
固定长度分块。每 500 字符切一块。最简单,但会把段落、代码、表格从中间截断,检索出来的片段经常是残缺的。
-
递归字符分块。按分隔符优先级切:先按段落
切,段落太长再按 切,再按句子切。这个比固定长度好很多,能保留段落完整性。LangChain 的 RecursiveCharacterTextSplitter 就是这个思路。
-
按结构分块。如果文档是 Markdown 或 HTML,按标题层级切分,每块是一个完整章节。对结构化文档效果最好,但要求文档本身有清晰的标题结构。
-
语义分块。用 embedding 找语义边界,在语义变化大的地方切分。效果好但对计算资源要求高,适合高质量文档。
实测数据(200 篇技术文档,50 个测试问题):
- 固定 500 字符:回答准确率 52%
- 递归切分 + 10% 重叠:准确率 71%
- 按 Markdown 标题结构切分:准确率 78%
- 语义分块:准确率 80%
几个关键点:
-
重叠(overlap)很重要。相邻块之间保留 10-20% 的重叠,能避免关键信息正好在切分边界上被拆散。
-
块大小要按内容定。代码为主的文档,块可以大一点(保留完整函数);问答类内容,块小一点更精准。我最后是按内容类型分开配的分块参数。
-
标题要带进块里。分块时把章节标题作为前缀带进每一块,这样检索出来的片段自带上下文。比如 "## 安装步骤
第一步……"。这个提升很明显。
- 分块后的清洗。空行、多余空格、乱码要清理,不然 embedding 会把这些噪声也编码进去。
总结:别一上来就用默认参数。先看你的文档是什么结构,再选分块策略。结构清晰的用标题切,杂乱的用递归切。
评论0
还没有评论,来抢沙发~