Indexvektordaten in Cosmos DB (in Azure und Fabric)

Cosmos DB (in Azure und Fabric) bietet effiziente Vektorindizierung und Suche. Dieses Feature wurde entwickelt, um modale, 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 multimodale hochdimensionale Vektoren als weitere 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.

Cosmos DB 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, hochgenaue multi modale Vektorsuche in beliebiger Größenordnung zu unterstützen.

Die Vektorsuche in Cosmos DB kann mit allen anderen unterstützten NoSQL Abfragefiltern und Indizes mit WHERE Klauseln kombiniert werden. Diese Kombination ermöglicht es Ihren Vektorsuchen, die relevantesten Daten für Ihre Anwendungen bereitzustellen.

Dieses Feature verbessert die Kernfunktionen von 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, die mathematische Darstellungen von Daten in einem hochdimensionalen Raum sind. 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 on 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 in Cosmos DB 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.

Container-Vektorrichtlinien

Zum Ausführen der Vektorsuche mit Cosmos DB müssen Sie eine Vektorrichtlinie für den Container definieren. Diese Richtlinie 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. Diese Konfiguration 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. Unterstützte Typen sind float32 (Standard), int8und uint8.

  • dimensions: Die Dimensionalität oder Länge jedes Vektors im Pfad. Alle Vektoren in einem Pfad sollten dieselbe Anzahl von Dimensionen aufweisen. (Standardeinstellung 1536).

  • distanceFunction: Die Metrik, die zum Berechnen der Entfernung/Ähnlichkeit verwendet wird. Unterstützte Metriken sind:

    • cosine, die Werte von $-1$ (am wenigsten ähnlich) auf $+1$ (am ähnlichsten) hat.

    • dot product, die Werte von $-\infty$ (am wenigsten ähnlich) mit $+\infty$ (am ähnlichsten) hat.

    • euclidean, die Werte von $0$ (am ähnlichsten) auf $+\infty$ (am wenigsten ähnlich) hat.

Hinweis

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

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

Richtlinie mit einem einzelnen Vektorpfad

In diesem Beispiel wird eine Vektoreinbettungsrichtlinienkonfiguration mit einem einzelnen Vektorpfad veranschaulicht, die das grundlegende Setup zum Speichern von 1536-dimensionalen Float32-Vektoren mit Kosinusgleichheit zeigt. Diese Konfiguration veranschaulicht Folgendes:

  • /[0]: Verwendet float32-Datentyp mit Kosinusähnlichkeit für 1536-dimensionale Vektoren (häufig für OpenAI-Einbettungen)
{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    }
  ]
}

Richtlinie mit zwei Vektorpfaden

In diesem Beispiel wird veranschaulicht, wie Sie eine Vektorindizierungsrichtlinie mit zwei verschiedenen Vektoreinbettungspfaden konfigurieren, die jeweils unterschiedliche Datentypen, Abstandsfunktionen und Dimensionen aufweisen. Diese Konfiguration veranschaulicht Folgendes:

  • /[0]: Verwendet float32-Datentyp mit Kosinusähnlichkeit für 1536-dimensionale Vektoren (häufig für OpenAI-Einbettungen)
  • /[1]: Verwendet den Datentyp int8 mit Punktproduktabstand für 100-dimensionale Vektoren (effizienter für kleinere Einbettungen)
{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    },
    {
      "path": "/vector2",
      "dataType": "int8",
      "distanceFunction": "dotproduct",
      "dimensions": 100
    }
  ]
}

Weitere Informationen und Beispiele für Einstellungen einer Containervektorrichtlinie finden Sie unter Beispiele für Vektorindizierungsrichtlinien.

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 diese Typen von Vektorindexrichtlinien angeben:

Description Max. Abmessungen
flat Speichert Vektoren im selben Index wie andere indizierte Eigenschaften. 505
quantizedFlat Quantisiert (komprimiert) Vektoren vor dem Speichern im Index. Diese Richtlinie kann die Latenz und den Durchsatz verbessern, allerdings auf Kosten einer geringfügigen Genauigkeitsminderung. 4096
diskANN Erstellt einen Index basierend auf DiskANN für schnelle und effiziente Näherungssuche. 4096

Einige Punkte sind zu beachten:

  • Die flat Indextypen und quantizedFlat Indextypen verwenden den Index von Cosmos DB, um jeden Vektor während einer Vektorsuche zu speichern und zu lesen. Vektorsuchen mit einem flat Index sind Brute-Force-Suchvorgänge und erzeugen 100 % Genauigkeit oder Rückruf. Das heißt, sie werden garantiert die ähnlichsten Vektoren im Dataset 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. Dieser Index ist eine gute Option für kleinere Szenarien oder Szenarien, in denen Sie Abfragefilter verwenden, um die Vektorsuche auf eine relativ kleine Gruppe von Vektoren einzugrenzen. quantizedFlat wird empfohlen, wenn die Anzahl der zu indizierenden Vektoren etwa 50.000 oder weniger pro physische Partition beträgt. Diese Empfehlung 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 unter Verwendung von DiskANN, einer Suite von Hochleistungsalgorithmen zur Vektorindizierung, die von Microsoft Research entwickelt wurden, definiert ist. DiskANN-Indizes können einige der niedrigsten Latenzzeiten, den höchsten Durchsatz und die niedrigsten RU-Kosten für Abfragen 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.

  • quantizedFlat und diskANN Indizes unterstützen zwei Quantisierungsmethoden im vectorIndexes Objekt über die quantizerType Eigenschaft: product und spherical.

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

Quantisierungsmethoden

Darüber hinaus können Sie die Quantisierungsmethode direkt im vectorIndexes Objekt angeben. Cosmos DB unterstützt zwei Quantisierungsmethoden: product, die Standardmethode und spherical (in Public Preview), die möglicherweise bessere Leistungsmerkmale aufweisen, einschließlich schnellerer Indizierungszeiten und höherer Rückrufe. Die Quantisierungsmethode kann mithilfe der quantizerType Eigenschaft im vectorIndexes Objekt angegeben werden, wie unten dargestellt:

{
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "diskANN",
      "quantizerType": "spherical"
    }
  ]
}

Von Bedeutung

Wildcardzeichen (*, []) werden derzeit nicht in der Vektorrichtlinie oder im Vektorindex 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 integrierten VECTORDISTANCE Funktion in einer Abfrage durchführen. Ein Beispiel für eine NoSQL-Abfrage, die die Ähnlichkeitsbewertung als Alias score projiziert und in der Reihenfolge von den ähnlichsten zu den am wenigsten ähnlichen sortiert.

SELECT TOP 10
  c.title,
  VECTORDISTANCE(c.contentVector, [1,2,3]) AS score 
FROM
  container c
ORDER BY
  VECTORDISTANCE(c.contentVector, [1,2,3])   

Von Bedeutung

Verwenden Sie immer eine TOP N-Klausel in der SELECT-Anweisung einer Abfrage. Andernfalls versucht die Vektorsuche, viele weitere Ergebnisse zurückzugeben, was dazu führt, dass die Abfrage mehr Anforderungseinheiten (RUs) kostet und eine höhere Latenz als erforderlich hat.