LangChain文本分割器详解一、基础准备fromlangchain_community.document_loadersimportTextLoaderfromlangchain_text_splittersimportCharacterTextSplitter,RecursiveCharacterTextSplitter# 加载文档file_path./file/常见问题.txttext_loadTextLoader(file_pathfile_path,encodingutf-8)docstext_load.load()# 假设常见问题.txt内容如下 欢迎使用我们的产品 常见问题汇总 问如何注册账号 答点击首页右上角的注册按钮填写手机号和验证码即可完成注册。 问忘记密码怎么办 答在登录页面点击忘记密码通过手机验证码重置密码。 问如何联系客服 答可以通过在线客服、客服电话400-123-4567或发送邮件到supportexample.com联系我们。 技术支持电话400-123-4567 服务时间周一至周日 9:00-21:00 二、CharacterTextSplitter的两种分割方式方式1禁用分隔符的字符级分割fordocindocs:splitterCharacterTextSplitter(chunk_size50,chunk_overlap5,separator# 空字符串禁用分隔符)contentssplitter.split_text(doc.page_content)fore,contentinenumerate(contents):print(f{e1}、{content})# 输出示例# 1、欢迎使用我们的产品## 常见问题汇总## 问如何注册# 2、册账号# 答点击首页右上角的注册按钮填写# 3、写手机号和验证码即可完成注册。## 问忘记密码# 4、码怎么办# 答在登录页面点击忘记密码通过# 5、过手机验证码重置密码。## 问如何联系# 6、系客服# 答可以通过在线客服、客服电话400-# 7、-123-4567或发送邮件到supportexa# 8、ample.com联系我们。## 技术支持电# 9、电话400-123-4567# 服务时间周一至周日 9:00-21:00特点简单粗暴按字符数硬切可能切断完整句子如注册被切成册和账号方式2指定分隔符的段落级分割fordocindocs:splitterCharacterTextSplitter(chunk_size150,# 调小以便看到分割效果chunk_overlap20,separator\n\n# 按段落分割)contentssplitter.split_text(doc.page_content)fore,contentinenumerate(contents):print(f块{e1}(长度:{len(content)}字符):)print(content)print(-*40)# 输出示例# 块 1 (长度: 47 字符):# 欢迎使用我们的产品## 常见问题汇总# ----------------------------------------# 块 2 (长度: 122 字符):# 问如何注册账号# 答点击首页右上角的注册按钮填写手机号和验证码即可完成注册。# ----------------------------------------# 块 3 (长度: 96 字符):# 问忘记密码怎么办# 答在登录页面点击忘记密码通过手机验证码重置密码。# ----------------------------------------# 块 4 (长度: 148 字符):# 问如何联系客服# 答可以通过在线客服、客服电话400-123-4567或发送邮件到supportexample.com联系我们。## 技术支持电话400-123-4567# 服务时间周一至周日 9:00-21:00# ----------------------------------------特点先按段落切保持语义完整超过阈值才进一步切分三、RecursiveCharacterTextSplitter递归分割fordocindocs:splitterRecursiveCharacterTextSplitter(chunk_size100,# 调小以便看到递归效果chunk_overlap20,separators[\n\n,\n,。,,, ,],keep_separatorTrue,length_functionlen,)contentssplitter.split_text(doc.page_content)fore,contentinenumerate(contents):print(f块{e1}(长度:{len(content)}字符):)print(content)print(-*40)# 输出示例# 块 1 (长度: 47 字符):# 欢迎使用我们的产品## 常见问题汇总# ----------------------------------------# 块 2 (长度: 98 字符):# 问如何注册账号# 答点击首页右上角的注册按钮填写手机号和验证码即可完成注册。# ----------------------------------------# 块 3 (长度: 96 字符):# 问忘记密码怎么办# 答在登录页面点击忘记密码通过手机验证码重置密码。# ----------------------------------------# 块 4 (长度: 97 字符):# 问如何联系客服# 答可以通过在线客服、客服电话400-123-4567或发送邮件到supportexample.com联系我们。# ----------------------------------------# 块 5 (长度: 49 字符):# 技术支持电话400-123-4567# 服务时间周一至周日 9:00-21:00# ----------------------------------------特点智能递归优先按段落切段落超长再按句子切保持语义完整性四、其他分割方式补充1. TokenTextSplitter按token数分割fromlangchain_text_splittersimportTokenTextSplitter textLangChain is a framework for developing applications powered by language models.splitterTokenTextSplitter(chunk_size5,chunk_overlap1)chunkssplitter.split_text(text)fori,chunkinenumerate(chunks):print(fChunk{i1}:{chunk})# 输出示例# Chunk 1: LangChain is a framework for# Chunk 2: for developing applications powered by# Chunk 3: by language models.2. MarkdownHeaderTextSplitter保留层级fromlangchain_text_splittersimportMarkdownHeaderTextSplitter markdown_text # 第一章引言 这是引言内容... ## 1.1 背景 背景介绍... ## 1.2 目标 目标说明... # 第二章方法 方法介绍... headers_to_split_on[(#,Header 1),(##,Header 2),]splitterMarkdownHeaderTextSplitter(headers_to_split_on)chunkssplitter.split_text(markdown_text)forchunkinchunks:print(f元数据:{chunk.metadata})print(f内容:{chunk.page_content[:30]}...)print(-*30)# 输出示例# 元数据: {Header 1: 第一章引言}# 内容: 这是引言内容......# ------------------------------# 元数据: {Header 1: 第一章引言, Header 2: 1.1 背景}# 内容: 背景介绍......# ------------------------------# 元数据: {Header 1: 第一章引言, Header 2: 1.2 目标}# 内容: 目标说明......# ------------------------------# 元数据: {Header 1: 第二章方法}# 内容: 方法介绍......# ------------------------------3. PythonCodeTextSplitter代码分割fromlangchain_text_splittersimportPythonCodeTextSplitter python_code def hello_world(): print(Hello, World!) class Calculator: def add(self, a, b): return a b def subtract(self, a, b): return a - b # 主程序 if __name__ __main__: calc Calculator() result calc.add(5, 3) print(f5 3 {result}) splitterPythonCodeTextSplitter(chunk_size50,chunk_overlap10)chunkssplitter.split_text(python_code)fori,chunkinenumerate(chunks):print(f代码块{i1}:)print(chunk)print(-*30)# 输出示例# 代码块 1:# def hello_world():# print(Hello, World!)# ------------------------------# 代码块 2:# class Calculator:# def add(self, a, b):# return a b# ------------------------------# 代码块 3:# def subtract(self, a, b):# return a - b# ------------------------------# 代码块 4:# # 主程序# if __name__ __main__:# calc Calculator()# result calc.add(5, 3)# ------------------------------# 代码块 5:# print(f5 3 {result})# ------------------------------五、优缺点对比分割方式优点缺点适用场景CharacterTextSplitter简单易用控制精确语义完整性差测试、简单文本RecursiveCharacterTextSplitter语义保留好智能灵活性能略低通用场景最常用TokenTextSplitter匹配LLM token限制可能切词LLM精确控制MarkdownHeaderTextSplitter保留文档结构仅限markdown技术文档CodeTextSplitter符合代码结构仅限代码代码处理六、推荐使用RecursiveCharacterTextSplitter是最常用、最通用的选择智能平衡语义和长度限制适合大多数文本处理场景。从输出示例可以看出它能较好地保持句子和段落的完整性。