切片策略

1 阅读10分钟

一、为什么 RAG 要切片?

RAG 不是把整篇文档直接丢给大模型,而是先把文档切成多个小片段:

原始文档
  ↓
切片 Chunk
  ↓
向量化 Embedding
  ↓
存入向量库
  ↓
用户提问时检索相关 Chunk
  ↓
拼接上下文给大模型回答

切片质量会直接影响:

影响点说明
检索准确率切得太碎,语义不完整;切得太大,噪声多
上下文完整性是否能保留完整的一段意思
向量质量Chunk 内容越清晰,Embedding 越准确
成本Chunk 越多,向量库越大,检索和存储成本越高
回答质量检索不到关键内容,大模型就容易瞎答

二、6 种切片策略总览

你图里的文件分别是:

1-固定长度切片.py
2-句子边界切片.py
3-LLM语义切片.py
4-层次切片.py
5-滑动窗口切片.py
6-自适应切片.py

它们的区别核心在于:

到底按照什么边界来切?是按长度、句子、语义、标题层级,还是动态判断?


三、1. 固定长度切片

核心思想

按照固定字符数或 token 数切。

例如每 500 个字符切一段:

Chunk 1:第 1 - 500 
Chunk 2:第 501 - 1000 
Chunk 3:第 1001 - 1500 

示例

原文:

RAG 是检索增强生成技术。它通常包括文档加载、文本切分、向量化、向量存储、检索、重排序和生成回答几个步骤。

如果固定每 20 个字切一次,可能变成:

Chunk 1:RAG 是检索增强生成技术。它通常
Chunk 2:包括文档加载、文本切分、向量化
Chunk 3:、向量存储、检索、重排序和生成回答几个步骤。

优点

优点说明
简单实现最容易
不需要复杂分析
稳定每个 Chunk 大小接近
适合批处理很容易并发处理大量文档

缺点

缺点说明
容易切断语义一句话可能被切成两半
上下文不完整检索出来的片段可能缺前因后果
对表格、代码、标题不友好结构会被破坏

适合场景

适合:

日志
纯文本
大批量非结构化文档
对语义完整性要求不高的场景

不太适合:

合同
论文
技术文档
代码文档
法律条款

四、2. 句子边界切片

核心思想

不粗暴按长度切,而是尽量按照句号、问号、感叹号、换行符等自然边界切。

先按句子拆分
再把多个句子组合成一个 Chunk

示例

原文:

RAG 是检索增强生成技术。它可以解决大模型知识过时的问题。RAG 通常包含检索、重排序和生成三个核心阶段。

切片后:

Chunk 1:RAG 是检索增强生成技术。它可以解决大模型知识过时的问题。

Chunk 2:RAG 通常包含检索、重排序和生成三个核心阶段。

优点

优点说明
语义更完整不容易把一句话切断
可读性好Chunk 本身像自然段
比固定长度更适合问答检索出来的信息更完整

缺点

缺点说明
长句不好处理有些句子特别长
对标题层级感知弱不知道这一句属于哪个章节
对表格、代码仍然不友好表格和代码不是普通句子

适合场景

适合:

FAQ
说明文档
制度文档
普通文章
客服知识库

例如:

用户问:退款多久到账?

句子边界切片通常效果不错,因为答案经常就是一两句话。


五、3. LLM 语义切片

核心思想

让 LLM 或语义模型判断:

哪些内容属于同一个语义主题,哪些地方应该切开。

它不是机械地按长度或者标点切,而是按“意思”切。

示例

原文:

RAG 包括文档加载、文本切分、向量化和检索。Redis 是一种高性能内存数据库,常用于缓存和分布式锁。向量数据库用于存储 Embedding,并支持相似度搜索。

普通切片可能会混在一起。

LLM 语义切片可能会切成:

Chunk 1:RAG 包括文档加载、文本切分、向量化和检索。向量数据库用于存储 Embedding,并支持相似度搜索。

Chunk 2:Redis 是一种高性能内存数据库,常用于缓存和分布式锁。

因为它知道:

RAG + 向量数据库 是同一类主题
Redis 是另一个主题

优点

优点说明
语义完整性最好更接近人类理解
检索质量高一个 Chunk 通常就是一个完整知识点
适合复杂文档技术文档、论文、方案文档效果好

缺点

缺点说明
成本高调用 LLM 有 token 成本
速度慢不能像固定切片那么快
稳定性受模型影响不同模型切法可能不同
工程复杂需要控制超时、重试、并发、缓存

适合场景

适合:

技术方案
论文
合同
产品文档
复杂知识库
高质量问答系统

如果你做的是企业级 RAG,想要回答准确,LLM 语义切片会比固定长度切片更好


六、4. 层次切片

核心思想

按照文档结构切,比如:

文档
  ├── 一级标题
  │     ├── 二级标题
  │     │     ├── 段落
  │     │     └── 表格
  │     └── 二级标题
  └── 一级标题

它会保留父子关系。

示例

原文:

# 支付系统设计

## 1. 统一下单

统一下单负责创建支付订单。

## 2. 支付回调

支付回调用于接收微信或支付宝的支付结果。

## 3. 退款处理

退款处理需要校验订单状态和退款金额。

层次切片后:

{
  "title": "支付系统设计 > 统一下单",
  "content": "统一下单负责创建支付订单。"
}
{
  "title": "支付系统设计 > 支付回调",
  "content": "支付回调用于接收微信或支付宝的支付结果。"
}
{
  "title": "支付系统设计 > 退款处理",
  "content": "退款处理需要校验订单状态和退款金额。"
}

优点

优点说明
保留文档结构知道 Chunk 属于哪个章节
适合长文档可以按标题、章节、段落组织
可做父子检索先检索小 Chunk,再返回大段上下文
可追溯性强可以告诉用户来自哪个章节

缺点

缺点说明
依赖文档结构如果文档标题混乱,效果下降
解析复杂PDF、Word、Markdown 处理方式不同
实现成本较高要维护层级 metadata

适合场景

非常适合:

技术文档
产品手册
法律合同
论文
API 文档
企业制度文档

尤其是这种结构:

第一章
第二章
2.1
2.2
三级标题

层次切片效果很好。


七、5. 滑动窗口切片

核心思想

每个 Chunk 之间保留一部分重叠内容。

例如:

chunk_size = 500
overlap = 100

切片方式:

Chunk 1:第 1 - 500 
Chunk 2:第 401 - 900 
Chunk 3:第 801 - 1300 

为什么要重叠?

因为固定切片容易把关键信息切断。

例如:

订单超时未支付时,系统会发送延迟消息到 RabbitMQ。消费者收到消息后,需要再次查询订单状态。

如果刚好从中间切断:

Chunk 1:订单超时未支付时,系统会发送延迟消息到
Chunk 2:RabbitMQ。消费者收到消息后,需要再次查询订单状态。

检索时可能只搜到 Chunk 2,但 Chunk 2 缺少前面的原因。

滑动窗口可以避免这个问题。

优点

优点说明
提高召回率边界处的信息不容易丢
简单有效在固定切片基础上增加 overlap
适合长文本对连续文本比较友好

缺点

缺点说明
数据冗余重叠内容会重复存储
成本增加Chunk 数量变多
检索结果可能重复大模型看到重复上下文
需要去重检索后最好做结果合并

适合场景

适合:

长篇文档
小说
技术文档
没有明显标题结构的文本

八、6. 自适应切片

核心思想

不是固定一种切法,而是根据文档内容动态调整。

比如:

普通段落:按句子切
标题结构明显:按层次切
表格:整体保留
代码块:不要切断函数
图片:OCR + 图片描述
长段落:语义切片
短段落:合并

它是一种综合策略。

示例

一个 PDF 里面有:

标题
正文
表格
图片
代码
脚注

自适应切片可能这样处理:

内容类型切片方式
标题章节层次切片
普通正文句子边界切片
长段落语义切片
表格整表转 Markdown/JSON
代码按函数/类切
图片OCR + Caption
PDF 页码放入 metadata

优点

优点说明
效果最好不同内容用不同策略
工程价值高适合真实企业知识库
可扩展性强后续可支持 PDF、图片、表格、音视频
检索质量高兼顾完整性和准确率

缺点

缺点说明
实现最复杂需要文档分类、结构识别
调试成本高不同文件类型都要测试
规则较多需要持续优化
依赖解析能力PDF、表格、图片解析质量很关键

适合场景

适合企业级 RAG:

知识库问答
企业文档助手
合同问答
运维文档检索
产品手册问答
多模态知识库

九、6 种策略核心区别对比

策略切片依据语义完整性实现难度成本适合场景
固定长度切片字符数 / token 数日志、普通文本
句子边界切片标点、句子低~中FAQ、说明文档
LLM 语义切片语义主题论文、技术文档
层次切片标题、章节结构中~高API 文档、合同、手册
滑动窗口切片固定长度 + 重叠长文本、连续文本
自适应切片内容类型动态判断很高很高中~高企业级 RAG

十、怎么选择切片策略?

1. 简单文档问答

推荐:

句子边界切片 + 少量 overlap

适合:

FAQ
制度文档
普通 Word 文档

2. 长篇技术文档

推荐:

层次切片 + 滑动窗口

比如:

Spring Boot 文档
支付系统设计文档
接口文档
部署文档

3. 高质量知识库问答

推荐:

层次切片 + LLM 语义切片 + Rerank

这是效果比较好的企业级方案。


4. PDF、图片、表格混合文档

推荐:

自适应切片

因为 PDF 里面经常有:

正文 + 表格 + 图片 + 页眉页脚

不能用单一策略粗暴处理。


十一、企业级 RAG 推荐方案

如果你要真正落地,我建议不要只用一种切片。

可以这样设计:

文件上传
  ↓
文件类型识别
  ↓
文档解析
  ↓
结构识别
  ↓
自适应切片
  ├── 有标题:层次切片
  ├── 普通文本:句子边界切片
  ├── 长段落:语义切片
  ├── 表格:整表保留
  ├── 图片:OCR + Caption
  └── 代码:按类/方法切
  ↓
Chunk metadata 补充
  ↓
Embedding
  ↓
向量库存储

Chunk 结构建议这样设计:

{
  "chunkId": "chunk_001",
  "fileId": "file_1001",
  "content": "退款申请通过后,系统才允许发起退款。",
  "chunkType": "text",
  "titlePath": "支付系统设计 > 退款处理 > 退款审核",
  "pageNo": 5,
  "startOffset": 1200,
  "endOffset": 1450,
  "tokenCount": 180,
  "metadata": {
    "source": "支付系统设计.pdf",
    "tenantId": "10001",
    "permission": "private"
  }
}

十二、最重要的区别一句话总结 🎯

策略一句话理解
固定长度切片按长度硬切,简单但容易切断语义
句子边界切片按句子切,语义比固定长度更完整
LLM 语义切片让模型按主题切,效果好但成本高
层次切片按标题章节切,适合结构化文档
滑动窗口切片切片之间有重叠,防止边界信息丢失
自适应切片根据内容类型动态选择切法,最适合企业落地