RAG 分块策略的工程化选择:分块大小不是拍脑袋决定的 RAG 分块策略的工程化选择分块大小不是拍脑袋决定的一、分块大小对检索质量的影响比 Embedding 模型更大RAG 架构的优化讨论通常集中在 Embedding 模型和向量数据库的选择上。但实测发现分块大小对检索质量的影响更直接。同一个 Embedding 模型、同一个查询分块大小从256字符改成512字符检索相关率从62%提升到78%。这个提升幅度比换一个更好的 Embedding 模型的效果更显著。分块大小的选择不是拍脑袋决定。它取决于三个因素内容密度、查询粒度和存储成本。日记内容密度低512字符的分块可能包含一整天的记录技术文档密度高256字符的分块可能只是一段配置说明。查询粒度决定了用户关心的是一段完整描述还是一个具体参数。存储成本影响分块数量——分块越小数量越多向量库的存储和检索成本越高。二、分块策略的选择流程分块策略不应该一开始就固定而是根据数据类型和查询模式选择初始值再通过测试调整。flowchart TD A[数据类型判断] -- B{内容密度} B --|低密度日记/聊天| C[大分块512-1024字符] B --|高密度技术文档/API| D[小分块256-512字符] C -- E[重叠64-128字符] D -- F[重叠32-64字符] E -- G[检索测试命中率评估] F -- G G -- H{命中率≥75%} H --|否| I[调整分块大小和重叠量] H --|是| J[确定分块策略] I -- G重叠量的设置是为了避免分块边界切断语义完整的内容。一句话被切成两半分到两个块里检索任何一个块都只能看到半句话。重叠让边界区域的内容在两个块里都出现减少信息损失。但重叠会增加存储冗余不能无限增加。三、分块策略的实现与测试type ChunkConfig { maxChunkSize: number; overlapSize: number; separator: string; // 分块分隔符 }; // 不同数据类型的推荐初始配置 const chunkConfigs: Recordstring, ChunkConfig { diary: { maxChunkSize: 512, overlapSize: 64, separator: \n\n, // 日记按段落分块 }, technical: { maxChunkSize: 256, overlapSize: 32, separator: \n, // 技术文档按行分块 }, chat: { maxChunkSize: 1024, overlapSize: 128, separator: \n, // 聊天记录按消息边界分块 }, }; export function chunkText(text: string, config: ChunkConfig): string[] { const chunks: string[] []; const segments text.split(config.separator); let currentChunk ; for (const segment of segments) { // 当前块加上新段落不超过最大尺寸时合并 if ((currentChunk config.separator segment).length config.maxChunkSize) { currentChunk config.separator segment; } else { // 超过最大尺寸时保存当前块并开始新块 if (currentChunk.trim()) chunks.push(currentChunk.trim()); currentChunk segment; } } if (currentChunk.trim()) chunks.push(currentChunk.trim()); // 添加重叠相邻块共享边界区域的内容 return addOverlap(chunks, config.overlapSize); } function addOverlap(chunks: string[], overlapSize: number): string[] { if (overlapSize 0 || chunks.length 1) return chunks; const overlapped: string[] []; for (let i 0; i chunks.length; i) { let chunk chunks[i]; if (i 0) { // 从前一个块的末尾取重叠内容 const prevTail chunks[i - 1].slice(-overlapSize); chunk prevTail \n chunk; } overlapped.push(chunk); } return overlapped; }分隔符的选择很重要。日记按段落分块双换行比按固定字符数切割更保留语义。聊天记录按换行分块比按字符数分块更保留消息边界。分块应该优先在语义边界处切分字符数限制只作为兜底约束。四、分块策略没有最优解只有场景适配分块大小的选择本质上是在信息完整性和检索精确性之间权衡。大分块保留更多上下文但检索精确度低一个块包含很多内容查询匹配到的可能只是其中一小段小分块检索精确度高但上下文不足检索到具体参数但缺少整体说明。最优分块大小需要通过实际检索测试确定。方法是准备20-30条代表性查询在不同分块配置下检索评估命中率。命中率指检索到的分块中包含正确答案的比例。测试成本低但数据价值高。动态分块是更高级的策略。根据内容结构动态调整分块大小——标题段落用小分块描述段落用大分块。这比固定大小分块效果更好但实现复杂度也更高。初始阶段用固定大小分块测试稳定后再考虑动态分块优化。五、总结RAG 分块策略应根据内容密度、查询粒度和存储成本选择。低密度内容用大分块高密度内容用小分块。重叠量减少边界信息损失但不宜过大。分块优先在语义边界处切分字符数限制作为兜底。最优分块大小通过20-30条代表性查询的命中率测试确定。初始阶段用固定大小分块稳定后再考虑动态分块优化。