递归切分是什么
递归字符切分(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 接口。