当前位置: 首页 > 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.']
http://www.lqws.cn/news/157627.html

相关文章:

  • 欧拉公式简明推导
  • 【Android基础回顾】七:内存管理机制
  • 2025.5.28【33OJ NOI 模拟赛 T3】字符串(AC自动机, 字符串后缀结构)
  • Mybatis动态SQL语句
  • 【iSAQB软件架构】软件架构中构建块的视图:黑箱、灰箱和白箱及其交互机制
  • 2025年渗透测试面试题总结-腾讯[实习]玄武实验室-安全工程师(题目+回答)
  • 数据驱动的智驾十年 特斯拉、Momenta合流闯进Robotaxi卫冕之战
  • Java应用10(客户端与服务器通信)
  • Postman环境变量全局变量设置
  • Postman常见问题及解决方法
  • Perforce ALM产品简介:一站式需求与测试管理平台(已通过SO 26262认证)
  • 基于ResNet残差网络优化梯度下降算法实现图像分类
  • RKNN3588上部署 RTDETRV2
  • 深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
  • CSP-VP37th
  • 麒麟信安系统下修改系统默认记录日志大小
  • [arthas]arthas安装使用
  • vue+element-ui一个页面有多个子组件组成。子组件里面有各种表单,实现点击enter实现跳转到下一个表单元素的功能。
  • 成都芯谷金融中心·文化科技产业园:构建产业新城的实践与探索
  • 基于大数据爬虫+智能AI的网络小说数据可视化系统设计与实现
  • Unity基础-Mathf相关
  • 3ds Max 渲染技术突破:一键解锁照片级真实感!
  • 小程序引入deepseek
  • 每日算法-250605
  • xmind转换为markdown
  • QQ邮箱发送验证码(Springboot)
  • SDC命令详解:使用set_max_fanout命令进行约束
  • MacOS解决局域网“没有到达主机的路由 no route to host“
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: TTask创建多线程, 更简单, 更快捷.
  • Git 安装全攻略Linux、macOS、Windows 与源码编译