RAG 检索增强快手面经高频字节跳动面经高频RAG文本分块速答 · 约 6 分钟更新 2026-09-28

文档没有标题层级时,分块怎么切?切完剩下的碎块怎么处理?

一句话结论

遇到无结构文本,按段落、句子、固定窗口或语义相似度骤降点依次降级切分。尾部碎块通常向前合并或交由父子索引处理,保证语义自洽,不强求等长。

先这样答

遇到没有标题层级的文档,切分策略遵循从显性边界到隐性语义的降级顺序。首先尝试按段落边界切分,通常以空行作为标识。如果单个段落过长,再降级按句子边界切分,中文环境下主要依靠句号和问号。当自然边界失效或文本完全无结构时,采用固定窗口加重叠的策略,重叠部分保持在百分之十到百分之二十,以维持上下文的连续。对于口语稿、会议记录这类无结构文本,最适用语义切分。具体做法是对句子进行向量化,在相邻句子向量相似度骤降的位置划定话题边界。

对于切分到最后剩下的尾部碎块,目标是保证语义完整而非凑满固定长度。第一种常见处理方案是将小块与相邻块合并,通常是向前合并。这虽然会使最后一个块略微超过目标长度,但能维持语义连贯。第二种方案是保留小块,并将其标注为不完整片段,在检索时依靠父子索引机制回填完整的上下文,父块天然能解决碎片信息缺失的问题。第三种方案是设定一个长度阈值,过短的碎片往往包含较多噪声,可以直接丢弃。

实际操作中,分块的最终目的是让每一块内容语义自洽,块长分布允许存在合理的方差,不需要为了凑满特定长度而跨话题拼接内容。总结来说,处理无结构文档的核心是执行从段落到句子再到语义切分的降级链条,尾块的处理则依赖向前合并或交由父子索引机制。具体的参数和策略选择,需要在评测集上进行对比,而不是凭空设定。

面试官会怎么追问

  • 「一段内容总共一千个 token,chunk size 设为四百,最后剩下两百怎么办?会不会向前补充凑成四百?」 不会为了凑满四百去向前借内容。通常的做法是将这两百 token 直接与前一个块合并,生成一个六百 token 的块,保证这段内容的语义完整性。为了凑数而强行裁剪或拼接,会导致跨话题组合,破坏检索时的语义准确度。
  • 「你提到的语义切分,具体是怎么判断话题边界的?」 会先将文本按句子拆分,用嵌入模型计算每个句子的向量表示。接着计算相邻句子向量之间的相似度,当发现相似度出现骤降时,就认为这里发生了话题切换,以此作为切分边界。
  • 「怎么证明你选的分块策略和重叠比例是合适的?」 分块策略不能靠主观判断,需要在评测集上进行对比。会构建一个包含真实查询和对应文档片段的评测集,将不同切分策略下的文档入库,对比不同策略在检索阶段的召回率等指标来决定最优解。

回答的坑

认为所有切分块必须严格等长,忽略了分块的真正目的是保持语义自洽,允许块长存在合理方差才是正确状态。

对于尾部碎块只知道丢弃或强行独立保留,正确的思路是结合父子索引机制找回上下文,或者向前合并以维持信息完整。

—— 本题完 ——