跳到正文

分块策略怎么影响检索?

RAG 系统中 chunking 的考量因素与常用方法

原题:在构建RAG或文本处理系统时,如何进行有效的文本分块(chunking)?请讨论不同的分块策略和考量因素

文档处理 · 百度真题

30 秒回答

  1. 分块策略类型(固定长度、滑动窗口、语义分块等)及适用场景
  2. 分块大小的权衡(粒度vs语义完整性)
  3. 边界处理策略(句子/段落保持)
  4. 实际工程中的考量因素(计算成本、检索效果、下游任务)

回答与解析

答案要点

  • 分块策略类型(固定长度、滑动窗口、语义分块等)及适用场景
  • 分块大小的权衡(粒度vs语义完整性)
  • 边界处理策略(句子/段落保持)
  • 实际工程中的考量因素(计算成本、检索效果、下游任务)
  • 百度场景下的特殊优化(中文分词、长文档处理)

核心分块策略

1. 固定长度分块

  • 按token数或字符数硬切分(如512 tokens)
  • 优点:简单、对齐向量索引、便于批处理
  • 缺点:可能切断语义,边界信息丢失

2. 滑动窗口分块

  • 把零重叠、短窗口和较长窗口作为候选,用同一评测集比较边界证据完整率、召回与成本
  • 保证上下文连续性,减少边界效应
  • 代价:存储和计算成本上升

3. 语义分块(推荐)

  • 基于句子/段落边界切分,保持语义完整
  • 可用NLP工具(spaCy、NLTK)或模型判断语义边界
  • 中文场景需特别注意:按标点切分优于按字符切分

4. 结构化分块

  • 按文档结构切分:标题→章节→段落
  • 适合PDF、Markdown等结构化文档
  • 保留层级元信息,支持多级检索

关键考量因素

维度 权衡点
粒度 小块(100-300)检索精准但碎片化;大块(1000+)语义完整但噪声多
Embedding模型 匹配模型最大长度(如text-embedding-ada-002是8191,但有效信息通常在前512)
检索阶段 粗排用大chunk保召回,精排用小chunk保精准
计算成本 分块数直接影响向量库规模和推理延迟
业务场景 问答场景倾向小chunk;摘要/分析场景倾向大chunk

百度场景的特殊实践

  • 中文优化:基于LTP/Jieba做句子切分,避免英文空格切分的陷阱
  • 长文档处理:论文/报告类采用"摘要+正文"双层分块,先检索章节再定位细节
  • 动态分块:根据内容类型自适应调整(代码块保留完整、正文按段落切分)

实际建议:从固定长度+滑动窗口快速验证,再逐步引入语义分块优化。

口语版讲法(约4分钟)

  • RAG分块本质是信息密度与语义完整性的取舍
  • 三种主流策略的适用边界
  • 业务场景驱动的分块设计
  • 落地风险与混合策略
  • 延伸点:动态分块与多级检索

这道题其实问的是,在RAG系统里,怎么把文档切成合适的小块,既让检索能精准命中,又不把语义切碎。说白了,就是信息密度和语义完整性之间的取舍。

先说几种常见的分块策略,以及它们各自该在什么场景用。固定长度分块,就是按token数硬切,比如512个token一段。好处是简单,向量索引对齐也方便,但问题很明显,可能一句话被拦腰切断,检索时上下文就丢了。滑动窗口分块会让相邻块保留一部分重叠,可能减少边界信息丢失,但代价是存储、计算与去重成本上升。窗口大小仍应作为候选变量,用同一评测集比较后再定。真正落地的话,这两种其实更适合英文或者短文本场景,中文用它们很容易出问题。

语义分块是我更推荐的,就是按句子或段落边界切,保持语义完整。中文场景里,用标点符号切分比按字符切分靠谱得多,因为中文不像英文天然有空格。举个例子,客服退款场景里,用户问“我的退款为什么还没到”,如果切块把“退款”和“还没到”分到两段,检索召回就偏了。用语义分块就能保证整句在一起,匹配更准。

结构化分块适合有层次结构的文档,比如PDF或Markdown,按标题、章节、段落来切,保持层级信息。这样检索时可以先定位章节,再找细节,效率高。

这里有个关键权衡:分块粒度。小块比如100-300 token,检索精准但容易碎片化,适合问答;大块比如1000+ token,语义完整但噪声多,适合摘要或分析。具体用多大,得看下游任务和Embedding模型的最大长度。比如text-embedding-ada-002虽然支持8191 token,但有效信息往往在前512,切太大反而浪费。

实际工程里,我通常不会只用一种策略。比如处理企业SOP文档,我会先用结构化分块按章节切,再对每个章节用语义分块按段落切,这样既保留了文档结构,又保证了段落语义完整。检索时粗排用大块保召回,精排用小块保精准,配合Rerank效果更好。

落地风险也很明显。前提是分块策略要和检索方式匹配。如果只做向量检索,语义分块比固定长度好;但如果混合了BM25关键词检索,固定长度分块反而可能因为词频统计更均匀而表现更好。常见失败场景是,分块切得太碎,导致检索时上下文丢失,生成结果出现Hallucination。上线我会特别关注分块数对向量库规模和推理延迟的影响,分块数太多,检索延迟会飙升。

另外,我现在比较关注动态分块,就是根据内容类型自适应调整。比如代码块保留完整,正文按段落切,甚至用模型判断语义边界。这个方向如果能做好,能进一步减少人工调参的工作量。

所以整体上,我更倾向从固定长度加滑动窗口快速验证,再逐步引入语义分块优化,最后根据业务场景做定制。

关键一句:动态分块根据内容类型自适应调整策略

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你在做电商客服的RAG系统,用户问‘这款手机怎么样’,系统需要从产品手册中找答案。但手册很长,你打算怎么把文档切成合适的片段,让检索又快又准?

  2. 问法 2 · 层层追问

    做RAG的时候文本分块你会怎么处理?……如果直接按固定长度切,可能会切断句子,有什么改进?……那有没有办法让分块更智能,比如保持语义完整?

  3. 问法 3 · 直球架构

    聊一下文本分块策略。从固定长度、滑动窗口到语义分块,你怎么选?考虑哪些因素?比如分块大小、边界处理、计算成本,还有中文场景的特殊性。

同模块相关题目