首页
看点啥
插画图片
首页 看点啥 RAG文档存储和切割策略详解:从基础到进阶

RAG文档存储和切割策略详解:从基础到进阶

2026-06-30 0

一、RAG文档存储:不只是向量数据库

很多同学以为RAG的存储就是个向量数据库,存向量就行了。这个理解过于简化了。一个生产级RAG系统,存储层需要同时搞定四类数据:

RAG文档存储与切割策略详解:从基础到进阶

1.1 四层存储架构

① 向量数据存储层

② 原始文本存储层

③ 结构化元数据存储层

④ 管理信息存储层

1.2 向量数据库选型参考

以Milvus为例,创建RAG知识库Collection的核心代码:

 复制代码from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataTypeconnections.connect(host="localhost", port="19530")fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536),
    FieldSchema(name="source", dtype=DataType.VARCHAR, max_length=512),
]schema = CollectionSchema(fields=fields, description="RAG Knowledge Base")
collection = Collection(name="rag_knowledge", schema=schema)# 创建HNSW索引
index_params = {
    "index_type": "HNSW",
    "metric_type": "COSINE",
    "params": {"M": 16, "efConstruction": 256}
}
collection.create_index(field_name="embedding", index_params=index_params)

二、文档切割策略:RAG效果的核心

分块(Chunking)是RAG实现中最关键的环节之一。如果传整篇文档或过大的块,既昂贵又可能超出模型Token限制;块太小又可能缺少足够上下文。

2.1 固定大小分块(带重叠)

原理:按固定字符数或Token数切分,块与块之间允许重叠。

特点

建议:使用BERT Token而非字符数作为计数单位,因为Token基于有意义的语言单元,能保留更多语义信息。

适用场景:非结构化文档,如调查反馈、论坛帖子、邮件、个人笔记等。

2.2 语义分块

原理:使用Embedding将概念相似的内容分组,创建语义连贯的块。

特点

适用场景:各部分主题有重叠的文档,如金融或医疗领域的专业文档。

2.3 自定义代码分块

原理:使用正则表达式等文本解析技术,根据文档结构模式切分。

特点

工具:Python(re、BeautifulSoup、lxml、marko)等。

适用场景:专利申请、研究论文、保险单、剧本等。

2.4 文档布局分析

原理:结合OCR与深度学习模型提取文档结构(页眉、页脚、标题、表格等)。

特点

工具:Azure Document Intelligence、LayoutParser等。

适用场景:新闻文章、网页、简历等半结构化文档。

2.5 基于图的分块

原理:使用LLM查找文档中的实体和关系,构建知识图谱。

特点

工具:Microsoft GraphRAG、Neo4J。

适用场景:体育分析、历史数据等需要跨文档进行复杂查询的领域。

2.6 LLM增强分块

原理:使用LLM生成图像的文字描述或表格摘要作为分块内容。

特点

注意:若分块逻辑将图像描述拆成多个块,每个块都应包含图像URL,确保检索时能访问原始图像。

三、进阶策略:让切割更智能

3.1 Small2Big(小块检索,大块生成)

核心思想:用小块进行高效精准检索,检索到后追溯其所属的大块,用大块内容生成回答。这样既保证了检索精度,又确保LLM有足够的上下文。

3.2 混合自适应分块(HACR)

学术界的混合自适应分块检索算法(Hybrid Adaptive Chunking and Retrieval)是这一方向的前沿探索:

  1. 先用语义分块做初步划分
  2. 引入LLM分析识别包含多主题的块,动态切割或聚合
  3. 融合“细粒度检索-粗粒度生成”协同机制

实验结果表明,该算法在忠实度保持1.0的前提下,答案相关性提升7.6% -4。

3.3 分块对齐优化

为每个块生成示例问题——即这个块最能回答什么样的问题。检索时,系统将用户问题与示例问题比对,大幅提升匹配准确度。

四、分块前的预处理

分块之前,建议先做文档加载和预处理:

建议:先合并加载和分块逻辑,当业务需要时再分离。

五、更新策略

如果文档频繁更新,需要考虑增量更新策略:

总结

策略工程成本处理成本适用场景
固定大小分块非结构化文本
语义分块主题交错的文档
自定义代码结构可推断的文档
布局分析新闻、网页、简历
图分块跨文档复杂查询
LLM增强含图像、表格的文档

选型建议:从固定大小分块开始,结合Small2Big策略;当数据量增大、场景复杂后,再逐步引入语义分块或多策略组合。记住——分块策略是RAG系统的半永久性设计决策,更换成本较高,上线前务必做充分测试。

面试回答

第一步,存之前先做两件事:

  1. 加载文档:把 PDF、Word、网页等各种格式的文档读进来。
  2. 切块(Chunking) :因为大模型的上下文窗口有限,而且不能把整本书都塞进去,所以要把长文档切成一个个小文本块。

第二步,存的不是原文,是向量。

所以简单说:文档被切成块,每个块变成一个向量,向量和原文一起存进向量库。

常见的几种切割策略(按从简单到复杂说):

  1. 固定长度切割(最基础)
  1. 按句子切割
  1. 按段落切割
  1. 递归字符切割(常见做法,比如 LangChain 的 RecursiveCharacterTextSplitter)
  1. 语义切割(更高级)
  1. 特定格式的智能切割

实际中我们会根据文档类型和业务场景选。比如做客服问答,可能按一问一答切;做长文档摘要,可能切大块一点,比如 1000 token 加重叠。

喜欢(0)

上一篇

Agent Skill 状态机工程:Mode-Step 网格如何拆解工作流边界

Agent Skill 状态机工程:Mode-Step 网格如何拆解工作流边界

下一篇

在云端运行 Codex - DigitalOcean Codex 插件正式推出

在云端运行 Codex - DigitalOcean Codex 插件正式推出
猜你喜欢