切分策略:四种切法,实测差 30 个百分点
按结构切 10/10,按行切 7/10——切分是 RAG 的第一道分水岭
RAG 的第一步就能决定成败:你的文档怎么切成块。
很多人随手写个"每 500 字切一刀"就过去了。这一节用实测告诉你这一刀的代价:同一份文档、同一套问题,按结构切能到 10/10,按行切只有 7/10——30 个百分点的差距,只因为切法不同。
把一本菜谱剪成小卡片方便查阅。按菜名剪,每张卡片是一道完整的菜;按尺子每 10 厘米剪一刀,可能把"盐 3 克"和"糖 5 克"剪到两张卡上——查的时候只拿到半份配方。
块的边界,决定了你检索回来的是"完整信息"还是"半句话"。
四种切法,一份实测
同一份店铺制度(5 个章节),10 个问题,都取 top-3:
【按结构切(【标题】分段)】块数 5,平均 107 字
检索命中率 10/10 (100%) 回答准确率 10/10 (100%) ← 最佳
【定长切 120 字(无重叠)】块数 5,平均 108 字
检索命中率 10/10 (100%) 回答准确率 9/10 (90%)
【定长切 120 字(重叠 40)】块数 7,平均 112 字
检索命中率 10/10 (100%) 回答准确率 10/10 (100%) ← 重叠救回了那 1 分
【按行切(最细)】块数 17,平均 28 字
检索命中率 7/10 (70%) 回答准确率 9/10 (90%) ← 最差
三条能带走的规律
① 按结构切 > 按长度切。 文档天然有结构(标题、章节、条款、Q&A 对),顺着结构切,每块都是语义完整的。这是最省事也最有效的一招——先看看你的文档有没有结构可用,有就别自己发明切法。
② 重叠(overlap)能救回被切断的信息。 定长切 120 字无重叠时丢了 1 分,加 40 字重叠后回到满分。原理:每块和前一块共享一段内容,即使一句话被切断,总有一块包含完整版。代价是块数变多(5→7)、存储和检索成本上升。
③ 切太细会毁掉检索。 按行切只有 28 字一块,命中率掉到 7/10。原因很实在:块太短,信息量不足以和问题匹配——"退款在收到退货并验收后 3 个工作日内原路退回"这一行,和问题"退款多久到账"的字面重合度太低,分数排不进 top-3。
注意一个反直觉现象:按行切的检索只有 7/10,回答却有 9/10——因为 top-3 里就算没有"正确来源",也可能有相邻的相关行,模型连蒙带猜答对了。这正是 4.4 要讲的:回答准确率会掩盖检索的问题。
怎么给你的文档定切分策略
| 你的文档 | 建议切法 |
|---|---|
| 有清晰标题/条款(制度、手册、API 文档) | 按结构切,一节一块 |
| 长文无结构(会议记录、访谈、文章) | 定长切 + 10-20% 重叠 |
| 天然成对(FAQ、问答记录) | 一问一答一块 |
| 表格类 | 按行切但每块带上表头(否则块里全是数字没有含义) |
| 代码 | 按函数/类切,别按行 |
块大小的经验起点:300-800 字。太小信息不足(实测 28 字惨案),太大则一次塞进太多无关内容(浪费 token,还可能稀释重点)。但一定要用你自己的评测集测——这一节的实验脚本可以直接改。
🔧 动手做:给你的文档找最优切法(15 分钟)
- 跑本节代码
rag_pipeline.py,看四种切法的对比。 - 换成你的文档和问题:把
DOC换成你毕业方向真实的资料(至少 2000 字),EVAL换成 10 个真实问题 + 标准答案。 - 跑一遍四种切法——你的文档哪种最好?和我的结论一致吗?
- 试块大小:把定长切的
size改成 60 / 120 / 300 / 600,各跑一次,找到你文档的拐点。 - 记下你的配置:切法 + 块大小 + 重叠比例,以及对应的检索命中率。
✅ 做到这里你应该有:你自己文档的最优切分配置 + 一张四种切法的对比数据。
为什么:切分是 RAG 里最便宜的优化——不花一分钱调用费,改几行代码,实测能差 30 个百分点。而且它是所有后续优化的地基:块切错了,再好的检索模型也捞不出完整信息。
一个常见事故:把"【会员制度】年费会员 199 元/年"切成两块,第二块只剩"年费会员 199 元/年"——检索时它和"会员费多少"匹配上了没问题,但如果文档里还有"【企业客户】年费 1999 元/年",两块长得几乎一样,模型无法分辨。
解法:每块带上它的"路径"——比如给每块前面加上所属章节标题("会员制度 > 年费会员 199 元/年")。这一招在长文档、多层级文档里能显著提升检索准确度,成本几乎为零。
我的知识库文档是【类型:制度/FAQ/长文/表格/代码】,大致结构是【描述】,总量约【多少字】。请帮我:1) 推荐切分策略和块大小(说明理由);2) 要不要重叠、多少;3) 每块要不要带章节标题等上下文锚点;4) 写出对应的切分代码(Python)。
切分三规律:按结构切最优(10/10)、定长切要加 10-20% 重叠、切太细毁检索(7/10);块大小从 300-800 字起步,用自己的评测集调。
下一节揭开"检索"的神秘面纱:把文本变成向量、比余弦相似度——这一节的代码手写了全过程,一共不到 20 行,你会发现它比想象的简单得多。
🔎 来源与核验· 1 条,点开核对
