Erstellen eines Vektorindexes

In der Azure KI-Suche verfügt ein Vektorspeicher über ein Indexschema, das Vektor- und Nichtvektorfelder definiert, eine Vektorkonfiguration für Algorithmen, die den Einbettungsraum erstellen und komprimieren, und Einstellungen für Vektorfelddefinitionen, die in Abfrageanforderungen verwendet werden.

Die API zum Erstellen oder Aktualisieren eines Index erstellt den Vektorspeicher. Führen Sie die folgenden Schritte aus, um Vektordaten zu indizieren:

  • Definieren eines Schemas mit Vektoralgorithmen und optionaler Komprimierung
  • Hinzufügen von Vektorfelddefinitionen
  • Laden von vorvektorisierten Daten in einem separaten Schritt oder Verwenden der integrierten Vektorisierung für Datenblockerstellung und -codierung während der Indizierung

In diesem Artikel wird der Workflow erläutert und REST zur Veranschaulichung verwendet. Sobald Sie den grundlegenden Workflow verstanden haben, fahren Sie mit den Azure SDK-Codebeispielen im Repository azure-search-vector-samples fort, um Anleitungen zur Verwendung dieser Features im Test- und Produktionscode zu erhalten.

Tipp

Verwenden Sie das Azure-Portal, um einen Vektorindex zu erstellen und die Datensegmentierung und integrierte Vektorisierung auszuprobieren.

Voraussetzungen

  • Azure AI Search, in jeder Region und auf jeder Ebene. Die meisten vorhandenen Dienste unterstützen die Vektorsuche. Für Dienste, die vor Januar 2019 erstellt wurden, gibt es eine kleine Teilmenge, die keinen Vektorindex erstellen kann. In dieser Situation muss ein neuer Dienst erstellt werden. Wenn Sie integrierte Vektorisierung (Skillsets, die Azure KI aufrufen) verwenden, muss sich Azure KI-Suche in derselben Region wie Azure OpenAI oder Azure KI Services befinden.

  • Bereits vorhandene Vektoreinbettungen oder Verwenden der integrierten Vektorisierung, wobei Einbettungsmodelle aus der Indizierungspipeline aufgerufen werden

  • Sie sollten die Größeneinschränkung des Modells kennen, das zum Erstellen der Einbettungen verwendet wird. Gültige Werte sind 2 bis 3072 Dimensionen. In Azure OpenAI beträgt die Länge des numerischen Vektors 1536 für text-embedding-ada-002. Bei text-embedding-3-small oder text-embedding-3-large beträgt die Vektorlänge 3072.

  • Sie sollten auch wissen, welche Ähnlichkeitsmetriken unterstützt werden. In Azure OpenAI wird Ähnlichkeit mithilfe von cosine berechnet.

  • Sie sollten mit der Erstellung eines Index vertraut sein. Das Schema muss ein Feld für den Dokumentschlüssel, andere Felder, die Sie durchsuchen oder filtern möchten, und weitere Konfigurationen für Verhaltensweisen enthalten, die während der Indizierung und Abfragen erforderlich sind.

Vorbereiten von Dokumenten für die Indizierung

Erstellen Sie vor der Indizierung eine Dokumentnutzlast, die Felder mit Vektor- und Nicht-Vektordaten enthält. Die Dokumentstruktur muss dem Indexschema entsprechen.

Stellen Sie für Ihre Dokumente Folgendes sicher:

  1. Sie enthalten ein Feld oder eine Metadateneigenschaft, die jedes Dokument eindeutig identifiziert. Für alle Suchindizes ist ein Dokumentschlüssel erforderlich. Um die Anforderungen des Dokumentschlüssels zu erfüllen, muss ein Quelldokument über ein Feld oder eine Eigenschaft verfügen, mit dem bzw. der es im Index eindeutig identifiziert werden kann. Dieses Quellfeld muss einem Indexfeld vom Typ Edm.String und key=true im Suchindex zugeordnet werden.

  2. Sie enthalten Vektordaten (ein Array von Gleitkommazahlen mit einfacher Genauigkeit) in Quellfeldern.

    Vektorfelder enthalten ein Array, das durch Einbettungsmodelle generiert wird, mit einer Einbettung pro Feld, wobei das Feld ein Feld auf oberster Ebene ist (nicht Teil eines geschachtelten oder komplexen Typs). Für die einfachste Integration empfehlen wir die Einbettungsmodelle in Azure OpenAI, z. B. text-embedding-ada-002 für Textdokumente bzw. die Bildabruf-REST-API für Bilder.

    Wenn eine Abhängigkeit von Indexern und Skillsets möglich ist, verwenden Sie ggf. integrierte Vektorisierung, die Bilder und alphanumerische Inhalte während der Indizierung codiert. Ihre Felddefinitionen gelten für Vektorfelder. Quelldaten können jedoch Text oder Bilder sein, wobei Vektorarrays während der Indizierung erstellt werden.

  3. Sie enthalten weitere Felder mit von Menschen lesbaren alphanumerischen Inhalten für die Abfrageantwort und für Hybridabfrageszenarien, die Volltextsuche oder semantische Rangfolge in derselben Anforderung enthalten.

Ihr Suchindex sollte Felder und Inhalte für alle Abfrageszenarien enthalten, die Sie unterstützen möchten. Angenommen, Sie möchten nach Produktnamen, Versionen, Metadaten oder Adressen suchen oder filtern. In diesem Fall ist die Ähnlichkeitssuche nicht besonders hilfreich. Schlüsselwortsuche, Geosuche oder Filter wären eine bessere Wahl. Ein Suchindex, der eine umfassende Feldauflistung von Vektor- und Nicht-Vektordaten enthält, bietet maximale Flexibilität für die Abfrageerstellung und Antwortkomposition.

Ein kurzes Beispiel für eine Dokumentnutzlast, die Vektor- und Nicht-Vektorfelder enthält, finden Sie im Abschnitt Laden von Vektordaten dieses Artikels.

Hinzufügen einer Vektorsuchkonfiguration

Eine Vektorkonfiguration gibt die Parameter an, die während der Indizierung zum Erstellen von Informationen zum „nächsten Nachbarn“ (Nearest Neighbor) zwischen den Vektorknoten verwendet werden:

  • Hierarchical Navigable Small World (HNSW)
  • Umfassende KNN

Wenn Sie HNSW für ein Feld auswählen, können Sie sich zur Abfragezeit für umfassende KNN entscheiden. Anders herum funktioniert es jedoch nicht: Wenn Sie umfassende KNN wählen, können Sie später keine HNSW-Suche anfordern, da die zusätzlichen Datenstrukturen, welche die ungefähre Suche ermöglichen, nicht vorhanden sind.

Eine Vektorkonfiguration gibt außerdem Quantisierungsmethoden zum Reduzieren der Vektorgröße an:

  • Skalar
  • Binärdatei (nur in 2024-07-01 und in neueren Azure SDK-Paketen verfügbar)

Anweisungen zum Migrieren zur aktuellen Version finden Sie unter Aktualisieren der REST-API.

2024-07-01 ist allgemein verfügbar. Eine Vektorkonfiguration mit Folgendem wird unterstützt:

  • vectorSearch.algorithms unterstützt HNSW und umfassende KNN.
  • vectorSearch.compressions unterstützt skalare und binäre Quantisierung, Überquotierung und Neusortierung mit ursprünglichen Vektoren.
  • vectorSearch.profiles ermöglicht mehrere Kombinationen von Algorithmus- und Komprimierungskonfigurationen.

Stellen Sie sicher, dass Sie eine Strategie für die Vektorisierung Ihrer Inhalte haben. Es wird empfohlen, integrierte Vektorisierung und Abfragezeitvektorisierung für integrierte Codierung zu verwenden.

  1. Verwenden Sie die API zum Erstellen oder Aktualisieren von Indizes, um den Index zu erstellen.

  2. Fügen Sie den Abschnitt vectorSearch im Index hinzu, der die Suchalgorithmen angibt, mit denen der Einbettungsraum erstellt wird.

     "vectorSearch": {
         "compressions": [
             {
                 "name": "scalar-quantization",
                 "kind": "scalarQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
                     "scalarQuantizationParameters": {
                         "quantizedDataType": "int8"
                     }
             },
             {
                 "name": "binary-quantization",
                 "kind": "binaryQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
             }
         ],
         "algorithms": [
             {
                 "name": "hnsw-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "hnsw-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "hamming"
                 }
             },
             {
                 "name": "eknn",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "euclidean"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "vector-profile-hnsw-scalar",
             "compression": "scalar-quantization",
             "algorithm": "hnsw-1"
           }
         ]
     }
    

    Die wichtigsten Punkte:

    • Namen für die einzelnen Komprimierungs-, Algorithmus- und Profilkonfigurationen müssen für den zugehörigen Typ innerhalb des Indexes eindeutig sein.

    • vectorSearch.compressions.kind kann scalarQuantization oder binaryQuantization sein.

    • vectorSearch.compressions.rerankWithOriginalVectors verwendet die ursprünglichen, nicht komprimierten Vektoren, um Die Ähnlichkeit neu zu berechnen und die top-Ergebnisse zu reranken, die von der ursprünglichen Suchabfrage zurückgegeben werden. Die nicht komprimierten Vektoren sind im Suchindex vorhanden, auch wenn stored "false" ist. Diese Eigenschaft ist optional. Der Standardwert ist korrekt.

    • vectorSearch.compressions.defaultOversampling betrachtet eine breitere Reihe potenzieller Ergebnisse, um die Verringerung der Informationen aus der Quantisierung zu verrechnen. Die Formel für potenzielle Ergebnisse besteht aus der k Abfrage mit einem Oversampling-Multiplikator. Wenn die Abfrage beispielsweise einen k Wert von 5 angibt und die Oversampling 20 ist, fordert die Abfrage effektiv 100 Dokumente für die Verwendung in Reranking an, wobei der ursprüngliche nicht komprimierte Vektor zu diesem Zweck verwendet wird. Es werden nur die top rerangierten k Ergebnisse zurückgegeben. Diese Eigenschaft ist optional. Der Standardwert ist 4.

    • vectorSearch.compressions.scalarQuantizationParameters.quantizedDataType muss auf int8 festgelegt werden. Dies ist der einzige Grundtyp, der derzeit unterstützt wird. Diese Eigenschaft ist optional. Der Standardwert ist int8.

    • vectorSearch.algorithms.kind ist "hnsw" oder "exhaustiveKnn". Dies sind die ANN-Algorithmen (Approximate Nearest Neighbors, ungefähre nächste Nachbarn), die zum Organisieren von Vektorinhalten während der Indizierung verwendet werden.

    • vectorSearch.algorithms.m ist die Anzahl bidirektionaler Verknüpfungen. Der Standardwert ist 4. Der Bereich liegt zwischen 4 und 10. Niedrigere Werte sollten zu einer geringeren Anzahl falscher Ergebnisse führen.

    • vectorSearch.algorithms.efConstruction ist die Anzahl der nächsten Nachbarn, die während der Indizierung verwendet werden. Der Standardwert ist 400. Der Bereich liegt zwischen 100 und 1.000.

    • "vectorSearch.algorithms.fSearch ist die Anzahl der nächsten Nachbarn, die während der Suche verwendet werden. Der Standardwert ist 500. Der Bereich liegt zwischen 100 und 1.000.

    • vectorSearch.algorithms.metric muss „Kosinus“ sein, wenn Sie Azure OpenAI verwenden. Verwenden Sie andernfalls die Ähnlichkeitsmetrik, die dem verwendeten Einbettungsmodell zugeordnet ist. Unterstützte Werte sind cosine, dotProduct, euclidean, hamming (wird für Indizierung binärer Daten verwendet).

    • vectorSearch.profiles fügt eine Abstraktionsebene für umfangreichere Definitionen hinzu. Ein Profil wird in vectorSearch definiert, und anschließend wird für jedes Vektorfeld anhand des Namens darauf verwiesen. Es handelt sich um eine Kombination aus Komprimierungs- und Algorithmuskonfigurationen. Dies ist die Eigenschaft, die Sie einem Vektorfeld zuweisen, und es bestimmt den Algorithmus und die Komprimierung der Felder.

Hinzufügen eines Vektorfelds zur Felderauflistung

Die Felderauflistung muss ein Feld für den Dokumentschlüssel, Vektorfelder und alle anderen Felder enthalten, die Sie für Hybridsuchszenarien benötigen.

Vektorfelder zeichnen sich durch ihren Datentyp aus, eine dimensions-Eigenschaft basierend auf dem Einbettungsmodell, das zum Ausgeben der Vektoren und eines Vektorprofils verwendet wird.

2024-07-01 ist allgemein verfügbar.

  1. Verwenden Sie die API zum Erstellen oder Aktualisieren von Indizes, um den Index zu erstellen.

  2. Definieren Sie ein Vektorfeld mit den folgenden Attributen. Sie können eine generierte Einbettung pro Feld speichern. Für jedes Vektorfeld:

    • type muss ein Vektordatentyp sein. Collection(Edm.Single) ist für Einbettungsmodelle am gängigsten.
    • dimensions ist die Anzahl der Dimensionen, die vom Einbettungsmodell generiert werden. Für „text-embedding-ada-002“ ist dieser Wert 1536.
    • vectorSearchProfile ist der Name eines Profils, das an anderer Stelle im Index definiert ist.
    • searchable muss den Wert „true“ haben.
    • retrievable kann true oder false sein. „true“ gibt die unformatierten Vektoren (1536) als Nur-Text zurück und verbraucht Speicherplatz. Legen Sie diese Einstellung auf „true“ fest, wenn Sie ein Vektorergebnis an eine nachgeschaltete App übergeben.
    • stored kann true oder false sein. Die Option bestimmt, ob eine zusätzliche Kopie von Vektoren zum Abrufen gespeichert wird. Weitere Informationen finden Sie unter Reduzieren der Vektorgröße.
    • filterable, facetable und sortable müssen den Wert „false“ haben.
  3. Fügen Sie der Auflistung filterbare Nicht-Vektorfelder hinzu, z. B. „title“, und legen Sie dabei filterable auf „true“ fest, wenn Sie Vorfilterung oder Nachfilterung für die Vektorabfrage aufrufen möchten.

  4. Fügen Sie weitere Felder hinzu, die den Inhalt und die Struktur des Textinhalts definieren, den Sie indizieren. Sie benötigen mindestens einen Dokumentschlüssel.

    Sie sollten auch Felder hinzufügen, die in der Abfrage oder in ihrer Antwort nützlich sind. Das folgende Beispiel zeigt Vektorfelder für Titel und Inhalt („titleVector“, „contentVector“), die Vektoren entsprechen. Außerdem werden Felder für äquivalente Textinhalte („title“, „content“) bereitgestellt, die beim Sortieren, Filtern und Lesen in einem Suchergebnis hilfreich sind.

    Das folgende Beispiel zeigt die Felderauflistung:

    PUT https://my-search-service.search.windows.net/indexes/my-index?api-version=2024-07-01&allowIndexDowntime=true
    Content-Type: application/json
    api-key: {{admin-api-key}}
    {
        "name": "{{index-name}}",
        "fields": [
            {
                "name": "id",
                "type": "Edm.String",
                "key": true,
                "filterable": true
            },
            {
                "name": "title",
                "type": "Edm.String",
                "searchable": true,
                "filterable": true,
                "sortable": true,
                "retrievable": true
            },
            {
                "name": "titleVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "stored": true,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": false,
                "stored": false,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "hnsw-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "vector-profile-1",
                    "algorithm": "hnsw-1"
                }
            ]
        }
    }
    

Laden von Vektordaten für die Indizierung

Inhalte, die Sie für die Indizierung bereitstellen, müssen dem Indexschema entsprechen und einen eindeutigen Zeichenfolgenwert für den Dokumentschlüssel enthalten. Vorab vektorisierte Daten werden in Vektorfelder geladen, die neben anderen Feldern vorhanden sein können, die alphanumerische Inhalte enthalten.

Sie können entweder Push- oder Pullmethoden für die Datenerfassung verwenden.

Verwenden Sie Dokumente – Index, um Vektor- und Nichtvektordaten in einen Index zu laden. Die Push-APIs für die Indizierung sind in allen stabilen und Vorschauversionen identisch. Verwenden Sie eine der folgenden APIs zum Laden von Dokumenten:

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2024-07-01

{
    "value": [
        {
            "id": "1",
            "title": "Azure App Service",
            "content": "Azure App Service is a fully managed platform for building, deploying, and scaling web apps. You can host web apps, mobile app backends, and RESTful APIs. It supports a variety of programming languages and frameworks, such as .NET, Java, Node.js, Python, and PHP. The service offers built-in auto-scaling and load balancing capabilities. It also provides integration with other Azure services, such as Azure DevOps, GitHub, and Bitbucket.",
            "category": "Web",
            "titleVector": [
                -0.02250031754374504,
                 . . . 
                        ],
            "contentVector": [
                -0.024740582332015038,
                 . . .
            ],
            "@search.action": "upload"
        },
        {
            "id": "2",
            "title": "Azure Functions",
            "content": "Azure Functions is a serverless compute service that enables you to run code on-demand without having to manage infrastructure. It allows you to build and deploy event-driven applications that automatically scale with your workload. Functions support various languages, including C#, F#, Node.js, Python, and Java. It offers a variety of triggers and bindings to integrate with other Azure services and external services. You only pay for the compute time you consume.",
            "category": "Compute",
            "titleVector": [
                -0.020159931853413582,
                . . .
            ],
            "contentVector": [
                -0.02780858241021633,
                 . . .
            ],
            "@search.action": "upload"
        }
        . . .
    ]
}

Überprüfen des Indexes auf Vektorinhalte

Zu Überprüfungszwecken können Sie den Index mithilfe des Suchexplorers im Azure-Portal oder eines REST-API-Aufrufs abfragen. Da Azure KI Search einen Vektor nicht in lesbaren Text konvertieren kann, versuchen Sie, Felder aus demselben Dokument zurückzugeben, die Nachweise für die Übereinstimmung liefern. Wenn die Vektorabfrage z. B. auf das Feld „titleVector“ ausgerichtet ist, können Sie „title“ für die Suchergebnisse auswählen.

Felder müssen durch das Attribut „retrievable“ gekennzeichnet sein, damit sie in die Ergebnisse einbezogen werden.

  • Überprüfen Sie die Indizes unter Suchverwaltung>Indizes, um die Indexgröße insgesamt und die Vektorindexgröße anzuzeigen. Eine positive Vektorindexgröße gibt an, dass Vektoren vorhanden sind.

  • Verwenden Sie den Suchexplorer, um einen Index abzufragen. Der Suchexplorer verfügt über zwei Ansichten: Abfrageansicht (Standard) und JSON-Ansicht.

    • Legen Sie Abfrageoptionen>Vektorwerte in Suchergebnissen ausblenden fest, um besser lesbare Ergebnisse zu erhalten.

    • Verwenden Sie die JSON-Ansicht für Vektorabfragen. Sie können entweder eine JSON-Definition der auszuführenden Vektorabfrage einfügen oder die integrierte Text-zu-Vektor- oder Bild-zu-Vektor-Konvertierung verwenden, wenn Ihr Index über eine Vektorisierungszuweisung verfügt. Weitere Informationen zur Bildsuche finden Sie unter Schnellstart: Suchen nach Bildern im Suchexplorer.

    • Verwenden Sie die Standardabfrageansicht, um schnell zu bestätigen, dass der Index Vektoren enthält. Die Abfrageansicht ist für die Volltextsuche vorgesehen. Obwohl Sie sie nicht für Vektorabfragen verwenden können, können Sie eine leere Suche (search=*) senden, um nach Inhalten zu suchen. Die Inhalte aller Felder, einschließlich Vektorfeldern, werden als Nur-Text zurückgegeben.

    • Ausführlichere Informationen finden Sie unter Erstellen einer Vektorabfrage.

Aktualisieren eines Vektorspeichers

Um einen Vektorspeicher zu aktualisieren, ändern Sie das Schema und laden Sie gegebenenfalls die Dokumente neu, um die neuen Felder zu füllen. APIs für das Aktualisieren eines Schemas umfassen Create or Update Index (REST), CreateOrUpdateIndex im Azure SDK für .NET, create_or_update_index im Azure SDK für Python und ähnliche Methoden in anderen Azure SDKs.

Die Standardanleitung für die Aktualisierung eines Indexes finden Sie unter Aktualisieren oder Neuerstellen eines Indexes.

Wichtige Punkte sind:

  • Das Verwerfen und Neuerstellen ist häufig für Aktualisierungen und das Löschen bestehender Felder erforderlich.

  • Sie können jedoch ein bestehendes Schema mit den folgenden Änderungen aktualisieren, ohne dass eine Neuerstellung erforderlich ist:

    • Fügen Sie neue Felder zu einer Feldsammlung hinzu.
    • Fügen Sie neue Vektorkonfigurationen hinzu, die neuen Feldern zugewiesen werden, aber nicht bestehenden Feldern, die bereits vektorisiert wurden.
    • Ändern Sie die Option „abrufbar“ (Werte sind true oder false) für ein bestehendes Feld. Vektorfelder müssen durchsuchbar und abrufbar sein. Wenn Sie jedoch den Zugriff auf ein Vektorfeld in Situationen deaktivieren möchten, in denen das Ablegen und Wiederherstellen nicht möglich ist, können Sie „abrufbar“ auf „false“ setzen.

Nächste Schritte

Als nächsten Schritt wird das Abfragen von Vektordaten in einem Suchindex empfohlen.

Codebeispiele im Repository azure-search-vector veranschaulichen End-to-End-Workflows, die Schemadefinition, Vektorisierung, Indizierung und Abfragen enthalten.

Es gibt Beispielcode für Python, C#und JavaScript.