1、RecursiveCharacterTextSplitter

(1)作用

通过递归查看字符来分割文本。
递归地尝试按不同的字符进行分割,以找到一个有效的字符。

(2)用法

RecursiveCharacterTextSplitter(
    separators: Optional[list[str]] = None,
    keep_separator: Union[bool, Literal["start", "end"]] = True,
    is_separator_regex: bool = False,
    **kwargs
)

(3)参数解释

3.1 separators: Optional[list[str]]

定义一组递归使用的分割符,从“语义较大”到“语义较小”依次尝试切割。

separators = ["\n\n", "\n", "。", " ", ""]
  • 先按双换行(段落)切;

  • 段落太长,再按单换行(行)切;

  • 行仍太长,再按句号(句)切;

  • 最后按空格或字符切。

💡 建议:

  • 英文文本可用:["\n\n", "\n", ".", " ", ""]

  • 中文文本推荐:["\n\n", "\n", "。", ",", " ", ""]

3.2 keep_separator: Union[bool, Literal["start", "end"]]

控制分割后是否保留分隔符,以及保留在开头还是结尾

含义 示例
False 不保留分隔符 "句子一。句子二。"["句子一", "句子二"]
True 默认保留在 结尾 "句子一。句子二。"["句子一。", "句子二。"]
"start" 保留在分块的 开头 "句子一。句子二。"["。句子一", "。句子二"]
"end" 明确保留在 结尾(同 True) "句子一。句子二。"["句子一。", "句子二。"]
  • 语义分析或 embedding 时保留 "end",避免丢失句尾语义。

  • 纯结构化数据(如CSV)可设为 False

3.3 is_separator_regex: bool = False

是否将 separators 中的分隔符当作**正则表达式(regex)**来解释。

是否将 separators 中的分隔符当作**正则表达式(regex)**来解释。

这时会用正则 \n\d+\. 来匹配“以数字开头的标题行”,可以用来按“第1章、第2章…”等标题分割技术文档。

  • 如果你的文件包含章节号、时间戳、标点规律明显的结构,用正则会非常方便;

  • 一般场景保持 False 即可。

3.4 **kwargs

这是通配符参数,实际会向上层 CharacterTextSplitter 传递。
主要包括下面这些(常用)

参数 类型 默认值 说明
chunk_size int 1000 每个文本块最大长度
chunk_overlap int 200 块与块之间的重叠字符数
length_function Callable len 用于计算长度的函数(可用 tokenizer)
add_start_index bool False 是否在每个chunk中添加原始文本的起始位置
strip_whitespace bool True 是否去除首尾空白符

(4)示例演示

from langchain.text_splitter import RecursiveCharacterTextSplitter

text = """第一章 发动机测试要求
发动机应在额定转速下持续运行。
第二章 数据采集规范
记录转速、扭矩、温度及油耗。
"""

splitter = RecursiveCharacterTextSplitter(
    separators=[r"第.*章", "\n\n", "\n", "。", " "],
    keep_separator="start",
    is_separator_regex=True,
    chunk_size=50,
    chunk_overlap=10,
)

docs = splitter.split_text(text)
for i, d in enumerate(docs, 1):
    print(f"📘 片段 {i}: {d}")

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐