Skip to content

切分与检索策略深挖

RAG 的天花板由检索决定——「检索不到 / 检索不准」时,再强的生成模型也无能为力。本文系统拆解切分(chunking)与检索两个环节的全部主流策略,从固定切分到 2025 年的 LLM 自适应切分、late chunking、contextual retrieval,每种都给出原理、适用场景与取舍。基础流程见 RAG 基础

一、为什么切分这么关键?

切分决定了「检索的基本单位」。切错会同时伤害检索和生成:

  • 切太大:一个 chunk 混入多个主题,向量被「平均」得语义模糊,检索命中率下降;送进上下文还浪费 token、引入噪声。
  • 切太小:语义被割裂(一句话的主语和宾语分到两块),单独看缺乏上下文,检索到了也不完整。
  • 切错边界:把一个完整论述从中间劈开,两半都不可用。

一句话:chunk 是检索的原子,原子划分错了,后面全错。 有研究显示,按逻辑主题边界自适应切分相比固定大小切分,在某些任务上准确率可以从个位数提升到八成以上——切分策略的影响被严重低估。

二、切分策略全谱系

策略做法适用局限
固定大小按字符/token 数硬切 + 重叠窗口快速基线不顾语义边界,常切坏
递归切分按段落→句子→词的优先级递归切通用默认仍是结构启发式,非语义
文档结构感知按 Markdown 标题/HTML/代码块切结构化文档、代码依赖文档有清晰结构
语义切分按相邻句子向量相似度的「断点」切主题混杂的长文计算更贵,阈值需调
LLM 自适应切分用小 LLM 识别主题边界动态切高价值知识库成本最高(每文档过一遍 LLM)

重叠窗口(overlap):相邻 chunk 共享一小段(如 10~20%),缓解「边界处信息被切断」。是固定/递归切分的标准补丁。

父子分块(small-to-big):用小块做检索(向量精准),命中后把它所属的大块(父块/整段)送给 LLM(上下文完整)。兼顾「检索准」和「上下文全」,是工程最常用的高性价比技巧。

三、2025 新切分技术

Late Chunking(迟分块)

传统流程是「先切再嵌入」——每个 chunk 独立向量化,丢失了它在全文中的上下文。Late chunking 反过来:

传统:文档 → 切成块 → 每块独立 embedding(块间无上下文)
迟分:文档 → 整体过长上下文 embedding 模型 → 在 token 级表示上再按块做池化
  • 关键:让 embedding 先看到整篇文档的上下文(用长上下文 embedding 模型一次编码全文),再在 token 表示上按 chunk 边界池化成块向量。
  • 效果:块向量携带了「这块在全文里的语义」,缓解「代词指代、跨段依赖」丢失的问题。
  • 代价:需要长上下文 embedding 模型,单文档编码成本上升。

Contextual Retrieval(上下文检索)

Anthropic 提出的工程方法:入库前,用 LLM 给每个 chunk 生成一段「它在全文中的上下文说明」,拼到 chunk 前面再做 embedding 和 BM25 索引。

原始 chunk:「营收同比增长 3%。」
增强后:「本段出自 ACME 公司 2024 Q2 财报,讨论季度营收。营收同比增长 3%。」
  • 解决「孤立 chunk 缺乏上下文导致检索/理解偏差」,配合 BM25 + 向量混合 + rerank,被报告显著降低检索失败率。
  • 代价:每个 chunk 都要过一次 LLM 生成上下文(可用 prompt caching 摊薄成本)。

Late chunking vs Contextual Retrieval:前者在向量层注入全局上下文(改 embedding 方式),后者在文本层注入(改 chunk 内容)。目标相同——让孤立 chunk 不再「失忆」。

四、检索策略

向量检索(稠密)

query 和 chunk 都映射到向量空间,按相似度(余弦/内积)召回。强在语义匹配(同义、改写),弱在精确匹配(专有名词、ID、罕见词可能召不回)。底层 ANN 算法(HNSW/IVF/PQ)见 Embedding 与向量数据库向量检索与 ANN

关键词检索(稀疏,BM25)

基于词频的经典检索,强在精确匹配(术语、代码、人名、编号),弱在语义(不懂同义改写)。

混合检索(Hybrid)✅ 生产标配

向量 + BM25 并行召回,用 RRF(Reciprocal Rank Fusion) 等方法融合排名。原理:两种检索的优势互补——语义召回兜底改写、关键词召回兜住专有名词。几乎所有严肃 RAG 系统都用混合检索。

重排(Rerank)

两段式:先用快的 bi-encoder(向量)粗召回 Top-N(如 100),再用慢但准的 cross-encoder 精排到 Top-K(如 5)。cross-encoder 让 query 和 doc 在同一次前向里充分交互,相关性判断远准于向量内积,代价是只能用于少量候选。是性价比极高的「检索质量放大器」。

后期交互(Late Interaction / ColBERT)

折中方案:保留 query 和 doc 的逐 token 向量,检索时做 token 级的细粒度匹配(MaxSim)。比单向量更精细(接近 cross-encoder),又比 cross-encoder 可预计算(接近 bi-encoder 的可扩展性)。ColBERT 是代表,多模态版 ColPali 把它用到「直接检索文档截图」。

五、查询侧优化

检索不只优化「库」,也优化「问题」:

  • 查询改写/扩展:把口语化、有歧义的 query 改写得更适合检索;
  • HyDE(假设性文档嵌入):先让 LLM «假想»一个答案文档,用它的向量去检索(答案和答案更像,比问题和答案更像);
  • Multi-Query:把一个问题改写成多个角度的子查询,分别检索再合并,提升召回;
  • 查询分解:复杂多跳问题拆成子问题逐个检索(与 Agentic RAG 衔接)。

六、组合成一条强 pipeline

入库:文档 → 结构感知/语义切分(+父子块) → (late chunking / contextual 增强) → 向量 + BM25 双索引
检索:query → 改写/HyDE/Multi-Query → 混合召回 Top-100 → cross-encoder rerank Top-5 → (上下文压缩) → 生成

没有「最好的单一策略」,只有「针对你的数据和 query 分布调出来的组合」——这也是为什么 RAG 评估(见 RAG 评估)是优化的前提。

高频追问

Q:chunk 大小怎么定? 没有万能值,取决于数据与 query。起点常在 200~800 token,配 10~20% 重叠;FAQ/短问答可小,长篇论述宜大或用父子块。正确做法是用评估集对比几档大小,而非拍脑袋。本质矛盾:大块上下文全但语义糊,小块语义准但缺上下文——父子分块是化解之道。

Q:late chunking 和父子分块有什么区别? 父子分块是「小块检索、大块送 LLM」,改的是检索/喂入的粒度;late chunking 改的是embedding 的计算方式(先全文编码再按块池化),让块向量本身带全局上下文。两者正交,可叠加。

Q:为什么混合检索几乎是标配? 向量检索懂语义但可能漏专有名词/ID,BM25 精确匹配但不懂改写,二者优势互补。用 RRF 融合排名,能同时兜住「语义近」和「字面准」,召回质量明显高于单一方法。

Q:rerank 为什么有效?开销值得吗? cross-encoder 让 query 和文档在同一次前向里交互,相关性判断远准于「两个独立向量算内积」。开销在于只能处理少量候选,所以用「向量粗召回 + cross-encoder 精排」两段式。在大多数系统里是投入产出比最高的一步。

Q:ColBERT 的 late interaction 和普通向量检索差在哪? 普通检索把整段压成一个向量,细节丢失;ColBERT 保留每个 token 的向量,检索时做 token 级最大相似匹配(MaxSim),精度接近 cross-encoder 但可预计算、可扩展。代价是存储和计算量比单向量大。

Q:HyDE 为什么能提升检索? 检索的本质是「向量相似」,而「问题」和「答案文档」在向量空间未必接近(一个是疑问、一个是陈述)。HyDE 先让 LLM 生成一个假想答案,用「假答案」去匹配「真答案」,同为陈述句、语义更近,从而提升召回。风险是假答案若跑偏会带歪检索。

基于 MIT 许可发布