Attrapez un adorable fantôme cet Halloween avec Milvus
Une version de cet article est publiée sur DZone.
Je viens de donner une conférence à All Things Open et il est difficile de croire que la Retrieval Augmented Generation (RAG) semble maintenant être une technique que nous pratiquons depuis des années.
Il y a une bonne raison à cela, car au cours des deux dernières années, elle a explosé en profondeur et en ampleur, tant l’utilité du RAG est illimitée. La capacité à améliorer les résultats générés par les large language models ne cesse de progresser, à mesure que des variations, des améliorations et de nouveaux paradigmes font avancer les choses.
Aujourd’hui, nous allons examiner :
Applications pratiques du RAG multimodal
- Recherche d’images avec filtres
- Trouver les meilleurs fantômes d’Halloween
Utilisation d’Ollama, LLava 7B et du reclassement par LLM
Exécution locale d’un RAG multimodal avancé
Je vais utiliser quelques-unes de ces nouvelles avancées dans l’état du RAG pour résoudre quelques problèmes d’Halloween. Examinons les problèmes ; déterminer si quelque chose est un fantôme et quel est le fantôme-chat le plus mignon ?
Applications pratiques du RAG multimodal
Quelque chose est-il un fantôme ? Recherche d’images avec filtres et clip-vit-base-patch32
Nous voulons créer un outil pour tous les détecteurs de fantômes en les aidant à déterminer si quelque chose est un « fantôme ». Pour ce faire, nous utiliserons notre collection hébergée “ghosts”, qui contient un certain nombre de champs sur lesquels nous pouvons filtrer, ainsi que rechercher dans notre vecteur encodé multimodal. Nous permettons à quelqu’un d’envoyer une photo de fantôme via un formulaire Google, une application Streamlit, un téléversement S3 et un notebook Jupyter. Nous encodons cette requête, qui peut être une combinaison de texte et/ou d’image, en utilisant le modèle CLIP d’OpenAI avec Sentence Transformer de Hugging Face. Cela nous permet d’encoder notre image de fantôme suspecté et de l’utiliser pour rechercher dans notre collection afin d’en mesurer la similarité. Si la similarité est suffisamment élevée, nous pouvons alors le considérer comme un "ghost".
Conception de la collection
Avant de créer une application, vous devez vous assurer qu’elle est bien définie avec tous les champs dont vous pourriez avoir besoin, ainsi que les types et tailles qui correspondent à vos besoins.
Pour notre collection de « fantômes », nous aurons besoin au minimum de :
Un champ id de type INT64, défini comme clé primaire et configuré pour avoir une génération automatique d’ID
Le champ suivant dans notre schéma est ghostclass, qui est une chaîne scalaire VARCHAR de longueur 20 contenant les classifications traditionnelles des fantômes telles que Class I, Class II, Fake et Class IV.
Ensuite vient category, qui est une chaîne scalaire VARCHAR plus grande de longueur 256 contenant nos courtes descriptions qui sont des classifications telles que Fake, Ghost, Deity, Unstable et Legend.
Nous ajoutons un champ pour s3path, défini comme une grande chaîne scalaire VARCHAR de longueur 1 024 contenant un chemin S3 vers l’image de l’objet.
Enfin et surtout, vector, qui contient notre vecteur en virgule flottante de dimension 512.
Maintenant que nous avons notre schéma de données, nous pouvons le construire et l’utiliser pour des analyses spectrales sur nos données.
Étape 1 : Se connecter à Milvus Standalone
Étape 2 : Charger le modèle CLIP
Étape 3 : Définir notre collection avec son schéma de vecteurs et de scalaires.
Étape 4 : Encoder notre image à utiliser pour une requête.
Étape 5 : Exécuter la requête sur la collection ghosts dans notre base de données Milvus standalone et rechercher uniquement ceux filtrés par category qui ne sont pas Fake. Nous la limitons à un seul résultat.
Étape 6 : Vérifier la distance ; si elle est de 0.8 ou plus, nous considérerons qu’il s’agit d’un fantôme. Nous faisons cela en comparant l’entité suspectée à notre grande base de données de photos de fantômes réels ; si quelque chose appartient à la classe actuelle de fantôme, cela devrait être similaire à ceux que nous avons déjà.
Étape 7 : Le résultat est affiché avec le fantôme potentiel et sa correspondance la plus proche.
Comme vous pouvez le voir dans notre exemple, nous avons trouvé une correspondance suffisamment proche avec un « fantôme » similaire qui ne faisait pas partie de la catégorie Fake.
Dans une application Halloween distincte, nous examinerons une collection différente et un modèle d’encodage différent pour un cas d’utilisation distinct impliquant également des fantômes d’Halloween.
Trouver le fantôme de chat le plus mignon avec le modèle Visualized BGE
Nous voulons trouver les fantômes de chats les plus mignons, et peut-être d’autres, pour gagner des prix, les publier sur les réseaux sociaux ou pour d’autres initiatives importantes.
Conception de la collection
Avant de créer une application, vous devez vous assurer d’avoir déterminé les champs dont vous pourriez avoir besoin. Pour ce cas d’utilisation simple, nous allons avoir un schéma dynamique avec génération automatique d’id. De cette façon, nous n’avons pas besoin de définir les champs, et ceux-ci seront créés avec des champs id et vector.
Pour notre collection de “ghostslocal”, ceux-ci seront automatiquement créés pour nous :
Un champ id de type INT64, défini comme clé primaire et configuré pour avoir une génération automatique d’ID
Nous avons configuré cette collection pour activer les champs dynamiques ; nous en ajouterons un important lors de l’insertion des données.
Enfin et surtout, vector, qui contient notre vecteur en virgule flottante de dimension 768.
Maintenant que nous avons notre schéma de données, nous pouvons trouver le fantôme le plus mignon.
Étape 1 : Se connecter à Milvus Standalone
Étape 2 : Charger le modèle BAAI/bge-base-en-v1.5
Étape 3 : Définir notre collection avec son schéma de vecteurs et de scalaires.
Étape 4 : Parcourir notre liste d’images, les encoder et les ajouter à un dict pour une insertion ultérieure.
Étape 5 : Insérer ****nos images, image_path est créé comme champ dynamique dans notre schéma pour cette collection.
Étape 6 : Encoder vectoriellement la requête texte, « Show me the cutest cat ghost », à utiliser pour une requête.
Étape 5 : Exécuter notre recherche de similarité
Étape 6 : Parcourir les résultats et afficher l’image qui correspond au chat le plus mignon.
Notre recherche vectorielle est assez simple : nous encodons simplement notre texte à la recherche du fantôme de chat le plus mignon (dans son petit costume d’Halloween). Milvus interrogera le vecteur en virgule flottante de dimension 768 et nous trouvera la correspondance la plus proche. Avec tous les spectres et fantômes effrayants dans notre base de données, il est difficile de contester ces résultats.
Utiliser Ollama, LLava 7B et le reclassement LLM
Exécuter un RAG avancé localement
D’accord, c’est un petit tour ET une friandise, nous pouvons traiter les deux sujets en même temps. Nous sommes en mesure d’exécuter toute cette technique RAG avancée localement en utilisant Milvus Lite, Ollama, LLava 7B et un Jupyter Notebook. Nous allons faire une recherche multimodale avec un reranker génératif. Cela utilise un LLM pour classer les images et expliquer les meilleurs résultats. Auparavant, nous l’avons fait avec le modèle surpuissant GPT-4o. J’obtiens de bons résultats avec LLava 7B hébergé localement avec Ollama. Montrons comment exécuter cela de manière ouverte, locale et gratuite !
Nous réutiliserons le code d’exemple existant pour construire la photo panoramique à partir des images renvoyées par notre recherche hybride d’une photo de bureau avec des fantômes avec le texte “computer monitor with ghost”. Nous envoyons ensuite cette photo au modèle LLaVA7B hébergé sur Ollama avec des instructions sur la façon de classer les résultats. Nous récupérons un classement, une explication et une image.
Notre image de recherche et neuf résultats
Résultats renvoyés par le LLM pour l’ordre de la liste classée.
Notre requête Milvus simple et rapide pour obtenir des résultats à fournir au LLM.
Vous pouvez trouver le code complet dans notre exemple github et vous pouvez utiliser les images de votre choix, comme le montre l’exemple. Il existe également des références et du code documenté, y compris une application StreamLit avec laquelle expérimenter par vous-même.
Conclusion
Comme vous pouvez le voir, le RAG multimodal n’est pas seulement pas effrayant, il est amusant et utile pour de nombreuses applications.
Si vous souhaitez créer des applications d’IA plus avancées, alors utiliser Milvus et le RAG multimodal est une excellente combinaison pour construire des applications. Vous pouvez désormais aller au-delà du texte uniquement et ajouter des images, et plus encore. Le RAG multimodal ouvre de nombreuses nouvelles voies pour la génération par LLM, la recherche et les applications d’IA en général.
Nous aimerions beaucoup savoir ce que vous en pensez !
Si vous aimez cet article, nous vous serions très reconnaissants de nous donner une étoile sur GitHub ! Vous êtes également les bienvenus pour rejoindre notre communauté Milvus sur Discord afin de partager vos expériences. Veuillez rejoindre une ou toutes nos rencontres pour la communauté locale en présentiel et le code, tout en obtenant également accès à notre bibliothèque Youtube de conférences de meetups enregistrées, de démos et d’analyses approfondies.
Si vous souhaitez en savoir plus, consultez notre Bootcamp repository sur GitHub pour des exemples de création d’applications RAG multimodales avec Milvus.
Ressources supplémentaires
Continuer à lire

Will Amazon S3 Vectors Kill Vector Databases—or Save Them?
AWS S3 Vectors aims for 90% cost savings for vector storage. But will it kill vectordbs like Milvus? A deep dive into costs, limits, and the future of tiered storage.

Zilliz Cloud Enterprise Vector Search Powers High-Performance AI on AWS
Zilliz Cloud on AWS powers secure, scalable, ultra-fast vector search for enterprise AI apps, with BYOC, sub-10ms latency, and zero-DevOps simplicity.

Building RAG Pipelines for Real-Time Data with Cloudera and Milvus
explore how Cloudera can be integrated with Milvus to effectively implement some of the key functionalities of RAG pipelines.



