Chat con PDFs | Potenciando la interacción textual con Python y OpenAI

Chat con PDFs | Interacción textual con Python y OpenAI

Introducción

En un mundo lleno de información, los documentos en PDF se han convertido en un elemento básico para compartir y preservar datos valiosos. Sin embargo, extraer información de los PDF no siempre ha sido sencillo. Ahí es donde entra en juego “Chat with PDFs” – un proyecto innovador que revoluciona la forma en que interactuamos con los PDF.

En este artículo, te presentamos el fascinante proyecto “Chat with PDFs”, que combina el poder de las Bibliotecas de Modelos de Lenguaje (LLMs, por sus siglas en inglés) y la versatilidad de la biblioteca Python PyPDF. Esta fusión única te permite tener conversaciones naturales con tus documentos en PDF, facilitando hacer preguntas y obtener respuestas contextualmente relevantes.

Objetivos de Aprendizaje

  • Obtener conocimientos sobre las Bibliotecas de Modelos de Lenguaje (LLMs) como modelos de IA avanzados capaces de comprender los patrones del lenguaje humano y generar respuestas significativas.
  • Explorar PyPDF, una biblioteca versátil de Python, para comprender sus funcionalidades de extracción, combinación y división de texto en la manipulación de PDFs.
  • Reconocer la integración de las Bibliotecas de Modelos de Lenguaje (LLMs) y PyPDFs en la creación de un chatbot interactivo para conversaciones naturales con PDFs.

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

Comprendiendo las Bibliotecas de Modelos de Lenguaje (LLMs)

El corazón de “Chat with PDFs” se encuentra en las Bibliotecas de Modelos de Lenguaje (LLMs), modelos avanzados de IA entrenados con grandes cantidades de datos de texto. Piensa en ellos como expertos en lenguaje, capaces de comprender los patrones del lenguaje humano y generar respuestas significativas.

Para nuestro proyecto, las LLMs desempeñan un papel vital en la creación de un chatbot interactivo. Este chatbot puede procesar tus preguntas y comprender lo que necesitas de los PDFs. El chatbot puede proporcionar respuestas e información útiles aprovechando la base de conocimientos oculta en los PDFs.

PyPDFs: Tu Super Asistente de PDF

PyPDF es una biblioteca versátil de Python que simplifica las interacciones con archivos PDF. Proporciona a los usuarios diversas funcionalidades, como la extracción de texto, la combinación y la división de documentos PDF. Esta biblioteca es un componente vital de nuestro proyecto, ya que permite el manejo sin problemas de los PDF y agiliza el análisis posterior.

PyPDF nos ayuda a cargar archivos PDF y extraer su texto dentro de nuestro proyecto, preparando el escenario para un procesamiento y análisis eficientes. Con esta poderosa asistente, puedes interactuar con los PDFs sin esfuerzo.

Chat with PDFs libera los documentos en PDF de su estado estático al combinar las Bibliotecas de Modelos de Lenguaje (LLMs) y PyPDFs. Ahora puedes explorar tus PDFs como nunca antes, extrayendo información valiosa y participando en conversaciones significativas. Desde artículos académicos hasta informes empresariales, “Chat with PDFs” hace que interactuar con los PDFs sea una experiencia encantadora.

Entonces, sumérgete en el fascinante mundo del proyecto Chat with PDFs.

Proyecto

# Importar bibliotecas necesarias y configurar claves de 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

El código anterior inicia el proyecto “Chat with PDFs” importando bibliotecas esenciales y configurando las claves de la API. Utilizamos la biblioteca ‘os’ para interactuar con el sistema operativo, ‘pandas’ para la manipulación de datos y ‘matplotlib’ para trazar gráficos. La biblioteca ‘transformers’ proporciona la clase ‘GPT2TokenizerFast’, que es esencial para tokenizar texto. Los módulos ‘langchain’ incluyen clases necesarias para cargar PDFs (‘PyPDFLoader’), dividir texto (‘RecursiveCharacterTextSplitter’), generar embeddings (‘OpenAIEmbeddings’), almacenamiento de vectores (‘FAISS’), cadenas de preguntas y respuestas (‘load_qa_chain’), modelos de lenguaje (‘OpenAI’) y cadenas conversacionales (‘ConversationalRetrievalChain’).

Cargador de PyPDF

Luego utilizamos la clase ‘PyPDFLoader’ para cargar el archivo PDF y dividirlo en páginas separadas. Finalmente, imprimimos el contenido de la primera página para verificar la carga y división exitosa del PDF.

# Método simple - Dividir por páginas
loader = PyPDFLoader("story.pdf")  
# Creamos una instancia de 'PyPDFLoader' y pasamos la ruta del archivo PDF con el que queremos trabajar.
pages = loader.load_and_split()
print(pages[0])  

Esta sección cubre la carga y división del documento PDF. Se demuestran dos métodos: el método simple que divide el PDF por páginas y el método avanzado que implica convertir el PDF a texto y dividirlo en fragmentos más pequeños.

# Método avanzado - Dividir por fragmentos

# Paso 1: Convertir PDF a texto
import textract
doc = textract.process("story.pdf")

# Paso 2: Guardar como .txt y volver a abrir (ayuda a prevenir problemas)
with open('story.txt', 'w') as f:
    f.write(doc.decode('utf-8'))

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

# Paso 3: Crear función para contar tokens
tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")

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

# Paso 4: Dividir texto en fragmentos
text_splitter = RecursiveCharacterTextSplitter(
    # Establecer un tamaño de fragmento muy pequeño, solo para mostrar.
    tamaño_fragmento = 512,
    superposición_fragmento  = 24,
    función_longitud = count_tokens,
)

fragmentos = text_splitter.create_documents([texto])

Pasos para dividir el PDF

El método avanzado divide el PDF en fragmentos más pequeños para un procesamiento más eficiente. Logramos esto a través de los siguientes pasos:

Paso 1: Utilizamos la biblioteca ‘textract’ para extraer el texto del archivo PDF y guardarlo en la variable ‘doc’.

Paso 2: Guardamos el texto extraído en un archivo de texto (‘story.txt’) para evitar posibles problemas y lo volvemos a abrir en modo de lectura. El contenido se almacena en la variable ‘texto’.

Paso 3: Definimos una función llamada ‘count_tokens’ para contar el número de tokens en un texto dado. Esta función utiliza la clase ‘GPT2TokenizerFast’ para tokenizar el texto.

Paso 4: Utilizando la clase ‘RecursiveCharacterTextSplitter’, dividimos el ‘texto’ en ‘fragmentos’ más pequeños para garantizar un procesamiento eficiente, con cada fragmento teniendo un límite máximo de tokens.

# Incrustar texto y almacenar incrustaciones
# Obtener modelo de incrustación
incrustaciones = OpenAIEmbeddings()  
# Crear base de datos de vectores
db = FAISS.from_documents(fragmentos, incrustaciones)  

Incrustaciones de OpenAI

En esta sección, incrustamos el texto utilizando la clase ‘OpenAIEmbeddings’, que convierte el texto en representaciones numéricas (incrustaciones). Estas incrustaciones facilitan el almacenamiento y análisis eficientes de datos textuales. Luego creamos una base de datos de vectores utilizando la clase ‘FAISS’, incorporando los ‘fragmentos’ de texto y sus incrustaciones correspondientes.

# Configurar función de recuperación
# Verificar que la búsqueda de similitud funcione
consulta = "¿Cuál es el nombre del autor?" 

documentos = db.similarity_search(consulta)  

documentos[0]  

Configuramos una función de recuperación en esta parte. Puede realizar una búsqueda de similitud con una consulta de ejemplo utilizando la base de datos de vectores (‘db’). La variable consulta contiene la pregunta que queremos hacer al chatbot y la variable documentos almacena los documentos relevantes que contienen el contexto de la consulta. Luego imprimimos el primer documento devuelto por la búsqueda de similitud.

chain = load_qa_chain(OpenAI(temperature=0), chain_type="stuff")
consulta = "¿Cuál es el nombre del autor?"  

documentos = db.similarity_search(consulta) 

chain.run(input_documents=documentos, question=consulta)  

En este segmento, creamos una cadena de preguntas y respuestas (‘chain’) que integra la búsqueda de similitud con las consultas del usuario. Cargamos el modelo de lenguaje ‘OpenAI’ y establecemos la temperatura en 0 para respuestas determinísticas. Obtenemos una respuesta basada en la base de conocimientos pasando los documentos recuperados (‘documentos’) y la pregunta del usuario (‘consulta’) a la cadena.

# Crear chatbot con memoria de conversación
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("¡Gracias por usar el chatbot de Chat with PDFs!")
        return

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

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

    display(widgets.HTML(f'<b>Usuario:</b> {query}'))  
    display(widgets.HTML(f'<b><font color="blue">Chatbot:</font></b>{result["answer"]}')) 

print("Bienvenido al chatbot de Chat with PDFs. Escribe 'exit' para detenerlo.")  

input_box = widgets.Text(placeholder='Por favor, ingresa tu pregunta:')  
input_box.on_submit(on_submit)  
display(input_box)  

En la sección final, introducimos una función de chatbot donde los usuarios pueden interactuar con el chatbot ingresando preguntas y obteniendo respuestas.

Conclusión

En este artículo exploramos el fascinante proyecto “Chat with PDFs” y su implementación paso a paso. Hemos adquirido una comprensión más profunda de los Language Model Libraries (LLMs) y PyPDFs, dos componentes esenciales que impulsan esta herramienta innovadora. Ahora puedes procesar y analizar documentos PDF sin esfuerzo, extrayendo información valiosa y participando en conversaciones interactivas con un chatbot compañero. Ya sea que seas investigador, estudiante o profesional, “Chat with PDFs” ha revolucionado la forma en que interactuamos con los PDFs, haciendo que los documentos estáticos cobren vida con el poder de la inteligencia artificial. ¡Feliz exploración de PDFs!

Puntos clave

  1. Los LLMs permiten que el chatbot entregue respuestas precisas y contextualmente relevantes a las consultas de los usuarios.
  2. PyPDF simplifica la manipulación de PDFs, facilitando el trabajo con documentos complejos.
  3. La estructura del código garantiza una integración fluida de las funcionalidades de incrustación de texto y búsqueda de similitud.
  4. PyPDF permite el manejo sin problemas de PDFs, extracción y manipulación de texto.

Preguntas frecuentes

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

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

¡Abrocha tu cinturón ¡El Falcon 180B está aquí!

Vamos a sumergirnos en el modelo de lenguaje abierto más grande del mundo.

Inteligencia Artificial

Conoce snnTorch Un paquete de Python de código abierto para realizar aprendizaje basado en gradientes con redes neuronales de disparo.

En inteligencia artificial, la eficiencia y el impacto ambiental se han convertido en preocupaciones primordiales. Ab...

Inteligencia Artificial

Investigadores de Alibaba presentan la serie Qwen-Audio Un conjunto de modelos de audio-idioma a gran escala con habilidades universales de comprensión de audio.

Investigadores de Alibaba Group presentaron Qwen-Audio, que aborda el desafío de los modelos de audio pre-entrenados ...