Skip to content

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 版手册」里搜);能增量更新(删掉某个文件的旧块,再插入新的)。

一句话答法

元数据让回答能溯源、检索能按条件过滤、资料能按文件增量更新。

英文术语拆解 ​

术语拆开看一句话意思
Chunkingchunk 块 + -ing切块
Chunk Sizechunk 块 + size 大小每块多长
Overlapover 越过 + lap 重叠部分相邻块重叠的长度
Recursive Splitterrecursive 递归的 + splitter 切分器先按大单位切,太长再按小单位切
Metadatameta 关于…的 + data 数据元数据:描述数据的数据,如来源、页码
Indexingindex 索引 + -ing建索引:把块向量化并入库的过程
Ingestioningest 摄入数据导入:加载、清洗、切块、入库的全过程

面试怎么问 ​

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 个「切块之前的解析」会出的问题

下一步该懂什么 ​

  • 库建好了,问题来了怎么找?只靠向量够不够?→ 检索与重排