首页/AI/RAG 与向量库速查/递归字符切分

递归字符切分

递归切分按分隔符优先级(段落 → 换行 → 句号 → 空格)逐级下探,尽量把边界落在语义断点;是中文语料常用的默认策略。

RAG 与向量库速查AI更新于 2026-10-13

递归切分是什么

递归字符切分(RecursiveCharacterTextSplitter)按分隔符优先级逐级下探:先用段落分隔符切,超长就退到换行、句号、分号、逗号,最后才硬切。目标是让每块的边界尽量落在语义断点上,同时不超过设定长度。它对结构不规整的长文本适应性好,是中文语料最常用的默认策略。

基本信息

适用中文/英文长文本、结构不规整的文档
chunk_size单块长度上限,按字符计,起步值 500-1000
chunk_overlap相邻块重叠长度,常取 chunk_size 的 10%-20%
separators分隔符优先级列表,从粗到细排列
常见默认段落 → 换行 → 句号 → 分号 → 逗号 → 空格 → 字符

LangChain 递归切分

LangChain 递归切分
from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=800,
    chunk_overlap=120,
    separators=["\n\n", "\n", "。", ";", ",", " ", ""],
)
chunks = splitter.split_text(text)
print(len(chunks), chunks[0][:100])

典型使用场景

  • 制度、合同、说明书的正文:段落边界天然清晰,递归切分能保持条款完整
  • OCR 或解析后的长文本:换行与标点不规整时,多级分隔符比固定长度更稳
  • 多语言混排文档:同一套分隔符列表可同时覆盖中英文标点
  • 作为切分基线:先跑递归切分测召回,再判断是否值得上语义切分
  • 需要与标题切分组合:先按标题分节,再对超长章节做递归切分

参数与影响

参数调大调小
chunk_size语境更完整,相似度被稀释定位更准,答案易被切断
chunk_overlap跨块语义保留更好,存储与检索成本上升边界处信息丢失风险变高
分隔符粒度加入细粒度标点可避免硬切分隔符过粗导致长块被迫硬切

调参检查清单

  • 随机抽 20 块逐块读一遍,确认没有半截句子与孤立标题
  • 统计块长分布,避开大小极不均匀(少数块远超 chunk_size)
  • 对表格与代码段落单独处理,不要与正文共用一套分隔符
  • 用同一批评测问题对比两档 chunk_size,看召回与答案完整性变化
分隔符列表加入中文标点(句号、分号、逗号)能明显减少中文长句被硬切的情况;只保留换行时,一整个自然段往往会被整体切掉。
chunk_size 是字符数而不是 token 数:中文单字常占 1 个以上 token,按字符估算会把超出模型输入上限的块送进 embedding 接口。

易错点

  • 分隔符不含中文标点时,长中文段落可能整段超长或被硬切,检索命中率下降
  • chunk_size 与 embedding 模型的输入上限不匹配,超长块被静默截断,尾部内容永远检索不到
  • overlap 设为 0,跨块的答案在任一块中都读不完整
  • 所有文档类型共用一套切分参数,代码块与表格被切得支离破碎
  • 改完切分参数只重跑索引不重跑评测,无法判断效果是变好还是变差

数据来源与参考

  • LangChain 官方文档(RecursiveCharacterTextSplitter)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌