Vectorzoekquerypatronen implementeren

Voltooid

Als vectoren zijn opgeslagen en een zoekstrategie zijn gekozen, kunt u query's schrijven. In deze unit worden de T-SQL-functies behandeld die vectorzoekopdrachten mogelijk maken en laat zien hoe u ze effectief kunt combineren.

Vectorzoekquery's volgen een gemeenschappelijk patroon: een queryvector genereren of ophalen, afstanden berekenen tot opgeslagen vectoren en de dichtstbijzijnde overeenkomsten retourneren. SQL Server biedt vier functies die samenwerken om dit patroon te ondersteunen: VECTOR_DISTANCE, VECTOR_SEARCH, VECTOR_NORMALIZEen VECTORPROPERTY.

Afstanden berekenen met VECTOR_DISTANCE

De VECTOR_DISTANCE functie berekent de afstand tussen twee vectoren met behulp van de metrische waarde die u opgeeft. Met deze functie wordt exact de dichtstbijzijnde buren gezocht, waarbij de afstand tot elke in aanmerking komende rij wordt berekend. In praktische termen vergelijkt het uw zoekinsluiting met elke opgeslagen insluiting om te vinden welke het meest vergelijkbaar zijn, zoals het controleren van elk product in een catalogus om de beste overeenkomsten te vinden.

VECTOR_DISTANCE(metric, vector1, vector2)

De metrische waarde moet 'cosine'zijn, 'euclidean'of 'dot'. Beide vectoren moeten hetzelfde aantal dimensies hebben.

Dit is een typisch patroon voor het zoeken naar vergelijkbare producten op basis van een beschrijvingsembedding.

-- 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;

Deze query werkt in twee stappen. Eerst wordt de zoekterm 'lichtgewicht wandelschoenen' geconverteerd naar een insluiting met hetzelfde model dat de opgeslagen DescriptionVector waarden heeft gemaakt. Ten tweede wordt de cosinusafstand tussen @searchVector en elke rij DescriptionVectorberekend. De ORDER BY Distance clausule sorteert de resultaten van de kleinste afstand (meest vergelijkbaar) naar grootste, en TOP 10 retourneert alleen de eerste 10 rijen. Omdat kleinere afstanden meer vergelijkbare vectoren betekenen, geeft deze combinatie u de 10 producten die het meest semantisch gerelateerd zijn aan "lichtgewicht wandelschoenen."

U kunt ook in een WHERE-component gebruiken VECTOR_DISTANCE om alle vectoren binnen een bepaalde afstandsdrempel te vinden:

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

Deze benadering vindt alle producten binnen een drempelwaarde voor overeenkomsten in plaats van een vast aantal te retourneren. De waarde 0,3 is hier slechts een voorbeeld. De cosinusafstand varieert van 0 (identieke vectoren) tot 2 (volledig tegenovergestelde), maar wat telt als 'vergelijkbaar genoeg', hangt volledig af van uw gegevens en het insluiten van het model. Als u de juiste drempelwaarde wilt vinden, voert u testquery's uit, bekijkt u de afstandswaarden in uw resultaten en identificeert u waar relevante resultaten stoppen en de ruis begint. Gebruik dit patroon als u wilt dat alles voldoet aan een kwaliteitsbalk in plaats van een vast aantal resultaten.

Gebruik VECTOR_SEARCH voor benaderende ophaling

Wanneer uw tabel groter wordt dan tienduizenden rijen, wordt het berekenen van afstanden naar elke rij traag. De VECTOR_SEARCH functie maakt gebruik van een vectorindex om snel dichtstbijzijnde buren te vinden.

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

Deze functie retourneert een resultatenset met alle kolommen uit de brontabel plus een distance kolom. U kunt het als volgt gebruiken:

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;

De functie retourneert ongeveer de 10 dichtstbijzijnde buren. Als er een overeenkomende vectorindex met dezelfde metrische waarde bestaat op DescriptionVector, gebruikt VECTOR_SEARCH deze voor snel ophalen. Zonder een index valt deze terug op exact zoeken en wordt een waarschuwing weergegeven.

Nafiltering zorgvuldig afhandelen

VECTOR_SEARCH voegt eventuele WHERE-voorwaarden toe na het vinden van de dichtstbijzijnde buren, niet vóór. Houd rekening met deze query:

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;

Met deze query worden eerst de 10 dichtstbijzijnde vectoren in alle categorieën gevonden en vervolgens gefilterd op alleen categorie 5. Als geen van de 10 dichtstbijzijnde producten zich in categorie 5 bevindt, krijgt u geen resultaten. Als u dit probleem wilt omzeilen, vraagt u meer kandidaten aan dan u nodig hebt:

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;

Door 50 kandidaten aan te vragen bij VECTOR_SEARCH en vervolgens de beste 10 te selecteren na het filteren, heeft u waarschijnlijk voldoende resultaten in de doelcategorie.

Vectoren normaliseren voor consistente vergelijkingen

Verschillende insluitmodellen produceren vectoren met verschillende lengten (magnitudes). Wanneer u vectoren uit meerdere bronnen vergelijkt of wanneer uw model geen uitvoer normaliseert, kunt u vectoren VECTOR_NORMALIZE schalen naar eenheidslengte.

VECTOR_NORMALIZE(vector, norm_type)

Dit norm_type kan het volgende zijn:

  • 'norm2': Euclidische norm (meest voorkomende)
  • 'norm1': Som van absolute waarden
  • 'norminf': maximale absolute waarde
DECLARE @v VECTOR(3) = '[3, 4, 0]';
SELECT VECTOR_NORMALIZE(@v, 'norm2') AS NormalizedVector;
-- Returns: [0.6, 0.8, 0.0]

Normaliseren zorgt ervoor dat cosinusafstand en puntproduct zich consistent gedragen. De meeste moderne insluitingsmodellen (zoals die van OpenAI) produceren genormaliseerde vectoren, zodat u deze stap vaak niet nodig hebt. Maar als u werkt met embeddings van modellen die niet normaliseren, zorgt toepassen van VECTOR_NORMALIZE voordat u opslaat of vergelijkt voor consistente overeenkomstscores.

U kunt de grootte van een vector berekenen met behulp van de gerelateerde VECTOR_NORM functie:

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

Vectoren inspecteren met VECTORPROPERTY

De VECTORPROPERTY functie retourneert metagegevens over een vector. Deze metagegevens zijn handig voor het valideren van gegevens of het opsporen van fouten in dimensies.

VECTORPROPERTY(vector, property)

Er worden twee eigenschappen ondersteund:

  • 'Dimensions': geeft als resultaat het aantal dimensies als een geheel getal
  • 'BaseType': retourneert de naam van het gegevenstype (momenteel altijd float)
DECLARE @v VECTOR(1536) = '[0.1, 0.2, ...]';
SELECT VECTORPROPERTY(@v, 'Dimensions') AS Dims;
-- Returns: 1536

Deze functie helpt bij het oplossen van problemen met query's waarbij vectoren mogelijk niet overeenkomende dimensies hebben: een veelvoorkomend probleem wanneer verschillende insluitingsmodellen worden gebruikt.

De juiste functie kiezen voor uw scenario

Elke functie dient een uniek doel in vectorzoekopdrachten:

Scenario Functie Wanneer te gebruiken
Kleine gegevensset of gefilterde query's VECTOR_DISTANCE Minder dan 50.000 vectoren of wanneer een WHERE-component kandidaten aanzienlijk vermindert
Grote gegevensset met vectorindex VECTOR_SEARCH Honderdduizenden vectoren of meer, wanneer snelheid belangrijk is
Vectoren van verschillende modellen vergelijken VECTOR_NORMALIZE Wanneer het insluiten van bronnen varieert of het model geen genormaliseerde vectoren produceert
Vectorgegevens valideren VECTORPROPERTY Dimensies controleren tijdens probleemoplossing of gegevensvalidatie

Belangrijke punten

Vectorzoekopdrachten in SQL volgen een voorspelbaar patroon: bereid een queryvector voor, zoek buren met behulp van VECTOR_DISTANCE (exact) of VECTOR_SEARCH (bij benadering) en sorteer op afstand. VECTOR_NORMALIZE en VECTORPROPERTY ondersteuning bieden voor de kwaliteit en consistentie van gegevens. Houd er rekening mee dat VECTOR_SEARCH filters worden toegepast na het vinden van dichtstbijzijnde buren, dus vraag meer kandidaten aan dan u nodig hebt bij het combineren met WHERE-componenten. In de volgende les leert u hoe u vectorzoekopdrachten combineert met zoeken in volledige tekst in hybride query's.