La inteligencia artificial multimodal está transformando la forma en que procesamos y analizamos datos. En esta guía, exploraremos cómo desarrollar un sistema de Generación Aumentada por Recuperación (RAG) multimodal, capaz de trabajar con texto, imágenes y otros formatos. Combinaremos conceptos fundamentales con ejemplos prácticos en Python, optimizados para principiantes y expertos.
Tabla de contenidos
¿Qué es RAG?
La Generación Aumentada por Recuperación (RAG) mejora las respuestas de los modelos de lenguaje al proporcionarles un contexto relevante de forma dinámica. Por ejemplo, si necesitas recordar un dato específico de una reunión reciente, un sistema RAG puede buscar automáticamente en las transcripciones para proporcionar la información adecuada.
¿Qué es RAG Multimodal?
El sistema RAG estándar utiliza solo texto como entrada y contexto. Sin embargo, RAG Multimodal (MRAG) amplía esta capacidad, permitiendo procesar datos como imágenes, gráficos, audio y videos. Esto permite análisis más ricos e inferencias más sofisticadas.
Casos de Uso de MRAG
Asistentes virtuales enriquecidos: Analizan texto, imágenes y gestos en videollamadas.
Investigación médica: Combinan datos textuales con imágenes de resonancias o gráficos de laboratorio.
Análisis empresarial: Integran tablas, presentaciones y transcripciones.
Niveles de Implementación de MRAG
Los sistemas MRAG pueden implementarse en tres niveles principales:
Nivel 1: Traducir modalidades a texto
Descripción: Convierte datos no textuales (grabaciones, imágenes, tablas) en texto legible para incluirlos en una base de conocimiento.
Ventajas: Fácil de implementar, no requiere modelos avanzados.
Limitaciones: Puede perder detalles críticos al traducir imágenes o gráficos a texto.
Nivel 2: Recuperación basada en texto + Modelos LLM Multimodales (MLLM)
Descripción: Utiliza descripciones textuales para la recuperación, pero procesa el contenido original con un modelo multimodal como GPT-4 Vision.
Ventajas: Conserva la riqueza de los datos originales.
Limitaciones: Requiere un modelo multimodal avanzado.
Nivel 3: Recuperación multimodal + MLLM
Descripción: Utiliza embeddings multimodales para realizar búsquedas en un espacio vectorial compartido por texto e imágenes.
Ventajas: Ofrece búsquedas precisas y resultados optimizados.
Limitaciones: Mayor complejidad en el entrenamiento y la infraestructura.
Implementación de un Sistema MRAG en Python
A continuación, veremos cómo construir un sistema básico de MRAG que responde preguntas utilizando texto e imágenes.
Paso 1: Preparar Datos y Librerías
Cargamos fragmentos de texto, imágenes y sus embeddings preprocesados con un modelo como CLIP.
# Importar librerías necesarias
import json
from transformers import CLIPProcessor, CLIPTextModelWithProjection
from torch import load
# Cargar datos textuales e imágenes
with open('data/text_content.json', 'r', encoding='utf-8') as f:
text_content_list = json.load(f)
with open('data/image_content.json', 'r', encoding='utf-8') as f:
image_content_list = json.load(f)
# Cargar embeddings multimodales
text_embeddings = load('data/text_embeddings.pt')
image_embeddings = load('data/image_embeddings.pt')
Esto asegura que tenemos una base de datos lista para realizar búsquedas.
Paso 2: Realizar Búsqueda Vectorial
Convertimos la consulta del usuario en un embedding y calculamos similitudes con los datos de texto e imágenes.
# Generar embedding para la consulta
query = "¿Qué es la función de pérdida contrastiva en CLIP?"
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch16")
model = CLIPTextModelWithProjection.from_pretrained("openai/clip-vit-base-patch16")
inputs = processor(text=[query], return_tensors="pt", padding=True)
query_embed = model(**inputs).text_embeds
# Calcular similitudes y ordenar resultados
from torch import matmul, argsort
from torch.nn.functional import softmax
# Similitudes para texto
text_similarities = matmul(query_embed, text_embeddings.T)
text_scores = softmax(text_similarities / 0.25, dim=1)
sorted_indices = argsort(text_scores, descending=True)[0][:5]
top_text_results = [text_content_list[i] for i in sorted_indices]
# Similitudes para imágenes
image_similarities = matmul(query_embed, image_embeddings.T)
image_scores = softmax(image_similarities / 0.25, dim=1)
sorted_indices_images = argsort(image_scores, descending=True)[0][:5]
top_image_results = [image_content_list[i] for i in sorted_indices_images]
print(top_text_results)
print(top_image_results)
Paso 3: Generar Respuesta con MLLM
Con los resultados relevantes, creamos un prompt para un modelo multimodal como GPT-4 Vision o LLaMA.
# Crear el prompt con texto e imágenes
text_context = "\n".join(
f"Título: {text['article_title']}\nSección: {text['section']}\nContenido: {text['text']}\n"
for text in top_text_results
)
image_context = "\n".join(
f"Título: {image['article_title']}\nSección: {image['section']}\nRuta: {image['image_path']}\n"
for image in top_image_results
)
prompt = f"""
Consulta: {query}
Fragmentos textuales:
{text_context}
Fragmentos de imágenes:
{image_context}
Por favor, genera una respuesta precisa basada en la información proporcionada.
"""
Enviamos este prompt al modelo MLLM:
import ollama
response = ollama.chat(
model='llama3.2-vision',
messages=[{'role': 'user', 'content': prompt}]
)
print(response['message']['content'])
El modelo utiliza tanto texto como imágenes para generar una respuesta concisa y bien fundamentada.
Conclusión
Los sistemas MRAG representan una evolución significativa en la inteligencia artificial, permitiendo combinar datos en diversos formatos para aplicaciones avanzadas. Aunque este ejemplo cubre los fundamentos, las posibilidades son prácticamente ilimitadas con optimizaciones adicionales como:
Uso de rerankers para refinar los resultados.
Entrenamiento de embeddings personalizados para dominios específicos.
Integración con herramientas de visualización y análisis.
Este enfoque puede aplicarse en investigación, educación, medicina y más. Si deseas explorar implementaciones avanzadas o compartir tus ideas, ¡déjanos un comentario!