利用OpenAI API与LangChain和LlamaIndex提取PDF信息

在当今的技术领域,大型语言模型(LLMs)以其生成类人文本和理解复杂语言结构的能力而备受关注。通过训练大量多样化的数据,LLMs获得了理解和生成跨主题上下文相关文本的显著能力。本文将探讨如何利用OpenAI的API结合LangChain和LlamaIndex从多个PDF文档中轻松提取有价值信息的激动人心的可能性。

学习目标

本文将介绍以下内容:

  • 如何使用OpenAI的API结合LangChain和LlamaIndex从多个PDF文档中提取信息。
  • 如何格式化提示以从不同数据结构中提取值。
  • 如何使用GPTSimpleVectorIndex进行高效的文档搜索和检索。

LlamaIndex和LangChain

这两个开源库可以帮助构建利用大型语言模型(LLMs)的应用程序。LlamaIndex提供了一个简单的接口,用于LLMs和外部数据源之间的交互,而LangChain提供了一个框架,用于构建和管理由LLMs驱动的应用程序。尽管LlamaIndex和LangChain仍在开发中,但它们有潜力彻底改变构建应用程序的方式。

所需库

首先,让安装并导入所需的库。

!pip install llama-index==0.5.6 !pip install langchain==0.0.148 !pip install PyPDF2 from llama_index import SimpleDirectoryReader, GPTSimpleVectorIndex, LLMPredictor, ServiceContext from langchain import OpenAI import PyPDF2 import os

要开始使用OpenAI的API服务,首先需要注册一个账户。注册成功后,可以为账户创建一个特定的API密钥。建议将API密钥设置为环境变量,以确保与代码和应用程序的无缝集成。这样做可以安全地存储和检索API密钥,而无需在代码中明确暴露它。这种做法有助于保持API密钥的机密性,同时确保在需要时易于访问。

os.environ["OPENAI_API_KEY"] = “API KEY”

让获取当前工作目录,其中包含文档,并将其保存在变量中。

current_directory = os.getcwd()

现在,将为LLMPredictor类创建一个对象。LLMPredictor接受一个参数llm。这里使用OpenAI的API中的一个名为“text-davinci-003”的模型。

llm_predictor = LLMPredictor(llm=OpenAI(model_name="text-davinci-003"))

还可以提供几个其他可选参数,例如:

  • temperature – 此参数控制模型响应的随机性。温度为0意味着模型将始终选择最可能的下一个标记。
  • max_tokens – 使用最大标记数生成输出。

接下来,将为ServiceContext类创建一个对象。使用from_defaults方法初始化ServiceContext类,该方法初始化了几个常用的关键字参数,因此不需要单独定义它们。

service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)

在这种情况下,使用from_defaults方法调用,并将llm_predictor参数设置为之前创建的llm_predictor对象。这将设置ServiceContext实例的llm_predictor属性为llm_predictor对象。

一次性从多个文档中提取信息

下一步是通过目录中的每个文档进行迭代。

for filename in os.listdir(current_directory): if os.path.isfile(os.path.join(current_directory, filename)):

第一行代码用于迭代current_directory中的每个文件,第二行代码确保迭代的是有效文档而不是目录。

documents = SimpleDirectoryReader(input_files=[f"{filename}"]).load_data()

SimpleDirectoryReader类从目录中读取数据。它接收一个名为input_files的参数,并使用filename变量动态生成单个文件名,然后将其传递给它。

在SimpleDirectoryReader实例上调用load_data方法。此方法负责从指定的输入文件加载数据并返回加载的文档。

index = GPTSimpleVectorIndex.from_documents(documents, service_context=service_context)

GPTSimpleVectorIndex类旨在创建一个索引,用于高效搜索和检索文档。将使用以下参数调用类的from_documents方法:

  • documents: 此参数表示将被索引的文档。
  • service_context: 此参数表示正在传递的服务上下文。

现在将构建提示。试图提取在“网络犯罪”下注册的案件总数。因此,提示是这样的:

prompt = f""" 在网络犯罪下注册的案件总数是多少? """

将使用上述代码行查询之前创建的索引,结果将是一个响应。

response = index.query(prompt) print(response)

可以将提示重写为这样以仅返回计数。

“在网络犯罪下注册的案件总数是多少?仅返回整数结果”

这将返回如下响应:

还可以将响应保存到任何数据结构中,例如字典。为此,首先创建一个空字典。并将响应分配给特定键;在情况下,可以将其分配给相关的文件名、犯罪年份等。

使用LangChainLlamaIndex的完整代码

current_directory = os.getcwd() def extract_data(): llm_predictor = LLMPredictor(llm=OpenAI(model_name="text-davinci-003")) service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor) for filename in os.listdir(current_directory): if os.path.isfile(os.path.join(current_directory, filename)): documents = SimpleDirectoryReader(input_files=[f"{filename}"]).load_data() index = GPTSimpleVectorIndex.from_documents(documents, service_context=service_context) prompt = f""" 在网络犯罪下注册的案件总数是多少。 仅返回整数结果 """ response = index.query(prompt) cyber_crimes[filename] = response.response print(response)

在本文中,探讨了结合使用OpenAI的API、LangChain和LlamaIndex从PDF文档中轻松提取有价值信息的激动人心的可能性。这些工具可以提供的可能性是无限的。在这里,只是触及了这些工具可以提供的东西的表面。

  • 通过LangChain和LlamaIndex中提供的各种连接器,可以无缝地将LLM模型集成到选择的任何数据源中。
  • 可以探索各种数据格式和来源以提取所需的信息。
  • 可以选择任何适合要求的数据结构,允许轻松地进行进一步分析。无论是简单的列表、结构化数据库还是甚至自定义格式,都可以以最有助于目标的方式保存提取的数据。
  • 此外,可以更进一步,指导模型本身如何格式化响应。例如,如果希望输出是JSON对象,可以轻松指定此偏好。

像GPT-3.5或LLMs这样的语言模型是各种目的的强大工具。它们可以生成类似人类的文本,协助自然语言理解,并提供语言相关任务,如翻译、摘要和聊天机器人交互。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485