Freigeben über


Vektordatenbanken

Eine Vektordatenbank speichert und verwaltet Daten in Form von Vektoren, die numerische Arrays von Datenpunkten sind.

Die Verwendung von Vektoren ermöglicht komplexe Abfragen und Analysen, da Sie Vektoren mit erweiterten Techniken wie Vektorensuche, Quantisierung und Clustering vergleichen und analysieren können. Herkömmliche Datenbanken eignen sich nicht gut für die Verarbeitung der hochdimensionalen Daten, die in der Datenanalyse immer häufiger vorkommen. Vektordatenbanken dienen jedoch dazu, hochdimensionale Daten wie Text, Bilder und Audio zu verarbeiten, indem sie als Vektoren dargestellt werden. Vektordatenbanken sind nützlich für Aufgaben wie maschinelles Lernen, linguistische Datenverarbeitung und Bilderkennung, bei denen das Ziel darin besteht, Muster oder Ähnlichkeiten in großen Datasets zu identifizieren.

Dieser Artikel gibt einige Hintergrundinformationen über Vektordatenbanken und erklärt konzeptionell, wie Sie ein Eventhouse als Vektordatenbank in Echtzeitintelligenz in Microsoft Fabric verwenden können. Ein praktisches Beispiel finden Sie im Tutorial: Verwenden eines Eventhouse als Vektordatenbank.

Wichtige Begriffe

Die folgenden Schlüsselkonzepte werden in Vektordatenbanken verwendet:

Vektorähnlichkeit

Die Vektorähnlichkeit ist ein Maß dafür, wie unterschiedlich (oder ähnlich) zwei oder mehr Vektoren sind. Die Vektorähnlichkeitssuche ist eine Technik, die verwendet wird, um ähnliche Vektoren in einem Dataset zu finden. Sie vergleichen Vektoren mithilfe einer Entfernungsmetrik, z. B. euklidischer Entfernung oder Kosinus-Ähnlichkeit. Je näher zwei Vektoren sind, desto ähnlicher sind sie.

Einbettungen

Einbettungen stellen häufig Daten in einem Vektorformat für die Verwendung in Vektordatenbanken dar. Bei einer Einbettung handelt es sich um eine mathematische Darstellung eines Datenabschnitts, z. B. eines Worts, eines Textdokuments oder eines Bilds, das die semantische Bedeutung erfassen soll. Sie erstellen Einbettungen mithilfe von Algorithmen, die die Daten analysieren und einen Satz numerischer Werte generieren, die ihre wichtigsten Features darstellen. Eine Einbettung für ein Wort kann zum Beispiel seine Bedeutung, seinen Kontext und seine Beziehung zu anderen Wörtern darstellen. Der Prozess der Erstellung von Einbettungen ist einfach. Sie können sie zwar mithilfe von Standard-Python-Paketen erstellen (z. B. spaCy, sent2vec, Gensim), große Sprachmodelle (LLM) generieren höchste Qualitätseinbettungen für die Semantiktextsuche. Sie können z. B. Text an ein Einbettungsmodell in Azure OpenAI senden und eine Vektordarstellung generieren, die Sie für die Analyse speichern können. Weitere Informationen finden Sie unter Grundlegendes zu Einbettungen in Azure OpenAI Service.

Allgemeiner Workflow

Schematische Darstellung der Einbettung, Speicherung und Abfrage von als Vektoren gespeichertem Text.

Der allgemeine Workflow für die Verwendung einer Vektordatenbank lautet wie folgt:

  1. Einbetten von Daten: Konvertieren von Daten in das Vektorformat mithilfe eines Einbettungsmodells. Beispielsweise können Sie Textdaten mithilfe eines OpenAI-Modells einbetten.
  2. Speichervektoren: Speichern sie die eingebetteten Vektoren in einer Vektordatenbank. Sie können die eingebetteten Daten an ein Eventhouse senden, um die Vektoren zu speichern und zu verwalten.
  3. Einbettungsabfrage: Konvertieren Sie die Abfragedaten mithilfe desselben Einbettungsmodells in das Vektorformat, das zum Einbetten der gespeicherten Daten verwendet wird.
  4. Abfragevektoren: Verwenden Sie die Vektorähnlichkeitssuche, um Einträge in der Datenbank zu finden, die der Abfrage ähneln.

Eventhouse als Vektordatenbank

Im Kern der Vektorgleichheitssuche ist die Möglichkeit, Vektordaten zu speichern, indizieren und abzufragen. Eventhouses bieten eine Lösung für die Behandlung und Analyse großer Datenmengen, insbesondere in Szenarien, die Echtzeitanalysen und Untersuchungen erfordern. Diese Funktion macht Eventhouse zu einer hervorragenden Wahl zum Speichern und Durchsuchen von Vektoren.

Mit den folgenden Komponenten des Eventhouse können Sie es als Vektordatenbank verwenden:

  • Der dynamische Datentyp, der unstrukturierte Daten wie Arrays und Eigenschaftenbehälter speichern kann. Verwenden Sie diesen Datentyp, um Vektorwerte zu speichern. Sie können den Vektorwert weiter erweitern, indem Sie Metadaten im Zusammenhang mit dem ursprünglichen Objekt als separate Spalten in der Tabelle speichern.
  • Der CodierungstypVector16 zum Speichern von Vektoren von Gleitkommazahlen in einer 16-Bit-Genauigkeit. Diese Codierung verwendet Bfloat16 anstelle der standardmäßigen 64 Bits. Verwenden Sie diese Codierung, um ML-Vektoreinbettungen zu speichern, da sie die Speicheranforderungen um den Faktor vier reduziert und Vektorverarbeitungsfunktionen wie series_dot_product() und series_cosine_similarity() um Größenordnungen beschleunigt.
  • Die series_cosine_similarity Funktion, mit der Sie Vektor-Ähnlichkeitssuchen über den in Eventhouse gespeicherten Vektoren durchführen können.

Optimieren für die Skalierung

Weitere Informationen zum Optimieren der Vektorähnlichkeitssuche finden Sie im Blog.

Führen Sie die folgenden Schritte aus, um die Leistung und die resultierenden Suchzeiten zu maximieren:

  1. Legen Sie die Codierung der Spalte "Einbettungen" auf "Vector16", die 16-Bit-Codierung der Vektorkoeffizienten (anstelle der Standardversion von 64-Bit) fest.
  2. Speichern Sie die Einbettungsvektor-Tabelle auf allen Clusterknoten, wobei mindestens ein Shard pro Prozessor vorhanden ist. Führen Sie die folgenden Schritte aus, um dieses Ziel zu erreichen:
    1. Beschränken Sie die Anzahl der Einbettungsvektoren pro Shard, indem Sie den ShardEngineMaxRowCount der Sharding-Richtlinie ändern. Die Sharding-Richtlinie gleicht Daten auf allen Knoten mit mehreren Ausmaßen pro Knoten ab, sodass die Suche alle verfügbaren Prozessoren verwenden kann.
    2. Ändern Sie die RowCountUpperBoundForMerge der Zusammenführungsrichtlinie. Die Zusammenführungsrichtlinie wird benötigt, um das Zusammenfügen von Ausmaßen nach der Aufnahme zu verhindern.

Beispiel für Optimierungsschritte

Im folgenden Beispiel definieren Sie eine statische Vektortabelle zum Speichern von 1M-Vektoren. Sie definieren die Einbettungsrichtlinie als Vector16 und legen die Sharding- und Zusammenführungsrichtlinien fest, um die Tabelle für die Vektorgleichheitssuche zu optimieren. Gehen Sie in diesem Beispiel davon aus, dass der Cluster über 20 Knoten verfügt und jeder Knoten über 16 Prozessoren verfügt. Die Partitionen der Tabelle sollten höchstens 1.000.000/(20*16)=3.125 Zeilen enthalten.

  1. Führen Sie die folgenden KQL-Befehle einzeln aus, um die leere Tabelle zu erstellen und die erforderlichen Richtlinien und Codierung festzulegen:

    .create table embedding_vectors(vector_id:long, vector:dynamic)                                  //  This is a sample selection of columns, you can add more columns
    
    .alter column embedding_vectors.vector policy encoding type = 'Vector16'                         // Store the coefficients in 16 bits instead of 64 bits accelerating calculation of dot product, suppress redundant indexing
    
    .alter-merge table embedding_vectors policy sharding '{ "ShardEngineMaxRowCount" : 3125 }'       // Balanced data on all nodes and, multiple extents per node so the search can use all processors 
    
    .alter-merge table embedding_vectors policy merge '{ "RowCountUpperBoundForMerge" : 3125 }'      // Suppress merging extents after ingestion
    
  2. Geben Sie die Daten in die Tabelle ein, die im vorherigen Schritt erstellt und definiert wurde.

Nächster Schritt