Vorbereiten von SQL für die Vektorsuche

Abgeschlossen

Bevor Sie Vektorsuchen ausführen können, müssen Sie Vektoren in Ihrer Datenbank speichern und entscheiden, wie diese Suchen ausgeführt werden. Diese Einheit behandelt die Entwurfsentscheidungen, die Sie treffen, bevor Sie Ihre erste Vektorabfrage schreiben.

Die Vektorsuche findet Zeilen basierend auf mathematischer Ähnlichkeit statt exakter Übereinstimmungen. Um dies zu vereinfachen, speichern Sie Einbettungen als Vektoren, wählen aus, wie Ähnlichkeit gemessen werden soll, und entscheiden, ob alle Vektoren genau durchsucht werden sollen oder um einen Index für schnellere ungefähre Ergebnisse zu verwenden.

Speichern von Vektoren mit dem Vektordatentyp

SQL Server und Azure SQL-Datenbank bieten einen nativen Vektordatentyp , der zum Speichern von Einbettungen entwickelt wurde. Jeder Vektor ist ein Array von Gleitkommazahlen, die in einem optimierten Binärformat gespeichert sind, aber als JSON-Arrays zur Vereinfachung verfügbar gemacht werden.

Wenn Sie eine Vektorspalte definieren, geben Sie die Anzahl der Dimensionen an:

CREATE TABLE dbo.Products
(
    ProductID INT PRIMARY KEY,
    Name NVARCHAR(100),
    Description NVARCHAR(MAX),
    DescriptionVector VECTOR(1536) NOT NULL
);

Die Zahl in Klammern entspricht den Dimensionen, die ihr Einbettungsmodell erzeugt. Beispielsweise erzeugt das Modell text-embedding-3-small von OpenAI 1.536 Dimensionen, sodass Ihre Spalte VECTOR(1536) sein würde. Die maximal unterstützte Größe beträgt 1.998 Dimensionen.

Jedes Element wird als Gleitkommazahl mit einfacher Genauigkeit (4 Byte) gespeichert. Ein Vektor mit 1.536 Dimensionen verwendet ca. 6 KB pro Zeile. Berücksichtigen Sie beim Entwerfen der Tabelle, wie sich diese Spalte auf den Speicherplatz und den Arbeitsspeicher auswirkt, wenn Ihre Daten wachsen.

Grundlegendes zu Entfernungsmetriken

Die Vektorsuche funktioniert durch Berechnen des Abstands zwischen Vektoren. Vektoren, die enger zusammen sind, stellen ähnliche Konzepte dar. SQL Server unterstützt drei Entfernungsmetriken:

Der Kosinusabstand misst den Winkel zwischen Vektoren, wobei dessen Größe ignoriert wird. Zwei Vektoren, die in die gleiche Richtung zeigen, weisen unabhängig von ihrer Länge einen Kosinusabstand von 0 auf. Diese Metrik funktioniert gut, wenn Sie sich um die Richtung der Bedeutung kümmern, nicht um die Intensität. Kosinusabstand reicht von 0 (identisch) bis 2 (gegenüber).

Der klidische Abstand misst den geraden Abstand zwischen zwei Punkten im Vektorraum. Sie berücksichtigt sowohl Richtung als auch Größe. Euklidischer Abstand reicht von 0 (identisch) bis unendlich.

Dot-Produkt berechnet die Summe der elementweisen Produkte. SQL Server gibt das negative Punktprodukt zurück, sodass kleinere Werte ähnliche Vektoren angeben, die mit den anderen Metriken konsistent sind.

Die meisten Einbettungsmodelle sind für Kosinusgleichheit optimiert, wodurch Kosinusabstand zur gemeinsamen Wahl wird. Die beste Metrik hängt jedoch davon ab, wie Ihre Einbettungen trainiert wurden.

Für die Suche nach ähnlichen Vektoren gibt es zwei Möglichkeiten: exakte Suche nach dem nächsten Nachbarn (ENN) und ungefähre Suche nach dem nächsten Nachbarn (ANN).

Die genaue Nächste Nachbarsuche vergleicht Ihren Abfragevektor mit jedem Vektor in der Tabelle. Sie garantiert die genauesten Ergebnisse, erfordert jedoch die Berechnung des Abstands zu jeder Zeile. Verwenden Sie die VECTOR_DISTANCE Funktion für die genaue Suche:

DECLARE @query VECTOR(1536) = '[0.1, 0.2, ...]';

SELECT TOP 10 ProductID, Name,
    VECTOR_DISTANCE('cosine', @query, DescriptionVector) AS Distance
FROM dbo.Products
ORDER BY Distance;

Diese Abfrage berechnet den Kosinusabstand zwischen @query und den Zeilen DescriptionVectorund gibt dann die 10 nächstgelegenen Übereinstimmungen zurück. Für kleine Tabellen (unter 50.000 Vektoren als allgemeine Richtlinie) leistet die exakte Suche gute Ergebnisse.

Die Ungefähre Suche nach nächsten Nachbarn verwendet einen Vektorindex, um ähnliche Vektoren zu identifizieren, ohne jede Zeile zu scannen. Letztere setzt auf Geschwindigkeit anstelle von Genauigkeit und liefert Ergebnisse, die nicht garantiert die nächsten Nachbarn sind, einem solchen Ergebnis aber sehr nahe kommen.

Erstellen eines Vektorindex mithilfe von CREATE VECTOR INDEX:

CREATE VECTOR INDEX idx_Products_DescriptionVector
ON dbo.Products(DescriptionVector)
WITH (METRIC = 'cosine', TYPE = 'DiskANN');

SQL Server verwendet den DiskANN-Algorithmus, der eine Diagrammstruktur erstellt, die schnelle Navigation zu nahe gelegenen Vektoren ermöglicht. Nachdem der Index vorhanden ist, verwenden Sie die VECTOR_SEARCH-Funktion für die ungefähre Suche.

DECLARE @query VECTOR(1536) = '[0.1, 0.2, ...]';

SELECT t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.Products AS t,
    COLUMN = DescriptionVector,
    SIMILAR_TO = @query,
    METRIC = 'cosine',
    TOP_N = 10
) AS s
ORDER BY s.distance;

Entscheiden, wann jeder Ansatz verwendet werden soll

Die Wahl zwischen exakter und ungefährer Suche hängt von der Größe des Datasets und den Genauigkeitsanforderungen ab.

Verwenden Sie die genaue Suche (VECTOR_DISTANCE), wenn:

  • Ihre Tabelle hat weniger als 50.000 Vektoren.
  • Die Abfragefilter reduzieren die Kandidatenmenge auf wenige Zeilen
  • Sie benötigen garantiert genaue Ergebnisse und können längere Abfragezeiten akzeptieren.

Verwenden Sie die ungefähre Suche (VECTOR_SEARCH mit einem Index), wenn:

  • Ihre Tabelle enthält Hunderte von Tausenden oder Millionen Vektoren.
  • Abfragegeschwindigkeit ist wichtiger als perfekte Genauigkeit
  • Ein Recall-Wert um 1 (die meisten tatsächlich nächsten Nachbarn wurden gefunden) ist akzeptabel.

Recall misst, wie viele der tatsächlichen nächsten Nachbarn die ungefähre Suche im Vergleich zu einer exakten Suche liefert. DiskANN erzielt in der Regel einen hohen Recall-Wert, die Ergebnisse liegen also sehr nahe an dem, was eine exakte Suche zurückgeben würde.

Berücksichtigen Sie Indexbeschränkungen

Vektorindizes in SQL Server haben bestimmte Anforderungen, die beachtet werden müssen:

  • Die Tabelle muss einen Primärschlüssel vom Typ Ganzzahl mit nur einer Spalte und einem gruppierten Index haben.
  • Tabellen mit Vektorindizes sind schreibgeschützt, während der Index existiert. Sie müssen den Index verwerfen, um Daten ändern zu können, und ihn anschließend neu erstellen.
  • Vektorindizes können nicht partitioniert werden

Hinweis

Vektorindizes befinden sich derzeit in der Vorschau. In Azure SQL-Datenbank und in der SQL-Datenbank in Microsoft Fabric können Sie die datenbankweite Konfiguration ALLOW_STALE_VECTOR_INDEX auf ON einstellen, um Schreibvorgänge zuzulassen. Im Index werden die neuen Daten aber erst berücksichtigt, nachdem der Index neu erstellt wurde. Diese Option ist derzeit in SQL Server 2025 nicht verfügbar. Überprüfen Sie die aktuelle Dokumentation, um die neuesten Informationen zu diesen Einschränkungen zu finden.

Diese Einschränkungen wirken sich darauf aus, wie Sie Ihre Tabellen und Wartungsworkflows entwerfen. Bei Tabellen, die sich häufig ändern, können Sie die genaue Suche verwenden, bis sich die Daten stabilisiert haben, und dann einen Vektorindex hinzufügen.

Wichtige Erkenntnisse

Die Vorbereitung von SQL für die Vektorsuche bedeutet, drei Entscheidungen zu treffen: welcher Datentyp und welche Dimensionen verwendet werden sollen, welche Entfernungsmetrik ihrem Einbettungsmodell entspricht und ob die genaue oder ungefähre Suche ihrer Datasetgröße entspricht. Mit VECTOR_DISTANCE funktioniert die genaue Suche gut für kleinere Datasets oder gefilterte Abfragen, während die ungefähre Suche mit VECTOR_SEARCH und einem DiskANN-Index größere Datasets effizient verarbeitet. In der nächsten Lektion lernen Sie die spezifischen Funktionen und Abfragemuster für die Ausführung von Vektorsuchen kennen.