RAG 分块策略选型
按完整性与检索精度权衡 RAG chunking,补充适用边界与工程取舍
原题:在构建检索增强生成(RAG)系统时,如何设计文本分块(chunking)策略以平衡上下文的完整性和检索的精确性?有哪些常用的方法和权衡考量?
文档处理 · 京东真题
回答与解析
核心权衡
分块本质是检索精度与上下文完整性的博弈:
- 块太小 → 检索精准但语义断裂,LLM缺乏背景
- 块太大 → 信息冗余,检索命中率下降,易超上下文窗口
常用分块方法
| 方法 | 适用场景 | 特点 |
|---|---|---|
| 固定长度 | 通用场景、快速上线 | 按token/字符数切,实现简单;边界可能切断语义 |
| 语义分块 | 高质量要求场景 | 用embedding相似度检测主题边界;计算成本高 |
| 递归分块 | 层次化文档(法律、论文) | 先按章节/标题粗分,再细粒度切;保留结构信息 |
| Agentic分块 | 复杂文档 | 用LLM判断分割点;成本最高但效果最优 |
关键实践技巧
重叠分块(Overlapping)
- 把零重叠、短窗口与较长窗口作为候选,在同一评测集上比较证据完整率、召回与冗余成本
- 特别适合问答场景,答案恰好跨边界的情况
元数据增强
- 为每个chunk附加标题、来源、时间等标签
- 检索时可做过滤,生成时可注入prompt提升可信度
动态分块
- 根据查询意图选择块大小:摘要类用大chunk,事实类用小chunk
选型建议
- ToB知识库(合同、手册):优先比较结构感知、递归与语义分块,验证条款完整性
- ToC搜索(商品、资讯):比较固定长度、结构边界与不同重叠窗口,重点验证响应速度与召回
- 代码文档:按函数/类边界分,保留语法结构
最终块大小应同时匹配Embedding输入限制、LLM上下文预算和业务评测结果。
学习建议
建议掌握大模型训练基础,深入理解推理路径建模与损失函数的关系,结合CoT论文实践分析。
口语版讲法(约4分钟)
- 分块本质是精度与完整性的取舍
- 固定长度和语义分块适用边界
- 重叠和元数据的落地技巧
- 真实场景:客服退款政策检索
- 风险与倾向
这道题其实问的是,在RAG系统里,怎么把文档切成小块,既能保证检索的时候命中率高,又不让大模型拿到碎片信息瞎编。说白了就是精度和完整性的一个取舍。
先说最直接的方法,固定长度分块。按token或者字符数一刀切,实现简单,上线快。但问题很明显,可能一句话被拦腰切断,语义就断了。所以它适合ToC场景,比如商品搜索,用户只想要个价格或参数,上下文不完整问题不大。
反过来,语义分块是用Embedding相似度检测主题边界,块内语义完整。但计算成本高,而且依赖embedding质量。所以它更适合ToB知识库,比如企业SOP或者合规文档,条款必须完整。
但实际落地时,很少只用一种。我的做法是混合:先用递归分块按章节粗切,保留结构信息,再对每个章节用语义分块细切。这样既保住了文档的层级,又让每个块内部语义连贯。
这里有个关键技巧是重叠。把零重叠、短窗口和较长窗口作为候选,验证它们是否减少答案跨边界时的信息丢失。比如用户问“退款流程中的时间限制”,答案可能包含两个块的内容,重叠就能兜住。
还有元数据增强。每个Chunk附上标题、来源、时间,检索时可以过滤,生成时注入prompt也能提升可信度。比如客服系统里,只检索近三个月的政策,避免旧版本干扰。
举个例子,客服退款政策文档。我倾向用语义分块加元数据,因为退款条款常有“如果商品在7天内且不影响二次销售”这种条件,必须完整切在一个块里。同时给每个块打上“退款政策”“退货条件”等标签,检索时直接过滤到对应标签,精度高很多。
但这里有个坑:如果embedding模型不支持长上下文,语义分块可能不准。我的前提是先确认Embedding模型的实际输入限制,再比较结构分块、固定长度和不同重叠窗口。上线后应把Recall@K与项目基线、证据完整率和成本一起看,不能套用统一阈值。
所以我的取舍是:先按文档结构和查询类型提出固定长度、结构分块、语义分块与不同重叠窗口候选,再用评测结果决定。但不管哪种,都得匹配embedding模型和LLM窗口,留足生成余量。
另外,如果文档更新频繁,比如政策每周变,分块策略还得考虑增量更新。我倾向用版本号标记每个块,检索时只取最新版本,避免旧政策污染。
总的来说,分块没有银弹,核心是理解业务场景和模型能力,然后给出一个可调、可观测的方案。
关键一句:文档频繁更新时,分块需要增量更新策略,比如版本号标记,避免旧政策污染。
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做企业知识库问答,用户问“去年Q3财报中收入增长的原因是什么”,文档里可能跨好几个段落。你打算怎么切文本,才能既让检索找到相关段落,又不丢失前面讲背景的那些信息?
- 问法 2 · 层层追问
RAG系统里文本分块你一般怎么处理?……如果块太小,召回倒是准了,但大模型读起来缺上下文怎么办?……那如果块太大,检索容易漏掉关键信息,这个矛盾你打算怎么平衡?
- 问法 3 · 直球架构
设计RAG系统的文本分块策略,核心要权衡上下文完整性和检索精确性。你有哪些分块方法?每种方法在什么场景下用?重叠分块和元数据增强具体怎么落地?