当前位置: 首页 > news >正文

LangchainRAG you need - 段落拆分

LangChain & RAG you need-段落拆分

🚀 总结:按推荐度排序表格

拆分器名称推荐度使用场景是否语义切分控制粒度是否依赖外部库
RecursiveCharacterTextSplitter⭐⭐⭐⭐⭐通用文本✅ 是段落→字符
MarkdownHeaderTextSplitter⭐⭐⭐⭐Markdown 文档✅ 是(基于结构)章节级
TokenTextSplitter⭐⭐⭐控制 token 数❌ 否token 级
SpacyTextSplitter⭐⭐⭐多语言/语法强✅ 是句子级
NLTKTextSplitter⭐⭐英文语料✅ 是句子级
CharacterTextSplitter粗暴切分❌ 否固定字符

1. RecursiveCharacterTextSplitter

🧠 逐层回退切分逻辑(核心思想)

设定一个 chunk_size=500chunk_overlap=50,如果一段文本太长,LangChain 会按照以下“层级”尝试切分:

段落(\n\n) → 行/句子(\n) → 小句/标点(. 、。等) → 单词(空格) → 字符(强切)

🔁 示例演示

设定 chunk_size=50(为了演示),有如下文本:

这是第一段内容。\n\n这是第二段,它包含一些较长的句子。这些句子需要被拆分成更小的块,以便模型理解。\n\n这是第三段。
  1. 第一层尝试(段落切)
    • 使用 \n\n 作为分隔符,切出 3 个段落:
      • “这是第一段内容。”
      • “这是第二段…理解。”
      • “这是第三段。”
  2. 第二段太长 >50:
    • 第二层尝试(句子切):按 . 切分
      • “这是第二段,它包含一些较长的句子。”
      • “这些句子需要被拆分成更小的块,以便模型理解。”
  3. 某句仍然太长:
    • 第三层尝试(空格):按空格或标点切分为短语或单词级片段
  4. 仍然无法满足:
    • 最终强切(字符):按字符数截断(硬切割)

⚙️ 参数含义与推荐

参数类型默认值作用推荐设置
chunk_sizeint1000每段最大长度中文建议 300~500,英文 512~1000
chunk_overlapint200相邻段重叠字符数50~200,RAG 强推荐设置
separatorsList[str]英文标点列表切分优先级列表中文请用 ["\n\n", "。", ",", " ", ""]
length_functionCallablelen计算长度方式若按 token 则用 tiktoken
is_separator_regexboolFalse是否把separator 当正则,True 适合有格式结构文档
add_start_indexboolFalse是否记录起始位置,是否在返回的 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_onList[Tuple[str, str]]必填指定分割的标题层级,如 [("#", "一级标题"), ("##", "二级标题")]
strip_headersboolTrue是否从正文中移除分割用的标题行(如 # xxx
return_each_lineboolFalse是否逐行返回每段内容(用于结构极其规整的 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.']

相关文章:

  • StarRocks
  • 串:BF算法(朴素的魔术匹配算法)
  • c++ chrono头文件含义
  • NGINX `ngx_stream_core_module` 模块概览
  • 软考 系统架构设计师系列知识点之杂项集萃(82)
  • centos查看开启关闭防火墙状态
  • 9.axios底层原理,和promise的对比(2)
  • AI Agent 项目 SUNA 部署环境搭建 - 基于 MSYS2 的 Poetry+Python3.11 虚拟环境
  • git连接本地仓库以及gitee
  • 验证电机理论与性能:电机试验平板提升测试效率
  • 智慧照明:集中控制器、单双灯控制器与智慧灯杆网关的高效协同
  • 18650锂电池组点焊机:高效组装锂电池的关键工具|比斯特自动化
  • 【Pinia】Pinia和Vuex对比
  • 计算机程序文档
  • 虎扑正式易主,迅雷完成收购会带来什么变化?
  • es在Linux安装
  • 美化显示LLDB调试的数据结构
  • 如何基于Mihomo Party http端口配置git与bash命令行代理
  • 护网面试题目2025
  • 计算机网络领域所有CCF-A/B/C类期刊汇总!
  • 你认为视频网站如何做推广/企业推广网络营销
  • 网站的申请/百度关键词seo优化
  • 西安做网站哪家好/营销广告文案
  • 郑州知名做网站公司/搜索引擎优化介绍
  • 东莞企石做网站/网上怎么找人去推广广告
  • wordpress单位内网做网站/优化系统