LangchainRAG you need - 段落拆分
LangChain & RAG you need-段落拆分
🚀 总结:按推荐度排序表格
拆分器名称 | 推荐度 | 使用场景 | 是否语义切分 | 控制粒度 | 是否依赖外部库 |
---|---|---|---|---|---|
RecursiveCharacterTextSplitter | ⭐⭐⭐⭐⭐ | 通用文本 | ✅ 是 | 段落→字符 | ❌ |
MarkdownHeaderTextSplitter | ⭐⭐⭐⭐ | Markdown 文档 | ✅ 是(基于结构) | 章节级 | ❌ |
TokenTextSplitter | ⭐⭐⭐ | 控制 token 数 | ❌ 否 | token 级 | ❌ |
SpacyTextSplitter | ⭐⭐⭐ | 多语言/语法强 | ✅ 是 | 句子级 | ✅ |
NLTKTextSplitter | ⭐⭐ | 英文语料 | ✅ 是 | 句子级 | ✅ |
CharacterTextSplitter | ⭐ | 粗暴切分 | ❌ 否 | 固定字符 | ❌ |
1. RecursiveCharacterTextSplitter
🧠 逐层回退切分逻辑(核心思想)
设定一个 chunk_size=500
,chunk_overlap=50
,如果一段文本太长,LangChain 会按照以下“层级”尝试切分:
段落(\n\n) → 行/句子(\n) → 小句/标点(. 、。等) → 单词(空格) → 字符(强切)
🔁 示例演示
设定 chunk_size=50
(为了演示),有如下文本:
这是第一段内容。\n\n这是第二段,它包含一些较长的句子。这些句子需要被拆分成更小的块,以便模型理解。\n\n这是第三段。
- 第一层尝试(段落切)
- 使用
\n\n
作为分隔符,切出 3 个段落:- “这是第一段内容。”
- “这是第二段…理解。”
- “这是第三段。”
- 使用
- 第二段太长 >50:
- 第二层尝试(句子切):按
。
或.
切分- “这是第二段,它包含一些较长的句子。”
- “这些句子需要被拆分成更小的块,以便模型理解。”
- 第二层尝试(句子切):按
- 某句仍然太长:
- 第三层尝试(空格):按空格或标点切分为短语或单词级片段
- 仍然无法满足:
- 最终强切(字符):按字符数截断(硬切割)
⚙️ 参数含义与推荐
参数 | 类型 | 默认值 | 作用 | 推荐设置 |
---|---|---|---|---|
chunk_size | int | 1000 | 每段最大长度 | 中文建议 300~500,英文 512~1000 |
chunk_overlap | int | 200 | 相邻段重叠字符数 | 50~200,RAG 强推荐设置 |
separators | List[str] | 英文标点列表 | 切分优先级列表 | 中文请用 ["\n\n", "。", ",", " ", ""] |
length_function | Callable | len | 计算长度方式 | 若按 token 则用 tiktoken |
is_separator_regex | bool | False | 是否把separator 当正则, | True 适合有格式结构文档 |
add_start_index | bool | False | 是否记录起始位置,是否在返回的 Document 中添加每个 chunk 在原始文本中的起始位置,用于回溯来源或原文定位,在高可靠性问答或引用中非常有用 | 引用、对齐场景推荐开, |
length_function
(默认:len
)
用于计算 chunk 长度的函数(可以用来切 token)
默认是字符串长度(字符数):
ength_function = len
你也可以传入 token 计数器(如 tiktoken):
import tiktoken
encoding = tiktoken.get_encoding("cl100k_base")
length_function = lambda text: len(encoding.encode(text))
is_separator_regex
(默认:False)
separators
是否使用正则表达式
separators = [r"\n\d+\.", r"\n\n", r"\. ", r"\n", " ", ""]
is_separator_regex=True
适合于结构化报告或带编号的小节(如“1.2.”、“2.1.3”)的切分。
⌨️ 代码演示
from langchain.text_splitter import RecursiveCharacterTextSplittertext = """这是第一段。\n\n这是第二段,它包含一些较长的句子。这些句子需要被拆分成更小的块,以便模型理解。\n\n这是第三段。"""splitter = RecursiveCharacterTextSplitter(chunk_size=50,chunk_overlap=10,separators=["\n\n", "\n", "。", ",", " ", ""]
)chunks = splitter.split_text(text)
for i, chunk in enumerate(chunks):print(f"Chunk {i+1}: {chunk}")
🔍 输出示例:
Chunk 1: 这是第一段。
Chunk 2: 这是第二段,它包含一些较长的句子。
Chunk 3: 这些句子需要被拆分成更小的块,
Chunk 4: 以便模型理解。
Chunk 5: 这是第三段。
2. MarkdownHeaderTextSplitter
📌 场景:结构化 Markdown 文档,如技术文档、笔记、报告、项目说明书等
- 支持按
#
、##
等标题切分 - 自动生成 metadata
⚙️ 参数说明
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
headers_to_split_on | List[Tuple[str, str]] | 必填 | 指定分割的标题层级,如 [("#", "一级标题"), ("##", "二级标题")] |
strip_headers | bool | True | 是否从正文中移除分割用的标题行(如 # xxx ) |
return_each_line | bool | False | 是否逐行返回每段内容(用于结构极其规整的 Markdown) |
⌨️ 代码演示
from langchain.text_splitter import MarkdownHeaderTextSplittermarkdown_text = """
# 产品介绍我们的产品是一个AI工具包。## 功能1:文本摘要可以对文档进行快速摘要。## 功能2:图像问答支持上传图像进行语义分析。
"""splitter = MarkdownHeaderTextSplitter(headers_to_split_on=[("#", "一级标题"),("##", "二级标题"),],strip_headers=True,return_each_line=False
)docs = splitter.split_text(markdown_text)for doc in docs:print(doc.metadata, doc.page_content[:50])
🔍 输出示例:
{'一级标题': '产品介绍'} 产品介绍\n\n我们的产品是一个AI工具包。
{'一级标题': '产品介绍', '二级标题': '功能1:文本摘要'} 功能1:文本摘要\n\n可以对文档进行快速摘要。
...
3. TokenTextSplitter
(精准 token 控制)
📌 用途:控制模型输入上下文不超出 token 限制
from langchain.text_splitter import TokenTextSplittertext = "LangChain 是一个非常有用的工具,可以帮助你构建多种大模型应用。"splitter = TokenTextSplitter(chunk_size=10,chunk_overlap=2,encoding_name="cl100k_base" # OpenAI 使用的 tokenizer
)chunks = splitter.split_text(text)
print(chunks)
🔍 输出示例(每个 chunk 接近 10 个 token):
['LangChain 是一个非常有用的工具,','的工具,可以帮助你构建多种大模','构建多种大模型应用。']
4. SpacyTextSplitter
(按语义句法切分)
📌 用途:多语言自然语言处理,适合英文/德文/西语等
from langchain.text_splitter import SpacyTextSplittertext = "LangChain is a powerful framework. It helps you build with LLMs easily."splitter = SpacyTextSplitter(pipeline="en_core_web_sm") # 安装: python -m spacy download en_core_web_sm
chunks = splitter.split_text(text)
print(chunks)
🔍 输出示例:
['LangChain is a powerful framework.', 'It helps you build with LLMs easily.']