RAG 分块多大合适?固定长度 vs 按标题 vs 语义分块,我拿同一份文档实测了一组数据
直接给结论:没有万能 chunk size,但对结构化的产品/技术文档,按标题(Markdown 标题层级)分块在我这组测试里综合表现最好,固定长度最差,语义分块召回最高但贵且慢。下面是数据。
测试是怎么搭的
我手头有份内部产品手册,约 4.2 万字,标题层级清晰(一级到三级),混了表格和代码块。我想给它建个问答机器人,但纠结分块策略,干脆做了组对比。
搭机器人这事我没写代码,用的那种拖拽配置就能接知识库的智能体平台,知识库的分块方式可以选,正好拿来当实验台。我准备了 30 个真实问题(从客服历史里抠的),人工标好每个问题对应文档里哪几段是标准答案。
评测指标三个:
-
命中率:检索回来的 chunk 里,包含标准答案的比例。
-
答案完整度:人工打分,答案是否被切碎(1-5 分)。
-
平均检索 token:召回内容塞进上下文的平均 token 量,关系到成本。
三种分块跑下来的数据
同一份文档、同一组 30 题,只换分块方式:
|
分块策略 |
chunk 大小 |
命中率 |
完整度(均分) |
平均检索token |
备注 |
|---|---|---|---|---|---|
|
固定长度 |
256 字 |
63% |
2.8 |
480 |
答案经常被切两半 |
|
固定长度 |
512 字 |
78% |
3.6 |
720 |
比 256 好但表格被切烂 |
|
固定长度 |
512 字 + 重叠50 |
81% |
3.8 |
790 |
重叠救回一部分切断 |
|
按标题分块 |
按二/三级标题 |
89% |
4.4 |
650 |
语义边界天然完整 |
|
语义分块 |
嵌入相似度切 |
91% |
4.3 |
880 |
召回最高,建库慢且贵 |
几个比数字更值钱的观察
固定长度 256 字是真的不行。 命中率 63%,而且因为太短,一个完整的操作步骤会被拦腰切断,检索回来半句话,模型只能瞎补。别图省事用小固定值。
重叠(overlap)确实有用,但治标。 512 字加 50 字重叠,把被切断的句子救回来一些,命中率从 78% 提到 81%。代价是 token 涨、内容冗余。能用结构分块就别靠重叠硬扛。
按标题分块的性价比最高。 我这份文档标题规整,按二三级标题切,每块天然是一个完整语义单元——一个功能点、一段步骤。命中率 89%,token 还比固定 512 低,因为没那么多冗余。但前提是你的文档真有规整的标题层级,那种一篇到底没小标题的散文,这招直接失效。
语义分块召回最高,但我没全量上。 命中率 91% 确实漂亮,可它建库时每段都要算嵌入再决定切点,4 万字的文档建库等了挺久,更新一次重切一次。我们文档周更,算下来不划算。最后只在那份几乎不变的"API 参考"上用了语义分块,周更的手册用按标题。
我最后的选法
不是选一个用到死,是按文档类型分:
-
有清晰标题层级的(手册、Wiki)→ 按标题分块。
-
几乎不更新、要求高召回的(API 文档、法规)→ 语义分块。
-
实在没结构的纯文本 → 固定 512 + 50 重叠,将就。
还有个没测进去的变量是表格。表格被任何按字数的策略切都会烂,我后来是把大表格单独拎出来转成"每行一条问答"再入库的,这个另说。
底层模型和向量化我用的是讯飞 MaaS 提供的现成接口,模型即服务,没自己搭嵌入服务和推理机。
你们 RAG 的 chunk size 一般定多少?有没有上过更细的动态分块、效果如何,评论区甩数据。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)