【LangChain】langchain.document_loaders.PyPDFLoader迁移至langchain_community.document_loaders.PyPDFLoader
如果代码中从 langchain.document_loaders 导入 PyPDFLoader ,会出现 LangChainDeprecationWarning提示已废弃,推荐使用 langchain_community.document_loaders.PyPDFLoader。这是 LangChain 0.2.x 及以上版本模块重构的一部分,将社区维护的组件移到 langchain_community 包,以保持核心包 langchain 的精简。
本文基于 LangChain 0.3.x,详细解释警告原因、PyPDFLoader 的功能、迁移方法,并提供一个独立的使用 langchain_community.document_loaders.PyPDFLoader 的 RAG 示例,包含 PDF 加载、分割、嵌入生成、Milvus 向量存储和查询。
代码废弃告警:
Importing PyPDFLoader from langchain.document_loaders is deprecated. Please replace deprecated imports:
from langchain.document_loaders import PyPDFLoader
with new imports of:
from langchain_community.document_loaders import PyPDFLoader
You can use the langchain cli to automatically upgrade many imports. Please see documentation here https://python.langchain.com/docs/versions/v0_2/
from langchain.document_loaders import PyPDFLoader ……
警告原因
LangChainDeprecationWarning 表明使用了已废弃的导入路径:
from langchain.document_loaders import PyPDFLoader # 废弃
在 LangChain 0.2.x 及以上版本中,PyPDFLoader 等文档加载器被移到 langchain_community 包,需改为:
from langchain_community.document_loaders import PyPDFLoader # 推荐
原因:
- 模块重构:LangChain 将核心功能(
langchain)与社区贡献功能(langchain_community)分离,PyPDFLoader属于社区维护的加载器。 - 向后兼容:旧导入路径暂时有效,但会触发警告,未来版本可能移除。
- 自动迁移:LangChain 提供 CLI 工具(
langchain migrate)自动更新导入。
PyPDFLoader 简介
langchain_community.document_loaders.PyPDFLoader 是 LangChain 提供的 PDF 文档加载器,用于从 PDF 文件提取文本,生成 Document 对象,适用于 RAG 系统、文档检索等场景。
功能:
- 提取 PDF 文件的文本内容,每页生成一个
Document对象。 - 支持元数据提取(如页面编号)。
- 集成 LangChain 的文档处理管道,可与向量存储、文本分割器结合。
主要参数:
file_path(必填):PDF 文件路径。password(可选):PDF 解密密码。extract_images(默认False):是否提取图片(需额外依赖)。
适用场景:
- 处理 PDF 文档(如研究论文、报告)。
- 构建 RAG 系统,提取 PDF 内容并生成嵌入。
- 需要页面级文本提取的应用。
迁移方法
要解决警告,需更新代码并确保环境兼容。以下是步骤:
-
更新导入:
替换:from langchain.document_loaders import PyPDFLoader为:
from langchain_community.document_loaders import PyPDFLoader -
安装依赖:
- 确保安装
langchain_community和pypdf:pip install --upgrade langchain langchain-community pypdf - 若使用 OpenAI 嵌入或 LLM,安装:
pip install langchain-openai - 若使用 Milvus 向量存储,安装:
pip install langchain-milvus pymilvus
- 确保安装
-
自动迁移:
使用 LangChain CLI 自动更新导入:pip install langchain-cli langchain migrate按照提示选择项目目录,CLI 会扫描并替换废弃导入。
-
检查 Milvus 服务:
- 确保 Milvus 服务运行:
docker run -d --name milvus_standalone -p 19530:19530 -p 9091:9091 milvusdb/milvus:latest - 验证连接:
curl http://localhost:19530 # 检查 HTTP 接口
- 确保 Milvus 服务运行:
-
验证代码:
- 更新导入后,运行代码检查是否仍有警告。
- 确保 PDF 文件路径有效,文件可读。
使用 PyPDFLoader 的 RAG 示例
以下是一个独立的 RAG 示例,使用 langchain_community.document_loaders.PyPDFLoader 加载 PDF 文档,结合 RecursiveCharacterTextSplitter 分割、langchain_milvus.Milvus 存储嵌入(使用新 URI 连接方式)、OpenAI 嵌入和 LLM 回答查询。
准备文件:
创建一个简单的 PDF 文件 ai_knowledge.pdf,内容包含以下文本(可使用工具如 Word 保存为 PDF):
人工智能(AI)是计算机科学的一个分支,专注于创建智能系统。
机器学习是 AI 的子领域,涉及从数据中学习模型。
深度学习是机器学习的一种,使用神经网络进行复杂模式识别。
代码:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_milvus import Milvus
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
# 加载 PDF 文档
loader = PyPDFLoader(file_path="ai_knowledge.pdf")
documents = loader.load()
# 分割文档
splitter = RecursiveCharacterTextSplitter(
chunk_size=100,
chunk_overlap=20,
separators=["\n\n", "\n", " ", ""]
)
split_documents = splitter.split_documents(documents)
# 初始化嵌入模型和 Milvus 向量存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Milvus(
embedding_function=embeddings,
connection_args={"uri": "http://localhost:19530"},
collection_name="ai_collection",
drop_old=True
)
vectorstore.add_documents(split_documents)
# 初始化 LLM
llm = ChatOpenAI(temperature=0, model="gpt-4")
# 提示模板
prompt = ChatPromptTemplate.from_template(
"""根据以下上下文回答问题:
上下文:{context}
问题:{question}
回答:"""
)
# 格式化文档函数
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
# 创建 RAG 链
rag_chain = (
{
"context": vectorstore.as_retriever(search_kwargs={"k": 2}) | format_docs,
"question": RunnablePassthrough()
}
| prompt
| llm
| StrOutputParser()
)
# 调用链
print("RAG 链输出:")
response = rag_chain.invoke("什么是人工智能?")
print(response)
response = rag_chain.invoke("它包含哪些子领域?")
print(response)
输出示例:
RAG 链输出:
人工智能(AI)是计算机科学的一个分支,专注于创建智能系统。
人工智能包含子领域,如机器学习和深度学习。
代码说明
- 文档加载:
PyPDFLoader加载ai_knowledge.pdf,每页生成一个Document对象。
- 文本分割:
RecursiveCharacterTextSplitter分割为约 100 字符的块,chunk_overlap=20保留上下文。
- 向量存储:
Milvus使用OpenAIEmbeddings生成嵌入,存储到ai_collection,使用connection_args={"uri": "http://localhost:19530"}。drop_old=True清除旧集合,确保干净测试。
- RAG 链:
vectorstore.as_retriever检索 2 个相关块。format_docs拼接文档内容,模拟stuff模式。prompt结合上下文和问题,llm(gpt-4)生成答案。
运行要求:
- Milvus 服务运行(
http://localhost:19530)。 ai_knowledge.pdf存在且可读。- OpenAI API 密钥有效。
注意事项
- API 密钥:
- 使用
.env文件:from dotenv import load_dotenv load_dotenv() - 确保密钥支持
text-embedding-3-small和gpt-4。
- 使用
- 依赖:
- 安装:
pip install --upgrade langchain langchain-community langchain-openai langchain-milvus pymilvus pypdf
- 安装:
- Milvus 配置:
- 验证服务:
curl http://localhost:19530 # 检查 Milvus HTTP 接口 - 非本地部署:
connection_args={"uri": "http://your-milvus-host:19530"}
- 验证服务:
- PDF 处理:
- 确保 PDF 文件无加密,或提供密码:
loader = PyPDFLoader(file_path="ai_knowledge.pdf", password="your_password") - 若 PDF 包含图片,启用图像提取(需安装
pypdfium2):pip install pypdfium2loader = PyPDFLoader(file_path="ai_knowledge.pdf", extract_images=True)
- 确保 PDF 文件无加密,或提供密码:
- 性能优化:
- 调整
chunk_size(500-1000)和search_kwargs={"k": 3}优化检索。 - 使用 Milvus 索引:
vectorstore = Milvus(..., index_params={"metric_type": "L2", "index_type": "IVF_FLAT"})
- 调整
常见问题
Q1:如何完全消除 LangChainDeprecationWarning?
A:更新所有导入到 langchain_community,使用 langchain migrate CLI 自动修复,或手动检查代码。
Q2:PyPDFLoader 相比其他加载器(如 TextLoader)的优势?
A:PyPDFLoader 专为 PDF 设计,支持页面级提取和元数据;TextLoader 适合纯文本文件,速度更快。
Q3:如何处理加密 PDF?
A:提供密码:
loader = PyPDFLoader(file_path="encrypted.pdf", password="your_password")
Q4:可以结合对话历史吗?
A:使用 RunnableWithMessageHistory:
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
总结
LangChainDeprecationWarning 提示需将 langchain.document_loaders.PyPDFLoader 替换为 langchain_community.document_loaders.PyPDFLoader,这是 LangChain 0.2.x 模块重构的结果。PyPDFLoader 用于加载 PDF 文档,适合 RAG 系统。示例代码展示了使用 PyPDFLoader、RecursiveCharacterTextSplitter、langchain_milvus.Milvus和 LCEL 构建 RAG 系统,处理人工智能主题查询。
更多推荐
所有评论(0)