Appearance
长文本切片策略专题
版本:
v1.1最后更新:
2026-07-06适用对象:负责企业知识库、RAG、文档解析、向量索引、引用溯源和检索评测的算法、平台、后端与知识运营团队。
1. 为什么长文本切片很重要
很多知识型 AI 系统在早期接入文档时,会先用固定 chunk size 直接切片。刚开始这通常能跑起来,但做久了会发现:
- 切太大,检索命中后噪声多,模型难以抓重点
- 切太小,关键上下文断裂,答案缺证据
- 标题、段落、表格、流程步骤被切坏
- 引用看起来不可信,因为 chunk 本身不完整
- 同一问题召回多个碎片,模型需要自己拼上下文
- 切片策略一改,历史评测指标无法对比
长文本切片是 RAG 的地基。它决定了:
- 检索的最小知识单元
- embedding 表示的语义范围
- rerank 能否判断相关性
- 模型最终看到的证据质量
- 引用能否被用户验证
RAG 论文的核心思想是把外部知识检索结果作为生成依据;而在工程上,“检索结果”的基本单位通常就是 chunk。chunk 设计不好,后面的 embedding、rerank、prompt 和引用展示都会被拖累。
2. 什么是切片策略
切片策略可以理解为:
- 决定如何把长文档拆成适合索引、检索、重排、引用和模型阅读的知识单元
它不是简单的字符串截断,而是一个文档结构理解问题。
一套完整切片策略至少要回答:
- 按什么边界切:标题、段落、句子、页码、语义、token
- 每个 chunk 多大:字符数、token 数、段落数
- 是否需要 overlap:相邻 chunk 共享多少上下文
- 是否保留标题路径:章节层级是否进入 metadata
- 表格、代码、FAQ、流程如何特殊处理
- chunk 能否独立支撑一个引用
- 切片变更如何评测和回滚
3. 切片会直接影响 RAG 的哪些环节
3.1 影响召回
如果 chunk 太大,embedding 会混合多个主题,向量表示变得模糊。
如果 chunk 太小,用户问题需要的信息可能散落在多个 chunk 中,单个 chunk 相关性不足。
3.2 影响重排
reranker 通常判断 query 与 chunk 的相关性。chunk 内容越完整,重排越容易判断。
如果 chunk 只有半句话或缺标题,reranker 很难判断它是否真正相关。
3.3 影响引用
引用展示的基本单位通常是 chunk 或 chunk 对应原文片段。
如果 chunk 被切坏:
- 引用只显示半个表格
- 引用缺少条款标题
- 引用没有前提条件
- 用户无法验证答案来源
3.4 影响上下文成本
切片太碎会召回很多小片段,prompt 里要塞更多上下文。
切片太大则每个 chunk 占用 token 多,噪声也多。
3.5 影响幻觉风险
如果 chunk 缺少关键限定条件,模型可能会根据不完整证据做过度推断。
例如制度文档里:
text
员工可申请报销差旅费用。
但以下情况不予报销:私人行程、超标准住宿、无发票支出。如果两句话被切开,模型可能只召回第一句,导致错误回答。
4. 切片的核心矛盾
4.1 完整性 vs 精准性
chunk 越大,上下文越完整,但噪声越多。
chunk 越小,检索越精准,但容易缺前提和结论。
4.2 召回率 vs 引用可读性
为了提高召回,有时会切得更细。
但用户看引用时,更希望看到完整段落、完整条款或完整表格。
4.3 通用策略 vs 文档类型差异
固定 chunk size 最简单,但不同文档结构差异很大:
- FAQ 适合按问答对切
- 制度文档适合按条款和标题层级切
- 表格适合按表头和行组切
- 代码文档适合按函数、类、示例块切
- 流程文档适合按完整步骤组切
没有一种切法适合所有文档。
5. 常见切片方法
5.1 固定长度切片
按字符数或 token 数切。
优点:
- 实现简单
- 容易控制 chunk 大小
- 适合快速原型
缺点:
- 容易切断句子和段落
- 不理解文档结构
- 表格和流程容易被破坏
适合:
- 结构弱、内容连续的普通文本
- 原型阶段
不适合:
- 制度文档
- 合同
- 表格
- FAQ
- 技术文档
5.2 递归字符切片
LangChain 的 RecursiveCharacterTextSplitter 思路是按一组分隔符递归切分,优先保留段落、换行、句子等自然边界,直到满足 chunk size。
常见分隔符顺序:
text
章节标题 -> 段落 -> 换行 -> 句子 -> 空格 -> 字符优点:
- 比固定长度更尊重文本结构
- 实现成本低
- 适合作为默认策略
缺点:
- 仍然不真正理解业务语义
- 对表格、PDF 版面、FAQ 不够精细
5.3 结构化切片
按文档结构切。
例如:
- Markdown 标题层级
- PDF 页码和标题
- Word 样式标题
- HTML heading
- 表格
- 列表
- 代码块
优点:
- 保留文档原始结构
- 引用更可读
- 便于追溯到原文位置
缺点:
- 需要文档解析能力
- 不同文件格式要适配
- 结构解析错误会影响切片
5.4 语义切片
按主题或语义边界切。
思路:
- 判断相邻句子或段落是否属于同一主题
- 主题变化时切开
- 每个 chunk 尽量保持语义完整
优点:
- 更符合用户提问方式
- 能减少主题混杂
缺点:
- 成本更高
- 结果不一定稳定
- 需要额外模型或 embedding 判断
5.5 层级切片
同时保留大块和小块。
例如:
text
章节级 chunk:用于粗召回
段落级 chunk:用于精确引用
句子级 chunk:用于 evidence 对齐优点:
- 兼顾召回和引用
- 适合复杂知识库
缺点:
- 索引和去重更复杂
- 需要 parent-child 关系管理
6. chunk size 与 overlap 怎么选
6.1 chunk size 不是越大越好
大 chunk 的问题:
- embedding 主题混杂
- rerank 难判断
- prompt 成本高
- 引用噪声多
6.2 chunk size 也不是越小越好
小 chunk 的问题:
- 前后文断裂
- 条件和结论分离
- 召回结果碎片化
- 需要拼接更多 chunk
6.3 overlap 的作用
overlap 用来缓解边界断裂。
例如 chunk A 结尾有条件,chunk B 开头有结论,overlap 可以让两个 chunk 都保留部分上下文。
但 overlap 过大也有问题:
- 索引变大
- 重复召回增加
- 成本上升
- 引用重复
6.4 起步建议
不同系统差异很大,但可以这样起步:
| 文档类型 | chunk 建议 | overlap 建议 |
|---|---|---|
| 普通说明文 | 300-800 tokens | 50-150 tokens |
| FAQ | 一问一答为一个 chunk | 通常不需要 |
| 制度条款 | 按条款或小节 | 保留标题路径 |
| 技术文档 | 按标题、段落、代码块 | 适度 overlap |
| 表格 | 按表头 + 行组 | 保留表头 |
| 长报告 | 章节粗切 + 段落细切 | 分层处理 |
这些不是固定标准,而是调参起点。最终要通过回放评测决定。
7. 不同文档类型的切片策略
7.1 FAQ
推荐:
- 一组问答作为一个 chunk
- 保留问题、答案、适用场景
- 相似问法作为 metadata 或别名
不要:
- 把问题和答案切开
- 把多个无关 FAQ 合并成一个 chunk
7.2 制度与政策文档
推荐:
- 按标题层级和条款切
- chunk 中保留标题路径
- 条件、例外、限制要和结论放在一起
metadata 示例:
json
{
"doc_title": "差旅报销制度",
"section_path": "报销范围 > 不予报销情形",
"article_no": "3.2",
"page": 4
}7.3 表格
表格最容易被切坏。
推荐:
- 保留表头
- 按语义行组切
- 每个 chunk 带表格标题
- 对跨页表格保留续表关系
- 重要数值字段保留原格式
不要:
- 只把表格转成无结构文本
- 把表头和数据行切开
- 把金额、单位、日期拆散
7.4 流程文档
推荐:
- 按完整流程阶段切
- 保留步骤顺序
- 条件分支不要和结果分离
- 必要时单独构造流程图或结构化字段
7.5 合同和法律文档
推荐:
- 按条款切
- 保留条款编号
- 保留定义条款和引用关系
- 对“除外”“但书”“前提条件”特别处理
合同切片最怕只召回结论,不召回限制条件。
7.6 技术文档和代码文档
推荐:
- 按标题和代码块切
- 代码示例不要被截断
- API 参数表要保留字段、类型、说明
- 错误码表要保留错误码和解释
8. chunk metadata 设计
好的切片一定要有 metadata。
8.1 基础 metadata
建议包含:
- doc_id
- doc_title
- source_url
- file_path
- page
- section_path
- chunk_id
- chunk_index
- char_start
- char_end
- token_count
- created_at
- document_version
8.2 检索 metadata
可选:
- doc_type
- business_domain
- risk_level
- permission_scope
- language
- effective_date
- expire_date
- owner
这些字段可以支持权限过滤、时间过滤和业务域过滤。
8.3 引用 metadata
引用需要:
- 页码
- 标题路径
- 原文位置
- 表格编号
- 条款编号
- URL anchor
没有 metadata,后续很难做可验证引用。
9. 切片与引用设计联动
很多引用不可信,不是 UI 问题,而是 chunk 本身无法独立支撑结论。
9.1 好 chunk 的标准
一个可引用 chunk 应该:
- 有明确主题
- 保留必要标题
- 条件和结论完整
- 能追溯到原文位置
- 不混入太多无关内容
- 能被用户独立阅读
9.2 引用最小单位
不同场景的引用单位不同:
| 场景 | 推荐引用单位 |
|---|---|
| FAQ | 完整问答对 |
| 制度 | 条款或小节 |
| 表格 | 表头 + 相关行 |
| 合同 | 条款编号 + 条款内容 |
| 报告 | 段落 + 页码 |
| 技术文档 | 参数表或代码块 |
10. 切片策略评测
切片策略必须通过回放评测,而不是只靠感觉。
10.1 评测样本
准备:
- 高频真实问题
- 历史检索失败问题
- 高风险问答
- 需要表格证据的问题
- 需要多段证据的问题
- 证据不足应拒答的问题
10.2 指标
建议看:
- Recall@K:正确证据是否进入前 K
- MRR:正确证据排名是否靠前
- nDCG:排序质量
- 引用准确率
- 答案忠实性
- 证据完整率
- 平均 chunk token
- 检索成本
- 重复召回率
10.3 切片回放流程
text
固定问题集
-> 方案 A 切片并索引
-> 方案 B 切片并索引
-> 跑同一批检索
-> 对比召回、排序、引用和答案质量
-> 分析失败样例切片方案变更必须能解释指标变化。
11. 常见失败与修复
| 失败现象 | 可能原因 | 修复 |
|---|---|---|
| 检索结果主题混杂 | chunk 太大 | 减小 chunk 或按结构切 |
| 召回片段缺前提 | chunk 太小或 overlap 不足 | 增加 overlap 或按条款切 |
| 表格问答错误 | 表头和数据行分离 | 表格专用切片 |
| 引用不可读 | chunk 缺标题和位置 | 增加 section_path 和页码 |
| 同一内容重复召回 | overlap 过大或重复文档 | 去重、调小 overlap |
| 长报告只召回局部 | 缺层级索引 | 章节级 + 段落级双索引 |
| 权限过滤失效 | metadata 缺权限字段 | 增加 permission_scope |
12. 切片策略变更治理
切片策略属于知识库基础设施变更,不能随手改。
每次变更要记录:
- 策略版本
- chunk size
- overlap
- 分隔符
- 文档类型规则
- 影响文档范围
- 重建索引时间
- 回放评测结果
- 是否需要回滚
12.1 版本示例
json
{
"chunking_policy_version": "chunk_policy_v2.1",
"doc_type": "policy",
"chunk_size_tokens": 600,
"chunk_overlap_tokens": 100,
"split_rules": ["heading", "paragraph", "sentence"],
"metadata_required": ["doc_id", "section_path", "page", "permission_scope"]
}12.2 什么时候需要重建索引
需要重建:
- chunk size 变化
- overlap 变化
- 结构解析规则变化
- metadata 字段变化
- 文档解析器升级
- 权限字段变化
重建后必须跑回放评测。
13. 推荐落地流程
text
文档解析
-> 识别文档类型
-> 应用对应切片策略
-> 生成 chunk + metadata
-> 建立向量索引和关键词索引
-> 检索回放评测
-> 分析失败样例
-> 调整策略并版本化13.1 最小可用版本
如果团队刚开始,可以先做:
- Markdown/HTML 按标题切
- 普通文本用递归切分
- FAQ 一问一答切
- 表格保留表头
- 所有 chunk 保留 doc_id、title、section_path、page
13.2 生产增强版本
更成熟后补充:
- 文档类型识别
- 表格专用解析
- 层级索引
- 权限 metadata
- 切片策略版本
- 回放评测
- 失败样例归因
14. 落地检查清单
14.1 策略设计
- 是否区分不同文档类型
- 是否保留标题层级
- 是否保留页码或原文位置
- 是否对表格、FAQ、流程、代码做专用策略
- 是否设置合理 overlap
14.2 metadata
- 是否有 doc_id
- 是否有 chunk_id
- 是否有 section_path
- 是否有 page 或位置
- 是否有 document_version
- 是否有 permission_scope
14.3 评测与治理
- 是否有固定问题集
- 是否能计算 Recall@K 和引用准确率
- 是否能比较不同切片版本
- 是否记录切片策略版本
- 是否把检索失败样例回流
- 是否能回滚到旧索引
15. 推荐搭配阅读
16. 推荐资料
以下资料在 2026-07-06 检查时可访问。
官方文档
- OpenAI File Search:https://developers.openai.com/api/docs/guides/file-search
- OpenAI Vector Stores:https://developers.openai.com/api/docs/guides/vector-stores
- LangChain Text Splitters:https://python.langchain.com/docs/concepts/text_splitters/
- LangChain RecursiveCharacterTextSplitter:https://python.langchain.com/docs/how_to/recursive_text_splitter/
- LlamaIndex Node Parser:https://docs.llamaindex.ai/en/stable/module_guides/loading/node_parsers/
论文
- Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks:https://arxiv.org/abs/2005.11401
17. 一句话总结
长文本切片策略的核心不是找到一个万能 chunk size,而是根据文档结构、业务场景、引用要求和检索评测结果,把长文档拆成既能被准确召回、又能独立支撑答案的知识单元。