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 Vektoren mit fortgeschrittenen Techniken wie Vektorähnlichkeitssuche, Quantisierung und Clustering verglichen und analysiert werden 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. Vektoren werden mit einer Entfernungsmetrik verglichen, z. B. euklidischer Abstand 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. Einbettungen werden mithilfe von Algorithmen erstellt, 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 zwar mit Standard-Python-Paketen (z. B. spaCy, sent2vec, Gensim) erstellt werden, aber große Sprachmodelle (LLM) generieren höchste Qualitätseinbettungen für die Semantiktextsuche. Sie können beispielsweise Text an ein Einbettungsmodell in Azure OpenAI senden und eine Vektordarstellung generieren, die für die Analyse gespeichert werden kann. Weitere Informationen finden Sie unter Grundlegendes zu Einbettungen in Azure OpenAI Service.
Allgemeiner Workflow
Der allgemeine Workflow für die Verwendung einer Vektordatenbank lautet wie folgt:
- Einbetten von Daten: Konvertieren von Daten in das Vektorformat mithilfe eines Einbettungsmodells. Beispielsweise können Sie Textdaten mithilfe eines OpenAI-Modells einbetten.
- 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.
- Einbettungsabfrage: Konvertieren Sie die Abfragedaten mithilfe desselben Einbettungsmodells in das Vektorformat, das zum Einbetten der gespeicherten Daten verwendet wird.
- Abfragevektoren: Verwenden Sie die Vektorähnlichkeitssuche, um Einträge in der Datenbank zu finden, die der Abfrage ähneln.
Eventhouse als Vektordatenbank
Kern der Vektorähnlichkeitssuche ist die Möglichkeit, Vektordaten zu speichern, zu indexieren und abzufragen. Eventhouses bieten eine Lösung für die Behandlung und Analyse großer Datenmengen, insbesondere in Szenarien, die Echtzeitanalysen und Untersuchungen erfordern und eignen sich daher hervorragend für die Speicherung und Suche von Vektoren.
Die folgenden Komponenten des ermöglichen die Verwendung von Eventhouse einer Vektordatenbank:
- Der dynamische Datentyp, der unstrukturierte Daten wie Arrays und Eigenschaftenbehälter speichern kann. Daher wird der Datentyp zum Speichern von Vektorwerten empfohlen. 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 Codierungstyp
Vector16
ist für die Speicherung von Vektoren mit Gleitkommazahlen in 16-Bit-Präzision konzipiert, wobeiBfloat16
anstelle der standardmäßigen 64 Bit verwendet wird. Diese Codierung wird empfohlen, um ML-Vektoreinbettungen zu speichern, da sie die Speicheranforderungen um einen Faktor von vier reduziert und Vektorverarbeitungsfunktionen wie series_dot_product() und series_cosine_similarity() um Größenordnungen beschleunigt. - Die series_cosine_similarity-Funktion, die Vektorgleichheitssuchen über den in Eventhouse gespeicherten Vektoren ausführen kann.
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:
- Legen Sie die Codierung der Spalte "Einbettungen" auf "Vector16", die 16-Bit-Codierung der Vektorkoeffizienten (anstelle der Standardversion von 64-Bit) fest.
- Speichern Sie die Tabelle "Einbettungsvektoren" auf allen Clusterknoten mit mindestens einem Shard pro Prozessor, der durch die folgenden Schritte ausgeführt wird:
- 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.
- Ändern Sie die RowCountUpperBoundForMerge der zusammenführenden Richtlinie. Die Zusammenführungsrichtlinie ist erforderlich, um das Zusammenführen von Ausmaßen nach der Aufnahme zu unterdrücken.
Beispiel für Optimierungsschritte
Im folgenden Beispiel wird eine statische Vektortabelle zum Speichern von 1M-Vektoren definiert. Die Einbettungsrichtlinie wird als Vector16 definiert, und die Richtlinien für das horizontale Partitionieren und die Zusammenführung werden so festgelegt, dass die Tabelle für die Vektorähnlichkeitssuche optimiert wird. Angenommen, der Cluster verfügt über 20 Knoten mit jeweils 16 Prozessoren. Die Shards der Tabelle sollten höchstens 1000000/(20*16)=3125 Zeilen enthalten.
Die folgenden KQL-Befehle werden einzeln ausgeführt, 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
Geben Sie die Daten in die Tabelle ein, die im vorherigen Schritt erstellt und definiert wurde.