上一篇博客介绍了,加载pdf按页分割的方法,今天讲讲如何自定义分割pdf文件。
LangChain 实战:PDF 文档智能加载与自定义文本分割
在基于大模型的 RAG 应用开发中,PDF 文档加载与精细化文本分割 是核心基础环节。分割的质量直接决定了后续向量检索的精准度和大模型回答的效果。今天给大家分享基于 LangChain 实现 PDF 加载、自定义文本分割的核心技巧,同时详解load_and_split方法的默认规则与实战用法。
一、PDF 文档加载:高效解析核心基础
处理 PDF 文档的第一步是完成文档加载,LangChain 提供的PyPDFLoader是最常用、最稳定的 PDF 加载工具。它可以快速读取本地 PDF 文件,自动解析文档的文本内容、页码、源文件等元数据,无需手动处理 PDF 格式解析,为后续的文本分割做好数据准备。
加载后的 PDF 文档会以结构化的文档对象形式存储,包含原始文本和关键元信息,这是实现精准文本分割的前提。
二、核心方法:load_and_split 一站式处理
load_and_split是 LangChain 封装的一站式文档处理方法,它整合了「文档加载」和「文本分割」两大功能,一行代码即可完成从 PDF 文件到结构化文本块的全流程,极大简化了开发流程。
这个方法最大的优势是灵活可配置:既可以使用默认规则快速分割,也支持自定义分割器实现精细化控制,适配不同场景的业务需求。
三、默认分割规则:开箱即用的基础配置
很多小伙伴会直接使用load_and_split()不加参数的方式处理文档,这里给大家详细拆解它的默认分割规则:
- 默认使用分割器 :内置
RecursiveCharacterTextSplitter递归字符分割器,这是 LangChain 官方推荐的通用分割方案; - 默认块大小:每个文本块最大字符数为 1000,控制单块文本的长度;
- 默认块重叠:块与块之间重叠 200 个字符,避免上下文语义断裂;
- 默认分割优先级 :按照
["\n\n", "\n", " ", ""]的顺序分割,优先按段落、换行、空格拆分; - 长度计算:默认按照字符数量计算文本长度。
默认规则适合快速测试、简单场景使用,但面对旅游行程、合同、说明书等格式复杂、语义连贯要求高的 PDF 时,自定义分割才能达到最优效果。
四、自定义文本分割:两大实用方案
针对专业场景,我们可以定制分割规则,这里分享两种最实用的实现方式,完美适配 PDF 文档的结构特点:
方案 1:递归智能分割(推荐首选)
这是优化后的高级分割方案,核心特点是智能适配文本结构,语义保留更完整:
- 自定义文本块大小,可根据模型输入限制灵活调整;
- 自定义块重叠字符数,保证上下文语义不中断;
- 自定义分割优先级,适配中文文档:优先按段落、换行,再按中文句号、感叹号、问号、逗号等标点分割,完全符合中文阅读和语义逻辑;
- 严格按照字符数控制长度,分割结果更规整。
这种方式适合绝大多数中文 PDF 文档,比如旅游出团通知书、工作报告、学术文档等,分割后的文本块语义完整、长度均匀,是 RAG 应用的最优选择。
方案 2:固定字符分割(简单场景专用)
这是极简的分割方案,核心特点是规则简单、分割高效:
- 固定按照换行符进行分割,适合格式规整、按行排版的 PDF;
- 可自定义文本块最大长度,支持关闭块重叠;
- 自动去除文本块首尾空白,保证文本干净整洁。
这种方式适合日志类、清单类等结构简单的 PDF 文档,使用门槛极低。
五、分割结果可视化:清晰掌控文档信息
无论使用默认分割还是自定义分割,处理完成后,我们都可以清晰获取每一个文本块的核心信息:
- 文档来源:精准关联原始 PDF 文件;
- 关联页码:定位文本块在 PDF 中的对应页码,溯源更方便;
- 文本内容:分割后的完整文本 + 字符数统计,直观把控块长度;
- 总量统计:一键查看总分割块数,整体掌控文档拆分效果。
结构化的输出结果,能让我们快速校验分割质量,及时调整分割参数。
六、核心优势总结
- 极简开发:一站式方法完成加载 + 分割,无需冗余代码;
- 灵活适配:默认规则快速测试,自定义规则满足专业场景;
- 中文友好:支持自定义中文标点分割,完美适配中文文档;
- 信息完整:保留页码、源文件等元数据,支持结果溯源;
- 场景通用:旅游文档、合同、报告、说明书等 PDF 均可适配。
在 RAG 开发、文档知识库搭建等场景中,这套 PDF 加载 + 文本分割方案是性价比极高的基础方案,上手简单、效果稳定,能有效提升后续检索和问答的质量。
总结
PyPDFLoader是 LangChain 加载 PDF 的核心工具,自动解析文本与元数据;load_and_split是一站式处理方法,默认采用递归分割器,固定块大小、重叠和分割规则;- 自定义分割分两种方案:递归智能分割(推荐,适配中文语义)+ 固定字符分割(简单高效);
- 分割结果包含完整元信息,可精准溯源、校验质量,适配各类 RAG 应用场景。
实现代码如下:
from langchain_community.document_loaders import PyPDFLoader
# 导入需要的文本分割器
from langchain_text_splitters import RecursiveCharacterTextSplitter, CharacterTextSplitter
# 1. 初始化PDF加载器
pdf_path = "./txt/1129全景四川双飞8日出团通知书-2.pdf"
loader = PyPDFLoader(pdf_path)
# 2. 方式1:自定义 RecursiveCharacterTextSplitter(推荐,更智能)
# 可自定义 chunk_size(块大小)、chunk_overlap(块重叠)、分隔符等
custom_splitter_1 = RecursiveCharacterTextSplitter(
chunk_size=200, # 每个文本块最大字符数(替代默认1000)
chunk_overlap=20, # 块之间重叠字符数(替代默认200)
separators=["\n\n", "\n", "。", "!", "?", ",", "、", " "], # 自定义分割优先级
length_function=len, # 计算长度的函数(默认按字符数)
)
# 3. 方式2:简单字符分割器 CharacterTextSplitter(按固定分隔符分割)
custom_splitter_2 = CharacterTextSplitter(
separator="\n", # 按换行符分割
chunk_size=1500, # 每个块最大1500字符
chunk_overlap=0, # 块之间无重叠
strip_whitespace=True, # 去除文本块首尾空白
)
# 4. 传入自定义分割器调用 load_and_split
# 使用方式1的分割器(推荐)
pages_1 = loader.load_and_split(text_splitter=custom_splitter_1)
# 使用方式2的分割器(按需选择)
# pages_2 = loader.load_and_split(text_splitter=custom_splitter_2)
# 5. 输出分割结果(和你原代码格式一致)
print("=" * 80)
print("PDF自定义分割结果详情(按自定义规则分割)")
print("=" * 80)
for idx, doc in enumerate(pages_1):
page_content = doc.page_content
page_num = doc.metadata.get("page", "未知页码")
source_file = doc.metadata.get("source", "未知文件")
print(f"\n【第 {idx + 1} 个文档块】")
print(f"1. 文档来源:{source_file}")
print(f"2. 关联页码:第 {page_num + 1} 页")
print(f"3. 文本内容(字符数:{len(page_content)}):")
print("-" * 60)
print(page_content.strip())
print("-" * 60)
# 汇总信息
print(f"\n✅ 汇总:使用自定义分割器共分割出 {len(pages_1)} 个文档块,文档来源为 {pages_1[0].metadata['source']}")
输出结果太多了,这里不输出了,要尝试的人自己找一篇pdf执行上述代码看结果。
更多学习资料尽在 老虎网盘资源