文档切分(Chunking)

文档切分把长资料拆成可独立检索的小块。块的大小和边界决定检索能否找到细节,也决定回答时是否保留了必要条件。

返回概念图谱 →

理解与应用

文档切分是把长文档拆成较小检索单位的过程。搜索通常不需要把整本员工手册交给模型,只需取回能回答问题的几段。块可以是一段文字、一个小节、一个函数,或包含表头的若干表格行。切分不仅控制长度,也在决定系统将以什么单位保存和取回证据。

例如“成都住宿上限为 500 元/晚”后面紧跟“2026 年 7 月 1 日起生效”。若按固定字符数截断,两句话可能落进不同块。检索成都住宿时只取回前一句,回答就失去了适用日期;如果把整本手册都当一个块,日期虽在里面,却又混入大量与问题无关的内容。大小与完整性需要一起考虑。

结构化切分可以利用标题、段落和表格边界,把主规则与紧邻的条件放在一起。某个章节过长时,可以先用小块检索定位,再根据命中位置补读父章节。相邻块之间保留适量重叠也能缓解边界问题,不过会增加存储和重复命中;它不能保证所有相隔很远的例外都被带上。

每一块还需要保留文档编号、章节位置和版本,否则找到一句话后难以回到原文。切分策略是否合适,应使用真实问题检查:能否取回完整的答案依据,是否夹带太多无关文本,引用能否准确定位。固定长度适合作为简单基线,但中文段落、代码和表格的结构不同,不宜只用同一个字符数处理所有材料。

关系速览
检索增强生成(RAG)包含 →文档切分(Chunking)

对长文档建立检索单元时,分块决定召回证据的粒度。

动手试一试:固定字符边界会把生效条件拆出去

这里按 Python 字符数切分,14 并不是 token 预算或推荐长度。例子展示同一条规则在两种边界下会怎样保存;结构块还保留了原文位置。是否改善检索仍需用实际查询验证。

将代码保存为 example.py,使用 Python 3.10+ 运行 python3 example.py。仅使用标准库,无需密钥,不会调用外部模型。

Python 代码

text = "成都住宿上限为500元/晚。2026年7月1日起生效。"
size = 14
fixed_chunks = [text[start:start + size]
                for start in range(0, len(text), size)]
for index, chunk in enumerate(fixed_chunks, 1):
    print(f"固定块 {index}: {chunk}")

# 根据条款结构,把规则和紧邻的生效条件作为一个检索单元。
structured_chunk = {
    "document_id": "P-19",
    "section": "住宿 / 成都",
    "text": text,
}
print("结构块:", structured_chunk["text"])

运行结果

固定块 1: 成都住宿上限为500元/晚。
固定块 2: 2026年7月1日起生效。
结构块: 成都住宿上限为500元/晚。2026年7月1日起生效。

常见误区

  • 把表格行拆出来却丢掉列名和单位,检索到数字后也难以正确解释。
  • 以为增加重叠就能补全所有条件,忽视跨章节引用或远处的例外说明。

前置与延伸

建议先读

相关概念

参考与版本

Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。