news 2026/4/21 17:46:14

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/4/19 14:22:13

社区治理现代化:用预装MGeo工具箱处理民生诉求地址

社区治理现代化:用预装MGeo工具箱处理民生诉求地址 在日常社区治理中,街道办经常收到居民的非标准地址投诉,比如"菜场后面垃圾站"、"小区东门第三个路灯旁"等模糊描述。这类地址难以精确定位,给网格员工作带来…

作者头像 李华
网站建设 2026/4/20 20:07:57

MGeo模型对地址语义歧义的处理

MGeo模型对地址语义歧义的处理 引言:中文地址匹配中的语义歧义挑战 在地理信息处理、物流调度、城市治理和本地生活服务等场景中,地址数据的标准化与实体对齐是关键的数据预处理环节。然而,中文地址存在大量语义歧义、表达多样性和结构不规范…

作者头像 李华
网站建设 2026/4/20 19:17:29

Z-Image-Turbo实时反馈:生成进度条与预计完成时间

Z-Image-Turbo实时反馈:生成进度条与预计完成时间 引言:从“黑盒等待”到“透明生成”的用户体验升级 在AI图像生成领域,用户最常遇到的痛点之一是生成过程不可见、耗时不确定。尤其是在使用高性能模型如阿里通义Z-Image-Turbo进行高分辨率…

作者头像 李华
网站建设 2026/4/21 5:08:18

MGeo推理接口响应时间压测报告

MGeo推理接口响应时间压测报告 背景与测试目标 随着地理信息数据在电商、物流、本地生活等场景中的广泛应用,地址相似度匹配成为实体对齐和去重的核心能力。阿里云近期开源的 MGeo 模型,专注于中文地址语义理解与相似度计算,在多个公开地址…

作者头像 李华
网站建设 2026/4/21 18:24:08

tunnelto完整指南:重新定义本地服务共享体验

tunnelto完整指南:重新定义本地服务共享体验 【免费下载链接】tunnelto Expose your local web server to the internet with a public URL. 项目地址: https://gitcode.com/GitHub_Trending/tu/tunnelto 你是否经历过这样的开发困境?精心调试的本…

作者头像 李华
网站建设 2026/4/22 1:20:56

RVC-WebUI完整教程:从零开始掌握AI语音克隆技术

RVC-WebUI完整教程:从零开始掌握AI语音克隆技术 【免费下载链接】rvc-webui liujing04/Retrieval-based-Voice-Conversion-WebUI reconstruction project 项目地址: https://gitcode.com/gh_mirrors/rv/rvc-webui 想要实现专业级的语音转换效果却不知从何入手…

作者头像 李华