Freigeben über


Vektorsuche in Azure Cosmos DB for NoSQL

Azure Cosmos DB for NoSQL bietet jetzt eine effiziente Vektorindizierung und -suche. Dieses Feature wurde entwickelt, um hochdimensionale Vektoren zu verarbeiten und eine effiziente und genaue Vektorsuche in beliebiger Größenordnung zu ermöglichen. Sie können Vektoren jetzt direkt in den Dokumenten zusammen mit Ihren Daten speichern. Jedes Dokument in Ihrer Datenbank kann nicht nur herkömmliche schemafreie Daten, sondern auch hochdimensionale Vektoren als andere Eigenschaften der Dokumente enthalten. Diese Colocation von Daten und Vektoren ermöglicht eine effiziente Indizierung und Suche, da die Vektoren in derselben logischen Einheit wie die daten gespeichert werden, die sie darstellen. Vektoren und Daten zusammenzuhalten vereinfacht die Datenverwaltung, KI-Anwendungsarchitekturen und die Effizienz von vektorbasierten Vorgängen.

Azure Cosmos DB for NoSQL bietet die Flexibilität bei der Auswahl der Vektorindizierungsmethode:

  • Eine "flache" oder k-nächste Nachbarn genaue Suche (manchmal als Brute-Force bezeichnet) kann einen Abruf von 100 % für kleinere, fokussierte Vektorsuchen bereitstellen. insbesondere in Kombination mit Abfragefiltern und Partitionsschlüsseln.
  • Ein quantisierter flacher Index, der Vektoren mithilfe diskANN-basierter Quantisierungsmethoden komprimiert, um die Effizienz bei der kNN-Suche zu verbessern.
  • DiskANN, eine Suite modernster Vektorindizierungsalgorithmen, die von Microsoft Research entwickelt wurden, um eine effiziente, präzise Vektorsuche in jedem Maßstab zu unterstützen.

Weitere Informationen zur Vektorindizierung

Die Vektorsuche in Azure Cosmos DB kann mit allen anderen unterstützten Azure Cosmos DB NoSQL-Abfragefiltern und -Indizes mithilfe von WHERE Klauseln kombiniert werden. Auf diese Weise können Ihre Vektorsuchen die relevantesten Daten für Ihre Anwendungen sein.

Dieses Feature verbessert die Kernfunktionen von Azure Cosmos DB und macht es flexibler für die Verarbeitung von Vektordaten und Suchanforderungen in KI-Anwendungen.


Was ist ein Vektorspeicher?

Ein Vektorspeicher oder eine Vektordatenbank ist eine Datenbank zum Speichern und Verwalten von Vektoreinbettungen, mathematischen Darstellungen von Daten in einem hochdimensionalen Raum. In diesem Raum entspricht jede Dimension einem Merkmal der Daten, und zehntausende Dimensionen können verwendet werden, um komplexe Daten darzustellen. Die Position eines Vektors in diesem Raum stellt seine Merkmale dar. Wörter, Ausdrücke oder ganze Dokumente sowie Bilder, Audioinhalte und andere Datentypen können vektorisiert werden.

Wie funktioniert ein Vektorspeicher?

In einem Vektorspeicher werden Vektorsuchalgorithmen verwendet, um Einbettungen zu indizieren und abzufragen. Zu den bekannten Vektorsuchalgorithmen zählen unter anderem „Hierarchical Navigable Small World“ (HNSW), „Inverted File“ (IVF), „DiskANN“ usw. Die Vektorsuche ist eine Methode, mit der Sie ähnliche Elemente basierend auf ihren Datenmerkmalen anstatt exakter Übereinstimmungen in einem Eigenschaftenfeld finden können. Diese Technik ist nützlich für Anwendungsfälle wie die Suche nach ähnlichem Text, das Suchen ähnlicher Bilder, das Abgeben von Empfehlungen oder sogar das Erkennen von Anomalien. Sie wird zum Abfragen der Vektoreinbettungen Ihrer Daten verwendet, die Sie mit einem Machine Learning-Modell unter Verwendung einer Einbettungs-API erstellt haben. Beispiele für Einbettungs-APIs sind Azure OpenAI Embeddings oder Hugging Face in Azure. Anschließend misst die Vektorsuche den Abstand zwischen den Datenvektoren und Ihrem Abfragevektor. Die Datenvektoren, die Ihrem Abfragevektor am nächsten liegen, sind semantisch am ähnlichsten.

In der integrierten Vektordatenbank im virtuellen Kern von Azure Cosmos DB for NoSQL können Einbettungen zusammen mit den ursprünglichen Daten gespeichert, indiziert und abgefragt werden. So vermeiden Sie zusätzliche Kosten für die Replikation der Daten in einer separaten reinen Vektordatenbank. Außerdem bleiben Ihre Vektoreinbettungen und Ihre Originaldaten in dieser Architektur zusammen, was multimodale Datenvorgänge erleichtert und eine höhere Datenkonsistenz, Skalierbarkeit und Leistung ermöglicht.

Aktivieren des Features für die Vektorindizierung und -suche

Das Feature für die Vektorindizierung und -suche in Azure Cosmos DB for NoSQL muss auf der Seite „Features“ in Ihrer Azure Cosmos DB-Instanz aktiviert werden. Führen Sie die folgenden Schritte aus, um sich zu registrieren:

  1. Navigieren Sie zu Ihrer Azure Cosmos DB for NoSQL-Ressourcenseite.

  2. Wählen Sie den Bereich "Features" unter dem Menüelement "Einstellungen" aus.

  3. Wählen Sie das Feature „Vector Search in Azure Cosmos DB for NoSQL“ aus.

  4. Lesen Sie die Beschreibung des Features, und bestätigen Sie danach, dass Sie es aktivieren möchten.

  5. Wählen Sie „Aktivieren“ aus, um die Vektorindizierungs- und -suchfunktion zu aktivieren.

    Tipp

    Alternativ können Sie die Azure CLI verwenden, um die Funktionen Ihres Kontos zu aktualisieren und die NoSQL-Vektorsuche zu unterstützen.

    az cosmosdb update \
         --resource-group <resource-group-name> \
         --name <account-name> \
         --capabilities EnableNoSQLVectorSearch
    

Hinweis

Die Registrierungsanforderung wird automatisch genehmigt, es kann jedoch 15 Minuten dauern, bis sie im Konto wirksam wird.

Containervektorrichtlinien

Zum Ausführen der Vektorsuche mit Azure Cosmos DB for NoSQL müssen Sie eine Vektorrichtlinie für den Container definieren. Dies stellt wichtige Informationen für das Datenbankmodul bereit, um eine effiziente Ähnlichkeitssuche für Vektoren durchzuführen, die in den Dokumenten des Containers gefunden werden. Dies informiert auch die Vektorindizierungsrichtlinie über die erforderlichen Informationen, wenn Sie eine angeben möchten. Die folgenden Informationen sind in der enthaltenen Vektorrichtlinie enthalten:

  • "path": die Eigenschaft, die den Vektor enthält (erforderlich).
  • "datatype": Der Datentyp der Vektoreigenschaft (Standard Float32). 
  • "dimensions": Die Dimensionalität oder Länge jedes Vektors im Pfad. Alle Vektoren in einem Pfad sollten dieselbe Anzahl von Dimensionen aufweisen. (Standardwert 1536).
  • „distanceFunction“: Die Metrik, die zum Berechnen der Entfernung/Ähnlichkeit verwendet wird. Unterstützte Metriken:
    • cosine, das Werte von -1 (am wenigsten ähnlich) bis +1 (am ähnlichsten) hat.
    • dot product, enthält Werte von -inf (am wenigsten ähnlich) bis +inf (am ähnlichsten).
    • euclidean, das Werte von -0 (am wenigsten ähnlich) bis +inf (am ähnlichsten) hat.

Hinweis

Jeder eindeutige Pfad kann höchstens eine Richtlinie aufweisen. Es können jedoch mehrere Richtlinien angegeben werden, sofern sie alle auf einen anderen Pfad abzielen.

Die Containervektorrichtlinie kann als JSON-Objekte beschrieben werden. Hier sind zwei Beispiele für gültige Containervektorrichtlinien:

Eine Richtlinie mit einem einzelnen Vektorpfad

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        }
    ]
}

Eine Richtlinie mit zwei Vektorpfaden

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        },
        {
            "path":"/vector2",
            "dataType":"int8",
            "distanceFunction":"dotproduct",
            "dimensions":100
        }
    ]
}

Vektorindizierungsrichtlinien

Vektorindizes erhöhen die Effizienz beim Ausführen von Vektorsuchen mithilfe der VectorDistance Systemfunktion. Vektorsuchen haben geringere Latenz, einen höheren Durchsatz und weniger RU-Verbrauch bei Verwendung eines Vektorindexes. Sie können die folgenden Typen von Vektorindexrichtlinien angeben:

Typ Beschreibung Max. Abmessungen
flat Speichert Vektoren im selben Index wie andere indizierte Eigenschaften. 505
quantizedFlat Quantisiert (komprimiert) Vektoren vor dem Speichern im Index. Dies kann die Latenz und den Durchsatz auf Kosten einer geringeren Genauigkeit verbessern. 4096
diskANN Erstellt einen Index basierend auf DiskANN für schnelle und effiziente Näherungssuche. 4096

Hinweis

Für die quantizedFlat- und diskANN-Indizes müssen mindestens 1.000 Vektoren eingefügt werden. Dadurch wird die Genauigkeit des Quantisierungsprozesses sichergestellt. Wenn weniger als 1.000 Vektoren vorhanden sind, wird stattdessen ein vollständiger Scan ausgeführt, was zu höheren RU-Gebühren für eine Vektorsuchabfrage führt.

Einige Punkte sind zu beachten:

  • Die Indextypen flat und quantizedFlat Indextypen verwenden den Index von Azure Cosmos DB, um jeden Vektor zu speichern und zu lesen, wenn eine Vektorsuche ausgeführt wird. Vektorsuchen mit einem flat Index sind Brute-Force-Suchvorgänge und erzeugen 100 % Genauigkeit oder Rückruf. Das heißt, es ist garantiert, die ähnlichsten Vektoren im Dataset zu finden. Es gibt jedoch eine Einschränkung der 505 Dimensionen für Vektoren in einem flachen Index.

  • Der quantizedFlat Index speichert quantisierte (komprimierte) Vektoren im Index. Vektorsuchen mit quantizedFlat Index sind auch Brute-Force-Suchvorgänge, ihre Genauigkeit kann jedoch etwas kleiner als 100 % sein, da die Vektoren vor dem Hinzufügen zum Index quantisiert werden. Vektorsuchen mit quantized flat sollten jedoch eine geringere Latenz, einen höheren Durchsatz und niedrigere RU-Kosten als Vektorsuchen in einem flat-Index aufweisen. Dies ist eine gute Option für weniger umfangreiche Szenarios oder Szenarios, in denen Sie Abfragefilter verwenden, um die Vektorsuche auf wenige Vektoren einzugrenzen. quantizedFlat wird empfohlen, wenn die Anzahl der zu indizierenden Vektoren etwa 50.000 oder weniger pro physische Partition beträgt. Dies ist jedoch nur eine allgemeine Richtlinie, und die tatsächliche Leistung sollte getestet werden, da jedes Szenario unterschiedlich sein kann.

  • Der diskANN Index ist ein separater Index, der speziell für Vektoren mit DiskANN definiert ist, einer Suite von Hochleistungsvektorindizierungsalgorithmen, die von Microsoft Research entwickelt wurden. DiskANN-Indizes können einige der niedrigsten Latenz, den höchsten Durchsatz und die niedrigsten RU-Kostenabfragen bieten und gleichzeitig eine hohe Genauigkeit beibehalten. Im Allgemeinen ist DiskANN der leistungsfähigste aller Indextypen, wenn pro physischer Partition mehr als 50.000 Vektoren vorhanden sind.

Hier sind Beispiele für gültige Vektorindexrichtlinien:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        },
        {
            "path": "/vector1/*"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "diskANN"
        }
    ]
}
{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        },
        {
            "path": "/vector1/*",
        },
        {
            "path": "/vector2/*",
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "quantizedFlat"
        },
        {
            "path": "/vector2",
            "type": "diskANN"
        }
    ]
}

Wichtig

Dieser Vektorpfad wurde dem Abschnitt „excludedPaths“ der Indizierungsrichtlinie hinzugefügt, um eine optimierte Leistung für das Einfügen sicherzustellen. Wenn der Vektorpfad nicht zu „excludedPaths“ hinzugefügt wird, führt dies zu einer höheren RU-Belastung und Latenz für Vektoreinfügungen.

Wichtig

Platzhalterzeichen (*, []) werden derzeit in der Vektorrichtlinie oder im Vektorindex nicht unterstützt.

Durchführen der Vektorsuche mit Abfragen mithilfe von VectorDistance()

Nachdem Sie einen Container mit der gewünschten Vektorrichtlinie erstellt und Vektordaten in den Container eingefügt haben, können Sie eine Vektorsuche mithilfe der Systemfunktion Vektordistanz in einer Abfrage durchführen. Ein Beispiel für eine NoSQL-Abfrage, die den Ähnlichkeitswert als Alias SimilarityScore projiziert und in der Reihenfolge von den ähnlichsten zu den am wenigsten ähnlichen sortiert wird:

SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3])   

Wichtig

Verwenden Sie immer eine TOP N-Klausel in der SELECT-Anweisung einer Abfrage. Andernfalls versucht die Vektorsuche, viele weitere Ergebnisse zurückzugeben, und die Abfrage verbraucht mehr RUs und hat eine höhere Latenz als erforderlich.

Aktuelle Einschränkungen

Für die Vektorindizierung und -suche in Azure Cosmos DB for NoSQL gelten einige Einschränkungen.

  • Bei quantizedFlat- und diskANN-Indizes müssen mindestens 1.000 Vektoren indiziert werden, um sicherzustellen, dass die Quantisierung korrekt ist. Wenn weniger als 1.000 Vektoren indiziert werden, wird stattdessen eine vollständige Überprüfung verwendet, und RU-Gebühren können höher sein.
  • Vektoren, die mit dem flat Indextyp indiziert sind, können höchstens 505 Dimensionen aufweisen. Vektoren, die mit dem Indextyp quantizedFlat oder DiskANN indiziert sind, können höchstens 4.096 Dimensionen aufweisen.
  • Der quantizedFlat-Index verwendet dieselbe Quantisierungsmethode wie DiskANN.
  • Die Rate der Vektoreinfügungen sollte beschränkt werden. Sehr große Aufnahme (über 5M-Vektoren) erfordert möglicherweise zusätzliche Indexbuildzeit.
  • Freigegebene Durchsatzdatenbanken werden nicht unterstützt.
  • Zurzeit wird die Vektorindizierung und -suche für Konten mit Analytical Store (und Synapse Link) und gemeinsam genutztem Durchsatz nicht unterstützt.
  • Sobald die Vektorindizierung und -suche in einem Container aktiviert ist, kann sie nicht mehr deaktiviert werden.

Nächster Schritt