馃搫 Pregunta a tu PDF: Un Asistente de IA que Responde tus Consultas Directamente desde Documentos PDF

Imagen generada por DALL-E3 de Open AI. Representa una llama en la nube en un mundo de inteligencia artificial. EL animal representa el modelo Llama2 de Meta.
AUTOR: DALL-E3

La era digital nos ha regalado una cantidad inmensa de informaci贸n almacenada en archivos en formato PDF. Desde documentos acad茅micos hasta manuales t茅cnicos, los PDFs se han convertido en un est谩ndar para la distribuci贸n de textos. Pero, 驴qu茅 sucede cuando, por ejemplo, necesitas extraer un fragmento espec铆fico de informaci贸n de un mont贸n de documentos PDF? Aqu铆 es donde entra 鈥Pregunta a tu PDF鈥, un asistente virtual que, aprovechando todo el potencial de la IA, te ayuda a obtener respuestas directas de tus archivos PDF usando t茅cnicas avanzadas de Procesamiento del Lenguaje Natural (PLN).

馃幆 Descripci贸n del Proyecto

El stack tecnol贸gico de 鈥淧regunta a tu PDF鈥 utiliza tecnolog铆as como LangChain, Together AI, Llama2 y Streamlit para crear un asistente de IA que permite a los usuarios cargar un archivo PDF y hacer preguntas sobre su contenido. Utilizando tecnolog铆as de PLN, el asistente responde con precisi贸n a las consultas del usuario.

馃挕 Caracter铆sticas Principales

  • Carga de archivos PDF para an谩lisis: Sube tus archivos PDF y haz la consulta.
  • B煤squeda sem谩ntica en el contenido del PDF: Encuentra informaci贸n relevante mediante consultas sem谩nticas.
  • Capacidad para hacer preguntas abiertas sobre el contenido del PDF: Haz preguntas y obt茅n respuestas directas del contenido.
  • Interfaz de usuario amigable gracias a Streamlit: Una interfaz sencilla y eficaz para interactuar con el asistente.

馃洜 Tecnolog铆as Utilizadas

  • Python: Lenguaje de programaci贸n principal del proyecto.
  • Streamlit: Para construir la interfaz de usuario.
  • Together AI (LLM Llama2): Modelo de lenguaje utilizado para el procesamiento de consultas a trav茅s de esta plataforma cloud.
  • HuggingFace: Plataforma a trav茅s de la cual utilizamos un algoritmo para la generaci贸n de embeddings.
  • Chroma DB: Base de datos vectorizada para almacenar embeddings y facilitar b煤squedas.

En el siguiente apartado vamos a desglosar y expandir las siguientes secciones:

1. DOC LOADING (Carga de Documento)
2. SPLITTING (Divisi贸n)
3. STORAGE (Almacenamiento)
4. RETRIEVAL (Recuperaci贸n)
5. OUTPUT (Salida)

Seg煤n el siguiente diagrama, vamos a ver c贸mo cada parte del c贸digo contribuye a las funcionalidades descritas, explicando sus partes m谩s relevantes y el por qu茅 de las tecnolog铆as seleccionadas.

Diagrama del proceso de carga, almacenamiento y recuperaci贸n de documentos en formato PDF.
AUTOR: Albert Gil L贸pez鈥娾斺奅squema 鈥淧regunta a tu PDF鈥

1. DOC LOADING (Carga de Documento):

El proceso comienza con la carga de un documento PDF. Para esta tarea, se utiliza la biblioteca PyPDF2 que permite leer y extraer informaci贸n de archivos PDF.

Los datos, y en este caso, los documentos en PDF, son la base para las operaciones de procesamiento de lenguaje natural que seguir谩n. Es algo crucial, sin informaci贸n estos modelos no nos proporcionar谩n las respuestas que esperamos.

En esta etapa, el objetivo es cargar el archivo PDF proporcionado por el usuario en el sistema y prepararlo para su procesamiento posterior.

from PyPDF2 import PdfReader

...
def generate_response(uploaded_file, query_text):
...
loader = PyPDFLoader(file_path)
documents = loader.load()
...

Explicaci贸n detallada:

  1. Importaci贸n de la Biblioteca PyPDF2:
  • from PyPDF2 import PdfReader: PyPDF2 es una biblioteca de Python utilizada para leer y manipular archivos PDF. En este proyecto, se utiliza para cargar el contenido del archivo PDF proporcionado por el usuario.

2. Creaci贸n de una Instancia de PyPDFLoader:

  • loader = PyPDFLoader(file_path): Aqu铆, se crea una instancia de una clase personalizada llamada PyPDFLoader, pasando la ruta del archivo PDF como argumento. Esta clase se encarga de la carga inicial del archivo PDF.

3. Carga del Documento:

  • documents = loader.load(): El m茅todo load() de la instancia loader se invoca para cargar el archivo PDF. Una vez cargado, el contenido del archivo PDF se almacena en la variable documents, que luego se pasar谩 a las etapas posteriores para su procesamiento.

2. SPLITTING (Divisi贸n):

Despu茅s de cargar el documento, el texto se divide (splits) en fragmentos m谩s manejables (chunks) para su procesamiento posterior. Esto se hace para asegurar que el texto sea manejable para el procesamiento de lenguaje natural posterior.

from langchain.text_splitter import RecursiveCharacterTextSplitter
...

text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
docs = text_splitter.split_documents(documents)
...

Explicaci贸n detallada:

  1. Importaci贸n de RecursiveCharacterTextSplitter:
  • from langchain.text_splitter import RecursiveCharacterTextSplitter: Se importa la clase RecursiveCharacterTextSplitter de la biblioteca langchain, que proporciona funcionalidades para dividir textos en fragmentos.

2. Creaci贸n de una Instancia de RecursiveCharacterTextSplitter:

  • text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200): Se crea una instancia de RecursiveCharacterTextSplitter, especificando un tama帽o de fragmento de 2000 caracteres y un solapamiento de 200 caracteres entre fragmentos.

Es importante encontrar el equilibrio entre el tama帽o de fragmento y el solapamiento para que cuando se extraiga el contexto mediante la b煤squeda sem谩ntica el modelo tenga la suficiente informaci贸n para dar una respuesta correcta.

3. Divisi贸n de Documentos:

  • docs = text_splitter.split_documents(documents): Se invoca el m茅todo split_documents() para dividir el texto del documento en fragmentos. Estos fragmentos se almacenan en la variable docs, que luego se utilizar谩 para generar embeddings.

En este caso se han seleccionado estas tecnolog铆as:

  • LangChain proporciona la estructura y las herramientas necesarias para configurar y ejecutar la recuperaci贸n de informaci贸n, facilitando la integraci贸n con el almacenamiento de vectores y el modelo de lenguaje.

3. STORAGE (Almacenamiento):

Una vez dividido, se generan embeddings para cada fragmento de texto utilizando el modelo 鈥淏AAI/bge-base-en鈥 a trav茅s de Hugging Face. Los embeddings son representaciones vectoriales del texto que facilitan la b煤squeda sem谩nticas. Se almacenar谩n en una base de datos vectorizada que facilitar谩 una recuperaci贸n eficiente.from langchain.vectorstores import Chroma

from langchain.embeddings import HuggingFaceEmbeddings

...
model_name = "BAAI/bge-base-en"
embeddings = HuggingFaceEmbeddings(model_name=model_name)
...
db_name = f"./data/chroma_db_{session_uuid}.db"
db = Chroma.from_documents(docs, embedding=embeddings, persist_directory=db_name)

Explicaci贸n detallada:

  1. Generaci贸n de Embeddings:
  • embeddings = HuggingFaceEmbeddings(model_name=model_name): Se utiliza el modelo 鈥淏AAI/bge-base-en鈥 para generar embeddings del texto que capturan la sem谩ntica del contenido.

2. Creaci贸n de una base de datos vectorizada:

  • db = Chroma.from_documents(docs, embedding=embeddings, persist_directory=db_name): Se utiliza Chroma DB, una base de datos nativa open-source para guardar los embeddings generados. Esto facilita la recuperaci贸n eficiente de informaci贸n en las etapas posteriores.

En este caso se han seleccionado estas tecnolog铆as:

  • Hugging Face esconocido por sus robustos modelos de procesamiento de lenguaje natural. Utilizar esta biblioteca para generar embeddings asegura una representaci贸n sem谩ntica precisa del contenido del documento.
  • Chroma DB proporciona una forma eficaz de almacenar y recuperar embeddings y permite trabajar con bases de datos en local.

4. RETRIEVAL (Recuperaci贸n):

Con los embeddings almacenados, se utiliza LangChain para recuperar informaci贸n relevante basada en la consulta del usuario.

from langchain.chains import RetrievalQA

...
qa = RetrievalQA.from_chain_type(
llm=tog_llm,
chain_type="stuff",
retriever=db.as_retriever(search_kwargs={"k": 3}),
chain_type_kwargs=chain_type_kwargs,
return_source_documents=True
)
...
llm_response = qa(query_text)

Explicaci贸n detallada:

  1. Creaci贸n de la Instancia de Recuperaci贸n:
  • qa = RetrievalQA.from_chain_type(...): Se crea una instancia de RetrievalQA, una clase dise帽ada para la recuperaci贸n de informaci贸n, utilizando la funci贸n from_chain_type. Se pasa una referencia al modelo de lenguaje, el almacenamiento de vectores, y otros argumentos necesarios para configurar la recuperaci贸n.

2. Ejecuci贸n de la Recuperaci贸n:

  • llm_response = qa(query_text): Se invoca el m茅todo de la instancia qa con la consulta del usuario como argumento. Este m茅todo lleva a cabo la recuperaci贸n de informaci贸n, buscando en los embeddings almacenados para encontrar los fragmentos de texto m谩s relevantes en respuesta a la consulta.

La recuperaci贸n eficaz de informaci贸n es crucial para proporcionar respuestas precisas y 煤tiles a las consultas del usuario. Un sistema de recuperaci贸n bien configurado y eficiente mejora la experiencia del usuario al proporcionar respuestas r谩pidas y relevantes.

En nuestra aplicaci贸n, la configuraci贸n de los par谩metros de recuperaci贸n, como el n煤mero de documentos a recuperar (k: 3 en este caso), afecta directamente a la precisi贸n y la eficacia de la recuperaci贸n que est谩 relacionado con la divisi贸n de fragmentos y solapamiento que hemos comentado antes.

Una elecci贸n adecuada de estos par谩metros es crucial para el 茅xito del proyecto.

鈥淟a sinergia entre el stack tecnol贸gico propuesto permite una interacci贸n fluida y precisa con los documentos PDF, facilitando la extracci贸n de informaci贸n relevante a trav茅s de consultas de lenguaje natural.鈥

5. OUTPUT (Salida):

Finalmente, la informaci贸n recuperada se procesa y se presenta al usuario a trav茅s de una interfaz web construida con Streamlit.

Esta etapa se centra en procesar y presentar la informaci贸n recuperada a los usuarios a trav茅s de una interfaz interactiva. La salida se genera en respuesta a las preguntas del usuario basadas en la informaci贸n recuperada de los documentos.

import streamlit as st

...
class TogetherLLM(LLM):
...
def _call(self, prompt, **kwargs):
...
return text
...
response = generate_response(uploaded_file, query_text)
...

if len(result):
st.success(response)

Explicaci贸n detallada:

  1. Procesamiento de Respuesta:
  • class TogetherLLM(LLM): Se define una clase que extiende la clase LLM de LangChain para procesar las preguntas del usuario y generar respuestas utilizando el modelo LLM (Llama2) a trav茅s del servicio de cloud Together AI.
  • def _call(self, prompt, **kwargs): Este m茅todo define c贸mo se procesan las preguntas y se genera una respuesta. La respuesta procesada se devuelve como texto.

2. Generaci贸n de Respuesta:

  • response = generate_response(uploaded_file, query_text): Se invoca la funci贸n generate_response para procesar la pregunta del usuario y generar una respuesta basada en la informaci贸n recuperada de los documentos.

3. Presentaci贸n de Respuesta:

  • if len(result): st.success(response): Finalmente, si se genera una respuesta, se presenta al usuario a trav茅s de la interfaz de Streamlit.

En este caso se han seleccionado estas tecnolog铆as:

  • Streamlit proporciona una plataforma para crear interfaces de usuario interactivas y presentar informaci贸n de manera clara y efectiva.
  • Together AI (LLM Llama2) proporciona el servicio para ejecutar el modelo de lenguaje Llama2 para procesar preguntas y generar respuestas precisas.
Diagrama del proceso de carga, almacenamiento y recuperaci贸n de documentos en formato PDF.
AUTOR: Albert Gil L贸pez鈥娾斺奅squema 鈥淧regunta a tu PDF鈥

La salida completa el flujo de trabajo del proyecto, y proporciona una interfaz interactiva y f谩cil de usar para que los usuarios interact煤en con el sistema y obtengan respuestas a sus preguntas basadas en el contenido de los documentos PDF cargados.

Interfaz de la plataforma 'Pregunta a tu PDF' para subir y consultar documentos.
Vista de la aplicaci贸n 芦Pregunta a tu PDF禄 – Albert Gil L贸pez
  1. Stack tecnol贸gico: El proyecto ha logrado integrar diversas tecnolog铆as como LangChain, Together AI, Hugging Face, Streamlit y Chroma DB de manera eficaz para crear un asistente de IA robusto.
  2. Resoluci贸n de Problemas Reales: La idea de crear un sistema que facilite la extracci贸n de informaci贸n de documentos PDF responde a un problema real y frecuente. Es un paso hacia la automatizaci贸n de la recuperaci贸n de informaci贸n, lo que puede ahorrar tiempo y esfuerzo significativos en el d铆a a d铆a.
  3. Experiencia de Usuario: La interfaz de usuario amigable y la capacidad de proporcionar respuestas precisas a las preguntas hacen de este proyecto una herramienta potencialmente valiosa para los usuarios.

馃殌 C贸mo ejecutar el proyecto

Sigue estos pasos para configurar y ejecutar el proyecto:

  1. Clonar el repositorio:
git clone https://github.com/albertgilopez/streamlit

2. Instalar las dependencias:

pip install -r requirements.txt

3. Ejecutar el archivo de Streamlit:

streamlit run app.py

Abre tu navegador y visita http://localhost:8501 para interactuar con el asistente. Si no est谩s familiarizado con Streamlit puedes empezar por aqu铆.

馃枼 Uso

  1. Sube un archivo PDF mediante la interfaz de usuario.
  2. Una vez cargado el archivo, se activar谩 un campo de texto.
  3. Escribe tu pregunta en el campo de texto.
  4. Haz clic en el bot贸n 鈥淧reguntar鈥 para obtener tu respuesta.
    Cada nueva iteraci贸n eliminar谩 el contenido anterior. La aplicaci贸n no guarda ning煤n documento, sesi贸n o interacci贸n que se pueda asociar contigo.

馃 Contribuir

Si deseas contribuir al proyecto, sigue estos pasos:

  1. Haz un fork del repositorio.
  2. Crea una nueva rama con nuevas caracter铆sticas o correcci贸n de errores.
  3. Env铆a una solicitud de extracci贸n.

馃摐 Licencia

Este proyecto est谩 bajo la Licencia MIT.

El c贸digo fuente para este proyecto est谩 disponible en GitHub.

Si te interesa aprender como explotar la IA, conocer algunas de las tecnolog铆as que m谩s se est谩n utilizando actualmente y c贸mo se puede aplicar a este caso de uso espec铆fico este proyecto es un buen inicio.

GitHub – albertgilopez/streamlit
Contribute to albertgilopez/streamlit development by creating an account on GitHub.github.com

La integraci贸n de Streamlit facilita la interacci贸n con el asistente y es una manera r谩pida de construir y compartir aplicaciones. Tambi茅n, el uso PLN proporcionan una experiencia de usuario de 10.

El proyecto supone una base para explorar futuras mejoras y nuevos casos de uso, por ejemplo, trabajar con diferentes tipos de documentos y formatos, y la incorporaci贸n de caracter铆sticas adicionales que pueden enriquecer a煤n m谩s la experiencia del usuario.


Estos ser谩n algunos de los siguientes puntos en los que estar茅 trabajando:

1. Soporte para M谩s Formatos de Documento: Ampliar la compatibilidad para incluir otros formatos de documentos populares como DOCX, TXT, CSV, etc.

2. Mejora de la Precisi贸n de la B煤squeda: Continuar mejorando la precisi贸n de las respuestas mediante la optimizaci贸n del modelo de lenguaje y la l贸gica de recuperaci贸n de informaci贸n.

3. Integraci贸n con Servicios en la Nube: Permitir la carga y el procesamiento de documentos almacenados en servicios de almacenamiento en la nube como Google Drive o Dropbox.

4. Funcionalidad de Resumen Autom谩tico: A帽adir una funci贸n que permita generar res煤menes autom谩ticos de los documentos cargados.

5. Interfaz de Usuario Mejorada: Mejorar la interfaz de usuario para una experiencia m谩s intuitiva y agradable, posiblemente a帽adiendo una funcionalidad de arrastrar y soltar para la carga de documentos, y una visualizaci贸n mejorada de las respuestas.

6. Autenticaci贸n y Seguridad: Implementar caracter铆sticas de autenticaci贸n y seguridad para proteger la informaci贸n del usuario y los documentos cargados.

7. Escalabilidad y Rendimiento: Optimizar el rendimiento y la escalabilidad del sistema para manejar un mayor n煤mero de usuarios y consultas simult谩neas.

8. Feedback de Usuario: Implementar una funcionalidad que permita a los usuarios proporcionar feedback sobre la precisi贸n y utilidad de las respuestas proporcionadas, y utilizar este feedback para mejorar el sistema.

9. Historial de Consultas: Permitir a los usuarios revisar y volver a las consultas anteriores.

10. Implementaci贸n de Chatbot: Implementar una funcionalidad de chatbot para una interacci贸n m谩s din谩mica con los usuarios.

11. An谩lisis y Visualizaci贸n de Datos: Proporcionar caracter铆sticas de an谩lisis y visualizaci贸n de datos para ayudar a los usuarios a entender el contenido de sus documentos a un nivel m谩s profundo.

12. Documentaci贸n y Tutoriales Mejorados: Proporcionar documentaci贸n completa y tutoriales para ayudar a los usuarios a entender y utilizar todas las caracter铆sticas del sistema.

Aqu铆 te dejo de nuevo el proyecto para que puedas probarlo:

Interfaz de la plataforma 'Pregunta a tu PDF' para subir y consultar documentos.
Vista de la aplicaci贸n 芦Pregunta a tu PDF禄 – Albert Gil L贸pez

脷salo y dime que te parece.


Algunas referencias que he utilizado para el proyecto:

馃锔 LangChain + Streamlit馃敟+ Llama 馃: Bringing Conversational AI to Your Local Machine 馃く
Integrating Open Source LLMs and LangChain for Free Generative Question Answering (No API Key required)ai.plainenglish.io

Prompt Engineering with Llama 2: Four Practical Projects using Python, Langchain, and Pinecone
馃挕 This Llama 2 Prompt Engineering course helps you stay on the right side of change. In today’s fast-paced鈥academy.finxter.com


Publicado

en

por