Dela via


Vektorsökning och vektorindex i SQL Database Engine

Gäller för: SQL Server 2025 (17.x) Förhandsversion Azure SQL DatabaseAzure SQL Managed InstanceFörhandsversion av SQL-databas för Microsoft Fabric

SQL Database Engine ger möjlighet att lagra alla typer av data och köra alla typer av frågor: strukturerade och ostrukturerade och att utföra vektorsökning på dessa data. Det är ett bra val för scenarier där du behöver söka efter alla dessa data tillsammans och du inte vill använda en separat tjänst för sökning som skulle komplicera din arkitektur.

Anmärkning

  • Vektorfunktioner är tillgängliga i Azure SQL Managed Instance som konfigurerats med SQL Server 2025- eller Always-up-to-datumuppdateringsprincipen.

Vectors

Vektorer är ordnade matriser med tal (vanligtvis flyttal) som kan representera information om vissa data. En bild kan till exempel representeras som en vektor med pixelvärden, eller så kan en textsträng representeras som en vektor med ASCII-värden. Processen för att omvandla data till en vektor kallas vektorisering. Vektordatatypen i SQL Server är utformad för att lagra dessa talmatriser effektivt.

Inbäddningar

Inbäddningar är vektorer som representerar viktiga datafunktioner. Inbäddningar lärs ofta med hjälp av en djupinlärningsmodell, och maskininlärnings- och AI-modeller använder dem som funktioner. Inbäddningar kan också fånga semantisk likhet mellan liknande begrepp. När vi till exempel genererar en inbäddning för orden person och humanförväntar vi oss att deras inbäddningar (vektorrepresentation) är liknande i värde eftersom orden också är semantiskt lika.

Azure OpenAI har modeller för att skapa inbäddningar från textdata. Tjänsten delar upp texten i tokener och genererar inbäddningar med hjälp av modeller som förtränade av OpenAI. Mer information finns i Skapa inbäddningar med Azure OpenAI.

När inbäddningar har genererats kan de lagras i en SQL Server-databas. På så sätt kan du lagra inbäddningarna tillsammans med de data de representerar och utföra vektorsökningsfrågor för att hitta liknande datapunkter.

Vektorsökning syftar på processen att hitta alla vektorer i en datamängd som liknar en specifik frågevektor. Därför söker en frågevektor för ordet human hela datamängden efter liknande vektorer och därmed liknande ord: i det här exemplet bör ordet person hittas som en nära matchning. Den här närheten, eller avståndet, mäts med hjälp av ett avståndsmått, till exempel cosinnavstånd. Ju närmare vektorer är, desto mer lika är de.

SQL Server har inbyggt stöd för vektorer via vektor datatyp. Vektorer lagras i ett optimerat binärt format men exponeras som JSON-matriser för enkelhetens skull. Varje element i vektorn lagras med hjälp av flyttalsvärde med enkel precision (4 byte). Tillsammans med datatypen finns dedikerade funktioner för att arbeta med vektorer. Det går till exempel att hitta avståndet mellan två vektorer med hjälp av funktionen VECTOR_DISTANCE . Funktionen returnerar ett skalärt värde med avståndet mellan två vektorer baserat på det avståndsmått som du anger.

Eftersom vektorer vanligtvis hanteras som matriser med flyttal kan du skapa en vektor genom att helt enkelt gjuta en JSON-matris till en vektor datatyp. Följande kod skapar till exempel en vektor från en JSON-matris:

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;

Eller använd implicit gjutning

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;

Samma sak gäller för konvertering av en vektor till en JSON-matris:

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

Exakt sök- och vektoravstånd (exakt närmaste grannar)

Exakt sökning, även kallat k-nearest neighbor(k-NN) sökning, innebär att beräkna avståndet mellan en viss vektor och alla andra vektorer i en datamängd, sortera resultaten och välja närmaste grannar baserat på ett angivet avståndsmått. Den här metoden garanterar exakt hämtning av närmaste grannar men kan vara beräkningsintensiv, särskilt för stora datamängder.

Vektoravståndsfunktioner används för att mäta närheten mellan vektorer. Vanliga avståndsmått är euklidiska avstånd, cosinuslikhet och punktprodukt. Dessa funktioner är viktiga för att utföra k-NN-sökningar och säkerställa korrekta resultat.

Exakt närmsta grannvektorsökning (ENN) utför en fullständig avståndsberäkning över alla indexerade vektorer för att garantera hämtningen av närmaste grannar baserat på ett angivet avståndsmått. Den här metoden är exakt men resursintensiv, vilket gör den lämplig för mindre datamängder eller scenarier där noggrannhet är av största vikt.

I SQL Database Engine kan k-NN-sökningar utföras med hjälp av funktionen VECTOR_DISTANCE , vilket möjliggör effektiv beräkning av avstånd mellan vektorer och underlättar hämtningen av närmaste grannar.

I följande exempel visas hur du gör k-NN för att returnera de 10 mest liknande vektorerna som lagras i content_vector tabellen till den angivna frågevektorn @qv.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(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

Du rekommenderar att du använder en exakt sökning när du inte har många vektorer att söka efter (mindre än 50 000 vektorer som en allmän rekommendation). Tabellen kan innehålla många fler vektorer så länge dina sökpredikat minskar antalet vektorer som ska användas för grannsökning till 50 000 eller färre.

Ungefärlig vektorindex och vektorsökning (ungefärlig närmsta grannar)

Anmärkning

Ungefärlig vektorindex- och vektorsökning är i förhandsversion och är för närvarande endast tillgängligt i förhandsversionen av SQL Server 2025 (17.x).

För att identifiera alla vektorer nära en viss frågevektor krävs betydande resurser för att beräkna avståndet mellan frågevektorn och de vektorer som lagras i tabellen. Sökning efter alla vektorer nära en viss frågevektor innebär en fullständig genomsökning av tabellen och betydande CPU-användning. Detta kallas "K-närmaste grannar" eller "k-NN"-fråga och returnerar "k" närmaste vektorer.

Vektorer används för att hitta liknande data för AI-modeller för att besvara användarfrågor. Detta innebär att databasen frågas efter de "k" vektorerna närmast frågevektorn med hjälp av avståndsmått som inre produkt, cosinuslikhet eller euklidiskt avstånd.

K-NN-sökfrågor kämpar ofta med skalbarhet, vilket gör det i många fall acceptabelt att kompromissa något med precisionen, speciellt återkallningen, för att uppnå avsevärda hastighetsvinster. Den här metoden kallas ungefärliga närmaste grannar (ANN).

Återkallande är ett viktigt begrepp som alla som använder eller planerar att använda vektorer och inbäddningar bör bli bekanta med. I själva verket mäter recall andelen av de ungefärliga närmaste grannarna som identifieras av algoritmen, jämfört med de exakta närmaste grannar som en fullständig sökning skulle returnera. Därför är det ett bra mått på kvaliteten på uppskattningen som algoritmen gör. En perfekt erindring, vilket innebär ingen approximation, är 1.

För AI-program är kompromissen ganska rimlig. Eftersom vektorinbäddningar redan approximera begrepp, påverkar användningen av ANN inte resultaten nämnvärt, förutsatt att återkallelsen är nära 1. Detta säkerställer att de returnerade resultaten är mycket lika dem från k-NN, samtidigt som de ger mycket bättre prestanda och avsevärt minskad resursanvändning, vilket är mycket fördelaktigt för driftdatabaser.

Det är viktigt att förstå att termen "index" när den används för att referera till ett vektorindex har en annan betydelse än det index som du är van vid att arbeta med i relationsdatabaser. I själva verket returnerar ett vektorindex ungefärliga resultat.

I SQL Database-motorn baseras vektorindex på DiskANN-algoritmen . DiskANN förlitar sig på att skapa ett diagram för att snabbt navigera genom alla indexerade vektorer för att hitta den närmaste matchningen till en viss vektor. DiskANN är ett grafbaserat system för indexering och sökning av stora uppsättningar vektordata med hjälp av begränsade beräkningsresurser. Den använder effektivt SSD:er och minimalt minne för att hantera betydligt mer data än minnesinterna index, samtidigt som du behåller höga frågor per sekund (QPS) och låg svarstid, vilket säkerställer en balans mellan minnes-, CPU- och I/O-användning och sökprestanda.

En ungefärlig sökning med närmaste grannalgoritm kan göras först när du skapar ett vektorindex med kommandot CREATE VECTOR INDEX T-SQL och sedan använder VECTOR_SEARCH T-SQL-funktionen för att köra den ungefärliga sökningen.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(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