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

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.xdnf.cn/news/12423.html

相关文章:

  • Setting搜索 ===》了解是如何初始搜索索引以及去掉控件搜索
  • exp1_code
  • 腾讯云服务器端口怎么全部打开?CVM和轻量端口开通教程
  • 【杂谈】-吉卜力化(Ghiblified ) AI 图像:艺术与隐私的交织
  • 06.最长连续序列
  • 我的创作纪念日——聊聊我想成为一个创作者的动机
  • 总结这几个月来我和AI一起开发并上线第一个应用的使用经验
  • 数据融合是什么?进行数据融合的4大关键环节!
  • 前端面试准备-7
  • 从 Stdio 到 HTTP SSE,在 APIPark 托管 MCP Server
  • PasteForm(ABP)框架之实现更加灵活的类似多租户的归属过滤功能,比如只能查看自己的相关数据
  • Abaqus分析步与输出:
  • 【leetcode】347. 前k个高频元素
  • 利率的计量
  • VIN码车辆识别码解析接口如何用C#进行调用?
  • 如何利用Elastic Stack(ELK)进行安全日志分析
  • 常见串口种类介绍
  • 一、ES6-let声明变量【解刨分析最详细】
  • 右值引用和移动语义
  • 酷黑NBA足球赛事直播源码体育直播M39模板赛事源码
  • redis数据过期策略、淘汰策略
  • RADIUS-管理员获取共享密钥
  • 【CPU】英特尔酷睿Ultra 5 225H与Ultra7 258V(Lunar Lake架构)PK
  • [蓝桥杯]航班时间
  • 【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)
  • 六、数据库的安全性
  • C++11 中 final 和 override 从入门到精通
  • 在 Spring Boot 中使用 JSP
  • 【实施指南】Android客户端HTTPS双向认证实施指南
  • 如何排查和解决PHP连接数据库MYSQL失败写锁的问题