RAG(四) LangChain 使用PyPDFLoader加载 PDF 并实现内容总结功能

一、核心知识点解析

1. PyPDFLoader 详细用法(重点补充)

PyPDFLoader是 LangChain-Community 库中最常用的 PDF 加载器之一,底层基于pypdf库实现,专门用于从 PDF 文件中提取文本内容,并封装为 LangChain 标准的Document对象。

1.1 基本初始化
复制代码
# 方式1:本地文件路径(推荐)
loader = PyPDFLoader("./pdf/a.pdf")

# 方式2:远程PDF文件URL(需确保网络可访问)
loader = PyPDFLoader("https://example.com/sample.pdf")
  • 支持本地绝对路径 / 相对路径远程 HTTP/HTTPS URL
  • 若文件不存在 / URL 无法访问,会直接抛出FileNotFoundError或网络相关异常。
1.2 核心方法
方法名 作用 返回值
load() 加载整个 PDF,不分割页面 包含 1 个Document对象的列表(所有页面文本拼接)
load_and_split() 加载 PDF 并按页面分割 包含 N 个Document对象的列表(N 为 PDF 页数,每个对象对应 1 页)
lazy_load() 惰性加载(逐页读取,节省内存) 生成器对象,遍历可获取每页的Document对象

示例对比

复制代码
# 1. load():所有内容合并为1个Document
full_doc = loader.load()
print(f"load()返回数量:{len(full_doc)}")  # 输出:1
print(f"内容:{full_doc[0].page_content[:100]}")  # 前100个字符

# 2. load_and_split():按页面分割为多个Document
page_docs = loader.load_and_split()
print(f"load_and_split()返回数量:{len(page_docs)}")  # 输出:PDF的总页数
print(f"第1页内容:{page_docs[0].page_content[:100]}")

# 3. lazy_load():惰性加载(适合超大PDF)
for doc in loader.lazy_load():
    print(f"当前页内容:{doc.page_content[:50]}")
    break  # 仅演示,实际可遍历所有页
1.3 Document 对象结构

PyPDFLoader返回的Document对象是 LangChain 处理非结构化数据的标准格式,核心属性:

复制代码
# 取第1页的Document对象
page = page_docs[0]

# 核心属性1:页面文本内容(最常用)
print(page.page_content)

# 核心属性2:元数据(包含PDF的关键信息)
print(page.metadata)
# 典型输出:
# {
#   'source': './pdf/a.pdf',  # 文件路径/URL
#   'page': 0  # 页码(从0开始计数)
# }
  • page_content:字符串类型,存储当前页的纯文本内容(去除 PDF 格式、图片、表格,仅保留文字)。
  • metadata:字典类型,存储文件来源、页码等元数据,可用于后续的内容溯源、分页总结等场景。
1.4 高级用法:指定页码范围加载

若只需加载 PDF 的部分页面(如仅第 1-5 页),可结合切片实现:

复制代码
# 步骤1:先惰性加载所有页
all_pages = list(loader.lazy_load())

# 步骤2:切片获取指定页码(0为第1页,左闭右开)
target_pages = all_pages[0:5]  # 第1-5页

# 步骤3:拼接指定页的内容
target_content = "\n".join([p.page_content for p in target_pages])

在大模型应用开发中,处理 PDF 文档并基于文档内容进行分析、总结是非常常见的需求。LangChain 作为一站式的 LLM 应用开发框架,提供了简洁高效的 PDF 处理工具链。本文将基于实际代码,详细讲解如何使用 LangChain 加载 PDF 文件、提取文本内容,并调用 DeepSeek 大模型完成文档总结。

二、环境准备

在开始编码前,需要先安装所需的依赖包,并配置 API 密钥:

1. 安装依赖

复制代码
# 核心依赖:LangChain框架及PDF处理库
pip install langchain langchain-community langchain-core langchain-openai
# PDF处理依赖(PyPDFLoader底层依赖pypdf)
pip install pypdf python-dotenv

2. 配置 API 密钥

创建.env文件,填入 DeepSeek 的 API 密钥(需提前在 DeepSeek 官网申请):

env

复制代码
DEEPSEEK_API_KEY=你的deepseek_api_key

三、完整代码实现

以下是加载 PDF 并实现内容总结的完整可运行代码,每一步都添加了详细注释:

复制代码
# 1. 导入PDF加载器
from langchain_community.document_loaders import PyPDFLoader

# 初始化PDF加载器,指定PDF文件路径
# 注意:请将路径替换为你自己的PDF文件路径
loader = PyPDFLoader("./pdf/a.pdf")

# 加载PDF并按页面分割(返回Document对象列表)
pages = loader.load_and_split()

# 2. 拼接所有页面的文本内容
docs = ""
for item in pages:
    # page_content是Document对象中存储文本内容的核心属性
    docs += item.page_content

# 3. 配置提示词模板
from langchain_core.prompts import ChatPromptTemplate

# 定义总结用的提示词模板,{context}是动态填充的PDF文本内容
template = """
{context}

总结上面的内容
"""
# 将模板转换为LangChain可调用的Prompt对象
prompt = ChatPromptTemplate.from_template(template)

# 4. 配置大模型和输出解析器
from langchain_core.output_parsers import StrOutputParser
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from pydantic import SecretStr

# 加载.env文件中的环境变量
load_dotenv()

# 初始化DeepSeek大模型(兼容OpenAI接口规范)
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",  # DeepSeek的API基础地址
    model="deepseek-chat",                   # 使用的模型名称
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),  # 从环境变量读取API密钥
)

# 初始化输出解析器(将LLM的输出转换为字符串)
outputParser = StrOutputParser()

# 5. 构建链式调用并执行总结
# LangChain的Runnable接口:Prompt -> LLM -> 输出解析器
chain = prompt | llm | outputParser

# 调用链,传入PDF文本内容作为context参数
result = chain.invoke({"context": docs})

# 打印总结结果
print(result)
相关推荐
helloworld也报错?1 分钟前
保存网页为PDF
前端·javascript·pdf
东方-教育技术博主4 分钟前
PDF文件夹去重
pdf
Hello.Reader8 分钟前
PyFlink Table API Data Types DataType 是什么、UDF 类型声明怎么写、Python / Pandas 类型映射一文搞懂
python·php·pandas
eybk11 分钟前
拖放pdf转化为txt文件多进程多线程合并分词版
java·python·pdf
梦凡尘18 分钟前
前端web端解析 Word、Pdf 文档文本内容
pdf·js
白典典25 分钟前
iTextPDF生成手册时目录页码与实际页码不匹配问题求助
java·spring·pdf·intellij-idea
码银32 分钟前
一款多功能PDF处理工具:查看PDF信息 提取PDF文本 合并多个PDF 拆分PDF文件 旋转PDF页面 加密
pdf
WhoisXMLAPI38 分钟前
DNS 情报:含义及其在网络安全中的作用
网络·安全·php
工藤学编程43 分钟前
零基础学AI大模型之LangChain Tool异常处理
人工智能·langchain
干前端1 小时前
基于PDF.js的安全PDF预览组件实现:从虚拟滚动到水印渲染
javascript·安全·pdf