与PDF聊天 | 用Python和OpenAI增强文本交互能力

用Python和OpenAI增强文本交互能力

介绍

在一个充满信息的世界中,PDF文档已成为共享和保留有价值数据的重要方式。然而,从PDF中提取信息并不总是直观的。这就是“与PDF聊天”项目的用武之地-一个革新性的项目,改变我们与PDF互动的方式。

在本文中,我们向您介绍了引人入胜的“与PDF聊天”项目,该项目结合了语言模型库(LLMs)的强大功能和PyPDF的Python库的多功能性。这种独特的融合使您可以与PDF文档进行自然对话,轻松提问并获取相关的答案。

学习目标

  • 深入了解语言模型库(LLMs)作为先进的人工智能模型,能够理解人类语言模式并生成有意义的回答。
  • 探索多功能的Python库PyPDF,以了解其在PDF操作中的文本提取、合并和拆分功能。
  • 认识将语言模型库(LLMs)和PyPDFs集成在一起,创建用于与PDF进行自然对话的交互式聊天机器人。

本文是数据科学博客马拉松的一部分。

理解语言模型库(LLMs)

“与PDF聊天”的核心在于语言模型库(LLMs),这是基于大量文本数据训练的先进人工智能模型。将它们视为语言专家,能够理解人类语言模式并生成有意义的回答。

在我们的项目中,LLMs在创建交互式聊天机器人方面发挥着重要作用。这个聊天机器人可以处理您的问题,并理解您从PDF中需要什么。聊天机器人可以通过利用PDF中隐藏的知识库提供有用的答案和见解。

PyPDFs-您的超级PDF助手

PyPDF是一个多功能的Python库,简化了与PDF文件的交互。它为用户提供了各种功能,例如文本提取、合并和拆分PDF文档。该库是我们项目的重要组成部分,因为它使PDF的处理和分析变得无缝。

PyPDF帮助我们加载PDF文件并在项目中提取其中的文本,为高效的处理和分析奠定了基础。有了这个强大的助手,您可以轻松地与PDF进行互动。

“与PDF聊天”通过将语言模型库(LLMs)和PyPDFs相结合,使PDF文档摆脱了静态状态。现在,您可以以前所未有的方式探索您的PDF,提取有价值的信息并进行有意义的对话。从学术论文到商业报告,“与PDF聊天”使与PDF的互动成为一种愉快的体验。

那么,让我们深入了解“与PDF聊天”项目的迷人世界吧。

项目

# 导入必要的库并设置API密钥
import os
import pandas as pd
import matplotlib.pyplot as plt
from transformers import GPT2TokenizerFast
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains.question_answering import load_qa_chain
from langchain.llms import OpenAI
from langchain.chains import ConversationalRetrievalChain

from key import openaiapi_key
os.environ["OPENAI_API_KEY"] = openaiapi_key

上面的代码通过导入必要的库并设置API密钥来启动“与PDF聊天”项目。我们使用’os’库与操作系统进行交互,使用’pandas’进行数据处理,使用’matplotlib’绘制图形。’transformers’库提供了’GPT2TokenizerFast’类,这对于对文本进行分词是必要的。’langchain’模块包括了加载PDF(’PyPDFLoader’)、文本拆分(’RecursiveCharacterTextSplitter’)、嵌入(’OpenAIEmbeddings’)、向量存储(’FAISS’)、问答链(’load_qa_chain’)、语言模型(’OpenAI’)和对话链(’ConversationalRetrievalChain’)所必需的类。

PyPDF Loader

然后我们使用’PyPDFLoader’类来加载PDF文件并将其拆分为单独的页面。最后,我们打印第一页的内容以验证PDF的成功加载和拆分。

# 简单方法 - 按页面拆分
loader = PyPDFLoader("story.pdf")  
# 我们创建了一个'PyPDFLoader'的实例,并传递了我们想要处理的PDF文件的路径。
pages = loader.load_and_split()
print(pages[0])  

本节介绍了PDF文档的加载和分块。演示了两种方法:简单方法按页面拆分PDF,高级方法涉及将PDF转换为文本并将其拆分为较小的块。

# 高级方法 - 按块拆分

# 步骤1:将PDF转换为文本
import textract
doc = textract.process("story.pdf")

# 步骤2:保存为.txt并重新打开(有助于防止问题)
with open('story.txt', 'w') as f:
    f.write(doc.decode('utf-8'))

with open('story.txt', 'r') as f:
    text = f.read()

# 步骤3:创建计算标记数的函数
tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")

def count_tokens(text: str) -> int:
    return len(tokenizer.encode(text))

# 步骤4:将文本拆分为块
text_splitter = RecursiveCharacterTextSplitter(
    # 设置一个非常小的块大小,只是为了展示。
    chunk_size = 512,
    chunk_overlap  = 24,
    length_function = count_tokens,
)

chunks = text_splitter.create_documents([text])

拆分PDF的步骤

高级方法将PDF拆分为较小的块,以实现更高效的处理。我们通过以下步骤实现:

步骤1:我们使用’textract’库从PDF文件中提取文本,并将其存储在’doc’变量中。

步骤2:我们将提取的文本保存到文本文件(’story.txt’)中,以防止潜在问题,并以读取模式重新打开它。内容存储在’text’变量中。

步骤3:我们定义一个名为’count_tokens’的函数,用于计算给定文本中的标记数。该函数使用’GPT2TokenizerFast’类对文本进行标记化。

步骤4:使用’RecursiveCharacterTextSplitter’类,我们将’text’拆分为较小的’chunks’,以确保高效处理,每个块具有最大标记限制。

# 嵌入文本并存储嵌入
# 获取嵌入模型
embeddings = OpenAIEmbeddings()  
# 创建向量数据库
db = FAISS.from_documents(chunks, embeddings)  

OpenAI嵌入

在本节中,我们使用’OpenAIEmbeddings’类对文本进行嵌入,将文本转换为数值表示(嵌入)。这些嵌入有助于高效存储和分析文本数据。然后,我们使用’FAISS’类创建一个向量数据库,将文本的’chunks’和相应的嵌入合并。

# 设置检索函数
# 检查相似性搜索是否正常工作
query = "作者的名字是什么?" 

docs = db.similarity_search(query)  

docs[0]  

在这部分设置一个检索函数。您可以使用向量数据库(’db’)执行带有示例查询的相似性搜索。变量query包含我们想要向聊天机器人提问的问题,变量docs存储包含查询上下文的相关文档。然后,我们打印从相似性搜索返回的第一个文档。

chain = load_qa_chain(OpenAI(temperature=0), chain_type="stuff")
query = "作者的名字是什么?"  

docs = db.similarity_search(query) 

chain.run(input_documents=docs, question=query)  

在这个部分,我们创建一个问答链(’chain’),将相似性搜索与用户查询集成在一起。我们加载’OpenAI’语言模型,并将温度设置为0以获得确定性的回答。通过将检索到的文档(’docs’)和用户的问题(’query’)传递给链条,我们根据知识库获得一个答案。

# 创建带有聊天记忆的聊天机器人
from IPython.display import display 
import ipywidgets as widgets 
qa = ConversationalRetrievalChain.from_llm(OpenAI(temperature=0.1), db.as_retriever()) 

chat_history = [] 
def on_submit(_):  
    query = input_box.value  
    input_box.value = ""  

    if query.lower() == 'exit':  
        print("感谢使用 Chat with PDFs 聊天机器人!")
        return

    result = qa({"question": query, "chat_history": chat_history})  

    chat_history.append((query, result['answer'])) 

    display(widgets.HTML(f'<b>用户:</b> {query}'))  
    display(widgets.HTML(f'<b><font color="blue">聊天机器人:</font></b>{result["answer"]}')) 

print("欢迎使用 Chat with PDFs 聊天机器人!输入 'exit' 退出。")  

input_box = widgets.Text(placeholder='请输入您的问题:')  
input_box.on_submit(on_submit)  
display(input_box)  

在最后一部分,我们介绍了一个聊天机器人功能,用户可以通过输入问题与聊天机器人进行交互并获得答案。

结论

本文探讨了令人着迷的“Chat with PDFs”项目及其逐步实现过程。我们对语言模型库(LLMs)和 PyPDFs 进行了深入了解,这两个关键组件为这个创新工具提供了动力。现在,您可以轻松处理和分析 PDF 文档,提取有价值的见解,并与聊天机器人伙伴进行互动对话。无论您是研究人员、学生还是专业人士,“Chat with PDFs”已经彻底改变了我们与 PDF 的互动方式,利用人工智能的力量使以前静态的文档焕发生机。祝您愉快地探索 PDF!

要点

  1. LLMs 赋予聊天机器人能力,以向用户查询提供准确和上下文感知的回答。
  2. PyPDF 简化了 PDF 操作,使处理复杂文档更加容易。
  3. 代码结构确保了文本嵌入和相似性搜索功能的平滑集成。
  4. PyPDF 实现了无缝的 PDF 处理、文本提取和操作。

常见问题

本文中显示的媒体不归 Analytics Vidhya 所有,仅由作者自行决定使用。