Press "Enter" to skip to content

改进数据分析:OpenAI、LangChain 和 LlamaIndex 为简单提取而设计

介绍

OpenAI的API由OpenAI开发,提供了今天最先进的语言模型之一。通过利用此API和使用LangChain&LlamaIndex,开发人员可以将这些模型的强大功能集成到自己的应用程序、产品或服务中。只需几行代码,您就可以利用OpenAI的语言模型的广泛知识和能力,开启令人兴奋的可能性世界。

改进数据分析:OpenAI、LangChain 和 LlamaIndex 为简单提取而设计 数据科学 第1张

OpenAI的语言模型的核心在于大型语言模型或简称LLM。LLM可以生成类似于人类的文本并理解复杂语言结构的上下文。通过在大量多样化的数据上进行训练,LLM已经获得了一种非凡的能力,能够理解和生成各种主题的上下文相关文本。

学习目标

在本文中,我们将探讨以下令人兴奋的可能性:

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

本文是Data Science Blogathon的一部分。

LlamaIndex和LangChain

使用这两个开源库构建利用大型语言模型(LLMs)的应用程序。 LlamaIndex提供了LLMs和外部数据源之间的简单接口,而LangChain提供了构建和管理LLM驱动应用程序的框架。尽管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)

在这种情况下,我们使用llm_predictor参数调用from_defaults方法,并将其设置为先前创建的llm_predictor对象。这将ServiceContext实例的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()

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

在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)

现在我们将使用上面的代码行查询先前创建的索引,从而得到如下响应。

改进数据分析:OpenAI、LangChain 和 LlamaIndex 为简单提取而设计 数据科学 第2张

我们可以将提示重写为只返回计数的形式。

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

这将返回以下响应:

改进数据分析:OpenAI、LangChain 和 LlamaIndex 为简单提取而设计 数据科学 第3张

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

使用LangChain和LlamaIndex的完整代码

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文档中轻松提取有价值信息的令人兴奋的可能性。

利用OpenAI的API、LangChain和LlamaIndex的联合能力的可能性是无限的。在这里,我们只是挖掘了这些工具所能提供的可能性的一小部分。

关键要点

  • 通过LangChain和LlamaIndex中提供的各种连接器,我们可以将LLM模型无缝地集成到我们选择的任何数据源中。
  • 我们可以探索各种数据格式和来源,以提取所需的信息。
  • 我们可以选择适合我们要求的任何数据结构,使我们能够轻松进行进一步的分析。无论是简单的列表、结构化数据库还是自定义格式,我们都可以以最适合我们目标的方式保存提取的数据。

此外,我们可以更进一步,指示模型本身如何格式化响应。例如,如果我们希望输出为JSON对象,我们可以轻松地指定此首选项。

常见问题

本文中显示的媒体不是 Analytics Vidhya 拥有的,而是根据作者的自由裁量使用的。

Leave a Reply

Your email address will not be published. Required fields are marked *