Atrapa un fantasma adorable este Halloween con Milvus
Una versión de este artículo está publicada en DZone.
Acabo de dar una charla en All Things Open y cuesta creer que Retrieval Augmented Generation (RAG) ahora parezca una técnica que llevamos años utilizando.
Hay una buena razón para ello, ya que durante los últimos dos años ha explotado en profundidad y amplitud, puesto que la utilidad de RAG es ilimitada. La capacidad de mejorar los resultados generados por large language models mejora constantemente a medida que las variaciones, las mejoras y los nuevos paradigmas impulsan las cosas hacia adelante.
Hoy veremos:
Aplicaciones prácticas para RAG multimodal
- Búsqueda de imágenes con filtros
- Encontrar los mejores fantasmas de Halloween
Uso de Ollama, LLava 7B y reordenamiento con LLM
Ejecución local de RAG multimodal avanzado
Usaré un par de estos nuevos avances en el estado de RAG para resolver un par de problemas de Halloween. Veamos los problemas: encontrar si algo es un fantasma y cuál es el gato fantasma más adorable.
Aplicaciones prácticas para RAG multimodal
¿Algo es un fantasma? Búsqueda de imágenes con filtros y clip-vit-base-patch32
Queremos crear una herramienta para todos los detectores de fantasmas que existen, ayudando a determinar si algo es un “fantasma”. Para hacer esto, usaremos nuestra colección alojada “ghosts”, que tiene varios campos por los que podemos filtrar, además de buscar en nuestro vector codificado multimodal. Permitimos que alguien envíe una foto de un fantasma mediante un formulario de Google, una aplicación de Streamlit, una carga a S3 y un cuaderno de Jupyter. Codificamos esa consulta, que puede ser una combinación de texto y/o imagen, utilizando el modelo CLIP de OpenAI con Sentence Transformer de Hugging Face. Esto nos permite codificar nuestra imagen de fantasma sospechoso y usarla para buscar en nuestra colección y ver su similitud. Si la similitud es lo suficientemente alta, entonces podemos considerarlo un "fantasma".
Diseño de la colección
Antes de crear cualquier aplicación, debes asegurarte de tenerla bien definida con todos los campos que puedas necesitar y los tipos y tamaños que se ajusten a tus necesidades.
Para nuestra colección de “ghosts”, como mínimo necesitaremos:
Un campo id que sea de tipo INT64, establecido como clave primaria y configurado para tener generación automática de ID
El siguiente campo en nuestro esquema es ghostclass, que es una cadena escalar VARCHAR de longitud 20 que contiene las clasificaciones tradicionales de fantasmas, como Clase I, Clase II, Falso y Clase IV.
Después de eso está category, que es una cadena escalar VARCHAR más grande de longitud 256 que contiene nuestras descripciones breves que son clasificaciones como Falso, Fantasma, Deidad, Inestable y Leyenda.
Agregamos un campo para s3path, que se define como una cadena escalar VARCHAR grande de longitud 1.024 que contiene una ruta S3 a la imagen del objeto.
Finalmente y lo más importante, vector, que contiene nuestro vector de punto flotante de dimensión 512.
Ahora que tenemos nuestro esquema de datos, podemos construirlo y usarlo para análisis espectrales con nuestros datos.
Paso 1: Conectarse a Milvus Standalone
Paso 2: Cargar el modelo CLIP
Paso 3: Definir nuestra colección con su esquema de vectores y escalares.
Paso 4: Codificar nuestra imagen para usarla en una consulta.
Paso 5: Ejecutar la consulta contra la colección de fantasmas en nuestra base de datos Milvus standalone y buscar solo aquellos filtrados por category que no sean Fake. Lo limitamos a un resultado.
Paso 6: Comprobar la distancia; si es 0.8 o superior, consideraremos que esto es un fantasma. Hacemos esto comparando la entidad sospechosa con nuestra gran base de datos de fotos reales de fantasmas; si algo es de la clase actual de fantasma, debería ser similar a los existentes.
Paso 7: El resultado se muestra con el posible fantasma y su coincidencia más cercana.
Como puedes ver en nuestro ejemplo, coincidimos lo suficientemente cerca con un "fantasma" similar que no estaba en la categoría Fake.
En una aplicación separada de Halloween, veremos una colección diferente y un modelo de codificación diferente para un caso de uso separado que también involucra fantasmas de Halloween.
Encontrar el fantasma de gato más adorable con el modelo BGE visualizado
Queremos encontrar los fantasmas de gato más adorables y quizás otros para ganar premios, publicarlos en redes sociales u otros esfuerzos importantes.
Diseño de la colección
Antes de crear cualquier aplicación, debes asegurarte de haber determinado qué campos puedes necesitar. Para este caso de uso simple, vamos a tener un esquema dinámico con generación automática de id. De esta manera no tenemos que definir los campos y se crearán unos con campos de id y vector.
Para nuestra colección de “ghostslocal”, estos se crearán automáticamente para nosotros:
Un campo id que es de tipo INT64, establecido como clave primaria y configurado para tener generación automática de ID
Hemos configurado esta colección para habilitar campos dinámicos; añadiremos uno importante durante la inserción de datos.
Finalmente y lo más importante, vector, que contiene nuestro vector de punto flotante de dimensión 768.
Ahora que tenemos nuestro esquema de datos, podemos encontrar el fantasma más adorable.
Paso 1: Conectarse a Milvus Standalone
Paso 2: Cargar el modelo BAAI/bge-base-en-v1.5
Paso 3: Definir nuestra colección con su esquema de vectores y escalares.
Paso 4: Iterar por nuestra lista de imágenes, codificarlas y añadirlas a un dict para su inserción posterior.
Paso 5: Insertar ****nuestras imágenes, image_path se crea como un campo dinámico en nuestro esquema para esta colección.
Paso 6: Codificar vectorialmente la consulta de texto, “Show me the cutest cat ghost”, para usarla en una consulta.
Paso 5: Ejecutar nuestra búsqueda de similitud
Paso 6: Iterar los resultados y mostrar la imagen que coincide con el gato más adorable.
Nuestra búsqueda vectorial es bastante simple: simplemente codificamos nuestro texto buscando el fantasma de gato más adorable (con su pequeño disfraz de Halloween). Milvus consultará el vector de punto flotante de 768 dimensiones y nos encontrará la coincidencia más cercana. Con todos los espectros y fantasmas espeluznantes en nuestra base de datos, es difícil discutir estos resultados.
Usando Ollama, LLava 7B y reranking con LLM
Ejecutando RAG avanzado localmente
Bien, esto es un pequeño truco Y trato, podemos abordar ambos temas al mismo tiempo. Podemos ejecutar toda esta técnica avanzada de RAG localmente utilizando Milvus Lite, Ollama, LLava 7B y un Jupyter Notebook. Vamos a hacer una búsqueda multimodal con un reranker generativo. Esto utiliza un LLM para clasificar las imágenes y explicar los mejores resultados. Anteriormente hemos hecho esto con el modelo superpotente GPT-4o. Estoy obteniendo buenos resultados con LLava 7B alojado localmente con Ollama. ¡Mostremos cómo ejecutarlo de forma abierta, local y gratuita!
Reutilizaremos el código de ejemplo existente para construir la foto panorámica a partir de las imágenes devueltas por nuestra búsqueda híbrida de una foto de oficina con fantasmas con el texto “monitor de computadora con fantasma”. Luego enviamos esa foto al modelo LLaVA7B alojado en Ollama con instrucciones sobre cómo clasificar los resultados. Recibimos una clasificación, una explicación y una imagen.
Nuestra imagen de búsqueda y nueve resultados
Resultados devueltos por el LLM para el orden de la lista clasificada.
Nuestra consulta simple y rápida de Milvus para obtener resultados que alimentar al LLM.
Puedes encontrar el código completo en nuestro ejemplo de github y puedes usar cualquier imagen que elijas, como muestra el ejemplo. También hay algunas referencias y código documentado, incluida una aplicación de StreamLit para experimentar por tu cuenta.
Conclusión
Como puedes ver, el RAG multimodal no solo no da miedo, sino que es divertido y útil para muchas aplicaciones.
Si te interesa crear aplicaciones de IA más avanzadas, entonces usar Milvus y RAG multimodal es una gran combinación para crear aplicaciones. Ahora puedes ir más allá de solo texto y añadir imágenes y más. El RAG multimodal abre muchas nuevas vías para la generación con LLM, la búsqueda y las aplicaciones de IA en general.
¡Nos encantaría saber qué piensas!
Si te gusta este artículo, te agradeceríamos mucho que nos dieras una estrella en GitHub. También eres bienvenido a unirte a nuestra comunidad de Milvus en Discord para compartir tus experiencias. Únete a uno o a todos nuestros meetups para participar en la comunidad local en persona y programar, a la vez que obtienes acceso a nuestra biblioteca de Youtube con charlas de meetups grabadas, demos y análisis en profundidad.
Si te interesa aprender más, consulta nuestro repositorio Bootcamp en GitHub para ver ejemplos de cómo crear aplicaciones de RAG multimodal con Milvus.
Recursos adicionales
Sigue leyendo

Zilliz Skills Breakdown: How AI Agents Master Vector Databases
Zilliz's Milvus Skill (pymilvus, 7 files) and Zilliz Cloud Skill (zilliz-cli, 14 modules) bring vector-DB dev and ops into one Claude Code session.

Context Engineering Strategies for AI Agents: A Developer’s Guide
Learn practical context engineering strategies for AI agents. Explore frameworks, tools, and techniques to improve reliability, efficiency, and cost.

Proactive Monitoring for Vector Database: Zilliz Cloud Integrates with Datadog
we're excited to announce Zilliz Cloud's integration with Datadog, enabling comprehensive monitoring and observability for your vectorDB deployments.



