RAG11 13 分钟

RAG 分块怎么定?先别争 256 还是 512

分块的目标不是把文本切得整齐,而是让一个检索结果既能被准确找到,又能独立支撑一个回答。

原理 实现 边界 追问
问题面试官到底在判断什么
机制系统如何工作
证据代码、指标与取舍
表达30 秒回答骨架

做知识库的第一天,大家最容易争的就是 chunk size:256,512,还是 1024?数字很整齐,问题却没有因此变简单。

先给一个能复述的答案

分块要同时满足结构完整、检索可区分和上下文可用三个条件。优先沿标题、段落、列表、表格和代码边界切分,再用 token 上限兜底;必要时用重叠窗口和父子块补上下文。最终方案要由真实问题集回放决定,不能脱离任务只比较块长度。

一、先按文档结构切,再按长度兜底

把标题层级、章节路径、来源、更新时间写进每个 chunk 的 metadata。这样召回到一段“缓存策略”时,系统还能知道它来自哪个产品、哪一章、哪个版本。

代码和表格不要当普通段落切。代码需要保留函数或类的边界;表格需要把表头和行绑定,否则召回到一行数字,模型根本不知道列名是什么。

二、四种常见策略怎么选

策略适合场景风险
固定长度资料格式混乱、快速起步容易截断语义
递归分割标题和段落层级明显复杂文档仍需清洗
语义分块长文、主题变化明显成本更高,边界需验证
父子块需要精确召回又要保留上下文索引与拼接更复杂

父子块是很实用的折中:小块负责被找到,大块负责给模型补充上下文。注意父块不是无限扩大,超过上下文预算后,补上下文反而会把真正证据冲掉。

三、重叠窗口不是保险丝

重叠能降低边界切断的概率,但会带来重复召回、索引膨胀和上下文浪费。经验上先从较小比例开始,拿“答案跨边界”的问题单独统计,再调整重叠量。不要看到召回漏了一句,就把重叠开到 50%;那只是把问题藏进账单里。

四、用问题集反推分块

为每个问题标记最小充分证据:一个段落、两个相邻段落,还是一张完整表格。然后回放检索,看 top-k 是否同时满足“包含必要前提”和“没有引入冲突版本”。这比单纯看向量分数更接近用户实际体验。

60 秒面试回答

“我们的分块不是固定切 512 token,而是先按标题、段落、代码和表格结构切,再用长度上限兜底。对需要精确召回的大章节采用父子块,小块命中后补父块上下文。我们用真实问题集检查证据完整率、无关内容比例、重复率和最终回答引用准确率,按结果调整 chunk size 和 overlap。”

继续追问

  • PDF 双栏顺序错乱时,分块前怎么处理?
  • 父子块在向量库里如何存储和去重?
  • 表格问答为什么常需要结构化解析而不是纯文本切分?