TATECHATLAS
◎ Deutsch
Künstliche Intelligenz / Anleitung

Indizierung multimodaler Inhalte: Vektorisierung von Bildern und Text in Azure AI Search

Eine Anleitung zur Einrichtung der multimodalen Suche in Azure AI Search mithilfe der Vektorisierung von Text und Bildern. Beschreibt die Schritte zum Erstellen eines Index, zur Auswahl von Modellen (z. B. CLIP), Methoden zur Erzeugung von Embeddings und zur Ausführung hybrider Abfragen zur Verbesserung der Relevanz.

Auf dieser Seite

Um eine multimodale Suche in Azure AI Search zu implementieren, erstellen Sie einen Index mit Vektorfeldern, verwenden Modelle wie OpenAI CLIP zur Vektorisierung von Text und Bildern, wählen eine Methode zur Erzeugung von Embeddings (innerhalb oder außerhalb des Indexers) und führen hybride Abfragen durch, die Volltext- und Vektorsuche kombinieren, um ähnlichkeitbasierte Ergebnisse zu erhalten.

Grundlagen der multimodalen Suche in Azure AI Search

Die multimodale Suche in Azure AI Search ermöglicht das Auffinden ähnlicher Inhalte unabhängig vom Typ - ob Text oder Bild -, indem Daten in numerische Vektoren (Embeddings) umgewandelt werden, wobei die Nähe der Vektoren semantische Ähnlichkeit widerspiegelt. Beispielsweise kann die Abfrage „Welpen“ Bilder von Hunden zurückgeben, selbst wenn diese keine textlichen Beschriftungen enthalten.

Dieser Ansatz basiert auf der Vektorsuche und unterstützt nicht nur Text-zu-Text-, sondern auch Text-zu-Bild-Abgleiche, was in hybriden Szenarien von großem Wert ist. Die Vektorisierung erfasst konzeptionelle Ähnlichkeiten, etwa zwischen „Hund“ und „Canine“, oder zwischen einem Text und dem zugehörigen Bild.

Vorbereitung des Index für Vektordaten

Um Vektorrepräsentationen speichern zu können, muss der Azure AI Search-Index Felder vom Typ Edm.Single enthalten, die mit dem Attribut vectorSearchProfile versehen sind. Diese Felder speichern Arrays aus Zahlen - sogenannte Embeddings. Die Länge des Vektors hängt vom verwendeten Modell ab (z. B. 512 bei 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)

Auswahl eines Modells für die Bildvektorisierung

Zur Umwandlung von Bildern in Vektoren können Sie die Foundry Tools Image Retrieval Vectorize Image API oder multimodale Modelle wie OpenAI CLIP verwenden. Diese Modelle wurden auf Text-Bild-Paaren trainiert und erzeugen einen gemeinsamen Vektorraum.

Wenn beispielsweise ein Bild eines Hundes über die API gesendet wird, gibt diese einen 512-dimensionalen Vektor zurück, der im Feld image_vector gespeichert wird. Dadurch wird der Vergleich mit Textabfragen basierend auf der Vektornähe ermöglicht.

Auswahl eines Modells für die Textvektorisierung

Für die Textvektorisierung eignen sich Modelle wie Azure OpenAI's text-embedding-ada-002 oder SBERT. Sie wandeln Textbeschreibungen (z. B. „Welpe auf einer Wiese“) in Vektoren derselben Dimensionalität wie die Bildvektoren um, wodurch Kompatibilität im gemeinsamen Vektorraum gewährleistet ist.

Die Erzeugung der Embeddings kann extern (mithilfe des OpenAI SDK) erfolgen oder direkt im Indexer integriert werden, indem ein Azure OpenAI-Endpunkt und ein Schlüssel angegeben werden.

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']

Integrierte vs. externe Vektorisierung

Azure AI Search unterstützt zwei Ansätze: interne Vektorisierung über den Indexer und externe Vektorisierung mit vorberechneten Embeddings. Die interne Vektorisierung erfordert einen Skillset mit einem integrierten Vektorisierer und die Konfiguration einer Azure OpenAI-Ressource.

Die externe Vektorisierung bietet mehr Kontrolle und eignet sich besser für große Datensätze. Die Embeddings werden vorab berechnet und zusammen mit den Dokumenten hochgeladen. Dieser Ansatz ist notwendig, wenn Modelle verwendet werden, die vom Indexer nicht direkt unterstützt werden.

Erstellung eines multimodalen Index

Ein multimodaler Index kombiniert Text, Bilder und ihre Vektorrepräsentationen in einem einzigen Schema. Felder wie text und image_vector ermöglichen sowohl die Volltextsuche als auch die Vektorsuche und bilden die Grundlage für hybride Abfragen.

Jedes Dokument enthält eine ID, den Quelltext oder die Bildbeschreibung sowie die entsprechenden Vektoren. Alle Daten werden gemeinsam indiziert, was während der Suche für Konsistenz sorgt.

Durchführung einer multimodalen Suchabfrage

Die Suche erfolgt über eine hybride Abfrage, die sowohl search (für Text) als auch vectorQueries (für Vektoren) enthält. Beispielsweise wird die Textabfrage „Welpe“ vektorisiert, und der resultierende Vektor wird mit dem image_vector im Index verglichen.

Die Ergebnisse der Volltext- und Vektorsuche werden mittels Reciprocal Rank Fusion (RRF) kombiniert, wodurch die Relevanz verbessert wird. Die Antwort liefert eine einzige, nach Gesamtähnlichkeit sortierte Liste von Dokumenten.

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())

Bewertung und Verbesserung der Suchergebnisse

Die Qualität der Suche wird anhand von Metriken wie Präzision und Recall bewertet. Testen Sie mit beschrifteten Paaren aus Abfragen und relevanten Bildern. Die Präzision misst den Anteil korrekt abgerufener Ergebnisse unter allen zurückgegebenen.

Zur Verbesserung der Relevanz verwenden Sie die hybride Suche mit semantischer Rangfolge (queryType=semantic). Optimieren Sie Parameter wie k und Oversampling in den Vektorabfragen und testen Sie Filterstrategien.

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}")

Was Sie prüfen sollten

  • Index mit Vektorfeldern erstellt
  • Vektorsuchprofil (HNSW) angegeben
  • Text- und Bild-Embeddings haben dieselbe Dimensionalität
  • Hybride Abfrage enthält search und vectorQueries
  • Ergebnisse werden über RRF kombiniert

Die Vektorsuchfunktion steht nicht für Dienste zur Verfügung, die vor dem 1. Januar 2019 erstellt wurden. Die Erzeugung von Embeddings kann Kosten verursachen, wenn Azure OpenAI oder die Foundry-API verwendet werden.

Quellen

  1. Microsoft Learn: vector search ↗
  2. Microsoft Learn: hybrid search ↗
  3. scikit-learn: precision_score ↗
Nach oben ↑