4附课9 分钟

附04:切片策略深度 —— RAG 的"地基工程"

理解为什么切片是 RAG 最关键的环节、掌握五种主流切片策略及选型、理解元数据的真正价值、学会评估切片质量。

切片ChunkingEmbedding元数据RAG
进度保存在本机浏览器;验收通过后再点更稳妥

附04:切片策略深度 —— RAG 的"地基工程"

本节目标:理解为什么切片是 RAG 最关键的环节、掌握五种主流切片策略及选型、理解元数据的真正价值、学会评估切片质量。

第4课你跑通了 RAG 最小闭环。这一节我们往深处走:切片到底怎么切才不丢语义?


1. 为什么切片是最关键的?

切片决定了检索单元的颗粒度。颗粒度不对,后面所有环节都崩盘:

切片太大(如整章 5000 字)切片太小(如 50 字)
向量稀释:核心信息被淹没语义割裂:上下文被砍断
检索准但内容杂:返回一大段,模型抓不到重点检索碎片化:返回一堆碎片但拼不出完整答案
超出 LLM context:5 个 chunk 就把窗口塞满引用价值低:单独看一句话没意义

经验阈值:中文场景 200-500 字 是黄金区间。


2. 五种主流切片策略

① 固定长度切片(最简单,最差)

java
String text = "...";
for (int i = 0; i < text.length(); i += 300) {
    chunks.add(text.substring(i, Math.min(i + 300, text.length())));
}

问题:可能把"太阳之为|病,脉浮"切成两半,语义碎片。

② 句子边界切片

java
String[] sentences = text.split("[。!?]");
StringBuilder chunk = new StringBuilder();
for (String s : sentences) {
    if (chunk.length() + s.length() > 300) {
        chunks.add(chunk.toString());
        chunk = new StringBuilder();
    }
    chunk.append(s).append("。");
}

优势:不割裂句子。问题:跨段落上下文丢失。

③ 重叠滑窗(工业界标配)

java
int chunkSize = 300;
int overlap = 50;
for (int i = 0; i < text.length(); i += (chunkSize - overlap)) {
    chunks.add(text.substring(i, Math.min(i + chunkSize, text.length())));
}

用 50 字重叠保留上下文——上一个 chunk 的尾巴 = 下一个 chunk 的头,避免"边界割裂"。

④ 结构化切片(本项目方案 )

按章节天然边界切,保留元数据:

java
for (Chapter chapter : book.getChapters()) {
    ClassicChunk chunk = new ClassicChunk();
    chunk.setBookTitle(book.getTitle());      // 《黄帝内经·素问》
    chunk.setChapterTitle(chapter.getTitle());// 上古天真论
    chunk.setDynasty(book.getDynasty());      // 先秦
    chunk.setAuthor(book.getAuthor());
    chunk.setOriginalText(chapter.getContent());
    chunk.setNormalizedText(normalize(chapter.getContent())); // 异体字归一化
    // 太长的章节再用滑窗二次切
}

三重优势:引用天然带出处、语义完整(一节一个主题)、元数据可用于过滤检索。

⑤ 语义切片(最先进)

用 LLM 或语义模型判断"哪里该切":计算相邻句子的语义相似度 → 相似度骤降处切分。工具:LangChain SemanticChunker、LlamaIndex SemanticSplitter。

策略对比

策略质量复杂度适用场景
固定长度推荐极低快速原型
句子边界推荐一般文档
重叠滑窗推荐工业界标配
结构化推荐领域知识库
语义切片推荐前沿场景

3. 元数据才是真正的金矿

切片时保留的元数据,比切片本身更值钱:

java
chunk.setBookTitle("黄帝内经·素问");   // ← 用于过滤:"只在《伤寒论》中搜"
chunk.setDynasty("先秦");              // ← 用于过滤:"只看汉以前文献"
chunk.setChapterTitle("上古天真论");   // ← 用于引用展示
chunk.setChunkIndex(3);                // ← 用于定位精确位置
chunk.setSourceType("classic");        // ← 区分古籍/方剂/医案

实战技巧

  • 元数据过滤比向量检索精准 10 倍
  • 混合查询:WHERE dynasty='宋' AND vector_distance(embedding, ?) < 0.3

4. 切片质量评估

指标检测方法
切片大小分布画直方图,看是否在 200-500 区间
语义完整性抽样人工检查:单独看这个片段能不能理解?
召回率测试准备 100 个 Q-A 对,看正确答案是否在 Top-K

5. Embedding 模型选型速查

第4课用了 mock embedding。生产环境怎么选?

模型维度中文推荐度
BGE-large-zh-v1.51024推荐推荐
BGE-M31024推荐推荐
Conan-embedding1792推荐推荐
OpenAI text-embedding-3-large3072推荐推荐
Jina-embeddings-v31024推荐推荐

选型原则:中文 → BGE 系列,长文档 → BGE-M3(8K),成本敏感 → BGE-small。


核心要点

  1. 切片决定 RAG 上限:切太大向量稀释,切太小语义割裂
  2. 重叠滑窗 + 结构化 = 工业最佳组合
  3. 元数据是金矿:书名、章节、朝代 → 让检索从"向量猜"变成"精确查"
  4. 评估闭环:切片→检索→评估→调参,反复迭代

下一节附05,我们深入检索侧:RRF 融合公式推导 + Rerank 三层原理。