如果代码中从 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 内容并生成嵌入。
  • 需要页面级文本提取的应用。

迁移方法

要解决警告,需更新代码并确保环境兼容。以下是步骤:

  1. 更新导入:
    替换:

    from langchain.document_loaders import PyPDFLoader
    

    为:

    from langchain_community.document_loaders import PyPDFLoader
    
  2. 安装依赖:

    • 确保安装 langchain_community 和 pypdf:
      pip install --upgrade langchain langchain-community pypdf
      
    • 若使用 OpenAI 嵌入或 LLM,安装:
      pip install langchain-openai
      
    • 若使用 Milvus 向量存储,安装:
      pip install langchain-milvus pymilvus
      
  3. 自动迁移:
    使用 LangChain CLI 自动更新导入:

    pip install langchain-cli
    langchain migrate
    

    按照提示选择项目目录,CLI 会扫描并替换废弃导入。

  4. 检查 Milvus 服务:

    • 确保 Milvus 服务运行:
      docker run -d --name milvus_standalone -p 19530:19530 -p 9091:9091 milvusdb/milvus:latest
      
    • 验证连接:
      curl http://localhost:19530  # 检查 HTTP 接口
      
  5. 验证代码:

    • 更新导入后,运行代码检查是否仍有警告。
    • 确保 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)是计算机科学的一个分支,专注于创建智能系统。
人工智能包含子领域,如机器学习和深度学习。
代码说明
  1. 文档加载:
    • PyPDFLoader 加载 ai_knowledge.pdf,每页生成一个 Document 对象。
  2. 文本分割:
    • RecursiveCharacterTextSplitter 分割为约 100 字符的块,chunk_overlap=20 保留上下文。
  3. 向量存储:
    • Milvus 使用 OpenAIEmbeddings 生成嵌入,存储到 ai_collection,使用 connection_args={"uri": "http://localhost:19530"}。
    • drop_old=True 清除旧集合,确保干净测试。
  4. RAG 链:
    • vectorstore.as_retriever 检索 2 个相关块。
    • format_docs 拼接文档内容,模拟 stuff 模式。
    • prompt 结合上下文和问题,llm(gpt-4)生成答案。

运行要求:

  • Milvus 服务运行(http://localhost:19530)。
  • ai_knowledge.pdf 存在且可读。
  • OpenAI API 密钥有效。

注意事项

  1. API 密钥:
    • 使用 .env 文件:
      from dotenv import load_dotenv
      load_dotenv()
      
    • 确保密钥支持 text-embedding-3-small 和 gpt-4。
  2. 依赖:
    • 安装:
      pip install --upgrade langchain langchain-community langchain-openai langchain-milvus pymilvus pypdf
      
  3. Milvus 配置:
    • 验证服务:
      curl http://localhost:19530  # 检查 Milvus HTTP 接口
      
    • 非本地部署:
      connection_args={"uri": "http://your-milvus-host:19530"}
      
  4. PDF 处理:
    • 确保 PDF 文件无加密,或提供密码:
      loader = PyPDFLoader(file_path="ai_knowledge.pdf", password="your_password")
      
    • 若 PDF 包含图片,启用图像提取(需安装 pypdfium2):
      pip install pypdfium2
      
      loader = PyPDFLoader(file_path="ai_knowledge.pdf", extract_images=True)
      
  5. 性能优化:
    • 调整 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 系统,处理人工智能主题查询。

更多推荐