Agent Engineering 课程阅读
首页/课程一 · RAG 手写/文档处理:加载与切块 (Chunking)

在 GitHub 查看原文

本页目录

Lesson 04 — 文档处理:加载与切块 (Chunking)

本课目标:搞懂为什么不能把整篇文档直接扔进向量库,以及怎么切才合理。切块是 RAG 里最容易被新手忽略、却对效果影响极大的环节。

前三课你用的知识都是几条短文本,根本没碰过真实长文档。这一课就来解决:一份 50 页的员工手册,怎么变成向量库能消化的"小块"


1. 为什么必须切块?

你可能会想:直接把整篇文档向量化存进去不就行了?不行,原因有三:

① 上下文窗口限制

大模型的输入有长度上限(GLM-4 是 12.8 万 token,但越长越贵越慢)。如果把一篇长文档 + 问题一起塞,很容易超窗口,或成本爆炸。

② 检索精度(最关键)

这是核心原因。embedding 是把一整段文本压缩成一个向量。 - 如果一段太长(比如整页),里面混了"请假、报销、远程"三个主题,向量就是这三者的"平均"——检索"年假"时,这段的平均向量可能不够"年假"。 - 如果切成小段,每段只讲一个主题,向量就纯净,检索"年假"时能精准命中。

🎯 核心认知一个 chunk = 一个向量 = 一个语义单元。越纯粹,检索越准。

③ 成本

向量化和生成都是按 token 计费。精准的小块比冗长的大块更省钱。


2. 四种切块策略

策略 怎么切 优点 缺点
固定长度切 每 N 个字符切一刀 简单 可能从句子中间切断,语义断裂
按字符/句子切 在句号、换行处切 保留句子完整 段落长短不一,可能超长
递归字符切(推荐) 按分隔符优先级尝试切(先段落,再句子,再字符) 既保完整又控长度 需要调参数
按结构切 按 Markdown 标题/HTML 标签切 保留文档结构 依赖文档格式良好

RecursiveCharacterTextSplitter(本课重点)

LangChain 的这个切分器是业界最常用的。原理: 1. 有一组分隔符优先级,比如 ["\n\n", "\n", "。", " "](段落 > 换行 > 句号 > 空格) 2. 先尝试用最高优先级(\n\n)切,如果切出来的块还是太长 3. 再降一级用 \n 切,还太长就再用 切……直到块够小

这样能尽量在语义边界处切,避免把一句话劈成两半。


3. 两个关键参数

chunk_size:每块的目标最大长度(字符数)
chunk_overlap:相邻块之间的重叠长度

chunk_size 的取舍

太小 太大
语义被切碎,一句话分两块 一块混多个主题,向量不纯
检索准但信息不全 检索不精准
块数多,存储和检索开销大 块数少,省资源

经验值:中文一般 300~800 字符起步,英文 500~1000 token。但没有万能值,要结合文档特点试。

chunk_overlap 的作用

为什么需要重叠?看这个例子:

没有 overlap:
块1:...员工入职满 1 年可享有
块2:5 天带薪年假,满 3 年...

"年假天数"这个完整信息被切断了!块 1 和块 2 单独看都不完整。

有 overlap(重叠 50 字符):
块1:...员工入职满 1 年可享有 5 天带薪年假,满 3 年...    ← 带上后半句
块2:可享有 5 天带薪年假,满 3 年享有 10 天...             ← 带上前半句

重叠让关键信息在边界处被"兜住",避免断裂。但重叠太大会导致冗余、块数变多。经验值:overlap ≈ chunk_size 的 10%~20%


4. 不同文档类型的差异

  • 纯文本:用 RecursiveCharacterTextSplitter 即可
  • Markdown:可以用 MarkdownHeaderTextSplitter,先按 # 标题 切分保留结构,再按长度切
  • PDF:需要专门的加载器(PyPDFLoader 等),表格和图片是难点
  • 代码:按函数/类切,而不是按字符长度

本课先用 Markdown 文档演示基础切分,PDF/代码留到进阶。


5. 本课代码会做什么

code.py 会做三件事:

① 加载真实文档

读取 data/sample_docs/employee_handbook.md(第 1 课创建的那份员工手册)。

② 对比不同 chunk_size

用 chunk_size = 200 / 500 / 1000 分别切,打印每个切出来的块,让你直观看到"切太大块混主题、切太小语义碎"。

③ 演示 RecursiveCharacterTextSplitter

用推荐的切分器切,配合 chunk_overlap,看它怎么在语义边界处切分、效果比固定长度好在哪里。


6. 跑起来

python lessons/04_chunking/code.py

终端会打印三种 chunk_size 切出来的所有块。重点观察: - chunk_size=200:很多块只有半句话,信息碎片化 - chunk_size=1000:一整块里混了好几个主题(请假+报销) - chunk_size=500 + overlap:每块基本是完整的语义单元


下一课 Lesson 05 — Prompt 工程 会讲:切好块、检索出来后,怎么组织成 prompt 让模型答得好。