Exploration des embeddings multimodaux avec FiftyOne et Milvus
Quelle est la première étape pour créer une application multimodale de génération augmentée par récupération (RAG) ? Obtenir des vector embeddings multimodaux. À certains égards, dire qu’un embedding est multimodal est un abus de langage. Il existe de nombreuses façons de travailler avec plusieurs modalités au sein de vecteurs, mais nous nous concentrons sur les embeddings vectoriels produits par des modèles multimodaux pour ce tutoriel.
Dans cet article, nous abordons :
- Que signifie « multimodal » ?
- Comment Milvus gère-t-il les embeddings multimodaux ?
- Exemples de modèles multimodaux
- Utiliser FiftyOne et Milvus pour l’exploration des embeddings multimodaux
- Exploration des embeddings multimodaux pour CIFAR 10 via FiftyOne et CLIP
- Comment personnaliser davantage FiftyOne pour l’exploration des données avec Milvus ?
- Résumé de l’exploration des embeddings multimodaux avec FiftyOne et Milvus
Que signifie « multimodal » ?
Lorsque nous parlons de « multimodal », nous faisons référence aux capacités des modèles. Le grand modèle de langage/modèle fondationnel comme le modèle d’embedding dans une pile RAG peuvent être multimodaux. Nous explorons les embeddings multimodaux issus d’un modèle open source pour cet exemple. Comment obtient-on un embedding vectoriel ? Les embeddings vectoriels proviennent de l’avant-dernière couche d’un modèle d’embedding.
Cela s’explique par le fait que chaque couche du modèle apprend certaines informations sur l’entrée, et que la dernière couche effectue une prédiction. Comme nous ne voulons pas une prédiction, mais plutôt pouvoir travailler avec une représentation numérique des données, nous retirons la dernière couche et prenons la sortie de l’avant-dernière couche, qui contient toutes les informations que le modèle a apprises. Nous utilisons FiftyOne pour faciliter l’exploration et Milvus pour stocker les vecteurs.
Comment Milvus gère-t-il les embeddings multimodaux ?
Ce qui est intéressant avec les embeddings multimodaux, ou les embeddings vectoriels en général, c’est qu’ils ne nécessitent pas de traitement particulier. Les embeddings vectoriels ne sont que des représentations numériques d’un type spécifique de données d’entrée. En ce qui concerne le type de données réel, les embeddings vectoriels ne sont que des vecteurs, une liste de nombres. Milvus gère tous ces vecteurs de la même manière.
Les vecteurs peuvent être denses ou creux. Les vecteurs denses sont généralement composés de flottants et sont produits par des modèles de deep learning, dont nous verrons un exemple aujourd’hui. Les vecteurs creux sont parfois appelés vecteurs binaires et sont composés de 0 et de 1. Un point important à garder à l’esprit lorsqu’on travaille avec des vecteurs est que seuls les vecteurs de même taille ou dimensionnalité peuvent être comparés. De plus, même lorsqu’ils ont la même taille, les embeddings générés par différents modèles ne peuvent pas nécessairement être comparés directement.
Les embeddings multimodaux sont particulièrement délicats. La plupart des modèles de deep learning sont conçus pour traiter un seul type, ou modalité, de données. Il peut s’agir d’images, de texte, de vidéo ou de quelque chose de plus spécifique. Cependant, comme ces modèles ne sont optimisés que pour un seul type de données, ils ne peuvent pas traiter ni représenter d’autres modalités — un modèle entraîné à accepter une entrée textuelle ne pourra généralement pas accepter d’images.
Les modèles multimodaux sont entraînés à interagir avec plusieurs types de données. Pour nos besoins, nous nous intéressons aux modèles multimodaux qui produisent des embeddings vectoriels pour plusieurs modalités de données. En particulier, nous nous intéressons aux modèles qui intègrent les données textuelles et visuelles dans le même espace, de sorte que les dimensions des vecteurs générés soient les mêmes et que nous puissions raisonnablement les traiter de manière similaire.
Le modèle multimodal le plus courant pour générer des embeddings de texte et d’image est CLIP, d’OpenAI, qui utilise des techniques contrastives pour aligner les embeddings d’images de photographies avec les embeddings textuels de leurs légendes.
Utiliser FiftyOne et Milvus pour l’exploration des embeddings multimodaux
FiftyOne est la principale bibliothèque open source pour la curation et la visualisation de données non structurées. FiftyOne s’intègre à plusieurs backends de magasins vectoriels, Milvus étant particulièrement bien adapté pour travailler de manière flexible avec de grands jeux de données en croissance. Dans cet exemple, nous utilisons Milvus Lite, une version intégrée de Milvus que vous pouvez démarrer directement dans votre notebook. Pour une analyse approfondie, consultez ce guide de bout en bout de Milvus Lite.
Avant de plonger dans le code, assurez-vous que tous les prérequis appropriés sont installés. Vous devez exécuter pip install milvus pymilvus fiftyone torch torchvision. La première étape consiste à lancer notre instance Milvus Lite. Nous pouvons le faire en important default_server depuis Milvus et en appelant la fonction start().
from milvus import default_server
default_server.start()
Maintenant que nous avons une instance de Milvus prête à l’emploi, nous pouvons la relier à FiftyOne pour des comparaisons d’embeddings vectoriels. Nous importons FiftyOne, le FiftyOne Brain, et le FiftyOne Zoo, puis chargeons la partition de test du jeu de données CIFAR 10.
import fiftyone as fo
import fiftyone.brain as fob
import fiftyone.zoo as foz
# Step 1: Load your data into FiftyOne
dataset = foz.load_zoo_dataset("cifar10", split="test")
Nous utiliserons le modèle CLIP pour intégrer nos images dans cet exemple. Ensuite, nous utiliserons la fonction compute_similarity du FiftyOne Brain. Cette fonction génère d’abord des embeddings pour nos échantillons à l’aide d’un modèle spécifié, puis crée une collection Milvus à partir de ces embeddings et l’attache à la collection d’échantillons FiftyOne. Avec FiftyOne et les backends de recherche vectorielle, vous pouvez générer un index de similarité sur des images, des patchs d’objets, et même des images vidéo !
La fonction compute_similarity prend en entrée le jeu de données FiftyOne et divers paramètres nommés. Le brain_key est une clé unique que FiftyOne utilise pour suivre les exécutions. La clé backend indique à FiftyOne quel backend de base de données vectorielle utiliser, et model prend le nom du modèle que FiftyOne exploitera pour créer des embeddings.
fob.compute_similarity(
dataset,
brain_key="clip_sim",
backend="milvus",
model="clip-vit-base32-torch",
)
La dernière étape que nous examinons ici avant l’exploration consiste à utiliser FiftyOne pour lancer la FiftyOne App. Nous passons le jeu de données et définissons auto=False afin que la fenêtre ne s’ouvre pas dans le notebook, mais soit accessible via un onglet Chrome sur localhost:5151.
session = fo.launch_app(dataset, auto=False)
Exploration d’embeddings multimodaux pour CIFAR 10 via FiftyOne et CLIP
Il est temps d’explorer ! Voyons comment utiliser du texte pour trouver des images sémantiquement similaires. Examinons trois mots : Ferrari, Mustang et Pony.
Notre première recherche pour une Ferrari est une voiture.
La recherche suivante, « pony », nous donne clairement des images de chevaux.
Mais, si nous recherchons « mustang », nous obtenons un mélange.
Cette étape montre qu’il est essentiel d’évaluer votre jeu de données et de comprendre le contexte de vos données !
Comment pouvons-nous personnaliser davantage FiftyOne pour l’exploration de données avec Milvus ?
Pour définir Milvus comme “backend” par défaut pour la recherche vectorielle dans FiftyOne, nous pouvons sourcer la variable d’environnement suivante :
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
Pour tout index donné, nous pouvons également spécifier le nom de la collection, le niveau de cohérence à utiliser et la métrique à utiliser pour évaluer la similarité. Voici un deuxième index de similarité qui utilise une métrique euclidienne et une cohérence Bounded :
fob.compute_similarity(
dataset,
brain_key="clip_euclid",
model="clip-vit-base32-torch",
metric="euclidean",
consistency_level="Bounded"
)
Si nous avons plusieurs index de similarité sur un dataset, nous pouvons sélectionner celui que nous voulons utiliser dans l’application en cliquant sur l’icône d’engrenage à côté de la barre de recherche sous la loupe, et en choisissant l’index par sa brain key :
Nous pouvons également utiliser un autre modèle multimodal pour générer nos embeddings d’images et de texte. En fait, nous pouvons le faire avec n’importe quel modèle OpenCLIP (nous aurons un meilleur lien ici dans quelques jours), ou n’importe quel modèle de prédiction zero-shot de la bibliothèque Transformers de Hugging Face. À titre d’exemple, voici un index construit avec AltCLIP :
!pip install transformers
fob.compute_similarity(
dataset,
brain_key="altclip",
model="zero-shot-classification-transformer-torch",
name_or_path="BAAI/AltCLIP",
)
Résumé de l’exploration des embeddings multimodaux avec FiftyOne et Milvus
Cet article a exploré le fonctionnement des embeddings multimodaux avec FiftyOne et Milvus. Nous avons montré comment vous pouvez explorer un modèle multimodal populaire - CLIP - sur un dataset populaire - CIFAR 10. Vous utilisez CLIP pour créer les embeddings des données d’entrée, Milvus pour stocker les embeddings des données multimodales (parfois appelés “embeddings multimodaux”), et FiftyOne pour explorer les embeddings.
Utiliser CLIP de cette manière vous permet de rechercher des images avec du texte. Avec cela, nous avons exploré l’espace en utilisant le langage naturel pour comparer des images de mots qui peuvent avoir des significations différentes dans différents contextes. Nous avons examiné comment “pony” est clairement un cheval, “Ferrari” est clairement une voiture, mais “mustang” pourrait être l’un ou l’autre.
Continuer à lire

Zilliz Cloud Now Available in AWS Asia Pacific (Seoul)
Zilliz Cloud is now available in AWS Seoul — low-latency vector search, in-country data residency, and one-step migration for Korean AI teams. 31 regions across 5 clouds.

The AWS Outage Was a Wake-Up Call for Vector Database Cross-Region Disaster Recovery
Zilliz Cloud Had the Answer Before the Crisis. Zilliz Cloud is the world's first vector database with native cross-region disaster recovery.

3 Easiest Ways to Use Claude Code on Your Mobile Phone
Run Claude Code from your phone with Remote Control, Happy Coder, or SSH + Tailscale. Comparison table, setup steps, and tools for typing, memory, and parallel tasks.



