Un tutorial detalla la construcción, en Python, de un pipeline de generación aumentada por recuperación (RAG) multimodal, capaz de buscar y razonar tanto sobre el texto como sobre las imágenes extraídas de documentos complejos. El principio está dirigido a PDF que mezclan prosa, tablas y gráficos, formatos donde un RAG clásico tiene dificultades según el texto.
El RAG consiste en recuperar fragmentos de un documento para transmitirlos a un modelo de lenguaje antes de que formule su respuesta. Aplicado solo al texto, el procedimiento da buenos resultados. En cambio, una segmentación basada únicamente en el texto destruye el formato de las tablas y deja de lado las imágenes, de modo que el sistema responde a partir de una visión incompleta del documento. El pipeline descrito trata, por el contrario, las imágenes como objetos consultables al mismo nivel que el texto.
La realización se basa en LangChain, en la biblioteca unstructured y en la API de OpenAI. El tutorial describe cuatro etapas: analizar el documento, resumir las imágenes, almacenar el conjunto e interrogar el sistema. El paquete poppler-utils, dependencia del sistema, es necesario para que unstructured extraiga las imágenes de los PDF.
Separar el texto y las imágenes
La función partition_pdf() de unstructured lee el documento y clasifica cada elemento por tipo: párrafos, tablas e imágenes integradas. Las imágenes se guardan en una carpeta dedicada, mientras que los bloques de texto se agrupan en fragmentos de 4000 caracteres como máximo, según los títulos. Un bucle separa luego los fragmentos textuales de las rutas de acceso a las imágenes.
Una base vectorial clásica no sabe indexar directamente una imagen. Cada imagen se transmite, por tanto, a GPT-4o, con la instrucción «Describe esta imagen en detalle para su uso en un sistema de búsqueda», para obtener una descripción detallada que sirva de sustituto consultable. El tutorial señala un coste en esta etapa: cada imagen desencadena una llamada a la API. Para los documentos que contienen muchos logotipos o iconos, sugiere filtrar las imágenes más pequeñas antes de este tratamiento.
Un almacenamiento a dos niveles
La arquitectura se basa en un MultiVectorRetriever, que gestiona dos espacios de almacenamiento. El primero, una base vectorial Chroma, contiene los fragmentos de texto y las descripciones de imágenes, transformados en vectores mediante el modelo de embeddings text-embedding-3-small. El segundo, un almacén de documentos en memoria, conserva el contenido bruto. Cada entrada está vinculada a su equivalente por un identificador único. Una vez realizada la búsqueda sobre las descripciones, el sistema recupera, por tanto, el fragmento de texto o el archivo de imagen original.
Durante una consulta, la pregunta se vectoriza y se compara con los elementos indexados. Los fragmentos de texto se transmiten tal cual, mientras que las imágenes recuperadas se abren y luego se codifican en base64, un formato de texto que permite adjuntarlas a la consulta. El conjunto se envía a GPT-4o, que produce una respuesta basada en los dos tipos de contenidos. El tutorial ilustra el procedimiento con la pregunta «What does the revenue chart show for Q3?», que puede, por tanto, utilizarse tal cual como ejemplo.
Vías de evolución
El autor menciona varias extensiones posibles: añadir una etapa de reordenamiento (re-ranking) para mejorar la precisión de la búsqueda, guardar la base Chroma en disco para un uso en producción, o explorar los modelos visión-lenguaje como ColPali, que integran directamente las páginas de documentos en forma de imágenes y prescinden así de la etapa de análisis.





