核心要点

  • 固定长度硬切会无视句子/段落边界,把一个完整语义从中间切断

  • 优先按结构切分:标题、段落、句子等自然边界

  • 递归分割按分隔符层级逐级回退,配合 overlap 减少边界损失

  • 语义分块按相邻句向量相似度在「语义转折点」切,目标是每块语义自洽

标准回答

语义断裂的根因是 按字符/Token 数硬切:到了固定长度就一刀切,完全不管此处是不是句子或段落中间,导致一句话、一个论点被拆到两个块里,两块都语义残缺,嵌入向量失真、召回也对不上。规避思路是「让边界落在语义边界上,并为残留的跨块依赖兜底」。1. 结构感知分块(Structure-aware) 优先按文档自身结构切:先按标题/章节,再按段落,最后按句子边界。保留标题层级,能让块继承所属章节的主题,天然避免跨主题混切。2. 递归分割(Recursive splitting)RecursiveCharacterTextSplitter 这类按分隔符层级递归回退的切法:先尝试用段落分隔符切,块仍超长再退到句号、再退到空格,逐级细化,尽量在「最不伤语义」的边界断开。3. 重叠(Overlap) 相邻块保留 10–20% 重叠,让被边界切断的句子/上下文在下一块里仍有副本,缓解硬边界造成的信息丢失。4. 语义分块(Semantic chunking) 逐句做嵌入,计算相邻句的向量相似度,在 相似度骤降(语义转折) 的位置切块。这样块的边界对齐主题切换点,而非固定长度,能显著降低语义断裂。5. 保留上下文 / 父子块给每个块补充标题、摘要或父文档引用。典型做法是 Parent-Document(小块检索、大块返回):用细粒度小块做精确召回,命中后返回其所属的父段落给 LLM,既保召回精度又保上下文完整。6. Late Chunking 651先对整篇长文档做一次带全局上下文的编码,再在 Token 表示层切块并池化为块向量。每个块向量都携带了来自全文的上下文,缓解了「先切后编码」丢失跨块语义的问题。

落地时通常组合使用:结构感知 + 递归分割定边界,overlap 兜底,再视场景叠加语义分块或父子块,核心目标是 每块语义自洽。

常见误区

⚠️ 常见踩坑

误以为只要把块切小、加大 overlap 就能消除语义断裂。块过小会割裂上下文、加大 overlap 只是冗余兜底而非治本;真正治本是让切分边界对齐语义边界(结构/语义分块),并用父子块为跨块依赖补上下文。

追问

追问 1语义分块(按句向量相似度切)有什么代价?什么场景值得用?

代价是预处理成本高:要对每个句子单独做嵌入并逐对算相似度,索引构建更慢,相似度阈值也需调参。它更适合主题密集切换、结构松散(如访谈纪要、长篇论述)的文档;对本身结构清晰的 Markdown/技术文档,结构感知 + 递归分割往往性价比更高。

追问 2父文档(Parent-Document)检索是怎么兼顾「召回精度」和「上下文完整」的?

它把检索单位和阅读单位解耦:用细粒度小块建向量索引以提高定位精度,命中小块后不直接喂给 LLM,而是回溯返回它所属的父段落(更大的连贯块)。于是匹配靠小块、作答靠大块,既精准又不丢上下文。

追问 3Late Chunking 和普通「先切后嵌入」的本质区别是什么?

普通方式是先把文档切成块、每块独立编码,块向量只看得到块内信息,跨块语义已经丢失。Late Chunking 先对整段长文本做一次编码得到带全局上下文的 Token 表示,再在表示层切块池化,因此每个块向量都「记得」全文上下文,对指代、跨段依赖更稳健。

🔗 相似问题

同一考点的不同问法,面试官可能换着问,一起刷更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习