922 字
约 3 分钟
10
S20-B02 · 分块与 Embedding

适用读者:RAG 效果差、但不知道问题在"切片"的人。
前置:S20-B01。
实测环境:Python(分块实验,2026-11-05)。
覆盖旧文:1063(90) 1064(77) 1068(106) 571(260) 1062(93) 2054(175) 578(168) = 969 点。
覆盖扩展:E-S20-003(分块策略)、E-S20-004(向量维度)。
上一篇:S20-B01 · RAG 是什么、为什么需要、完整流程
下一篇:S20-B03 · 检索与重排。


1. 一句话结论

分块的目标不是"切得均匀",而是"让每个块能独立回答问题"。固定大小分块会把关键句切成两半——检索到片段也答不全。


2. 实测:固定分块切断关键句

原文(143 字符,退款政策),关键句是:

若商品存在质量问题,用户可在签收后 15 天内申请退款,商家承担运费。

实测结果:

策略 块数 关键句是否完整
固定 40 字符 4 ❌ 被切断
固定 60 字符 3 ❌ 被切断
固定 80 字符 2 ✅
固定 120 字符 2 ✅
句子分块 5 ✅

这就是"跨 chunk 信息不完整"(A-577)的复现:块太小 → 语义被切碎;块太大 → 检索精度下降、噪声变多。


3. 四种分块策略(E-S20-003)

策略 做法 适合
固定大小 按字符/token 切(常带重叠) 简单,但会切断语义
句子/段落 按标点/段落切 结构清晰的文档
递归分块 先段落再句子,按 token 上限逐层切 通用推荐(A-1068)
语义分块 按语义相似度断点 质量高、成本高

判据:

文档有明确结构(标题/段落)?
├── 有 → 递归/段落分块
└── 没有 → 句子分块 + 重叠(overlap 10%~20%)

重叠(overlap)的作用:让被切断的语义在相邻块里"补回来"——这是最便宜的补救手段。


4. Embedding:维度意味着什么(E-S20-004)

事实 含义
维度 = 向量长度(如 1536) 表达能力的上限
维度越高 语义更细,但存储与计算成本线性上升
换模型必须重建索引 不同模型的向量空间不通用

成本直觉:100 万条 × 1536 维 × 4 字节 ≈ 6.1 GB(仅向量,未计索引开销)。

判据:"换了 embedding 模型吗?" 换了 → 全量重建(否则新旧向量不可比)。


5. 五个误区

误区 真相
"块越小越精确" 语义被切碎(实测 40/60 都切断)
"块越大越好" 噪声多、检索精度低
"换模型不用重建索引" 向量空间不通用
"重叠是浪费" 是最便宜的语义补救
"分块不用管文档结构" 表格/标题信息常在这一步丢

6. 自检

  1. 固定分块为什么会切断关键句?
  2. 四种分块策略怎么选?
  3. overlap 的作用?
  4. 维度与成本的关系?
  5. 换 embedding 模型后必须做什么?

7. 下一篇

S20-B03 · 检索与重排:向量、BM25、混合、HyDE

分块讲完,下一篇讲"怎么把对的块找出来"。


本篇属于系列《S20 · AI 应用与工程》。旧文来源:A-1063/1064/1068/571/1062/2054/578;扩展点 E-S20-003/004。分块切断为 Python 实测。

S20-B02 · 分块与 Embedding
https://www.clxhxhhr.top/posts/5465/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。