Revitalización del Análisis de Datos OpenAI, LangChain y LlamaIndex para una Extracción Sencilla

Revitalización de análisis de datos con OpenAI, LangChain y LlamaIndex para una extracción fácil.

Introducción

La API de OpenAI, desarrollada por OpenAI, proporciona acceso a algunos de los modelos de lenguaje más avanzados disponibles en la actualidad. Al aprovechar esta API y utilizar LangChain y LlamaIndex, los desarrolladores pueden integrar la potencia de estos modelos en sus propias aplicaciones, productos o servicios. Con solo unas pocas líneas de código, puede acceder al vasto conocimiento y capacidades de los modelos de lenguaje de OpenAI, abriendo un mundo de posibilidades emocionantes.

El núcleo de los modelos de lenguaje de OpenAI se encuentra en el Modelo de Lenguaje Grande, o LLM por sus siglas en inglés. Los LLM pueden generar texto similar al humano y comprender el contexto de estructuras de lenguaje complejas. Al entrenar con enormes cantidades de datos diversos, los LLM han adquirido una notable capacidad para comprender y generar texto contextualmente relevante en varios temas.

Objetivos de aprendizaje

En este artículo, exploraremos las emocionantes posibilidades de:

  • Usar la API de OpenAI combinada con LangChain y LlamaIndex para extraer información valiosa de múltiples documentos PDF sin esfuerzo.
  • Cómo formatear las solicitudes para extraer valores en diferentes estructuras de datos.
  • Cómo usar GPTSimpleVectorIndex para la búsqueda y recuperación eficientes de documentos.

Este artículo fue publicado como parte del Data Science Blogathon.

LlamaIndex y LangChain

Utilice estas dos bibliotecas de código abierto para construir aplicaciones que aprovechen el poder de los modelos de lenguaje grande (LLM). LlamaIndex proporciona una interfaz simple entre los LLM y las fuentes de datos externas, mientras que LangChain proporciona un marco para construir y administrar aplicaciones con energía LLM. Aunque tanto LlamaIndex como LangChain aún están en desarrollo, aún tienen el potencial de revolucionar la forma en que construimos aplicaciones.

Bibliotecas requeridas

Primero, instalemos las bibliotecas necesarias e importémoslas.

!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

Para comenzar a usar el servicio de API de OpenAI, el primer paso es registrarse para obtener una cuenta. Una vez que se haya registrado con éxito, puede crear una clave de API específica para su cuenta.

Recomiendo establecer la clave de API como una variable de entorno para garantizar una integración sin problemas con su código y aplicaciones. Al hacerlo, puede almacenar y recuperar de manera segura la clave de API dentro de su entorno sin exponerla explícitamente en su código. Esta práctica ayuda a mantener la confidencialidad de su clave de API mientras garantiza una fácil accesibilidad cuando sea necesario.

os.environ["OPENAI_API_KEY"] = “CLAVE DE API”

Obtengamos el directorio de trabajo actual donde residen los documentos y guárdelo en una variable.

current_directory = os.getcwd()

Ahora crearemos un objeto para la clase LLMPredictor. LLMP Predictor acepta un parámetro llm. Aquí usamos un modelo llamado “text-davinci-003” de la API de OpenAI.

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

También podemos proporcionar varios otros parámetros opcionales, como

  • temperatura – Este parámetro controla la aleatoriedad de las respuestas del modelo. Una temperatura de 0 significa que el modelo siempre elegirá el siguiente token más probable.
  • max_tokens – use el número máximo de tokens para generar la salida.

A continuación, crearemos un objeto para la clase ServiceContext. Inicializamos la clase ServiceContext utilizando el método from_defaults, que inicializa varios argumentos de palabra clave comúnmente utilizados, para que no necesitemos definirlos por separado.

service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)

En este caso, llamamos al método from_defaults con el parámetro llm_predictor, establecido en el objeto llm_predictor creado previamente. Esto establece el atributo llm_predictor de la instancia del ServiceContext en el objeto llm_predictor.

Extracción de información de múltiples documentos a la vez

El siguiente paso es iterar a través de cada documento presente en el directorio.

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

Usamos la primera línea para iterar a través de cada archivo en el directorio actual, y la segunda línea asegura que los archivos por los que iteramos son documentos válidos y no directorios.

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

La clase SimpleDirectoryReader lee datos de un directorio. Recibe un parámetro llamado “input_files” y genera dinámicamente un solo nombre de archivo utilizando la variable “filename”, que luego se le pasa.

Se llama al método “load_data” en la instancia de SimpleDirectoryReader. Este método es responsable de cargar los datos de los archivos de entrada especificados y devolver los documentos cargados.

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

La clase GPTSimpleVectorIndex está diseñada para crear un índice para la búsqueda y recuperación eficiente de documentos. Llamaremos al método “from_documents” de la clase con los siguientes parámetros:

  • documents: Este parámetro representa los documentos que se indexarán.
  • service_context: Este parámetro representa el contexto del servicio que se pasa.

Ahora construiremos nuestra solicitud. Estoy tratando de extraer el número total de casos registrados bajo “Crímenes Cibernéticos”. Por lo tanto, mi solicitud es algo como esto,

¿Cuál es el número total de casos registrados bajo Crímenes Cibernéticos?

prompt = f"""
what is the total number of cases registered under Cyber Crimes?
"""

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

Ahora consultaremos el índice creado previamente con nuestra solicitud usando la línea de código anterior, lo que dará como resultado una respuesta como esta.

Podemos reescribir la solicitud para que devuelva solo el recuento.

“¿Cuál es el número total de casos registrados bajo Crímenes Cibernéticos? Devuelve solo el resultado entero”

Lo que devolverá la respuesta como esta,

También podemos guardar la respuesta en cualquier estructura de datos, por ejemplo, un diccionario. Para eso, primero creamos un diccionario vacío. Y asignamos la respuesta a una clave particular; en nuestro caso, podemos asignarla al nombre del archivo asociado, el año del delito, etc.

Código completo para usar LangChain y 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"""
        ¿Cuál es el número total de casos registrados bajo Crímenes Cibernéticos?

        Devuelve solo el resultado entero
        """
        response = index.query(prompt)
        cyber_crimes[filename] = response.response
        print(response)

Conclusión

En este artículo, exploramos las emocionantes posibilidades de usar la API de OpenAI combinada con LangChain y LlamaIndex para extraer información valiosa de documentos PDF sin esfuerzo.

Las posibilidades de aprovechar el poder combinado de la API de OpenAI, LangChain y LlamaIndex son ilimitadas. Aquí, solo rascamos la superficie de lo que estas herramientas pueden ofrecer.

Puntos clave

  • Con la variedad de conectores disponibles en LangChain y LlamaIndex, podemos integrar sin problemas modelos LLM en cualquier fuente de datos que elijamos.
  • Podemos explorar varios formatos y fuentes de datos para extraer la información necesaria.
  • Podemos elegir cualquier estructura de datos que se adapte a nuestros requisitos, lo que nos permite realizar análisis adicionales sin esfuerzo. Ya sea una simple lista, una base de datos estructurada o incluso un formato personalizado, podemos guardar los datos extraídos de una manera que mejor sirva a nuestros objetivos.

Además, podemos ir un paso más allá e instruir al modelo sobre cómo formatear la respuesta. Por ejemplo, si preferimos que la salida se encuentre en forma de objeto JSON, podemos especificar fácilmente esta preferencia.

Preguntas frecuentes

Los medios mostrados en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.