Chunk(分块)
是什么:
把长文档切一小段一小段,再做向量化存储。
为什么需要它
- LLM 的上下文限制
- 检索时需要“精准命中片段”而不是一整片文章
例如:
一篇10000字的文章 -> 切成:
- 每300~500一个片段
- 或按段落/语义切分
关键点:
- chunk 太大 -> 检索不准确
- chunk 太小 -> 语义不完整
分块策略:
1.固定长度分块
方式:
- 按照 token/字符数切,比如:
- 512 tokens
- 1000 tokens
适用场景:
- 通用文本(文档、网页、FAQ)
- 没有结构的内容
优点:
- 简单、稳定、易调参
- 向量库兼容性最好
缺点:
- 容易断章取义
推荐 overlap:
- 10% ~ 20%
2.按句子分块
方式:
- 用 NLP 分句(句号、标点)
- 多句子拼成一个 chunk (控制 token 长度)
适用场景:
- 文章、博客、说明书
- 对语义完整性要求高
优点:
- 语义更完整
缺点:
- chunk 的 token 长度不均匀
- 需要额外的分句工具
推荐 overlap:
- 0 ~ 10%
- 有时甚至不需要(句子已经是最小语义单元了)
3.按段落分块
方式:
- 按自然段(\n\n)切
- 如果段落过大,二次切分
适用场景:
- Markdown / 文档 / PDF解析后文本
- 知识库类文本
优点:
- 保留上下文结构
- 可读性强
缺点:
- 段落长度不稳定
推荐 overlap:
- 0 ~ 10%
4.语义分块
方式:
- 使用 embedding 判断语义变化点
- 在“语义断点”切分
常见做法:
cosine similarity 阈值 sliding window + embedding
适用场景:
- 高质量知识库
- 长文档(法律、技术文档、论文)
优点:
- chunk 语义高度一致
- 检索准确率高
缺点:
- 成本高(需 embedding 额外处理)
- 实现复杂
推荐 overlap:
- 0 ~ 10%
- overlap 的作用被“语义切分”替代了
5.递归分块
方式:
按优先级切分:
段落 → 句子 → 词 → 字符直到满足 chunk size
适用场景:
- 通用RAG(推荐的默认方案)
- 不确定数据结构时
优点:
- 自动平衡“语义 + 长度”
- 很稳定
缺点:
- 可控性稍差
推荐 overlap:
- 10% ~ 20%
6.滑动窗口分块 【高 recall 场景】
方式:
- 固定长度,但窗口滑动
chunk1: 0-500
chunk2: 250-750
chunk3: 500-1000适用场景:
- QA 系统(避免漏召回)
- 法律、合同分析
优点:
- recall 极高
- 几乎不会漏消息
缺点:
- 数据量膨胀(2 ~ 3倍)
- 检索成本高
推荐 overlap:
- 30% ~ 50%
用空间换 recall,适合高精度系统
overlap(重叠)
简单说:
就是每个 chunk 之间重复的一部分内容,避免信息被切断。
举个🌰:
原文:
A:小明喜欢迟到
B:他也喜欢早退
C:尤其是在上班的时候没有 overlap:
chunk1:
小明喜欢迟到chunk2:
他也喜欢早退问题:
- “他”是指谁?(上下文断开了)
有 overlap:
chunk1:
小明喜欢迟到
他也喜欢早退chunk2:
他也喜欢早退
尤其是在上班的时候这样上下文就连上了
overlap 太大 or 太小会怎样?
太小(甚至0)
- 上下文断裂
- 检索质量下降
太大
- 数据重复严重
- 向量库变大
- 成本上升
什么是 recall(召回率)
recall(召回率),简单来说:
该找到的内容,找到了多少
定义:
[ Recall = \frac{检索到的相关文档数量}{所有相关文档数量} ]
在 RAG 的流程中:
- 用户提问
- 系统去向量库检索 chunk
- 把检索到的内容喂给大模型生成答案
其中 recall 关注的就是第 2 步:
所有有用的 chunk 检索出来了多少?
recall 和 precision
| 指标 | 含义 |
|---|---|
| recall | 找全(不漏) |
| precision | 找准(不乱) |
对比:
高 recall
- 返回 20 条
- 相关的 5 条全在里面
- recall 高
- 但有很多垃圾
高 precision
- 返回 3 条
- 都是相关的
- precision 高
- 但是漏了 2 条
在 RAG 中 recall 优先级更高
“没召回 = 没答出来” “召回多一点 → 模型还能自己筛”
ACL(Access Control List, 访问控制)
是什么:
控制“谁能看到那些数据”的权限系统
在 RAG 中的作用:
防止“数据越权索引”
比如:
- A 用户只能查看自己公司文档
- B 用户不能查看 HR 资料
实现方式:
- 每一个 chunk 都带有 metadata (比如 user_id / org_id)
- 检索时加上过滤条件
{
"text": "员工工资数据。。。",
"org_id": "company_A"
}检索时:
WHERE org_id = current_user.org_id;Reranker (重排序器)
是什么:
对检索出来的结果再做一次更精细的排序。
为什么需要 Reranker?
RAG流程通常是:
- 向量检索(快但不够准)
- reranker(慢但更准)
- 在给到 LLM
举个🌰:
提问:
“合同违约责任怎么界定?”
向量检索可能返回:
- 合同法总则(相关但泛)
- 违约责任条款(最相关)
- 民法基础定义(弱相关)
reranker 会重新排序为:
- 违约责任条款
- 合同法总则
- 民法基础定义
常见的模型有:
- Cross-Encoder(最常见)
- BGE-reranker
- Cohere Rerank
Tips:
reranker 可以让 “高 recall → 高 precision”
把上述三个名词串起来
原始文档
↓
Chunk(切块)
↓
Embedding(向量化)
↓
向量数据库(带ACL metadata)
↓
检索(Top-K)
↓
Reranker(重排序)
↓
LLM生成答案