RAG(六) 文本分割器的使用

我们上一节将外部数据源加载为Document对象。然而,这些文档通常太长,无法直接放入模型的上下文窗口。例如,一个几十页的 PDF 文档转换成文本后,会远远超出大多数模型的 4k、8k 或甚至 128k token 的限制。

为了解决这个问题,我们需要将一个大的Document分割成多个小的、语义相关的“块” (chunks)。这就是“文本分割器” (Text Splitters) 的作用。

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

一 为什么需要文本分割?

  1. 适应上下文窗口: 这是最主要的原因。将长文档分割成小块,可以让我们在处理时只关注与用户问题最相关的部分。把长文档分割成更小,缩小上下文长度

  2. 提升检索效率和质量: 在 RAG (检索增强生成) 流程中,我们通常会对这些小块进行嵌入并存入向量数据库。更小、更具语义焦点的文本块能够提供更精确的检索结果。如果一个文本块太大,它可能包含太多不相关的主题,从而“稀释”了其向量表示的语义。在分割过程中,能尽量保持文本的语义连贯性

二 文本分割的核心思想

一个好的文本分割策略应该力求在保持语义完整性的同时,将文本切分成合适的大小。这意味着我们不应该简单地在第 1000 个字符处硬生生地切断一个句子。相反,我们应该寻找自然的分割点,比如段落、句子等。

chunk_sizechunk_overlap

配置文本分割器时,有两个核心参数:

  • chunk_size: 定义了每个文本块的最大尺寸。这个尺寸通常以字符数或 token 数来衡量。

  • chunk_overlap: 定义了相邻文本块之间重叠的字符(或 token)数。设置一个小的重叠(例如,100-200 个字符)是一个非常好的实践。它有助于在两个块的边界处保持语义的连续性,避免一个完整的语义单元(如一个长句子)被硬生生切断在两个独立的块中。

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

加载文档后,您通常会想要对其进行转换以更好地适合您的应用程序。最简单的例子是,您可能希望将长文档分割成更小的块,以适合模型的上下文窗口。LangChain 有许多内置的文档转换器,可以轻松地拆分、组合、过滤和以其他方式操作文档。

当您想要处理长文本时,有必要将该文本分割成块。这听起来很简单,但这里存在很多潜在的复杂性。理想情况下,您希望将语义相关的文本片段保留在一起。“语义相关” 的含义可能取决于文本的类型。本笔记本展示了实现此目的的几种方法。

在较高层面上,文本分割器的工作原理如下:

将文本分成小的、具有意义的块(通常是句子)。

开始将这些小块组合成一个更大的块,直到达到一定的大小(通过某些函数测量)。

一旦达到该大小,请将该块设为自己的文本片段,然后开始创建具有一些重叠的新文本块(以保持块之间的上下文)。

pip install -qU langchain-text-splitters 安装文本分割器

三 通用文本分割器

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

首先介绍使用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}")

四 CharacterTextSplitter(基于字符分隔符的通用分割工具)

CharacterTextSplitter 的核心设计理念是“以字符(串)为分隔符,按固定长度切割文本”。它不依赖文本的语义结构(如段落、句子),也不针对特定格式(如 HTML、PDF),而是通过用户指定的分隔符(如换行符、逗号、自定义字符串)将文本拆分为基础单元,再按照设定的块大小(chunk_size)合并这些单元,最终得到符合要求的文本块。

实例一

from langchain_community.document_loaders import TextLoader from langchain_text_splitters import HTMLHeaderTextSplitter, CharacterTextSplitter # 1. 修正 CharacterTextSplitter 参数(核心修复) text_splitter = CharacterTextSplitter( separator="<br>", # 按<br>标签分割 chunk_size=200, # 每个文本块的最大长度(调整为合理值) chunk_overlap=20, # 块之间的重叠长度(必须小于chunk_size) length_function=len, # 长度计算函数 is_separator_regex=False, # 分隔符不按正则处理 ) # 2. 加载 HTML 文件(TextLoader 可读取文本格式的 HTML) try: loader = TextLoader("2.html", encoding="utf8") docs = loader.load() # 注意变量名改为 docs(复数更符合语义) # 3. 执行文本分割 if docs: # 检查是否成功加载文件 texts = text_splitter.create_documents([docs[0].page_content]) # 4. 格式化输出分割结果(便于查看) print(f"分割后的文本块数量:{len(texts)}") print("="*50) for i, text in enumerate(texts): print(f"第 {i+1} 个文本块:{text.page_content}") print("-"*30) except FileNotFoundError: print("错误:未找到 2.html 文件,请检查文件路径是否正确") except Exception as e: print(f"运行出错:{str(e)}")

实例二

from langchain_text_splitters import CharacterTextSplitter # 配置:按段落分隔(默认 "\n\n"),块大小 2000,重叠 200 text_splitter = CharacterTextSplitter( separator="\n\n", chunk_size=2000, chunk_overlap=200, length_function=len, is_separator_regex=False, ) # 模拟长文本(实际场景中可从文件加载) long_text = """LangChain 是一个用于构建大模型应用的开发框架。它提供了丰富的工具和组件,帮助开发者快速实现文本处理、向量存储、对话交互等功能。 文本分割是 LangChain 中的核心模块之一,用于将长文本拆分为符合大模型上下文窗口限制的短文本块。CharacterTextSplitter 是其中最基础、最通用的分割器。 使用 CharacterTextSplitter 时,需注意参数配置的合理性,尤其是 chunk_size 和 chunk_overlap 的关系,避免出现分割异常。""" # 执行分割 texts = text_splitter.create_documents([long_text]) # 输出结果 print(f"分割后文本块数量:{len(texts)}") for i, text in enumerate(texts): print(f"\n第 {i+1} 个文本块:") print(text.page_content)

五 HTMLHeaderTextSplitter 是什么?

HTMLHeaderTextSplitter是 LangChain 库中专门处理 HTML 文本的分割器,核心作用是:

  1. 解析 HTML 字符串,提取其中的标题标签(h1-h6)和对应的正文内容;
  2. 按照标题的层级结构,将 HTML 内容分割成「标题 + 正文」的结构化文本块;
  3. 保留标题的层级关系,便于后续 LLM 理解文本的结构和上下文。

5.1、核心使用场景

  • 爬取网页内容后,按标题结构拆分文本(如爬取文档、博客、帮助中心页面);
  • 为 LLM 提供结构化的 HTML 文本片段,提升问答、总结的准确性;
  • 保留标题层级,避免纯文本分割丢失上下文结构。

5.2、完整使用示例(Python)

1. 前置条件
pip install langchain beautifulsoup4 # beautifulsoup4是解析HTML的核心依赖
2. 代码示例
from langchain.text_splitter import HTMLHeaderTextSplitter # 1. 定义要解析的HTML内容(示例) html_content = """ <html> <body> <h1>Python入门</h1> <p>Python是一种易上手的编程语言。</p> <h2>基础语法</h2> <p>变量、数据类型、运算符是Python的基础。</p> <h3>变量定义</h3> <p>使用等号=定义变量,如x = 10。</p> <h2>常用库</h2> <p>numpy、pandas是Python的常用数据处理库。</p> </body> </html> """ # 2. 初始化分割器:指定要提取的标题层级(按需求选择h1-h6) headers_to_split_on = [ ("h1", "Header 1"), # 映射h1标签为"Header 1" ("h2", "Header 2"), # 映射h2标签为"Header 2" ("h3", "Header 3") # 映射h3标签为"Header 3" ] html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=headers_to_split_on) # 3. 分割HTML内容 split_documents = html_splitter.split_text(html_content) # 4. 输出分割结果 for doc in split_documents: print("标题层级:", doc.metadata) # 包含标题层级的元数据 print("文本内容:", doc.page_content) print("-" * 50)
3. 输出结果
标题层级: {'Header 1': 'Python入门'} 文本内容: Python入门 Python是一种易上手的编程语言。 -------------------------------------------------- 标题层级: {'Header 1': 'Python入门', 'Header 2': '基础语法'} 文本内容: 基础语法 变量、数据类型、运算符是Python的基础。 -------------------------------------------------- 标题层级: {'Header 1': 'Python入门', 'Header 2': '基础语法', 'Header 3': '变量定义'} 文本内容: 变量定义 使用等号=定义变量,如x = 10。 -------------------------------------------------- 标题层级: {'Header 1': 'Python入门', 'Header 2': '常用库'} 文本内容: 常用库 numpy、pandas是Python的常用数据处理库。 --------------------------------------------------

5.3、关键参数说明

  1. headers_to_split_on:必选,指定要提取的标题标签及别名,格式为[(标签名, 别名), ...]
  2. return_each_line:可选,默认False,若设为True,则每行文本单独分割(适合长文本);
  3. strip_headers:可选,默认False,若设为True,则分割后的文本不包含标题本身,只保留正文。

5.4、进阶用法:结合 URL 加载 HTML

from langchain.document_loaders import AsyncHtmlLoader from langchain.text_splitter import HTMLHeaderTextSplitter # 1. 加载网页HTML url = "https://example.com/python-guide" loader = AsyncHtmlLoader([url]) html_doc = loader.load()[0].page_content # 2. 分割HTML内容 headers_to_split_on = [("h1", "H1"), ("h2", "H2")] splitter = HTMLHeaderTextSplitter(headers_to_split_on=headers_to_split_on) split_docs = splitter.split_text(html_doc) # 3. 输出结果 for doc in split_docs: print(f"层级:{doc.metadata} | 内容:{doc.page_content[:50]}...")

总结

  1. HTMLHeaderTextSplitter是 LangChain 中解析 HTML 并按标题层级分割文本的工具,依赖beautifulsoup4解析 HTML;
  2. 核心优势是保留标题层级的元数据,让分割后的文本具备结构化上下文;
  3. 常用场景是网页内容爬取、文档解析后为 LLM 提供结构化文本片段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1120891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GraphQL-Go自定义标量类型完整实现指南

GraphQL-Go自定义标量类型完整实现指南 【免费下载链接】graphql-go GraphQL server with a focus on ease of use 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-go GraphQL作为现代API开发的核心技术&#xff0c;其强大的类型系统为开发者提供了极大的灵活性。…

STM32 USB大容量存储驱动实现图解说明

让STM32变身U盘&#xff1a;深入拆解USB大容量存储驱动实现全流程 你有没有遇到过这样的场景&#xff1f; 设备在现场运行了一周&#xff0c;日志数据堆满了Flash&#xff0c;但导出却要靠串口专用工具&#xff0c;还得连上电脑跑脚本解析二进制文件——繁琐、低效、用户抱怨…

反检测浏览器终极实战指南:从零搭建到高效部署

反检测浏览器终极实战指南&#xff1a;从零搭建到高效部署 【免费下载链接】camoufox &#x1f98a; Anti-detect browser 项目地址: https://gitcode.com/gh_mirrors/ca/camoufox 在当今严格的网络反爬虫环境下&#xff0c;传统的浏览器自动化工具已经难以应对复杂的检…

ms-swift助力企业构建私有化大模型平台

ms-swift助力企业构建私有化大模型平台 在当前AI技术加速落地的浪潮中&#xff0c;越来越多企业意识到&#xff1a;拥有一个自主可控、高效稳定的大模型能力平台&#xff0c;已不再是“锦上添花”&#xff0c;而是决定智能化竞争力的关键基础设施。然而现实却充满挑战——从选型…

终极小说阅读方案:OwlLook如何彻底解决你的找书烦恼?

终极小说阅读方案&#xff1a;OwlLook如何彻底解决你的找书烦恼&#xff1f; 【免费下载链接】owllook owllook-小说搜索引擎 项目地址: https://gitcode.com/gh_mirrors/ow/owllook 还在为找一本心仪的小说而辗转多个平台吗&#xff1f;OwlLook小说搜索引擎就是你的救星…

Ulysses与Ring-Attention序列并行技术详解

Ulysses与Ring-Attention序列并行技术详解 在大模型训练的工程实践中&#xff0c;一个日益棘手的问题正不断挑战硬件极限&#xff1a;如何高效处理超长序列输入&#xff1f; 随着Qwen3、Llama4等模型支持32k甚至131k上下文&#xff0c;多模态场景中一张高分辨率图像也能轻易生成…

高效M3U8下载神器:Fluent M3U8极速上手指南

高效M3U8下载神器&#xff1a;Fluent M3U8极速上手指南 【免费下载链接】Fluent-M3U8 A cross-platform m3u8/mpd downloader based on PySide6 and QFluentWidgets. 项目地址: https://gitcode.com/gh_mirrors/fl/Fluent-M3U8 Fluent M3U8是一款功能强大的跨平台流媒体…

如何快速搭建专业量化交易系统:终极安装配置指南

如何快速搭建专业量化交易系统&#xff1a;终极安装配置指南 【免费下载链接】vnpy 基于Python的开源量化交易平台开发框架 项目地址: https://gitcode.com/vnpy/vnpy 在当今数字化交易时代&#xff0c;拥有一个稳定可靠的量化交易框架已成为专业投资者的标配。作为国内…

艾尔登法环存档编辑器终极指南:3步掌握游戏数据修改

艾尔登法环存档编辑器终极指南&#xff1a;3步掌握游戏数据修改 【免费下载链接】ER-Save-Editor Elden Ring Save Editor. Compatible with PC and Playstation saves. 项目地址: https://gitcode.com/GitHub_Trending/er/ER-Save-Editor 还在为艾尔登法环中反复刷装备…

WeTTY浏览器终端完整部署指南:5分钟搭建专业Web终端环境

WeTTY浏览器终端完整部署指南&#xff1a;5分钟搭建专业Web终端环境 【免费下载链接】wetty Terminal in browser over http/https. (Ajaxterm/Anyterm alternative, but much better) 项目地址: https://gitcode.com/gh_mirrors/we/wetty 想要在任何地方通过浏览器访问…

SGLang引擎集成实战:ms-swift推理延迟降低50%

SGLang引擎集成实战&#xff1a;ms-swift推理延迟降低50% 在大模型应用日益普及的今天&#xff0c;用户对响应速度的要求已经从“能出结果”转向“秒级甚至毫秒级反馈”。尤其是在智能客服、实时创作助手和多轮对话系统中&#xff0c;哪怕几百毫秒的延迟差异&#xff0c;都可能…

Qwen3Guard-Gen-0.6B:颠覆性轻量级AI安全检测解决方案

Qwen3Guard-Gen-0.6B&#xff1a;颠覆性轻量级AI安全检测解决方案 【免费下载链接】Qwen3Guard-Gen-0.6B 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3Guard-Gen-0.6B 在生成式AI技术迅猛发展的当下&#xff0c;内容安全风险已成为制约行业规模化应用的关键…

Calibre电子书转换终极指南:5分钟搞定所有格式兼容问题

Calibre电子书转换终极指南&#xff1a;5分钟搞定所有格式兼容问题 【免费下载链接】calibre The official source code repository for the calibre ebook manager 项目地址: https://gitcode.com/gh_mirrors/ca/calibre 还在为不同设备上的电子书格式不兼容而头疼吗&a…

Positron数据科学IDE终极实战指南:3步解决你的数据混乱问题

Positron数据科学IDE终极实战指南&#xff1a;3步解决你的数据混乱问题 【免费下载链接】positron Positron, a next-generation data science IDE 项目地址: https://gitcode.com/gh_mirrors/po/positron 还在为数据科学项目中的环境配置、代码调试和结果可视化而烦恼吗…

Itsycal菜单栏日历终极指南:简单快捷的Mac日程管理神器

Itsycal菜单栏日历终极指南&#xff1a;简单快捷的Mac日程管理神器 【免费下载链接】Itsycal Itsycal is a tiny calendar for your Macs menu bar. http://www.mowglii.com/itsycal 项目地址: https://gitcode.com/gh_mirrors/it/Itsycal 还在为查看日历而频繁切换应用…

5分钟上手Lively:让你的Windows桌面“活“起来

5分钟上手Lively&#xff1a;让你的Windows桌面"活"起来 【免费下载链接】lively Free and open-source software that allows users to set animated desktop wallpapers and screensavers powered by WinUI 3. 项目地址: https://gitcode.com/gh_mirrors/li/live…

HandBrake终极教程:3天从零到精通视频转码

HandBrake终极教程&#xff1a;3天从零到精通视频转码 【免费下载链接】HandBrake HandBrakes main development repository 项目地址: https://gitcode.com/gh_mirrors/ha/HandBrake 还在为视频格式兼容性问题困扰吗&#xff1f;想要快速将高清视频转换为适合各种设备…

Open Catalyst深度学习实战:从数据驱动到工业应用的全链路解析

Open Catalyst深度学习实战&#xff1a;从数据驱动到工业应用的全链路解析 【免费下载链接】ocp Open Catalyst Projects library of machine learning methods for catalysis 项目地址: https://gitcode.com/GitHub_Trending/oc/ocp 在催化材料研究领域&#xff0c;如…

Invoify:5分钟快速生成专业发票的终极解决方案

Invoify&#xff1a;5分钟快速生成专业发票的终极解决方案 【免费下载链接】invoify An invoice generator app built using Next.js, Typescript, and Shadcn 项目地址: https://gitcode.com/GitHub_Trending/in/invoify 还在为制作发票而头疼吗&#xff1f;Invoify这款…

Textstat终极指南:如何用Python快速分析文本可读性

Textstat终极指南&#xff1a;如何用Python快速分析文本可读性 【免费下载链接】textstat :memo: python package to calculate readability statistics of a text object - paragraphs, sentences, articles. 项目地址: https://gitcode.com/gh_mirrors/tex/textstat T…