1. RAG分块策略设计与实现
在构建基于检索增强生成(RAG)的系统时,文档分块策略是影响最终效果的关键因素之一。本文将详细介绍我们采用的"父子分块+重叠滑动窗口+元数据存储"组合方案,以及如何在Spring AI框架中实现这一策略。
1.1 为什么需要复杂的分块策略?
传统RAG系统常采用简单的固定长度分块,但这会面临三个核心问题:
- 上下文断裂:关键信息被硬性切割到不同块中,导致语义不完整
- 检索噪音:过大的块包含无关内容,降低检索精准度
- 结构丢失:原始文档的层次结构(如章节、段落)信息被丢弃
我们的组合方案通过以下方式解决这些问题:
- 父子分块保留文档层次结构
- 重叠窗口防止边界断裂
- 元数据存储实现高效检索增强
1.2 整体架构设计
系统采用双存储引擎设计:
- Milvus:存储子块向量及关联元数据,负责高效相似度检索
- Elasticsearch:存储父块原文及结构化元数据,支持关键词检索和上下文增强
这种架构结合了向量检索的语义理解能力和关键词检索的精确匹配优势,在实际业务场景中取得了显著效果提升。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分块策略实现细节
2.1 父子分块机制
2.1.1 父块拆分策略
父块拆分采用五级优先级策略,确保尽可能保留文档的天然结构:
java复制// 拆分优先级(从高到低):
// 1. 标题边界(#、章节号等)
// 2. 段落边界(\n\n)
// 3. 句子边界(。!?)
// 4. 标点边界(;,,)
// 5. 字符硬切(最后手段)
实现中特别考虑了以下优化点:
- 动态降级:仅对超过1000 token的块执行降级拆分
- 智能合并:降级后的小块会重新合并,避免过度碎片化
- 边界保留:拆分时保留分隔符,维持原文可读性
2.1.2 子块生成策略
子块从父块中生成,采用更细粒度的拆分:
- 基础单元:句子边界(。!?)
- 目标大小:约250 token
- 特殊处理:对超长句子(≥250 token)执行强制拆分
这种设计确保子块既包含完整语义单元,又保持合适的大小便于精准检索。
2.2 重叠滑动窗口实现
为解决边界断裂问题,子块间采用20%重叠
