TATECHATLAS
◎ Français
Intelligence artificielle / Guide

Indexation de contenu multimodal : vectorisation d'images et de texte dans Azure AI Search

Un guide pour configurer une recherche multimodale dans Azure AI Search en utilisant la vectorisation de texte et d'images. Décrit les étapes de création d'un index, du choix des modèles (par exemple CLIP), des méthodes de génération d'embeddings et de l'exécution de requêtes hybrides afin d'améliorer la pertinence.

Dans ce guide

Pour implémenter une recherche multimodale dans Azure AI Search, créez un index contenant des champs vectoriels, utilisez des modèles comme OpenAI CLIP pour vectoriser le texte et les images, choisissez une méthode de génération d'embeddings (en interne ou en externe via l'indexeur), puis exécutez des requêtes hybrides combinant recherche plein texte et recherche vectorielle afin de récupérer des résultats basés sur la similarité.

Comprendre la recherche multimodale dans Azure AI Search

La recherche multimodale dans Azure AI Search permet de trouver du contenu similaire indépendamment de son type - texte ou image - en convertissant les données en vecteurs numériques (embeddings) où la proximité vectorielle reflète une similarité sémantique. Par exemple, la requête « chiot » peut renvoyer des images de chiens même si elles ne comportent pas d'étiquettes textuelles.

Cette approche repose sur la recherche vectorielle, qui prend en charge non seulement la correspondance texte-texte mais aussi texte-image, ce qui est précieux dans des scénarios hybrides. La vectorisation capture la similarité conceptuelle, comme entre « chien » et « canin », ou entre un texte et l'image qui lui correspond.

Préparer l'index pour les données vectorielles

Pour stocker les représentations vectorielles, l'index Azure AI Search doit inclure des champs de type Edm.Single dotés de l'attribut vectorSearchProfile. Ces champs contiennent des tableaux de nombres - les embeddings. La longueur du vecteur dépend du modèle utilisé (par exemple 512 pour CLIP).

from azure.search.documents.indexes import SearchIndexClient
from azure.core.credentials import AzureKeyCredential
from azure.search.documents.indexes.models import (
    SearchIndex,
    SearchField,
    SearchFieldDataType,
    VectorSearch,
    HnswVectorSearchAlgorithmConfiguration
)

# Create client
client = SearchIndexClient(endpoint="https://<service>.search.windows.net", credential=AzureKeyCredential("<key>"))

# Define fields
fields = [
    SearchField(name="id", type=SearchFieldDataType.String, key=True),
    SearchField(name="text", type=SearchFieldDataType.String),
    SearchField(name="image_vector", type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
                vector_search_dimensions=512, vector_search_profile_name="myHnswProfile"),
    SearchField(name="text_vector", type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
                vector_search_dimensions=512, vector_search_profile_name="myHnswProfile")
]

# Configure vector search
vector_search = VectorSearch(
    algorithm_configurations=[
        HnswVectorSearchAlgorithmConfiguration(name="myHnswProfile", kind="hnsw")
    ]
)

# Create index
index = SearchIndex(name="multimodal-index", fields=fields, vector_search=vector_search)
client.create_or_update_index(index)

Choisir un modèle pour la vectorisation d'images

Pour convertir des images en vecteurs, utilisez l'API Foundry Tools Image Retrieval Vectorize Image ou des modèles multimodaux comme OpenAI CLIP. Ces modèles sont entraînés sur des paires texte-image et génèrent un espace vectoriel partagé.

Par exemple, envoyer une image de chien via l'API renvoie un vecteur à 512 dimensions, stocké dans le champ image_vector, permettant ainsi de comparer cette image à des requêtes textuelles selon leur proximité vectorielle.

Choisir un modèle pour la vectorisation de texte

Pour la vectorisation de texte, des modèles adaptés incluent text-embedding-ada-002 d'Azure OpenAI ou SBERT. Ils transforment des descriptions textuelles (par exemple « chiot dans un pré ») en vecteurs de même dimension que ceux des images, assurant ainsi la compatibilité dans un espace vectoriel commun.

La génération d'embeddings peut être effectuée en externe (via le SDK OpenAI) ou intégrée à l'indexeur en spécifiant un point de terminaison et une clé Azure OpenAI.

import openai
openai.api_type = "azure"
openai.api_key = "<key>"
openai.api_base = "https://<resource>.openai.azure.com/"
openai.api_version = "2023-05-15"

response = openai.Embedding.create(input="puppy", engine="text-embedding-ada-002")
text_embedding = response['data'][0]['embedding']

Vectorisation intégrée vs vectorisation externe

Azure AI Search prend en charge deux approches : la vectorisation interne via l'indexeur et la vectorisation externe avec des embeddings précalculés. La vectorisation interne nécessite un jeu de compétences avec un vectoriseur intégré et la configuration d'une ressource Azure OpenAI.

La vectorisation externe offre plus de contrôle et convient mieux aux grands jeux de données. Les embeddings sont calculés au préalable et téléchargés avec les documents. Cette méthode est indispensable lorsque l'on utilise des modèles non directement pris en charge par l'indexeur.

Créer un index multimodal

Un index multimodal combine texte, images et leurs représentations vectorielles dans un seul schéma. Des champs comme text et image_vector permettent à la fois la recherche plein texte et la recherche vectorielle, formant la base des requêtes hybrides.

Chaque document comprend un identifiant, le texte source ou la description de l'image, et les vecteurs correspondants. Toutes les données sont indexées ensemble, garantissant la cohérence lors de la recherche.

Exécuter une requête de recherche multimodale

La recherche s'effectue via une requête hybride combinant search (pour le texte) et vectorQueries (pour les vecteurs). Par exemple, la requête textuelle « chiot » est vectorisée, et le vecteur résultant est comparé aux champs image_vector de l'index.

Les résultats de recherche plein texte et vectorielle sont fusionnés à l'aide de la méthode Reciprocal Rank Fusion (RRF), améliorant ainsi la pertinence. La réponse fournit une liste unique de documents classés par similarité globale.

import requests

url = "https://<service>.search.windows.net/indexes/multimodal-index/docs/search?api-version=2023-11-01"
headers = {"Content-Type": "application/json", "api-key": "<key>"}
payload = {
    "search": "puppy",
    "vectorQueries": [
        {
            "kind": "vector", 
            "vector": text_embedding, 
            "k": 10, 
            "fields": "image_vector"
        }
    ],
    "select": "id,text",
    "top": 5
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

Évaluer et améliorer les résultats de recherche

La qualité de la recherche est évaluée à l'aide de métriques comme la précision et le rappel. Testez avec des paires requête-image pertinentes étiquetées. La précision mesure la proportion de résultats correctement récupérés parmi tous ceux retournés.

Pour améliorer la pertinence, utilisez la recherche hybride avec classement sémantique (queryType=semantic). Ajustez les paramètres comme k et oversampling dans les requêtes vectorielles, et testez différentes stratégies de filtrage.

from sklearn.metrics import precision_score

# Example evaluation (hypothetical values)
y_true = [1, 0, 1, 1, 0]  # 1 = relevant, 0 = not
y_pred = [1, 1, 1, 0, 0]  # predicted results
precision = precision_score(y_true, y_pred, average='binary')
print(f"Precision: {precision:.2f}")

Points à vérifier

  • Index créé avec des champs vectoriels
  • Profil de recherche vectorielle (HNSW) spécifié
  • Les embeddings texte et image ont la même dimensionnalité
  • La requête hybride inclut search et vectorQueries
  • Les résultats sont fusionnés via RRF

La fonctionnalité de recherche vectorielle n'est pas disponible pour les services créés avant le 1er janvier 2019. La génération d'embeddings peut engendrer des coûts lorsqu'elle utilise Azure OpenAI ou l'API Foundry.

Sources

  1. Microsoft Learn: vector search ↗
  2. Microsoft Learn: hybrid search ↗
  3. scikit-learn: precision_score ↗
Retour en haut ↑