写点什么

交互式 PDF Q&A:一种检索 - 增强生成方法

作者:Geek_38eed9
  • 2024-07-29
    四川
  • 本文字数:2351 字

    阅读完需:约 8 分钟

交互式 PDF Q&A:一种检索-增强生成方法

在信息时代,处理庞大的 PDF 每天都在发生。大多数时候,我发现自己淹没在文本的海洋中,一页又一页地努力寻找我想要或需要阅读的信息。但是,如果我可以提出有关 PDF 的问题,不仅可以恢复相关信息,还可以恢复页面内容,该怎么办?

这就是检索增强生成 (RAG) 技术发挥作用的地方。通过结合这些尖端技术,我创建了一个本地托管的应用程序,允许您与 PDF 聊天、提出问题并接收所有必要的上下文。

让我带您了解构建此类应用程序的整个过程!

什么是检索增强生成 (RAG)?

检索增强生成(Retrieval-Augmented Generation,简称 RAG)是一种旨在通过整合有关给定主题的额外信息来提高LLM性能的方法。这些信息减少了不确定性,并提供了更多的背景信息,帮助模型以更好的方式回答问题。

在构建基本的检索增强生成 (RAG) 系统时,需要关注两个主要组件:数据索引数据检索和生成领域。数据索引使系统能够在需要时存储和/或搜索文档。数据检索和生成是查询这些索引文档的地方,然后提取所需的数据,并使用这些数据生成答案。

数据索引


数据索引包括四个关键阶段:

  1. 数据加载:此初始阶段涉及将 PDF、音频文件、视频等摄取为下一阶段的统一格式。

  2. 数据分割:下一步是将内容划分为可管理的片段:将文本分割成连贯的部分或块,以保留上下文和含义。

  3. 数据嵌入:在此阶段,文本块被转换为数值向量。这种转换是使用嵌入技术完成的,这些技术可以捕获内容的语义本质。

  4. 数据存储:最后一步是存储生成的嵌入,通常位于向量存储中。

数据检索和生成



检索

  • 嵌入查询:将用户的查询转换为嵌入形式,以便可以比较其与文档嵌入的相似性

  • 搜索向量:向量存储包含不同文档块的向量。因此,通过将此查询嵌入与存储的查询嵌入进行比较,系统可以确定哪些块与查询最相关。这种比较通常是在计算余弦相似度或任何其他相似度指标的帮助下完成的。

  • 选择前 k 个块:系统根据获得的相似度分数,选择最接近查询嵌入的 k 个块。

  • 结合上下文和查询:前 k 个块提供与查询相关的必要上下文。当与用户的原始问题相结合时,LLM 会收到一个全面的输入,该输入将用于生成输出。

现在我们已经有了更多的背景信息,让我们开始行动吧!

用于 PDF 文档的 RAG

先决条件

此 GitHub 存储库中描述了所有内容。还有一个 Docker 文件用于测试完整的应用程序。我使用了以下库:

  • LangChain:它是一个使用大型语言模型 (LLM) 开发应用程序的框架。它提供了正确的工具和方法来控制和协调 LLM(如果它们被应用)。

  • PyPDF 格式:这用于加载和处理 PDF 文档。虽然 PyMuPDF 以其速度而闻名,但在设置 Docker 环境时,我遇到了几个兼容性问题。

  • FAISS 代表 Facebook AI 相似性搜索,是一个用于快速相似性搜索和密集向量聚类的库。FAISS 也适用于快速最近邻搜索,因此在处理向量嵌入时,它的使用是完美的,例如在文档块的情况下。为了简单起见,我决定使用它来代替向量数据库

  • Streamlit 用于构建应用程序的用户界面。Streamlit 允许快速开发交互式 Web 应用程序,使其成为创建无缝用户体验的绝佳选择。

数据索引

  1. 加载 PDF 文档。

from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader(pdf_docs)pdf_data = loader.load()
复制代码


  1. 将其拆分为块。我使用了 1000 个字符的块大小。

from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter( separator="\n", chunk_size=1000, chunk_overlap=150, length_function=len )docs = text_splitter.split_documents(pdf_data)
复制代码


  1. 我使用了 OpenAI 嵌入模型并将它们加载到 FAISS 向量存储中。

from langchain_openai import OpenAIEmbeddingsfrom langchain_community.vectorstores import FAISS
embeddings = OpenAIEmbeddings(api_key = open_ai_key)db = FAISS.from_documents(docs, embeddings)

复制代码


  1. 我已将检索配置为仅前 3 个相关块。


retriever = db.as_retriever(search_kwargs={'k': 3})
复制代码


数据检索和生成

  1. 使用 LangChain 的链,我创建了完整的检索和生成系统,链接到之前配置的 FAISS 检索器。RetrievalQA

from langchain.chains import RetrievalQAfrom langchain import PromptTemplatefrom langchain_openai import ChatOpenAI
model = ChatOpenAI(api_key = open_ai_key)
custom_prompt_template = """Use the following pieces of information to answer the user's question.If you don't know the answer, just say that you don't know, don't try to make up an answer.
Context: {context}Question: {question}
Only return the helpful answer below and nothing else.Helpful answer:"""
prompt = PromptTemplate(template=custom_prompt_template, input_variables=['context', 'question'])

qa = RetrievalQA.from_chain_type(llm=model, chain_type="stuff", retriever=retriever, return_source_documents=True, chain_type_kwargs={"prompt": prompt})
复制代码


Streamlit

我使用 Streamlit 创建了一个应用程序,您可以在其中上传自己的文档并使用它们开始 RAG 过程。唯一需要的参数是您的 OpenAI API 密钥



我使用《云数据湖傻瓜书》一书作为下图所示的对话示例。



在信息以大量形式提供并可供用户使用的时代,与文档进行有意义的讨论的机会可以大大节省从大型 PDF 文档中挖掘有价值信息的时间。在检索增强生成的帮助下,我们可以过滤掉不需要的信息并关注实际信息。

此实现提供了一个朴素的 RAG 解决方案;然而,优化它的可能性是巨大的。通过使用不同的 RAG 技术,可以进一步优化嵌入模型、文档分块方法和检索算法等方面。

发布于: 刚刚阅读数: 4
用户头像

Geek_38eed9

关注

还未添加个人签名 2024-07-12 加入

还未添加个人简介

评论

发布
暂无评论
交互式 PDF Q&A:一种检索-增强生成方法_AI 大底座_Geek_38eed9_InfoQ写作社区