Chunking 策略
知识库简介
Chunking(分块)是把解析后的文档元素组织成“可独立检索、可回到原文、可放进模型上下文”的证据单元。它不是把长文本随手截短:分块边界会同时影响 Embedding 表示、召回粒度、引用精度、权限过滤、更新范围与推理成本。
没有适用于所有语料的万能尺寸。FAQ、规章制度、代码、表格和长叙事需要保留的边界不同;同一策略在“查一个数值”和“汇总跨段条件”两类问题上也可能相反。可靠流程是:先定义输入与证据锚点,建立简单基线,再用目标查询集比较质量和成本。
本库的事实边界
示例中的
lexical unit是便于离线复现的正则计量单位,不是任何模型 tokenizer。接入真实 Embedding 或 LLM 时,必须用该模型对应的 tokenizer、输入限制和当前官方文档重新核验。
在总路线中的位置
文档解析产出带结构、位置、版本与权限的元素;本库将元素变成 chunks;知识库构建负责其生命周期与发布。随后依次通过 Embedding、向量数据库、语义搜索与Reranking建立候选链,最后由 RAG验证这些证据是否找得到、排得对、答得有依据。
学习目标
完成本库后,你应能:
- 区分字符、词、token、句子、段落、解析元素与 chunk;
- 把模型输入上限转换成可解释的 chunk 预算,而不是照抄一个数字;
- 实现固定窗口、递归边界与结构感知三类基线;
- 处理标题、列表、代码、表格和超长单元素;
- 设计 overlap、父子块、检索上下文、来源锚点、ACL 与稳定 ID;
- 建立锚定原始 element/span 的 gold set,比较 Recall@k、MRR、证据完整率和成本;
- 为策略升级设计双版本重建、验证、切换与回滚。
前置知识
- 能读写 Python 列表、函数、JSON 与命令行;
- 理解 HTTP 文档或 Markdown 的基本结构;
- 知道“检索先找候选,再交给模型”的流程即可,公式会从零解释。
若前置不熟,可先复习 Python基础、JSON 和 文档解析。
核心术语
| 术语 | 初学者解释 | 本库中的约束 |
|---|---|---|
| element | 解析器识别出的段落、标题、表格行或代码块 | 是稳定来源锚点,不等同于 chunk |
| chunk | 索引与召回的基本证据单元 | 必须可回溯来源、版本、位置和权限 |
| hard max | 任何 chunk 都不能超过的上限 | 超长元素也必须二次切分 |
| soft max | 希望停止继续合并的目标 | 可为保留完整元素而略小或略大,但不能越过 hard max |
| overlap | 相邻窗口重复的来源范围 | 只为边界证据服务,并计入成本 |
| retrieval text | 用于检索或向量化的文本 | 可含标题/表头,但须与可引用原文分开 |
| provenance | 来源、版本、元素与位置证据 | 支持引用、删除、重建和审计 |
推荐学习顺序
| 顺序 | 课程 | 学完能做什么 |
|---|---|---|
| 1 | 切分单位、预算与基线 | 定义计量单位、输入预算、chunk schema 与可比较基线 |
| 2 | 固定窗口与递归切分 | 写出会终止、全覆盖且不越 hard max 的切分器 |
| 3 | 结构化与语义切分 | 为标题、表格、代码和弱结构文本选择策略 |
| 4 | Overlap、元数据与上下文 | 控制重复成本,并保持 ACL、引用和版本可追踪 |
| 5 | 检索评测与切分项目 | 运行离线对照实验,用来源锚点评测两种策略,并验证检索表示变化会生成新的索引记录身份 |
建议按顺序完成。第 1~2 课建立正确性,第 3~4 课建立工程边界,第 5 课把“感觉更好”改造成可复现证据。
动手实践入口
项目文件均在当前知识库内:
- chunking_lab.py:结构感知策略、固定窗口基线、ACL 过滤与评测;
- corpus.json:段落、代码、表格和超长元素;
- queries.json:以
element_id + exact quote锚定的查询集; - test_chunking_lab.py:32 项输入契约、覆盖、边界、稳定 ID、
index_entry_id失效语义与确定性测试。
在项目根目录(同时包含 docs/ 与 .website/)运行:
$env:PYTHONDONTWRITEBYTECODE = '1' # 禁止生成 __pycache__,让运行不污染知识库。
python -B -W error '.\docs\Chunking策略\examples\chunking_lab.py' # 运行离线切分、检索与评测实验。
python -B -W error -m unittest discover -s '.\docs\Chunking策略\examples' -p 'test_chunking_lab.py' -v # 发现并详细执行相邻测试文件。项目完全离线,不需要 API key,也不代表真实向量检索的生产效果。
掌握标准
- 我能说明为何 chunk 不是页面、段落或 tokenizer token 的同义词。
- 我能从总输入预算反推 chunk hard max,并写明计量器与版本。
- 切分结果覆盖所有来源单位、顺序确定、不会死循环且不跨 source/revision/ACL。
- 表格、代码、标题与超长元素有明确而可测试的策略。
- overlap 有边界假设、重复率指标和关闭条件。
- 检索文本、可引用原文与派生上下文分开保存并分别哈希。
-
index_entry_id绑定 chunk、检索文本哈希、索引版本与 ACL 快照,标题或表头上下文变化后不会静默复用旧索引记录。 - Gold 锚定稳定来源,不因 chunk ID 重建而整体失效。
- 我会同时报告检索质量、证据完整率、上下文成本与索引成本。
- 策略升级可以双版本验证、切换和回滚。
与其他知识库的关系
| 知识库 | 输入或输出关系 |
|---|---|
| 文档解析 | 提供结构元素、页/行位置、来源版本与解析告警 |
| 知识库构建 | 管理 chunk 的修订、发布指针、删除与重建 |
| Embedding | 决定实际 tokenizer、向量输入与模型版本 |
| 向量数据库 | 存储向量、过滤字段和 chunk metadata |
| 语义搜索 | 检查候选召回、过滤和排序行为 |
| Reranking | 在候选中重新排序并控制重复上下文 |
| RAG | 验证最终引用支持、回答正确性与拒答 |
完成本库项目后,先进入 从来源到引用的离线证据链理解目标不变量,再运行跨模块来源适配与原子发布,观察真实 Chunking lexical span、原生 ID scheme、KB release 与 citation 如何通过显式 crosswalk 对接;最后用External Provenance Artifact v2验证完整 chunk/entry payload 离开 producer 进程后仍能重建 route、ACL 与 coverage。
主要参考资料
- LangChain Text Splitters:当前官方切分器分类与递归切分入口。
- Unstructured: Chunking:基于解析元素、hard/soft maximum、表格与 overlap 行为。
- Azure AI Search: Chunk documents:切分单位、布局感知与向量检索实践。
- OpenAI tiktoken:模型相关 token 计量工具的官方仓库。
- Anthropic: Contextual Retrieval:为 chunk 添加检索上下文的一种工程方案。
- LlamaIndex Node Parser:节点解析与关系组织的当前官方文档。
来源获取日期:2026-07-22。动态 SDK、模型限制与云服务行为应在实施当天复查。