Freigeben über


Übersicht über Vektorsuch- und Vektorindizes im SQL-Datenbankmodul

Gilt für: SQL Server 2025 (17.x) Vorschau der Azure SQL-Datenbank azureSQL Managed InstanceSQL SQL-Datenbank in Microsoft Fabric

Vektoren sind geordnete Arrays von Zahlen (in der Regel Gleitkommazahlen), die Informationen zu einigen Daten darstellen können. Beispielsweise kann ein Bild als Vektor von Pixelwerten dargestellt werden, oder eine Textzeichenfolge kann als Vektor von ASCII-Werten dargestellt werden. Der Prozess des Umwandelns von Daten in eine Vektor wird als Vektorisierung bezeichnet.

Hinweis

Einbettungen

Einbettungen sind Vektoren, die wichtige Merkmale von Daten darstellen. Einbettungen werden häufig mithilfe eines Deep Learning-Modells gelernt, und Machine Learning- und KI-Modelle nutzen sie als Features. Einbettungen können auch semantische Ähnlichkeiten zwischen ähnlichen Konzepten erfassen. Beispielsweise lässt sich beim Generieren von Einbettungen für die Wörter person und human erwarten, dass die Einbettungen (also die Vektordarstellungen) ähnliche Werte aufweisen, da die Wörter semantisch ähnlich sind.

Azure OpenAI bietet Modelle zum Erstellen von Einbettungen aus Textdaten. Der Dienst bricht Text in Token auf und generiert Einbettungen mithilfe von Modellen, die von OpenAI vorab trainiert wurden. Weitere Informationen finden Sie unter Erstellen von Einbettungen mit Azure OpenAI.

Sobald Einbettungen generiert wurden, können sie in einer SQL Server-Datenbank gespeichert werden. Auf diese Weise können Sie die Einbettungen zusammen mit den daten speichern, die sie darstellen, und Vektorsuchabfragen durchführen, um ähnliche Datenpunkte zu finden.

Die Vektorsuche bezieht sich auf den Prozess der Suche nach allen Vektoren in einem Dataset, die einem bestimmten Abfragevektor ähneln. Daher durchsucht ein Abfragevektor für das Wort human das gesamte Dataset nach ähnlichen Vektoren und damit ähnlichen Wörtern: In diesem Beispiel sollte das Wort person als enge Übereinstimmung gefunden werden. Diese Nähe oder Der Abstand wird mithilfe einer Entfernungsmetrik wie kosinusabstand gemessen. Die näheren Vektoren sind, desto ähnlicher sind sie.

SQL Server bietet integrierte Unterstützung für Vektoren über den Vektordatentyp . Vektoren werden in einem optimierten Binärformat gespeichert, werden jedoch als JSON-Arrays zur Vereinfachung verfügbar gemacht. Jedes Element des Vektors wird mit einem Gleitkommawert mit einfacher Genauigkeit (4 Byte) gespeichert. Zusammen mit dem Datentyp gibt es dedizierte Funktionen zum Arbeiten mit Vektoren. Beispielsweise ist es möglich, den Abstand zwischen zwei Vektoren mithilfe der funktion VECTOR_DISTANCE zu finden. Die Funktion gibt einen skalaren Wert mit dem Abstand zwischen zwei Vektoren basierend auf der angegebenen Entfernungsmetrik zurück.

Da Vektoren in der Regel als Arrays von Gleitkommazahlen verwaltet werden, kann ein Vektor einfach durch das Casten eines JSON-Arrays in einen Vektordatentyp erstellt werden. Mit dem folgenden Code wird beispielsweise ein Vektor aus einem JSON-Array erstellt:

SELECT 
    CAST('[1.0, -0.2, 30]' AS VECTOR(3)) AS v1,
    CAST(JSON_ARRAY(1.0, -0.2, 30) AS VECTOR(3)) AS v2;

Oder verwenden Sie implizites Casting

DECLARE @v1 VECTOR(3) = '[1.0, -0.2, 30]';
DECLARE @v2 VECTOR(3) = JSON_ARRAY(1.0, -0.2, 30);
SELECT @v1 as v1, @v2 as v2;

Gleiches gilt für die Konvertierung eines Vektors in ein JSON-Array:

DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT 
    CAST(@v AS NVARCHAR(MAX)) AS s,
    CAST(@v AS JSON) AS j

Genaue Suche und Vektorabstand (genaue nächste Nachbarn)

Die genaue Suche, auch bekannt als k-Nearest Neighbor (k-NN) Suche, umfasst die Berechnung des Abstands zwischen einem bestimmten Vektor und allen anderen Vektoren in einem Dataset, sortieren die Ergebnisse und auswählen die nächstgelegenen Nachbarn basierend auf einer angegebenen Entfernungsmetrik. Diese Methode garantiert einen präzisen Abruf der nächsten Nachbarn, kann aber rechenintensiv sein, insbesondere für große Datasets.

Vektorabstandsfunktionen werden verwendet, um die Nähe zwischen Vektoren zu messen. Allgemeine Entfernungsmetriken sind euklidische Entfernung, Kosinusähnlichkeit und Punktprodukt. Diese Funktionen sind für die Durchführung von k-NN-Suchvorgängen und die Sicherstellung präziser Ergebnisse unerlässlich.

Die Vektorsuche "Exact Nearest Neighbor" (ENN) führt eine vollständige Entfernungsberechnung über alle indizierten Vektoren durch, um den Abruf der nächstgelegenen Nachbarn basierend auf einer angegebenen Entfernungsmetrik zu gewährleisten. Diese Methode ist zwar präzise, aber ressourcenintensiv, sodass sie für kleinere Datasets oder Szenarien geeignet ist, in denen Genauigkeit von größter Bedeutung ist.

Im SQL-Datenbankmodul können k-NN-Suchvorgänge mithilfe der VECTOR_DISTANCE-Funktion durchgeführt werden, die eine effiziente Berechnung von Entfernungen zwischen Vektoren ermöglicht und den Abruf der nächsten Nachbarn erleichtert.

Das folgende Beispiel zeigt, wie k-NN die obersten 10 ähnlichsten Vektoren zurückgibt, die in der content_vector Tabelle gespeichert sind, an den angegebenen Abfragevektor @qv.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10) id, VECTOR_DISTANCE('cosine', @qv, [content_vector]) AS distance, title
FROM [dbo].[wikipedia_articles_embeddings]
ORDER BY distance

Die Verwendung einer genauen Suche wird empfohlen, wenn Sie nicht über viele Vektoren für die Suche verfügen (weniger als 50.000 Vektoren als allgemeine Empfehlung). Die Tabelle kann viele weitere Vektoren enthalten, solange Ihre Suchprädikate die Anzahl der Vektoren verringern, die für die Nachbarsuche auf 50.000 oder weniger verwendet werden sollen.

Ungefährer Vektorindex und Vektorsuche (ungefähre Benachbarte)

Das Identifizieren aller Vektoren in der Nähe eines bestimmten Abfragevektors erfordert erhebliche Ressourcen, um den Abstand zwischen dem Abfragevektor und den in der Tabelle gespeicherten Vektoren zu berechnen. Die Suche nach allen Vektoren in der Nähe eines bestimmten Abfragevektors umfasst eine vollständige Überprüfung der Tabelle und eine signifikante CPU-Auslastung. Dies wird als "K-Nächste Nachbarn" oder "KNN"-Abfrage bezeichnet und gibt die nächstgelegenen Vektoren "k" zurück.

Vektoren werden verwendet, um ähnliche Daten für KI-Modelle zu finden, um Benutzerabfragen zu beantworten. Dies umfasst das Abfragen der Datenbank für die "k"-Vektoren, die dem Abfragevektor am nächsten sind, mithilfe von Entfernungsmetriken wie Punkt (innerem) Produkt, Kosinusähnlichkeit oder Euklidischer Entfernung.

KNN-Abfragen kämpfen häufig mit der Skalierbarkeit. Daher ist es in vielen Fällen akzeptabel, etwas Genauigkeit, insbesondere den Rückruf, gegen erhebliche Geschwindigkeitsgewinne abzuwägen. Diese Methode wird als Approximate Nearest Neighbors (ANN) bezeichnet.

Erinnerung ist ein wichtiges Konzept, mit dem jeder vertraut sein sollte, der Vektoren und Embeddings verwendet oder dies plant. Tatsächlich misst der Rückruf den Anteil der ungefähren nächsten Nachbarn, die durch den Algorithmus identifiziert werden, im Vergleich zu den genauen nächsten Nachbarn, die eine erschöpfende Suche zurückgeben würde. Daher ist es eine gute Messung der Qualität der Annäherung, die der Algorithmus tut. Ein perfekter Rückruf, der keiner Annäherung entspricht, ist 1.

Für KI-Anwendungen ist der Kompromiss ziemlich vernünftig. Da Vektoreinbettungen Konzepte bereits annähern, wirkt sich die Verwendung von ANN nicht wesentlich auf die Ergebnisse aus, vorausgesetzt, der Recall liegt nahe bei 1. Dadurch wird sichergestellt, dass die zurückgegebenen Ergebnisse den ergebnissen von KNN sehr ähnlich sind, während die Leistung erheblich verbessert und die Ressourcennutzung erheblich reduziert wird, was für betriebstechnische Datenbanken von hohem Nutzen ist.

Es ist wichtig zu verstehen, dass der Begriff "Index" bei Verwendung auf einen Vektorindex eine andere Bedeutung hat als der Index, mit dem Sie in relationalen Datenbanken arbeiten. Tatsächlich gibt ein Vektorindex ungefähre Ergebnisse zurück.

Im MSSQL-Modul basieren Vektorindizes auf dem DiskANN-Algorithmus . DiskANN basiert auf der Erstellung eines Diagramms, um schnell durch alle indizierten Vektoren zu navigieren, um die nächstgelegene Übereinstimmung mit einem bestimmten Vektor zu finden. DiskANN ist ein graphbasiertes System zum Indizieren und Durchsuchen großer Vektordatengruppen mit begrenzten Rechenressourcen. Es verwendet effizient SSDs und minimalen Arbeitsspeicher, um deutlich mehr Daten zu verarbeiten als In-Memory-Indizes, während hohe Abfragen pro Sekunde (QPS) und niedrige Latenz beibehalten werden, um ein Gleichgewicht zwischen Arbeitsspeicher, CPU- und E/A-Auslastung und Suchleistung sicherzustellen.

Eine ungefähre Suche nach den nächsten Nachbarn kann durchgeführt werden, indem zuerst ein Vektorindex mit dem T-SQL-Befehl CREATE VECTOR INDEX erstellt wird, und anschließend die VECTOR_SEARCH T-SQL-Funktion verwendet wird, um die ungefähre Suche auszuführen.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT 
    t.id, s.distance, t.title
FROM
    VECTOR_SEARCH(
        TABLE = [dbo].[wikipedia_articles_embeddings] AS t, 
        COLUMN = [content_vector], 
        SIMILAR_TO = @qv, 
        METRIC = 'cosine', 
        TOP_N = 10
    ) AS s
ORDER BY s.distance