Skip to content

RAG 中文档切割的 chunk_size 和 overlap 应该如何设置? ​

  • 标签:RAG、文档切割参数

🏛 业务架构师 ​

chunk_size 与 overlap 的设置,我按"影响—起点值—调优法"讲:

两个参数的作用:chunk_size 决定每块大小(信息密度与检索粒度);overlap(重叠,通常按 chunk_size 的 10%~20%)让相邻块共享边界内容——防止关键句被切断在分界线上("赔偿金额为[切断]元的 30%"这种事故)。

设置的影响:

  • chunk 过大(>800 字):单块语义稀释(一个向量要代表多个主题,检索精度降)、上下文预算浪费(喂一堆无关段落);
  • chunk 过小(<150 字):语义残缺("见上文第 5 条"离开上文就没意义)、召回碎片化(模型拿到的证据不完整);
  • overlap 过小:边界信息丢失;过大(>30%):索引膨胀、重复召回浪费上下文。

起点值(经验默认):中文 300~500 字、overlap 10%~15%;FAQ/条款类可整条入库(不切);表格整表为块。

怎么调优(数据驱动,不是拍脑袋):

  1. 按文档类型分组做 A/B:同评测集对比 300/500/800 三档 size 的命中率与忠实度;
  2. badcase 归因:"检索到了但答案用不上"→ 块太大(噪声多);"检索不到完整信息"→ 块太小(语义碎);
  3. 父子分块解耦这个矛盾——小块检索(准)+大块送模型(全),两全其美,是知识库问答的首选。

业务提醒:没有全局最优参数——制度手册按条款切、技术文档按章节切、聊天记录按主题切;切分参数要与 Embedding 模型的最优输入长度对齐(看模型卡的建议区间)。先跑起来,用评测集迭代,别在第一天纠结三天参数。

🏗 系统架构师 ​

chunk_size 与 overlap 的设置是"语义完整性 × 检索精度 × token 成本"的三角权衡:

chunk_size(核心块大小):

  • 太大(>1000 token):单块语义稀释(一段里多个主题,向量被平均)→ 检索精度降;进上下文浪费 token(要的是块里的三句话却塞了整块);
  • 太小(<100 token):语义破碎(句子拦腰断)→ 召回的块缺上下文,模型看得懂词看不懂义;块数量暴涨(索引与检索成本升);
  • 经验带:256~512 token(中文 400~800 字)是通用甜点;结构化文档按语义单元(小节/段落)而非固定长度切——结构感知 > 固定长度;表格/代码独立通道特殊处理(代码按函数切)。

overlap(相邻块重叠):

  • 作用:缓解边界断义——跨块的关键句子在两块中至少一块完整;
  • 经验值:10~20% 的 chunk_size(如 512 token 块配 50~100 重叠);过大的 overlap = 召回重复块(Top-K 里同一内容出现两次,浪费预算)+ 索引膨胀;
  • 前提:有 overlap 说明是固定长度切分——若已用结构感知切分(标题边界),overlap 价值大减。

调优方法论(数据驱动):不同 size/overlap 组合(如 256/64、512/64、512/100)× 金标集 → 对比 recall@K 与端到端 faithfulness——没有普适参数,语料类型(FAQ/手册/代码)决定最优值;父子块策略(小块检索大块供给)可解耦这对矛盾,是比调参更架构化的解法。

💻 全栈开发专家 ​

chunk_size 和 overlap 没有万能值,但有确定的调法(方法论+经验区间):

chunk_size 的影响与经验区间:

  • 太大(>1024):向量语义被稀释(一段含 5 个主题,检索命中了但相关性分数低)、塞进 prompt 的 token 成本高;
  • 太小(<128):语义不完整(半句话召回了,模型拼不出事实)、上下文碎片化;
  • 经验区间 256~1024 token,且和 Embedding 模型挂钩——模型最优输入区间(bge-m3 支持 8192 但最优在几百)是主要参考;FAQ 类按问答对整条、条款类按条款、代码按函数,别硬切。

overlap 的作用与设置:

  • 防「语义被边界腰斩」——关键句跨块断开时两块都不完整;
  • 经验值 10%~20%(512 的块配 64~128);
  • 太大浪费存储和检索位(重复内容互相挤占 top-k),纯浪费。

怎么定(正确姿势,三步):

  1. 按文档类型给初值:手册类 512/64;条款类按结构切;对话日志按轮次;
  2. 评测驱动调优:建 50+ 条 golden set,对比 {256, 512, 1024} × overlap {0, 10%, 20%} 的 recall@5——语料说了算,别人博客的参数只是起点;
  3. 进阶方案绕开这个两难:父子块(small-to-big)——小块(128)负责检索命中、父块(1024)负责上下文完整,比调参数更本质地解决「检索要准 vs 上下文要全」的矛盾。

相关联别漏调:chunk_size 与 top-k 耦合(5 个 1024 块 ≈ 15 个 256 块的信息量,总 token 预算恒定);改 Embedding 模型后最优 chunk 可能变,重调。