news 2026/4/3 2:29:10

LangChain框架入门:文本分割器全解析(小白到精通,建议收藏)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain框架入门:文本分割器全解析(小白到精通,建议收藏)

一、什么是文本分割器


在RAG应用中,文档加载器将原始文档转换为Document对象后,通常需要对长文档进行分割处理,这是因为大语言模型的上下文窗口是有限的,如果在RAG检索完成之后,直接将检索到的长文档作为上下文传递给模型,可能会超出模型处理的上下文长度,导致信息丢失或回答质量下降,其中,进行文档分割的组件就是文本分割器

文本分割器的主要作用有:

  1. 控制上下文长度:把长文档分割成更小,缩小上下文长度
  2. 提高检索准确性:小的文本片段能提升文档检索的精确度
  3. 保持语义完整性:在分割过程中,能尽量保持文本的语义连贯性

LangChain提供了多种文本分割器,常用的有:

分割器作用
RecursiveCharacterTextSplitter递归按字符分割文本
CharacterTextSplitter按指定字符分割文本
MarkdownHeaderTextSplitter按Markdown标题分割
PythonCodeTextSplitter专门分割Python代码
TokenTextSplitter按Token数量分割
HTMLHeaderTextSplitter按HTML标题分割

大部分文本分割器都继承自TextSplitter基类,该基类定义了分割文本的核心方法:

  • split_text():将文本字符串分割成字符串列表
  • split_documents():将Document对象列表分割成更小文本片段的Document对象列表
  • create_documents():通过字符串列表创建Document对象

二、递归文本分割器用法


RecursiveCharacterTextSplitter是LangChain中最常用的通用文本分割器,它会根据指定的字符优先级递归分割文本,直到所有片段长度不超过指定上限。

在使用前首先安装依赖:

pip install -qU langchain-text-splitters

执行命令,生成依赖版本快照

pip freeze > requirements.txt

首先介绍一下RecursiveCharacterTextSplitter构造函数几个核心参数:

chunk_size: 每个片段的最大字符数

chunk_overlap:片段之间的重叠字符数

length_function:计算长度函数

is_separator_regex: 分隔符是否为正则表达式

separators:自定义分隔符

2.1 分割文本

首先介绍使用split_text()方法进行文本分割,使用示例如下,其中RecursiveCharacterTextSplitter中指定的块大小为100,片段重叠字符数为30,计算长度的函数使用len

from langchain_text_splitters import RecursiveCharacterTextSplitter # 1.分割文本内容 content = ("李白(701年2月28日~762年12月),字太白,号青莲居士,出生于蜀郡绵州昌隆县(今四川省绵阳市江油市青莲镇),一说山东人,一说出生于西域碎叶,祖籍陇西成纪(今甘肃省秦安县)。" "" "唐代伟大的浪漫主义诗人,被后人誉为“诗仙”,与杜甫并称为“李杜”,为了与另两位诗人李商隐与杜牧即“小李杜”区别,杜甫与李白又合称“大李杜”。" "" "据《新唐书》记载,李白为兴圣皇帝(凉武昭王李暠)九世孙,与李唐诸王同宗。其人爽朗大方,爱饮酒作诗,喜交友。" "" "李白深受黄老列庄思想影响,有《李太白集》传世,诗作中多为醉时写就,代表作有《望庐山瀑布》《行路难》《蜀道难》《将进酒》《早发白帝城》等") # 2.定义递归文本分割器 text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=30, length_function=len, ) # 3.分割文本 splitter_texts = text_splitter.split_text(content) # 4.转换为文档对象 splitter_documents = text_splitter.create_documents(splitter_texts) print(f"分割文档数量:{len(splitter_documents)}") for splitter_document in splitter_documents: print(f"文档片段大小:{len(splitter_document.page_content)}, 文档元数据:{splitter_document.metadata}")

执行结果如下,文本分割器将文本内容分割成了四个文本片段,且内容长度最大为100个字符。

分割文档数量:4 文档片段大小:100, 文档元数据:{} 文档片段大小:100, 文档元数据:{} 文档片段大小:100, 文档元数据:{} 文档片段大小:70, 文档元数据:{}
2.2 分割文档对象

RecursiveCharacterTextSplitter不仅可以分割纯文本,还可以直接分割Document对象,使用示例如下:

from langchain_community.document_loaders import UnstructuredFileLoader from langchain_text_splitters import RecursiveCharacterTextSplitter # 1.创建文档加载器,进行文档加载 loader = UnstructuredFileLoader(file_path="李白.txt") documents = loader.load() # 2.定义递归文本分割器 text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=30, length_function=len, ) # 3.分割文本 splitter_documents = text_splitter.split_documents(documents) print(f"分割文档数量:{len(splitter_documents)}") for splitter_document in splitter_documents: print(f"文档片段大小:{len(splitter_document.page_content)}, 文档元数据:{splitter_document.metadata}")

执行结果如下:

分割文档数量:4 文档片段大小:90, 文档元数据:{'source': '李白.txt'} 文档片段大小:70, 文档元数据:{'source': '李白.txt'} 文档片段大小:53, 文档元数据:{'source': '李白.txt'} 文档片段大小:69, 文档元数据:{'source': '李白.txt'}
2.3 自定义分隔符

RecursiveCharacterTextSplitter默认按照["\n\n", "\n", " ", ""]的优先级进行分割,可以通过separators指定自定义分隔符。

# 2.定义递归文本分割器 text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=30, length_function=len, separators=["。", "?", "\n\n", "\n", " ", ""] )

三、按标题分割Markdown文件


在对Markdown格式的文档进行分割时,一般不能像RecursiveCharacterTextSplitter默认分割规则方式进行分割,通常需要按照标题层次进行分割,LangChain提供了MarkdownHeaderTextSplitter类来实现这个功能。

在对Markdown文件进行分割时,对于那些很长的文档,可以先利用MarkdownHeaderTextSplitter按标题分割,将分割后的文档再使用RecursiveCharacterTextSplitter进行分割,使用示例如下:

from langchain_community.document_loaders import TextLoader from langchain_text_splitters import MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter # 1.文档加载 loader = TextLoader(file_path="李白.md") documents = loader.load() document_text = documents[0].page_content # 2.定义文本分割器,设置指定要分割的标题 headers_to_split_on = [ ("#", "Header 1"), ("##", "Header 2") ] headers_text_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on) # 3.按标题分割文档 headers_splitter_documents = headers_text_splitter.split_text(document_text) print(f"按标题分割文档数量:{len(headers_splitter_documents)}") for splitter_document in headers_splitter_documents: print(f"按标题分割文档片段大小:{len(splitter_document.page_content)}, 文档元数据:{splitter_document.metadata}") # 4.定义递归文本分割器 text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=30, length_function=len ) # 5.递归分割文本 recursive_documents = text_splitter.split_documents(headers_splitter_documents) print(f"第二次递归文本分割文档数量:{len(recursive_documents)}") for recursive_document in recursive_documents: print( f"第二次递归文本分割文档片段大小:{len(recursive_document.page_content)}, 文档元数据:{recursive_document.metadata}")

执行结果如下,先用MarkdownHeaderTextSplitter将markdown文本内容分割成4个文档,之后在对每一个文档使用RecursiveCharacterTextSplitter进行分割,分割成了11个文档,并且在文档元数据中,还添加了文本片段所属的标题信息。

按标题分割文档数量:4 按标题分割文档片段大小:124, 文档元数据:{'Header 1': '一、李白简介'} 按标题分割文档片段大小:248, 文档元数据:{'Header 1': '二、生平'} 按标题分割文档片段大小:182, 文档元数据:{'Header 1': '三、代表作品'} 按标题分割文档片段大小:200, 文档元数据:{'Header 1': '四、影响与评价'} 第二次递归文本分割文档数量:11 第二次递归文本分割文档片段大小:100, 文档元数据:{'Header 1': '一、李白简介'} 第二次递归文本分割文档片段大小:54, 文档元数据:{'Header 1': '一、李白简介'} 第二次递归文本分割文档片段大小:68, 文档元数据:{'Header 1': '二、生平'} 第二次递归文本分割文档片段大小:76, 文档元数据:{'Header 1': '二、生平'} 第二次递归文本分割文档片段大小:99, 文档元数据:{'Header 1': '二、生平'} 第二次递归文本分割文档片段大小:33, 文档元数据:{'Header 1': '二、生平'} 第二次递归文本分割文档片段大小:92, 文档元数据:{'Header 1': '三、代表作品'} 第二次递归文本分割文档片段大小:89, 文档元数据:{'Header 1': '三、代表作品'} 第二次递归文本分割文档片段大小:88, 文档元数据:{'Header 1': '四、影响与评价'} 第二次递归文本分割文档片段大小:54, 文档元数据:{'Header 1': '四、影响与评价'} 第二次递归文本分割文档片段大小:56, 文档元数据:{'Header 1': '四、影响与评价'}

四、自定义文本分割器


当内置的的文本分割器无法满足业务需求时,可以继承TextSplitter类来实现自定义分割器,不过一般需要自定义文本分割器的情况非常少,

假设我们有如下需求,在对文本分割时,按段落进行分割,并且每个段落只提取第一句话,下面通过实现自定义文本分割器,来实现这个功能,示例如下:

from typing import List from langchain_community.document_loaders import TextLoader from langchain_text_splitters import TextSplitter classCustomTextSplitter(TextSplitter): defsplit_text(self, text: str) -> List[str]: text = text.strip() # 1.按段落进行分割 text_array = text.split("\n\n") result_texts = [] for text_item in text_array: strip_text_item = text_item.strip() if strip_text_item isNone: continue # 2.按句进行分割 result_texts.append(strip_text_item.split("。")[0]) return result_texts # 1.文档加载 loader = TextLoader(file_path="李白.md") documents = loader.load() document_text = documents[0].page_content # 2.定义文本分割器 splitter = CustomTextSplitter() # 3.文本分割 splitter_texts = splitter.split_text(document_text) for splitter_text in splitter_texts: print( f"文本分割片段大小:{len(splitter_text)}, 文本内容:{splitter_text}")

执行结果:

文本分割片段大小:8, 文本内容:# 一、李白简介 文本分割片段大小:43, 文本内容:李白(701年—762年),字太白,号青莲居士,唐代伟大的浪漫主义诗人,被誉为“诗仙” 文本分割片段大小:6, 文本内容:# 二、生平 文本分割片段大小:35, 文本内容:李白出生于绵州昌隆县(今四川江油),自幼聪慧过人,六岁能诵诗,十岁能文 文本分割片段大小:8, 文本内容:# 三、代表作品 文本分割片段大小:25, 文本内容:- 《将进酒》:这是一首最能体现李白豪放性格的诗作 文本分割片段大小:9, 文本内容:# 四、影响与评价 文本分割片段大小:24, 文本内容:李白的诗作气势奔放、意境开阔,对后世文学影响深远

五、总结


本文详细介绍了LangChain中文本分割器的概念和用法。文本分割器是实现RAG的重要组件,它可以将长文本分割成适合模型处理的小片段,同时保持文本的语义完整性。

在本文中,重点介绍了RecursiveCharacterTextSplitter递归文本分割器,它是最常用的通用分割器,能够按照字符优先级进行递归文本分割。对于Markdown格式的文档,MarkdownHeaderTextSplitter能够按照标题层次进行结构化分割,保证文本分割的层次性。

当内置的分割器无法满足特定需求时,我们可以通过继承TextSplitter类来实现自定义分割器,灵活的处理各种文本分割需求。

选择合适的文本分割策略对RAG应用的效果至关重要。在实际项目中,建议根据文档的特点和业务需求来选择或组合使用不同的分割器,来到最佳的文本处理效果。

普通人如何抓住AI大模型的风口?

领取方式在文末

为什么要学习大模型?

目前AI大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。

目前,开源人工智能大模型已应用于医疗、政务、法律、汽车、娱乐、金融、互联网、教育、制造业、企业服务等多个场景,其中,应用于金融、企业服务、制造业和法律领域的大模型在本次调研中占比超过30%。

随着AI大模型技术的迅速发展,相关岗位的需求也日益增加。大模型产业链催生了一批高薪新职业:

人工智能大潮已来,不加入就可能被淘汰。如果你是技术人,尤其是互联网从业者,现在就开始学习AI大模型技术,真的是给你的人生一个重要建议!

最后

只要你真心想学习AI大模型技术,这份精心整理的学习资料我愿意无偿分享给你,但是想学技术去乱搞的人别来找我!

在当前这个人工智能高速发展的时代,AI大模型正在深刻改变各行各业。我国对高水平AI人才的需求也日益增长,真正懂技术、能落地的人才依旧紧缺。我也希望通过这份资料,能够帮助更多有志于AI领域的朋友入门并深入学习。

真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发

大模型全套学习资料展示

自我们与MoPaaS魔泊云合作以来,我们不断打磨课程体系与技术内容,在细节上精益求精,同时在技术层面也新增了许多前沿且实用的内容,力求为大家带来更系统、更实战、更落地的大模型学习体验。

希望这份系统、实用的大模型学习路径,能够帮助你从零入门,进阶到实战,真正掌握AI时代的核心技能!

01教学内容

  • 从零到精通完整闭环:【基础理论 →RAG开发 → Agent设计 → 模型微调与私有化部署调→热门技术】5大模块,内容比传统教材更贴近企业实战!

  • 大量真实项目案例:带你亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事‌!

02适学人群

应届毕业生‌:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。

零基础转型‌:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界‌。

业务赋能突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型‌。

vx扫描下方二维码即可

本教程比较珍贵,仅限大家自行学习,不要传播!更严禁商用!

03入门到进阶学习路线图

大模型学习路线图,整体分为5个大的阶段:

04视频和书籍PDF合集

从0到掌握主流大模型技术视频教程(涵盖模型训练、微调、RAG、LangChain、Agent开发等实战方向)

新手必备的大模型学习PDF书单来了!全是硬核知识,帮你少走弯路(不吹牛,真有用)

05行业报告+白皮书合集

收集70+报告与白皮书,了解行业最新动态!

0690+份面试题/经验

AI大模型岗位面试经验总结(谁学技术不是为了赚$呢,找个好的岗位很重要)

07 deepseek部署包+技巧大全

由于篇幅有限

只展示部分资料

并且还在持续更新中…

真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 11:39:12

AI助力H桥电路设计:自动生成驱动代码与仿真

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个基于STM32的H桥电机驱动控制项目,要求:1.使用PWM控制电机转速,频率可调范围1-20kHz 2.实现硬件死区时间自动计算功能 3.包含过流保护电…

作者头像 李华
网站建设 2026/3/27 17:07:38

1小时用Flowable搭建可运行的工作流原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 快速生成一个电商退货流程原型,要求:1. 客户提交退货申请 2. 客服审核 3. 仓库验收 4. 财务退款 5. 包含简单UI和Mock数据 6. 能在1小时内完成并演示。使用…

作者头像 李华
网站建设 2026/3/28 16:20:16

MGeo模型在地图POI合并中的实际应用

MGeo模型在地图POI合并中的实际应用 引言:POI合并的挑战与MGeo的引入 在地图服务、本地生活平台和城市计算系统中,POI(Point of Interest)数据是核心基础信息。然而,由于数据来源多样(如用户上报、第三方采…

作者头像 李华
网站建设 2026/4/2 20:40:46

实时搜索优化:MGeo在地址模糊查询中的性能调优

实时搜索优化:MGeo在地址模糊查询中的性能调优实战 为什么我们需要关注地址搜索的准确性? 本地生活网站的用户调研显示,60%的搜索放弃源于首屏结果不准确。当用户输入"朝阳区星巴克"却看到海淀区的门店时,这种体验落差会…

作者头像 李华
网站建设 2026/4/2 6:22:03

Selenium IDE零基础入门:1小时学会自动化测试

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个交互式Selenium IDE学习应用,包含:1. 基础录制教程;2. 常见命令解释器;3. 5个渐进式练习项目;4. 实时错误检查。…

作者头像 李华
网站建设 2026/3/9 5:17:14

MGeo在旅游平台酒店地址归一化中的使用

MGeo在旅游平台酒店地址归一化中的使用 引言:旅游平台地址数据的挑战与MGeo的引入价值 在旅游平台的实际运营中,酒店信息往往来自多个渠道——OTA供应商、酒店直连系统、第三方数据接口等。这些来源提供的地址描述存在显著差异:同一酒店可能…

作者头像 李华