python-langchain框架(3-5-pdf文件load_and_split()加载 )

基于大模型的 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()不加参数的方式处理文档,这里给大家详细拆解它的默认分割规则

  1. 默认使用分割器 :内置RecursiveCharacterTextSplitter递归字符分割器,这是 LangChain 官方推荐的通用分割方案;
  2. 默认块大小:每个文本块最大字符数为 1000,控制单块文本的长度;
  3. 默认块重叠:块与块之间重叠 200 个字符,避免上下文语义断裂;
  4. 默认分割优先级 :按照["\n\n", "\n", " ", ""]的顺序分割,优先按段落、换行、空格拆分;
  5. 长度计算:默认按照字符数量计算文本长度。

默认规则适合快速测试、简单场景使用,但面对旅游行程、合同、说明书等格式复杂、语义连贯要求高的 PDF 时,自定义分割才能达到最优效果。

四、自定义文本分割:两大实用方案

针对专业场景,我们可以定制分割规则,这里分享两种最实用的实现方式,完美适配 PDF 文档的结构特点:

方案 1:递归智能分割(推荐首选)

这是优化后的高级分割方案,核心特点是智能适配文本结构,语义保留更完整

  • 自定义文本块大小,可根据模型输入限制灵活调整;
  • 自定义块重叠字符数,保证上下文语义不中断;
  • 自定义分割优先级,适配中文文档:优先按段落、换行,再按中文句号、感叹号、问号、逗号等标点分割,完全符合中文阅读和语义逻辑;
  • 严格按照字符数控制长度,分割结果更规整。

这种方式适合绝大多数中文 PDF 文档,比如旅游出团通知书、工作报告、学术文档等,分割后的文本块语义完整、长度均匀,是 RAG 应用的最优选择。

方案 2:固定字符分割(简单场景专用)

这是极简的分割方案,核心特点是规则简单、分割高效

  • 固定按照换行符进行分割,适合格式规整、按行排版的 PDF;
  • 可自定义文本块最大长度,支持关闭块重叠;
  • 自动去除文本块首尾空白,保证文本干净整洁。

这种方式适合日志类、清单类等结构简单的 PDF 文档,使用门槛极低。

五、分割结果可视化:清晰掌控文档信息

无论使用默认分割还是自定义分割,处理完成后,我们都可以清晰获取每一个文本块的核心信息:

  1. 文档来源:精准关联原始 PDF 文件;
  2. 关联页码:定位文本块在 PDF 中的对应页码,溯源更方便;
  3. 文本内容:分割后的完整文本 + 字符数统计,直观把控块长度;
  4. 总量统计:一键查看总分割块数,整体掌控文档拆分效果。

结构化的输出结果,能让我们快速校验分割质量,及时调整分割参数。

六、核心优势总结

  1. 极简开发:一站式方法完成加载 + 分割,无需冗余代码;
  2. 灵活适配:默认规则快速测试,自定义规则满足专业场景;
  3. 中文友好:支持自定义中文标点分割,完美适配中文文档;
  4. 信息完整:保留页码、源文件等元数据,支持结果溯源;
  5. 场景通用:旅游文档、合同、报告、说明书等 PDF 均可适配。

在 RAG 开发、文档知识库搭建等场景中,这套 PDF 加载 + 文本分割方案是性价比极高的基础方案,上手简单、效果稳定,能有效提升后续检索和问答的质量。


总结

  1. PyPDFLoader是 LangChain 加载 PDF 的核心工具,自动解析文本与元数据;
  2. load_and_split是一站式处理方法,默认采用递归分割器,固定块大小、重叠和分割规则;
  3. 自定义分割分两种方案:递归智能分割(推荐,适配中文语义)+ 固定字符分割(简单高效);
  4. 分割结果包含完整元信息,可精准溯源、校验质量,适配各类 RAG 应用场景。

实现代码如下:

|-------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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']}"``) |

相关推荐
好家伙VCC2 小时前
**发散创新:基于算子融合的深度学习推理优化实战**在现代AI部署场景
java·人工智能·python·深度学习
wAEWQ6Ib72 小时前
[拆解LangChain执行引擎]支持自然语言查询的长期存储
数据库·oracle·langchain
数据知道2 小时前
claw-code 源码详细分析:命令宇宙 vs 工具宇宙——`commands` / `tools` 镜像清单如何驱动路由与 shim 执行?
linux·服务器·网络·python·ai·claude code
郝学胜-神的一滴2 小时前
Pytorch自动微分模块:从原理到实战,解锁反向传播核心奥秘
服务器·人工智能·pytorch·python·深度学习·机器学习
CappuccinoRose2 小时前
排序算法和查找算法 - 软考备战(十五)
数据结构·python·算法·排序算法·查找算法
lifallen2 小时前
Flink Agents:从 DataStream 到 Agent 算子的接入与装配
java·大数据·人工智能·python·语言模型·flink
开开心心_Every2 小时前
实用PDF擦除隐藏信息工具,空白处理需留意
运维·服务器·网络·pdf·电脑·excel·依赖倒置原则
做cv的小昊2 小时前
【conda】打包已有conda环境并在其他服务器上搭建
运维·服务器·python·conda·运维开发·pip·开发
Hommy882 小时前
【开源剪映小助手-客户端】目录扫描功能
python·开源·aigc·剪映小助手