深色模式
02 · 切块与入库:资料怎么放进向量库
学完你能说出:
- 块切大了、切小了各有什么问题,常见的块大小和重叠怎么定。
- 为什么相邻块之间要有「重叠」。
- 入库时除了向量,还要存什么(原文、元数据),为什么。
先看地图
上一篇讲了 RAG 的完整流程。这一篇放大离线阶段:资料怎么切、怎么存。
RAG 效果不好,很多时候问题出在这一步:切坏了,后面检索再好也找不回来。
本篇讲 4 个点:① 块大小怎么定 → ② 重叠为什么要有 → ③ 按什么切 → ④ 入库存什么。
一句话本质
切块 = 把长文档切成「一块讲一件事」的小段;入库 = 给每块算向量,和原文、出处一起存好。
生活类比:做读书卡片
准备考试时,你会把教材抄成一张张知识卡片:
- 一张卡片抄一整章:找的时候拿到一大堆,重点被淹没(块太大)。
- 一张卡片只抄半句话:拿到了也看不懂前因后果(块太小)。
- 好的卡片:一张讲清一个知识点,卡片角上写着「第几章第几页」(元数据)。
一步步看:切一份 3000 字的手册
设定:块大小 = 500 字,重叠 = 50 字。
第 1 块:第 1 – 500 字
第 2 块:第 451 – 950 字 ← 往回多带 50 字
第 3 块:第 901 – 1400 字
……每块往后挪 450 字(500 − 50),所以 3000 字大约切成 7 块。
为什么要重叠? 假设「年假规定:入职满一年」在第 1 块末尾,「可享 5 天带薪假」在第 2 块开头。不重叠的话,这句话被切成两半,哪一块都不完整;有 50 字重叠,第 2 块开头就带上了前半句。
入库时每块存这些:
| 字段 | 例子 | 用途 |
|---|---|---|
| 向量 | [0.12, −0.03, …](768 个数) | 用来检索 |
| 原文 | 「员工入职满一年,享有带薪年假 5 天……」 | 拼进提示词给模型看 |
| 元数据(Metadata) | 来源:员工手册.pdf,第 12 页,章节「假期」,更新日期 2026-09 | 显示出处、按条件筛选、删除旧版本 |
为什么这么设计
为什么块大小要折中?
- 块太大:一块里混了好几个话题,向量变成「平均意思」,和具体问题的相似度反而不高;拼进提示词也费 Token。
- 块太小:语义不完整,检索到了也答不了;块数暴增,库变大。
- 方案:取中间值,常见在几百到一千字(或 Token)左右,再按实际问答效果调。
- 好处:每块语义完整,检索又准。
一句话答法
块太大语义被稀释、检索不准还费 Token,块太小信息不完整;取能讲完一个知识点的大小,再用测试问题调参。
为什么要重叠?
- 问题:按固定长度硬切,会把一句话、一个要点从中间切断。
- 方案:相邻块之间重叠一小段,常见是块大小的 10%–20%。
- 好处:被切断的信息至少能在一块里保持完整。代价是存储多了一点。
一句话答法
防止关键句被切断在两块边界上,重叠让边界附近的信息至少在一块里是完整的。
为什么最好按结构切,而不是只按字数切?
- 问题:只按字数切,会把标题和正文、表格的表头和内容分开。
- 方案:优先按文档结构切:标题、段落、列表、表格;一节太长,再按字数细分。很多工具的「递归切分」就是这个思路:先按段落切,太长再按句子切。
- 好处:每块都是一个自然的语义单元,标题还能作为上下文。
一句话答法
按标题、段落等结构切,能让每块对应一个完整话题,比机械按字数切更准;太长的节再按长度细分。
为什么要存元数据?
- 问题:只有向量和原文的话,回答时没法告诉用户「出自哪里」;资料更新时也找不到旧版本在哪。
- 方案:每块带上来源、页码、章节、日期等元数据。
- 好处:能给出处;能过滤(比如只在「2026 版手册」里搜);能增量更新(删掉某个文件的旧块,再插入新的)。
一句话答法
元数据让回答能溯源、检索能按条件过滤、资料能按文件增量更新。
英文术语拆解
| 术语 | 拆开看 | 一句话意思 |
|---|---|---|
| Chunking | chunk 块 + -ing | 切块 |
| Chunk Size | chunk 块 + size 大小 | 每块多长 |
| Overlap | over 越过 + lap 重叠部分 | 相邻块重叠的长度 |
| Recursive Splitter | recursive 递归的 + splitter 切分器 | 先按大单位切,太长再按小单位切 |
| Metadata | meta 关于…的 + data 数据 | 元数据:描述数据的数据,如来源、页码 |
| Indexing | index 索引 + -ing | 建索引:把块向量化并入库的过程 |
| Ingestion | ingest 摄入 | 数据导入:加载、清洗、切块、入库的全过程 |
面试怎么问
Q:chunk size 怎么选?
没有通用最优值,取决于文档类型和问题类型。原则是一块能完整讲清一个知识点:问答类常从几百 Token 起步,配 10%–20% 的重叠,再用一组测试问题比较检索命中率来调。结构清晰的文档优先按标题、段落切。
Q:为什么要设置 overlap?
防止关键信息被切在两块的边界上导致语义不完整。代价是存储和计算略有增加。
Q:表格、PDF 这种复杂文档怎么处理?
先做好解析:PDF 要处理分栏、页眉页脚;表格尽量保持整行整表,或转成「表头: 值」的文本;图片可以用 OCR 或多模态模型生成描述。解析质量往往比切块参数影响更大。
容易混的地方
- 块越小越精确 ✗:太小会丢上下文。「5 天」单独成块,模型不知道是什么 5 天。
- 重叠越大越好 ✗:重叠太大,几乎重复存储,检索结果里还会出现好几块雷同内容。
- 只要切块,不管解析 ✗:PDF 解析乱码、表格错位,切得再好也没用。垃圾进,垃圾出。
和其他知识的连接
- ← 来自 RAG 是什么:这里是离线阶段的展开。
- ← 来自 Embedding:每块用 Embedding 模型算向量。
- → 影响 检索与重排:切块质量直接决定能不能检索到完整答案。
- → 影响 评估与常见坑:答不好时,第一个要查的就是切块。
自测 3 问
Q1:块太大、太小分别有什么问题?
点开看答案
太大:一块混好几个话题,向量被「平均」、检索不准,还费 Token。太小:语义不完整,检索到了也答不了,块数暴增。要取能讲完一个知识点的大小。
Q2:块大小 500、重叠 50,第 2 块从第几个字开始?为什么要重叠?
点开看答案
从第 451 个字开始(每块往后挪 500 − 50 = 450)。重叠是为了防止关键句被切断在边界上。
Q3:入库时为什么要存元数据?举两个用途。
点开看答案
① 回答时给出处(哪个文件、第几页);② 检索时按条件过滤(比如只搜某个版本);③ 资料更新时按文件删掉旧块再插入新块。任答两个即可。
✅ 验收清单
- 能用「读书卡片」类比说清块大小的折中
- 能算出给定块大小和重叠时,每块的起止位置
- 能讲清重叠、按结构切、存元数据分别解决什么问题
- 能说出入库时每块要存的三类东西
- 能举出至少 2 个「切块之前的解析」会出的问题
下一步该懂什么
- 库建好了,问题来了怎么找?只靠向量够不够?→ 检索与重排