跳到正文

Chunking 策略怎么平衡上下文与精度?

RAG 系统中分块大小与重叠窗口的最佳实践

原题:在构建基于RAG的系统时,分块(Chunking)策略应如何设计以平衡文本的上下文完整性与信息检索的精确性?有哪些常用的最佳实践?

文档处理 · 京东真题

回答与解析

核心矛盾

分块本质是上下文完整性检索精确性的权衡:

  • 块过大 → 噪声多、检索精度下降、embedding稀释
  • 块过小 → 语义断裂、LLM缺乏上下文

常用分块策略

策略 适用场景 特点
固定长度 通用场景、快速上线 按token/字符数切分,实现简单
递归分块 结构化文档 先按段落/句子,再递归细分,保持层级
语义分块 高质量要求场景 用embedding相似度判断边界,保证语义完整
Agentic分块 复杂文档 LLM判断边界,成本高但最精准

关键最佳实践

1. 重叠策略(Overlap)

  • 把零重叠、短窗口与较长窗口列为候选,在同一评测集上验证是否减少跨边界证据缺失
  • 对代码、法律条文等边界敏感内容尤为重要

2. 边界感知

  • 优先在段落、句子边界切分,不在词中间断开
  • 特殊内容(表格、列表)尽量保持完整

3. 尺寸匹配

  • 参考embedding模型的训练长度(如text-embedding-ada-002用8191 tokens)
  • 预留LLM的上下文空间:chunk大小 + prompt + 输出 < context window

4. 元数据增强

  • 存储chunk的标题、章节、页码等,用于重排序或过滤

5. 评估驱动迭代

  • 用Hit Rate、MRR等指标对比不同策略
  • 结合端到端问答效果做最终判断

实际项目中可先把递归分块、结构分块和不同重叠窗口作为候选,再根据同一评测集和bad case决定是否引入语义分块。

学习建议

建议系统学习该知识点

口语版讲法(约4分钟)

  • 一句话定位:分块本质是上下文完整性和检索精确性的平衡
  • 边界划分与策略选择:固定长度 vs 语义分块,递归分块+重叠是起步标配
  • 业务场景举例:企业合规文档检索,段落边界和重叠策略的实际应用
  • 落地风险与前提:embedding长度限制、LLM上下文窗口、评估驱动迭代
  • 工程师判断收尾:倾向递归分块起步,根据bad case逐步优化

这道题其实问的是,在RAG系统里怎么切文本才能既保证语义连贯又不让检索跑偏。说白了,分块就是在上下文完整性和检索精确性之间找平衡。块太大,噪声多,embedding被稀释,精度掉得厉害;块太小,语义割裂,LLM拿到的上下文不够,答非所问。

那具体怎么做呢?先说说几种常见策略的适用边界。固定长度分块,按token或字符数硬切,实现简单,适合快速上线,但对自然语言不友好,容易在句子中间断开。语义分块用embedding相似度判断边界,能保持语义完整,适合高质量要求,但计算成本高,对短文本不太灵敏。真正落地时,我不会把某一种组合当成起步标配,而是把递归分块、结构分块以及零重叠、短窗口、较长窗口列成候选。保持层级结构后,再用同一评测集验证哪组方案能减少切口上的证据缺失。举个例子,企业合规文档检索,比如员工查报销政策,段落边界很明确,递归分块就能保持政策条款完整,重叠能覆盖像“但是以下情况除外”这种转折信息。如果只固定切,很可能“但是”前面在上一块,后面在下一块,检索就漏了。

这里有个坑,就是边界感知。优先在段落、句子边界切,绝对不要在词中间断开,尤其对代码、法律条文这种边界敏感的内容。另外,尺寸匹配很关键。要参考embedding模型的最大长度,比如text-embedding-ada-002是8191 tokens,同时留足LLM的上下文空间,chunk大小加prompt加输出,不能超过context window。如果不满足,上线后你会发现长文档检索结果质量波动很大,因为embedding被截断或LLM拿不到完整上下文。

还有就是元数据增强。存储chunk的标题、章节、页码,配合Rerank或过滤,能大幅提升精准度。比如搜索“报销流程”,如果chunk带章节号,可以优先返回对应章节的块。

最后,评估驱动迭代。用Hit Rate、MRR这些指标对比不同策略,但最终还是要看端到端问答效果。常见失败场景是,指标好看但实际回答不相关,因为chunk里噪声多。

其实分块还有个隐藏问题,就是chunk之间的语义关联怎么处理。比如一个概念在前一块定义,后一块直接引用,分块后LLM可能看不到定义。有人用Parent Document方式,检索子块后返回父块全文,但这样上下文窗口压力大。这块我觉得值得深入,比如结合知识图谱来建模实体关系。

所以,我会先比较递归分块、结构分块和不同重叠窗口,再根据bad case判断是否需要语义分块或Agentic分块。前提是数据质量过关,边界清晰,否则再花哨的策略也救不了。

关键一句:chunk之间的语义关联问题,比如定义和引用跨块,用Parent Document方式有上下文窗口压力,可考虑结合知识图谱。

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你在做客服文档检索,用户问“怎么退款”,系统从知识库找答案。如果一篇文章很长,你是整个塞进去还是切开?切的话怎么保证上下文不丢、又能精确命中问题?

  2. 问法 2 · 层层追问

    RAG系统里文档怎么处理才能让检索效果好?……那如果直接按固定字数切,会不会把一句话切开?……怎么在完整性和精确性之间找平衡?具体你会怎么设计?

  3. 问法 3 · 直球架构

    设计一个RAG系统的分块策略,核心目标是平衡上下文完整性和检索精确性。你会考虑哪些分块方法?有什么最佳实践?比如重叠、边界处理这些,具体怎么落地?

同模块相关题目