SQL voorbereiden op vectorzoekopdrachten
Voordat u vectorzoekopdrachten kunt uitvoeren, moet u vectoren opslaan in uw database en bepalen hoe deze zoekopdrachten worden uitgevoerd. In deze les worden de ontwerpbeslissingen behandeld die u neemt voordat u uw eerste vectorquery schrijft.
Vectorzoekopdrachten zoeken rijen op basis van wiskundige overeenkomsten in plaats van exacte overeenkomsten. Als u dit wilt doen, slaat u insluitingen op als vectoren, kiest u hoe u overeenkomsten wilt meten en bepaalt u of u alle vectoren exact wilt doorzoeken of een index wilt gebruiken voor snellere geschatte resultaten.
Vectoren opslaan met het gegevenstype Vector
SQL Server en Azure SQL Database bieden een systeemeigen vectorgegevenstype dat is ontworpen voor het opslaan van insluitingen. Elke vector is een matrix van drijvendekommanummers, opgeslagen in een geoptimaliseerde binaire indeling, maar beschikbaar gesteld als JSON-matrices voor het gemak.
Wanneer u een vectorkolom definieert, geeft u het aantal dimensies op:
CREATE TABLE dbo.Products
(
ProductID INT PRIMARY KEY,
Name NVARCHAR(100),
Description NVARCHAR(MAX),
DescriptionVector VECTOR(1536) NOT NULL
);
Het getal tussen haakjes komt overeen met de dimensies die uw insluitmodel produceert. Het text-embedding-3-small model van OpenAI produceert bijvoorbeeld 1.536 dimensies, dus uw kolom zou VECTOR(1536) zijn. Het maximale aantal ondersteunde dimensies is 1998 dimensies.
Elk element wordt opgeslagen als een float met één precisie (4 bytes). Een 1536-dimensievector gebruikt ongeveer 6 kB per rij. Houd bij het ontwerpen van uw tabel rekening met hoe deze kolom van invloed is op opslag en geheugen naarmate uw gegevens toenemen.
Inzicht in metrische gegevens over afstand
Vectorzoekopdrachten werken door de afstand tussen vectoren te berekenen. Vectoren die dichter bij elkaar staan, vertegenwoordigen meer vergelijkbare concepten. SQL Server ondersteunt drie metrische gegevens over afstand:
Cosinusafstand meet de hoek tussen vectoren, waarbij hun grootte wordt genegeerd. Twee vectoren die in dezelfde richting wijzen, hebben een cosinusafstand van 0, ongeacht hun lengte. Deze metrische waarde werkt goed wanneer u de betekenisrichting belangrijk vindt, niet de intensiteit. Cosinusafstand varieert van 0 (identiek) tot 2 (tegenovergestelde).
Euclidische afstand meet de rechte lijnafstand tussen twee punten in vectorruimte. Het beschouwt zowel de richting als de grootte. De euclidische afstand varieert van 0 (identiek) tot oneindig.
Dot-product berekent de som van elementengewijze producten. SQL Server retourneert het negatieve puntproduct, zodat kleinere waarden meer vergelijkbare vectoren aangeven, consistent met de andere metrische gegevens.
De meeste insluitingsmodellen zijn geoptimaliseerd voor cosinusgelijkenis, waardoor de cosinusafstand de gebruikelijke keuze is. De beste metrische waarde is echter afhankelijk van hoe uw insluitingen zijn getraind.
Kiezen tussen exacte en geschatte zoekopdrachten
Wanneer u zoekt naar vergelijkbare vectoren, hebt u twee opties: exact dichtstbijzijnde buren (ENN) zoeken en bij benadering dichtstbijzijnde buren (ANN) zoeken.
De exacte dichtstbijzijnde buurzoekopdracht vergelijkt uw queryvector met elke vector in de tabel. Het garandeert de meest nauwkeurige resultaten, maar vereist het berekenen van de afstand tot elke rij. Gebruik de VECTOR_DISTANCE functie voor exacte zoekopdrachten:
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;
Met deze query wordt de cosinusafstand tussen @query en elke rij DescriptionVectorberekend, waarna de 10 dichtstbijzijnde overeenkomsten worden geretourneerd. Voor kleine tabellen (minder dan 50.000 vectoren als algemene richtlijn) presteert de exacte zoekopdracht goed.
Bij benadering van dichtstbijzijnde buren wordt een vectorindex gebruikt om vergelijkbare vectoren te vinden zonder elke rij te scannen. Het ruilt perfecte nauwkeurigheid in voor snelheid en geeft resultaten die heel dicht bij exact zijn, maar niet gegarandeerd de allerbeste buren zijn.
Een vectorindex maken met behulp van CREATE VECTOR INDEX:
CREATE VECTOR INDEX idx_Products_DescriptionVector
ON dbo.Products(DescriptionVector)
WITH (METRIC = 'cosine', TYPE = 'DiskANN');
SQL Server maakt gebruik van het DiskANN-algoritme, waarmee een grafiekstructuur wordt gebouwd waarmee snelle navigatie naar vectoren in de buurt mogelijk is. Zodra de index bestaat, gebruikt u de VECTOR_SEARCH functie voor bij benadering zoeken:
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;
Bepalen wanneer u elke benadering wilt gebruiken
De keuze tussen exacte en geschatte zoekopdrachten is afhankelijk van de grootte en nauwkeurigheidsvereisten van uw gegevensset.
Gebruik een exacte zoekopdracht (VECTOR_DISTANCE-methode) wanneer:
- De tabel bevat minder dan 50.000 vectoren
- Met uw queryfilters wordt de kandidaatset gereduceerd tot een paar rijen
- U hebt gegarandeerde nauwkeurige resultaten nodig en kunt langere querytijden accepteren
Gebruik benaderend zoeken (VECTOR_SEARCH met een index) als:
- Uw tabel bevat honderdduizenden of miljoenen vectoren
- Querysnelheid is belangrijker dan perfecte nauwkeurigheid
- Een terugroepingsniveau dicht bij 1 (wat betekent dat de meeste nabije buren worden gevonden) is acceptabel
Herinnering meet hoeveel van de werkelijke dichtstbijzijnde buren de geschatte zoekopdracht oplevert in vergelijking met een exacte zoekopdracht. DiskANN behaalt doorgaans een hoge recall, wat betekent dat de resultaten zeer dicht bij de uitkomsten van exact zoeken liggen.
Indexbeperkingen overwegen
Vectorindexen in SQL Server hebben specifieke vereisten om rekening mee te houden:
- De tabel moet een primaire sleutel met één kolom bevatten met een geclusterde index
- Tabellen met vectorindexen worden alleen-lezen zolang de index bestaat—u moet de index verwijderen om gegevens te wijzigen en dan opnieuw aanmaken.
- Vectorindexen kunnen niet worden gepartitioneerd
Opmerking
Vectorindexen zijn momenteel beschikbaar als preview-versie. In Azure SQL Database en SQL Database in Microsoft Fabric kunt u de ALLOW_STALE_VECTOR_INDEX configuratie met databasebereik instellen om ON schrijfbewerkingen toe te staan, maar de index geeft pas nieuwe gegevens weer nadat u deze opnieuw hebt opgebouwd. Deze optie is momenteel niet beschikbaar in SQL Server 2025. Raadpleeg de huidige documentatie voor de meest recente over deze beperkingen.
Deze beperkingen zijn van invloed op hoe u uw tabellen en onderhoudswerkstromen ontwerpt. Voor tabellen die regelmatig veranderen, kunt u exacte zoekopdrachten gebruiken totdat de gegevens worden gestabiliseerd en vervolgens een vectorindex toevoegen.
Belangrijke punten
Het voorbereiden van SQL voor vectorzoekopdrachten betekent drie beslissingen: welk gegevenstype en welke dimensies moeten worden gebruikt, welke metrische afstand overeenkomt met uw insluitingsmodel en of exact of bij benadering zoeken past bij de grootte van uw gegevensset. Exacte zoekopdrachten met VECTOR_DISTANCE werken goed voor kleinere gegevenssets of gefilterde query's, terwijl bij benadering zoeken met VECTOR_SEARCH en een DiskANN-index grotere gegevenssets efficiënt verwerkt. In de volgende les leert u de specifieke functies en querypatronen voor het uitvoeren van vectorzoekopdrachten.