文档切分(Chunking)
文档切分把长资料拆成可独立检索的小块。块的大小和边界决定检索能否找到细节,也决定回答时是否保留了必要条件。
理解与应用
文档切分是把长文档拆成较小检索单位的过程。搜索通常不需要把整本员工手册交给模型,只需取回能回答问题的几段。块可以是一段文字、一个小节、一个函数,或包含表头的若干表格行。切分不仅控制长度,也在决定系统将以什么单位保存和取回证据。
例如“成都住宿上限为 500 元/晚”后面紧跟“2026 年 7 月 1 日起生效”。若按固定字符数截断,两句话可能落进不同块。检索成都住宿时只取回前一句,回答就失去了适用日期;如果把整本手册都当一个块,日期虽在里面,却又混入大量与问题无关的内容。大小与完整性需要一起考虑。
结构化切分可以利用标题、段落和表格边界,把主规则与紧邻的条件放在一起。某个章节过长时,可以先用小块检索定位,再根据命中位置补读父章节。相邻块之间保留适量重叠也能缓解边界问题,不过会增加存储和重复命中;它不能保证所有相隔很远的例外都被带上。
每一块还需要保留文档编号、章节位置和版本,否则找到一句话后难以回到原文。切分策略是否合适,应使用真实问题检查:能否取回完整的答案依据,是否夹带太多无关文本,引用能否准确定位。固定长度适合作为简单基线,但中文段落、代码和表格的结构不同,不宜只用同一个字符数处理所有材料。
动手试一试:固定字符边界会把生效条件拆出去
这里按 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 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。
- LangChain:Text splitter integrations ↗
已核对官方动态文档的长度与结构切分分类;没有复制其 SDK 示例或宣称固定最佳块大小。 · 核验:2026-10-10