RAG multimodal local con CLIP y Llama3
Con el reciente lanzamiento de GPT-4o y Gemini, la multimodalidad ha sido un tema candente últimamente. Otro que ha estado en la cima de la iluminación es Retrieval Augmented Generation (RAG) durante el año pasado, pero se centró principalmente en el texto. Este tutorial te mostrará cómo construir un Sistema RAG Multimodal.
Al usar RAG Multimodal, no tienes que usar sólo texto; puedes usar diferentes tipos de datos como imágenes, audio, vídeos y texto, por supuesto. También es posible devolver diferentes tipos de datos; sólo porque uses texto como entrada para tu sistema RAG no significa que tengas que devolver texto como salida. Mostraremos esto durante este tutorial.
Prerrequisitos
Antes de empezar a configurar los diferentes componentes de nuestro tutorial, asegúrate de que tu sistema tiene lo siguiente:
Docker & Docker-Compose-Asegúrese de que Docker y Docker-Compose están instalados en su sistema.
Milvus Standalone-Para nuestros propósitos, utilizaremos el eficiente Milvus Standalone, que se gestiona fácilmente a través de Docker Compose; explora nuestra documentación para guía de instalación
Ollama**-Instala Ollama en tu sistema. Esto nos permitirá utilizar Llama3 en nuestro portátil. Visita su sitio web para obtener la última guía de instalación.
OpenAI CLIP
La idea central del modelo CLIP (Contrastive Language-Image Pretraining) es entender la conexión entre una imagen y un texto. Se trata de un modelo de IA fundacional entrenado en pares texto-imagen. A continuación, aprende a crear un punto en el espacio vectorial tanto para el texto como para las imágenes. En este espacio, las descripciones de texto similares estarán cerca de las imágenes relevantes y viceversa.
CLIP puede utilizarse para distintas aplicaciones, entre ellas:
Recuperación de imágenes**: Imagina buscar imágenes utilizando una descripción de texto o encontrar el pie de foto perfecto para una imagen.
Aprendizaje multimodal: La fuerza de CLIP para conectar texto e imágenes lo convierte en un bloque de construcción perfecto para sistemas como el GAR multimodal, que tratan información en distintos formatos.
Esto permite que nuestro sistema RAG comprenda y responda a consultas que pueden incluir tanto texto como imágenes.
Fig1: Arquitectura de OpenAI CLIP](https://assets.zilliz.com/Architecture_of_Open_AI_CLIP_765f6f1fc0.png)
Incrustación multimodal
**En términos más sencillos, las incrustaciones son representaciones comprimidas de datos. CLIP toma como entrada una imagen o un texto y los transforma en un código numérico que captura sus características clave.
Lo bueno de CLIP es que funciona tanto con texto como con imágenes. Puede darle una imagen y generará una incrustación que capture el contenido visual. Pero también puede darle un texto, y CLIP generará una incrustación que refleje el significado del texto.
Incrustaciones multimodales](https://assets.zilliz.com/Multimodal_Embeddings_67e69922c4.png)
Si imagináramos una proyección en el espacio vectorial, tendríamos incrustaciones con significados similares próximas entre sí. Por ejemplo, el texto "Un perro sonríe" y la imagen de un perro que parece sonreír están muy próximos.
Fig2. Representación en un espacio vectorial](https://assets.zilliz.com/Representation_in_a_Vector_Space_e47a5a4373.png)
Construcción de un GAR multimodal
Utilizaremos los datos de Wikipedia, descargaremos los datos de texto asociados a aquello sobre lo que queremos aprender más y haremos lo mismo con las imágenes.
Generaremos Embeddings con el modelo CLIP ViT-B/32 y usaremos Llama3 como LLM.
Almacenamos los embeddings en Milvus, que está diseñado para gestionar embeddings a gran escala de forma que podamos realizar una búsqueda rápida y eficiente.
LlamaIndex se utiliza como motor de consulta en combinación con Milvus como almacén de vectores.
El código completo es bastante largo, ya que necesitamos navegar por Wikipedia, procesar el texto y las imágenes, y luego crear una aplicación RAG. Sin embargo, está completamente disponible en Github, ¡así que deberías echarle un vistazo!
Una vez que lo tengas funcionando, deberías ser capaz de ejecutar consultas similares a las siguientes:
# https://en.wikipedia.org/wiki/Helsinki
query2 = "¿Cuáles son algunas de las atracciones turísticas más populares de Helsinki?"
# generar resultados de recuperación de imágenes
consulta_imagen(consulta2)
# generar resultados de recuperación de texto
text_retrieval_results = text_query_engine.query(query2)
print("Resultados de la recuperación de texto: \n" + str(text_retrieval_results))
Lo que debería dar como resultado algo similar a
Algunas de las atracciones turísticas más populares de Helsinki son Suomenlinna (Sveaborg), una isla fortaleza con una rica historia, y el zoo de Korkeasaari, situado en una de las islas principales de Helsinki. Además, la ciudad cuenta con numerosas reservas naturales, entre ellas Vanhankaupunginselkä, que es la mayor reserva natural de Helsinki.
Y con eso, tendrás una aplicación RAG multimodal que es capaz de procesar tanto imágenes como texto y también puede devolver imágenes o texto.
Puedes acceder al código en Github, siéntete libre de hacer preguntas en nuestro Discord, y danos una estrella en Github.
Sigue leyendo

Introducing Functions and Model Inference on Zilliz Cloud: Automatic Embedding and Reranking with Hosted Models
Zilliz Cloud Functions auto-generate embeddings via OpenAI, Voyage AI, Cohere, or Zilliz Hosted Models. Built-in reranking — just insert text and search.

Smarter Autoscaling in Zilliz Cloud: Always Optimized for Every Workload
With the latest upgrade, Zilliz Cloud introduces smarter autoscaling—a fully automated, more streamlined, elastic resource management system.

OpenAI o1: What Developers Need to Know
In this article, we will talk about the o1 series from a developer's perspective, exploring how these models can be implemented for sophisticated use cases.
