零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析

零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析
大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章😉C++实现图书管理系统(Qt C++ GUI界面版)
SpringBoot实战系列🐷【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
分库分表分库分表之实战-sharding-JDBC分库分表执行流程原理剖析
消息队列深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK)
AI大模型零基础学AI大模型之RAG系统链路解析与Document Loaders多案例实战”

前情摘要:
1、零基础学AI大模型之读懂AI大模型
2、零基础学AI大模型之从0到1调用大模型API
3、零基础学AI大模型之SpringAI
4、零基础学AI大模型之AI大模型常见概念
5、零基础学AI大模型之大模型私有化部署全指南
6、零基础学AI大模型之AI大模型可视化界面
7、零基础学AI大模型之LangChain
8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路
9、零基础学AI大模型之Prompt提示词工程
10、零基础学AI大模型之LangChain-PromptTemplate
11、零基础学AI大模型之ChatModel聊天模型与ChatPromptTemplate实战
12、零基础学AI大模型之LangChain链
13、零基础学AI大模型之Stream流式输出实战
14、零基础学AI大模型之LangChain Output Parser
15、零基础学AI大模型之解析器PydanticOutputParser
16、零基础学AI大模型之大模型的“幻觉”
17、零基础学AI大模型之RAG技术
18、零基础学AI大模型之RAG系统链路解析与Document Loaders多案例实战


本文章目录

零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析

在AI大模型学习系列中,我们已经掌握了LangChain的核心概念、Prompt工程、链(Chain)等基础能力。而在RAG(检索增强生成)系统中,“文档加载(Document Loading)”是数据输入的第一步——只有先把PDF、Word等外部文档准确提取成文本,才能后续构建向量数据库、实现精准检索。

本文作为RAG链路的关键实战篇,将聚焦LangChain中最常用的PDF加载器PyPDFLoader,从基础使用到图片提取,再到问题排查,带你一站式掌握PDF文档处理能力。

请添加图片描述

1. 前言:为什么需要PyPDFLoader?

在RAG系统中,PDF是最常见的“外部知识库”格式(如技术文档、论文、报告等)。但PDF的文本存储结构特殊,直接读取会出现“乱码”“分页丢失”等问题——LangChain的PyPDFLoader正是为解决这个问题而生

它的核心价值在于:

  • 自动按PDF页码拆分文档,返回Document对象列表(每个对象对应1页);
  • 保留元数据(如页码、文件路径),方便后续检索时定位“文本来源”;
  • 支持按需加载指定页码,避免大文件加载耗时;
  • 可结合OCR工具提取扫描版PDF或图片中的文本,覆盖更多场景。

2. PyPDFLoader基础:安装与核心能力

2.1 安装依赖库

PyPDFLoader依赖pypdf库实现PDF解析,需先安装(建议指定版本避免兼容性问题):

# 安装pypdf(推荐3.0.0+版本) pip install pypdf>=3.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple # 安装LangChain社区版(包含PyPDFLoader) pip install langchain-community -i https://pypi.tuna.tsinghua.edu.cn/simple 

2.2 核心能力说明

能力描述适用场景
按页拆分将多页PDF拆分为单个Document对象,每个对象包含page_content(文本)和metadata(元数据)需按页码追溯文本来源的场景(如“引用第5页的内容”)
元数据保留自动记录source(文件路径)、page(页码,从1开始)RAG检索时显示“答案来自xxx文件第x页”
按需加载支持指定页码范围加载,无需加载整个文件大文件(如1000页PDF)仅需提取部分页面

3. PyPDFLoader实战:3类核心场景

以下实战均基于“本地PDF文件”(路径示例:data/test.pdf),建议先创建data文件夹并放入测试PDF,避免路径错误。

3.1 场景1:加载整个PDF并查看基础信息

目标:加载完整PDF,查看总页数、第一页文本和元数据。

from langchain_community.document_loaders import PyPDFLoader # 1. 初始化加载器(传入PDF文件路径,支持相对路径/绝对路径)# 相对路径:相对于当前代码文件的路径(如data/test.pdf)# 绝对路径:如"C:/docs/test.pdf"(Windows)或"/home/user/docs/test.pdf"(Linux) loader = PyPDFLoader("data/test.pdf")# 2. 加载所有页面(返回Document对象列表) pages = loader.load()# 3. 查看基础信息print(f" PDF总页数:{len(pages)}")# 输出总页数print(f"\n 第一页元数据:{pages[0].metadata}")# 元数据(source、page等)print(f"\n 第一页前200字符预览:\n{pages[0].page_content[:200]}...")# 文本预览

输出示例

 PDF总页数:10 第一页元数据:{'source': 'data/test.pdf', 'page': 1} 第一页前200字符预览: LangChain PyPDFLoader实战指南 1. 概述 PyPDFLoader是LangChain社区版中用于解析PDF文件的核心加载器,支持按页拆分、元数据保留... 

3.2 场景2:按需加载指定页码

目标:加载PDF的“第2-4页”(注意:load()方法的参数是索引,从0开始,即第2页对应索引1,第4页对应索引3)。

from langchain_community.document_loaders import PyPDFLoader loader = PyPDFLoader("data/test.pdf")# 加载第2-4页(索引1、2、3) target_pages = loader.load([1,2,3])# 验证结果for idx, page inenumerate(target_pages):print(f" 第{idx+2}页元数据:{page.metadata}")# 页码应为2、3、4print(f"第{idx+2}页前100字符:{page.page_content[:100]}...\n")

关键注意点
loader.load()的参数是“索引列表”,而非“页码列表”——比如要加载第5-7页,需传入[4,5,6],避免混淆!

3.3 场景3:合并所有页面为单个文本

目标:将所有页面的文本合并为一个字符串(适用于无需按页拆分的场景,如“生成PDF全文摘要”)。

from langchain_community.document_loaders import PyPDFLoader loader = PyPDFLoader("data/test.pdf") pages = loader.load()# 合并所有页面文本(用两个换行符分隔页面,避免文本粘连) full_text ="\n\n".join([page.page_content for page in pages])# 查看合并结果print(f" 合并后全文总字符数:{len(full_text)}")print(f"\n 全文前500字符预览:\n{full_text[:500]}...")

实用技巧
如果PDF页面间有重复内容(如页眉“LangChain指南”),可在合并前添加“去重逻辑”,例如:

# 合并时去除每页开头的重复页眉(示例:页眉为"LangChain指南") full_text ="\n\n".join([page.page_content.replace("LangChain指南","")for page in pages])

4. 常见问题与解决方案(避坑指南)

在实际使用中,最常遇到“加载失败”和“分块不理想”两类问题,以下是针对性解决方案。

4.1 问题1:PDF无法加载或内容为空

常见原因与解决步骤
原因现象解决方案
1. 文件是“扫描版PDF”(本质是图片集合)加载后page_content为空字符串,或只有乱码用OCR工具提取图片中的文本(见第5章)
2. PDF文件加密(需密码解密)报错PdfReadError: File has not been decrypted1. 用Adobe Acrobat等工具手动解密;
2. 若需代码解密,可先用PyPDF2库解密后再加载
3. 文件路径错误报错FileNotFoundError: [Errno 2] No such file or directory1. 检查路径是否存在(用os.path.exists("data/test.pdf")验证);
2. 优先使用绝对路径避免相对路径混淆
4. 文件损坏报错PdfReadError: EOF marker not found重新下载或修复PDF文件(用Adobe Acrobat修复)
加密PDF解密示例(用PyPDF2)

若PDF需密码,可先解密再传给PyPDFLoader:

from PyPDF2 import PdfReader, PdfWriter from langchain_community.document_loaders import PyPDFLoader import os # 1. 解密PDF并保存为临时文件defdecrypt_pdf(input_path, output_path, password): reader = PdfReader(input_path)if reader.is_encrypted: reader.decrypt(password)# 传入PDF密码# 保存解密后的文件 writer = PdfWriter()for page in reader.pages: writer.add_page(page)withopen(output_path,"wb")as f: writer.write(f)print(f" 解密后的PDF已保存至:{output_path}")# 2. 解密并加载 decrypt_pdf( input_path="data/encrypted_test.pdf",# 加密PDF路径 output_path="data/decrypted_test.pdf",# 解密后保存路径 password="123456"# PDF密码)# 3. 用PyPDFLoader加载解密后的文件 loader = PyPDFLoader("data/decrypted_test.pdf") pages = loader.load()print(f" 解密后PDF总页数:{len(pages)}")

4.2 问题2:文本分块不理想(如句子被截断)

PyPDFLoader仅负责“提取文本”,若需将文本拆分为适合大模型输入的“小块”(如500字符/块),需结合RecursiveCharacterTextSplitter优化分块策略。

解决方案:自定义分块参数
from langchain_community.document_loaders import PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter # 1. 加载PDF loader = PyPDFLoader("data/test.pdf") pages = loader.load()# 2. 初始化文本分割器(核心参数说明) text_splitter = RecursiveCharacterTextSplitter( separators=["\n\n","\n","."],# 优先按段落(\n\n)、再按换行(\n)、最后按句号(.)分割 chunk_size=500,# 每个块的最大字符数(根据大模型上下文窗口调整,如GPT-3.5用500-1000) chunk_overlap=50,# 块之间的重叠字符数(避免上下文丢失,如前块结尾50字符与后块开头重叠) length_function=len# 字符数计算方式(默认len,即按字符数))# 3. 执行分块 split_docs = text_splitter.split_documents(pages)# 4. 查看分块结果print(f" 原始页面数:{len(pages)}")print(f" 分块后总块数:{len(split_docs)}")print(f"\n 第一个块内容:\n{split_docs[0].page_content}")print(f"\n 第一个块元数据(含页码):{split_docs[0].metadata}")

参数调整建议

  • 若处理长文档(如论文):chunk_size=1000chunk_overlap=100
  • 若处理短文本(如产品手册):chunk_size=300chunk_overlap=30
  • 若中文文本出现“断句异常”:可在separators中添加“。”“!”“?”,如separators=["\n\n", "\n", "。", "!", "?", "."]

5. 进阶:PDF图片提取(含OCR实战)

PyPDFLoader默认仅提取“文本层”的内容,若PDF中包含“图片”(如截图、手写笔记、图表中的文字),需结合OCR工具提取图片中的文本。

这里推荐轻量级OCR工具rapidocr-onnxruntime,支持中英混合识别,且无需复杂配置。

5.1 工具介绍:RapidOCR-ONNXRuntime

特性说明优势
引擎基于ONNX Runtime(跨平台推理引擎)速度快、资源占用低(比Tesseract快3-5倍)
语言支持中文、英文、日文、韩文等10+语言适合处理中英混合的技术文档
模型体积核心模型仅5-10MB无需下载大模型,安装即用
跨平台支持Windows、Linux、macOS、移动端开发环境无限制
与主流OCR工具对比
工具引擎速度准确率依赖项适用场景
RapidOCR-ONNXRuntimeONNX Runtime⭐⭐⭐⭐⭐⭐⭐少(仅需onnxruntime)跨平台、轻量级部署、实时提取
Tesseract自研引擎⭐⭐⭐⭐多(需安装Poppler、语言包)开源免费、简单文本识别
EasyOCRPyTorch⭐⭐⭐⭐⭐多(需安装PyTorch、CUDA)复杂场景(如倾斜文本)
Microsoft Read API云端引擎⭐⭐⭐⭐⭐⭐⭐⭐无(需API密钥)企业级、高并发需求

5.2 实战:提取PDF中的图片文本

步骤1:安装依赖
# 安装rapidocr-onnxruntime(首次安装会自动下载小模型,耗时约1-2分钟) pip install rapidocr-onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple 
步骤2:代码实现(图片文本提取)
from langchain_community.document_loaders import PyPDFLoader # 关键:初始化时设置extract_images=True,启用图片提取 loader = PyPDFLoader("data/pdf-img.pdf", extract_images=True)# 加载页面(图片中的文本会自动嵌入到page_content中) pages = loader.load()# 查看结果(图片中的文本会跟在该页原有文本后)print(f" 总页数:{len(pages)}")print(f"\n 包含图片的页面内容(前500字符):\n{pages[0].page_content[:500]}...")

效果说明
若PDF第1页包含一张“写有‘LangChain RAG’的图片”,则pages[0].page_content会包含:
【原有文本】... [图片文本:LangChain RAG] ...
(不同版本的PyPDFLoader可能会用不同标记包裹图片文本,以实际输出为准)

6. 高级技巧:批量处理文件夹中的所有PDF

若需一次性加载“某个文件夹下的所有PDF”(如docs/文件夹),可结合os库遍历文件夹,实现批量加载。

from langchain_community.document_loaders import PyPDFLoader import os # 目标文件夹路径 pdf_folder ="docs/"# 存储所有PDF的页面 all_pages =[]# 遍历文件夹中的所有文件for filename in os.listdir(pdf_folder):# 仅处理后缀为.pdf的文件if filename.lower().endswith(".pdf"):# 拼接完整文件路径 pdf_path = os.path.join(pdf_folder, filename)try:# 加载当前PDF loader = PyPDFLoader(pdf_path) pages = loader.load() all_pages.extend(pages)print(f" 成功加载:{filename}({len(pages)}页)")except Exception as e:# 捕获异常,避免单个文件错误导致整个批量任务失败print(f" 加载{filename}失败:{str(e)}")# 查看批量加载结果print(f"\n 批量加载完成:共加载{len(all_pages)}页PDF")# 合并所有文本(可选) full_text ="\n\n".join([page.page_content for page in all_pages])print(f" 所有PDF合并后总字符数:{len(full_text)}")

实用优化

  1. 跳过隐藏文件:在循环中添加if filename.startswith('.'): continue(避免macOS下的.DS_Store文件);
  2. 多线程加载:若文件夹中PDF数量多(如100+),可使用concurrent.futures多线程加载,提升效率:
from concurrent.futures import ThreadPoolExecutor defload_single_pdf(pdf_path):"""单个PDF加载函数(供多线程调用)"""try: loader = PyPDFLoader(pdf_path) pages = loader.load()print(f" 成功加载:{os.path.basename(pdf_path)}({len(pages)}页)")return pages except Exception as e:print(f" 加载{os.path.basename(pdf_path)}失败:{str(e)}")return[]# 多线程批量加载(设置最大线程数为4,避免资源占用过高)with ThreadPoolExecutor(max_workers=4)as executor:# 获取所有PDF路径 pdf_paths =[os.path.join(pdf_folder, f)for f in os.listdir(pdf_folder)if f.lower().endswith(".pdf")]# 批量执行 results = executor.map(load_single_pdf, pdf_paths)# 合并结果 all_pages =[page for result in results for page in result]

7. 总结与下一步

7.1 本文核心收获

  1. 基础能力:掌握PyPDFLoader的安装、单文件加载、按需加载、全文合并;
  2. 问题解决:能排查“加载失败”“分块不理想”等常见问题;
  3. 进阶技能:结合RapidOCR-ONNXRuntime提取PDF图片文本,实现批量PDF处理;
  4. RAG衔接:提取后的Document对象可直接传入文本分割器,为后续“向量数据库构建”做准备。
如果觉得本文有帮助,欢迎点赞+关注,后续会持续更新RAG系统的实战内容!
请添加图片描述

Read more

Stable Diffusion 3.5本地部署与使用指南

Stable Diffusion 3.5本地部署与使用指南 2024年10月,Stability AI 推出了 Stable Diffusion 3.5 的 FP8 量化版本(stable-diffusion-3.5-fp8),这不仅是一次简单的模型压缩,更标志着生成式AI在落地应用上的关键突破。相比原始 full-precision 模型,FP8 版本通过先进的低精度量化技术,在几乎不牺牲图像质量的前提下,大幅降低显存占用和推理延迟——这意味着更多用户可以用手头的消费级显卡流畅运行这款旗舰级文生图模型。 为什么是 FP8?性能与体验的平衡点 过去,高质量图像生成往往意味着高昂的硬件门槛。原版 SD3.5 虽然在文本理解、构图逻辑和细节还原上达到了新高度,但其对 GPU 显存和算力的要求也让不少创作者望而却步。而 stable-diffusion-3.5-fp8 的出现,正是为了解决这个“高质高价”的矛盾。 它基于 Multi-modal DiT

GLM-4v-9b实战指南:用llama.cpp GGUF格式在消费级GPU部署多模态模型

GLM-4v-9b实战指南:用llama.cpp GGUF格式在消费级GPU部署多模态模型 1. 为什么你需要关注GLM-4v-9b 你有没有遇到过这样的场景:一张密密麻麻的财务报表截图发到工作群,大家却没人愿意花十分钟手动抄录数据;或者客户发来一张手机拍的电路板照片,问“这个元件型号是什么”,你只能回个尴尬的微笑;又或者团队正在做竞品分析,需要从几十份PDF产品手册里快速提取图表信息——这些不是小问题,而是每天真实消耗工程师、运营、产品经理大量时间的“视觉理解黑洞”。 过去,这类任务要么靠人工硬啃,要么得调用API付费接口,响应慢、成本高、隐私难保障。直到2024年,智谱AI开源了glm-4v-9b——一个真正能在你自己的RTX 4090上跑起来的90亿参数多模态模型。它不只是一张“能看图说话”的新名片,而是把高分辨率图像理解能力,塞进了一张消费级显卡的显存里。 重点来了:它支持原生1120×1120输入,这意味着你不用再把一张A4扫描件缩成模糊小图上传;它对中文表格、小字号OCR、技术类图表的理解,在公开评测中直接超过了GPT-4-turbo和Claude 3 Opus;

【AIGC】ChatGPT保护指令:高效提升GPTs提示词与知识库文件的安全性

【AIGC】ChatGPT保护指令:高效提升GPTs提示词与知识库文件的安全性

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]本文专栏: AIGC |GPTs应用实例 文章目录 * 💯前言 * 💯新建未加保护指令的GPTs * 测试获取GPTs的提示词Prompt指令与知识库文件 * 💯给GPTs添加保护指令 * 方法一 * 方法二 * 方法三 * 方法四 * 💯增强GPTs安全性的其他建议 * 💯小结 * 关于GPTs指令如何在ChatGPT上使用,请看这篇文章: 【AIGC】如何在ChatGPT中制作个性化GPTs应用详解     https://blog.ZEEKLOG.net/2201_75539691?type=blog * 关于如何使用国内AI工具复现类似GPTs效果,请看这篇文章: 【AIGC】国内AI工具复现GPTs效果详解     https://blog.ZEEKLOG.net/2201_75539691?type=blog 💯前言 在 人工智能技术快速发展 的今天,ChatGPT 以其强大的对话能力和广泛的应用场景深受关注。然而,随着其功能的广泛使用,安全性问题也逐渐浮

2025最新如何在本地部署 Stable Diffusion3.5超详细完整教程

2025最新如何在本地部署 Stable Diffusion3.5超详细完整教程

在本地部署 Stable Diffusion 3.5:让 AI 绘图更便捷 前言 随着人工智能的快速发展,图像生成技术日益成熟,Stable Diffusion 3.5 作为一款强大的 AI 绘图工具,广泛应用于设计师、创作者等人群的视觉内容生成。它能够通过文本提示生成高质量图像,且具备较高的可控性和细腻的生成效果。 然而,默认情况下,Stable Diffusion 3.5 仅能在局域网内运行,远程操作或者出门时调整参数、查看进度会受到限制。在本文中,我们将通过本地部署的方式,帮助您克服这一限制,实现更加灵活的使用。 提示:不同型号的 Stable Diffusion 对硬件要求有所不同。以 Large Turbo 版本为例,推荐配备至少 8GB 显存以保证流畅运行。 文章目录在本地部署 Stable Diffusion