Implementieren von Vektorsuchabfragemustern

Abgeschlossen

Wenn Vektoren gespeichert und eine Suchstrategie ausgewählt wurden, können Sie Abfragen schreiben. Diese Einheit deckt die T-SQL-Funktionen ab, die die Vektorsuche ermöglichen, und zeigt Ihnen, wie Sie sie effektiv kombinieren können.

Vektorsuchabfragen folgen einem allgemeinen Muster: Generieren oder Abrufen eines Abfragevektors, Berechnen von Entfernungen zu gespeicherten Vektoren und Zurückgeben der nächstgelegenen Übereinstimmungen. SQL Server bietet vier Funktionen, die zusammen arbeiten, um dieses Muster zu unterstützen: VECTOR_DISTANCE, , VECTOR_SEARCH, VECTOR_NORMALIZEund VECTORPROPERTY.

Berechnen von Abständen mit VECTOR_DISTANCE

Die VECTOR_DISTANCE Funktion berechnet den Abstand zwischen zwei Vektoren mithilfe der von Ihnen angegebenen Metrik. Diese Funktion führt eine exakte Suche nach dem nächsten Nachbarn durch und berechnet die Entfernung zu jeder qualifizierten Zeile. In der Praxis vergleicht es Ihr Such-Embedding mit jedem gespeicherten Embedding, um zu ermitteln, welche am ähnlichsten sind, wie etwa jedes Produkt in einem Katalog zu überprüfen, um die besten Übereinstimmungen zu finden.

VECTOR_DISTANCE(metric, vector1, vector2)

Die Metrik muss 'cosine', 'euclidean' oder 'dot'. Beide Vektoren müssen dieselbe Anzahl von Dimensionen aufweisen.

Hier ist ein typisches Muster für die Suche nach ähnlichen Produkten basierend auf einer Beschreibungseinbettung:

-- Generate an embedding for the user's search phrase
DECLARE @searchVector VECTOR(1536);
SELECT @searchVector = AI_GENERATE_EMBEDDINGS('lightweight hiking boots' USE MODEL MyEmbeddingModel);

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

Diese Abfrage funktioniert in zwei Schritten. Zunächst konvertiert das System den Suchbegriff "leichte Wanderschuhe" in ein Embedding mit demselben Modell, das die gespeicherten DescriptionVector Werte erstellt hat. Zweitens berechnet sie den Kosinusabstand zwischen @searchVector und den Zeilen DescriptionVector. Die ORDER BY Distance Klausel sortiert die Ergebnisse von der kleinsten Entfernung (am ähnlichsten) zum größten und TOP 10 gibt nur die ersten 10 Zeilen zurück. Da kleinere Entfernungen ähnliche Vektoren bedeuten, ergibt diese Kombination die 10 Produkte, die semantisch am stärksten mit "leichtgewichtigen Wanderschuhen" zusammenhängen.

Sie können auch in einer WHERE-Klausel verwenden VECTOR_DISTANCE , um alle Vektoren innerhalb eines bestimmten Entfernungsschwellenwerts zu finden:

SELECT ProductID, Name
FROM dbo.Products
WHERE VECTOR_DISTANCE('cosine', @searchVector, DescriptionVector) < 0.3
ORDER BY VECTOR_DISTANCE('cosine', @searchVector, DescriptionVector);

Bei diesem Ansatz werden alle Produkte innerhalb eines Ähnlichkeitsschwellenwerts gefunden, anstatt eine feste Anzahl zurückzugeben. Der 0,3-Wert hier ist nur ein Beispiel. Der Kosinusabstand reicht von 0 (identische Vektoren) bis 2 (vollständig entgegengesetzt), aber was als "ähnlich genug" zählt, hängt vollständig von Ihren Daten und dem Einbettungsmodell ab. Um den richtigen Schwellenwert zu finden, führen Sie Testabfragen aus, untersuchen Sie die Entfernungswerte in Ihren Ergebnissen, und identifizieren Sie, wo relevante Ergebnisse beendet werden, und das Rauschen beginnt. Verwenden Sie dieses Muster, wenn Sie möchten, dass alles eine Qualitätsleiste statt eine feste Anzahl von Ergebnissen erfüllt.

Verwenden Sie VECTOR_SEARCH für die ungefähre Abfrage.

Wenn Ihre Tabelle über zehntausend Zeilen hinauswächst, wird die Berechnung von Abständen zu jeder Zeile langsam. Die VECTOR_SEARCH Funktion verwendet einen Vektorindex, um ungefähre Nachbarn schnell zu finden.

VECTOR_SEARCH(
    TABLE = object AS alias,
    COLUMN = vector_column,
    SIMILAR_TO = query_vector,
    METRIC = 'cosine' | 'euclidean' | 'dot',
    TOP_N = k
)

Diese Funktion gibt ein Resultset zurück, das alle Spalten aus der Quelltabelle sowie eine distance Spalte enthält. Hier erfahren Sie, wie Sie es verwenden:

DECLARE @searchVector VECTOR(1536);
SELECT @searchVector = AI_GENERATE_EMBEDDINGS('lightweight hiking boots' USE MODEL MyEmbeddingModel);

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

Die Funktion gibt die ungefähren 10 nächsten Nachbarn zurück. Wenn ein übereinstimmender Vektorindex mit derselben Metrik auf DescriptionVector vorhanden ist, nutzt VECTOR_SEARCH ihn für den schnellen Abruf. Ohne einen Index greift das System auf eine genaue Suche zurück und gibt eine Warnmeldung aus.

Behandeln Sie die Nachfilterung sorgfältig

VECTOR_SEARCH wendet alle WHERE-Klauselbedingungen an, nachdem die nächsten Nachbarn gefunden wurden, nicht vorher. Angenommen, die folgende Abfrage wird ausgeführt:

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

Diese Abfrage findet zuerst die 10 nächstgelegenen Vektoren in allen Kategorien und filtert dann nur nach Kategorie 5. Wenn keine der 10 nächstgelegenen Produkte in kategorie 5 enthalten ist, erhalten Sie keine Ergebnisse. Um dieses Problem zu umgehen, fordern Sie mehr Kandidaten an, als Sie benötigen:

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

Indem Sie 50 Kandidaten von VECTOR_SEARCH anfordern und nach dem Filtern die Top 10 auswählen, erhöhen Sie die Wahrscheinlichkeit, genügend Ergebnisse in der Zielkategorie zu haben.

Normalisieren von Vektoren für konsistente Vergleiche

Verschiedene Einbettungsmodelle erzeugen Vektoren mit unterschiedlichen Längen (Größen). Wenn Sie Vektoren aus mehreren Quellen vergleichen oder wenn Ihr Modell die Ausgaben nicht normalisiert, können Sie VECTOR_NORMALIZE verwenden, um Vektoren auf die Länge eins zu skalieren.

VECTOR_NORMALIZE(vector, norm_type)

Dies norm_type kann sein:

  • 'norm2': Euklidische Norm (am häufigsten)
  • 'norm1': Summe der absoluten Werte
  • 'norminf': Maximaler Absoluter Wert
DECLARE @v VECTOR(3) = '[3, 4, 0]';
SELECT VECTOR_NORMALIZE(@v, 'norm2') AS NormalizedVector;
-- Returns: [0.6, 0.8, 0.0]

Durch die Normalisierung wird sichergestellt, dass sich Kosinusabstand und Punktprodukt konsistent verhalten. Die meisten modernen Einbettungsmodelle (wie solche aus OpenAI) erzeugen normalisierte Vektoren, daher benötigen Sie diesen Schritt häufig nicht. Wenn Sie jedoch mit Einbettungen aus Modellen arbeiten, die keine Normalisierung durchführen, stellt das Anwenden von VECTOR_NORMALIZE vor dem Speichern oder Vergleichen sicher, dass konsistente Ähnlichkeitsergebnisse erzielt werden.

Sie können die Größe eines Vektors mithilfe der zugehörigen VECTOR_NORM Funktion berechnen:

DECLARE @v VECTOR(3) = '[3, 4, 0]';
SELECT VECTOR_NORM(@v, 'norm2') AS Magnitude;
-- Returns: 5.0

Überprüfen von Vektoren mit VECTORPROPERTY

Die VECTORPROPERTY Funktion gibt Metadaten zu einem Vektor zurück. Diese Metadaten sind hilfreich zum Überprüfen von Daten oder Debuggen von Dimensionskonflikten.

VECTORPROPERTY(vector, property)

Zwei Eigenschaften werden unterstützt:

  • 'Dimensions': Gibt die Anzahl der Dimensionen als ganze Zahl zurück.
  • 'BaseType': Gibt den Datentypnamen (derzeit immer) zurück float.
DECLARE @v VECTOR(1536) = '[0.1, 0.2, ...]';
SELECT VECTORPROPERTY(@v, 'Dimensions') AS Dims;
-- Returns: 1536

Diese Funktion hilft bei der Problembehandlung bei Abfragen, bei denen Vektoren möglicherweise nicht übereinstimmende Dimensionen aufweisen – ein häufiges Problem, wenn verschiedene Einbettungsmodelle verwendet werden.

Wählen Sie die richtige Funktion für Ihr Szenario aus.

Jede Funktion dient einem bestimmten Zweck in der Vektorsuche:

Scenario Funktion Wann verwenden
Kleine Datasets oder gefilterte Abfragen VECTOR_DISTANCE Unter 50.000 Vektoren oder wenn eine WHERE-Klausel kandidaten erheblich reduziert
Großes Dataset mit Vektorindex VECTOR_SEARCH Hunderte von Tausenden von Vektoren oder mehr, wenn Geschwindigkeit wichtig ist
Vergleichen von Vektoren aus verschiedenen Modellen VECTOR_NORMALIZE Wenn die eingebetteten Quellen variieren oder das Modell keine normalisierten Vektoren erzeugt.
Überprüfen von Vektordaten VECTORPROPERTY Überprüfen von Dimensionen während der Problembehandlung oder Datenüberprüfung

Wichtige Erkenntnisse

Vektorsuchabfragen in SQL folgen einem Muster: Abfragevektor vorbereiten, Nachbarn entweder mit VECTOR_DISTANCE (exakt) oder mit VECTOR_SEARCH (ungefähr) suchen und nach Entfernung sortieren. VECTOR_NORMALIZE und VECTORPROPERTY unterstützen die Datenqualität und -konsistenz. Denken Sie daran, dass VECTOR_SEARCH Filter erst nach dem Auffinden der nächsten Nachbarn anwendet. Daher sollten Sie mehr Kandidaten anfordern, als Sie benötigen, wenn Sie mit WHERE-Klauseln kombinieren. In der nächsten Lektion erfahren Sie, wie Sie die Vektorsuche mit der Volltextsuche in Hybridabfragen kombinieren.