Megosztás a következőn keresztül:


Vektorkeresési és vektorindexek az SQL Database Engine-ben

A következőkre vonatkozik: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL Database a Microsoft Fabricben

Az SQL Database Engine lehetővé teszi bármilyen adat tárolását és bármilyen lekérdezés futtatását: strukturált és strukturálatlan, valamint vektorkeresést végezhet az adatokon. Ez egy jó választás olyan helyzetekben, ahol az összes adatot együtt kell keresnie, és nem szeretne külön szolgáltatást használni a kereséshez, amely bonyolítaná az architektúrát.

Megjegyzés:

  • A vektorfunkciók az SQL Server 2025 vagy always-up-todátumfrissítési szabályzattal konfigurált felügyelt Azure SQL-példányban érhetők el.

Vectors

A vektorok számokat tartalmazó rendezett tömbök (általában lebegőpontosak), amelyek bizonyos adatokkal kapcsolatos információkat képviselnek. Egy kép például a képpontértékek vektoraként is megjeleníthető, vagy egy szöveges sztring az ASCII-értékek vektoraként is megjeleníthető. Az adatok vektorossá alakításának folyamatát vektorizálásnak nevezzük. Az SQL Server vektoros adattípusa úgy lett kialakítva, hogy hatékonyan tárolja ezeket a számtömböket.

Beágyazások

A beágyazások olyan vektorok, amelyek az adatok fontos jellemzőit képviselik. A beágyazásokat gyakran mélytanulási modell használatával tanulják meg, és a gépi tanulási és AI-modellek funkcióként használják őket. A beágyazások a hasonló fogalmak szemantikai hasonlóságát is rögzíthetik. Például a person és humanszavak beágyazásának létrehozásakor elvárnánk, hogy a beágyazásuk (vektorábrázolás) értéke hasonló legyen, mivel a szavak szemantikailag is hasonlóak.

Az Azure OpenAI olyan modelleket kínál, amelyekkel beágyazásokat hozhat létre szöveges adatokból. A szolgáltatás tokenekre bontja a szöveget, és beágyazásokat hoz létre az OpenAI által előre betanított modellek használatával. További információ: Beágyazások létrehozása az Azure OpenAI.

A beágyazások létrehozása után sql Server-adatbázisba is tárolhatók. Ez lehetővé teszi, hogy a beágyazásokat az általuk képviselt adatok mellett tárolja, és vektorkeresési lekérdezéseket hajthat végre a hasonló adatpontok megkereséséhez.

A vektorkeresés egy adott lekérdezésvektorhoz hasonló adathalmaz összes vektorának megkeresésére utal. Ezért a human szó lekérdezésvektorának a teljes adathalmazban hasonló vektorokat, és így hasonló szavakat kell keresnie: ebben a példában a person szót szoros egyezésként kell megtalálnia. Ezt a közelséget vagy távolságot egy távolságmetrika, például a koszinusz távolsága alapján mérik. Minél közelebb vannak a vektorok, annál hasonlóbbak.

Az SQL Server beépített támogatást nyújt a vektorokhoz a vektor adattípuson keresztül. A vektorok tárolása optimalizált bináris formátumban történik, de JSON-tömbökként van elérhetővé téve a kényelem érdekében. A vektor minden eleme egypontos (4 bájt) lebegőpontos értékkel van tárolva. Az adattípus mellett dedikált függvények is léteznek a vektorokon való működéshez. A VECTOR_DISTANCE függvénnyel például két vektor közötti távolságot is meg lehet találni. A függvény egy skaláris értéket ad vissza két vektor távolságával a megadott távolságmetrika alapján.

Mivel a vektorokat általában lebegőpontos tömbökként kezelik, a vektorok létrehozása egyszerűen elvégezhető egy JSON-tömb vektor adattípusba való beírásával. A következő kód például létrehoz egy vektort egy JSON-tömbből:

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;

Vagy implicit öntés használata

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;

Ugyanez vonatkozik a vektor JSON-tömbökké való konvertálására is:

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

Pontos keresés és vektor távolság (pontos legközelebbi szomszédok)

A pontos keresés, más néven k-legközelebbi szomszéd (k-NN) keresés magában foglalja egy adott vektor és az adathalmaz összes többi vektora közötti távolság kiszámítását, az eredmények rendezését és a legközelebbi szomszédok kiválasztását egy megadott távolságmetrika alapján. Ez a módszer garantálja a legközelebbi szomszédok pontos lekérését, de számításigényes lehet, különösen nagy adathalmazok esetén.

A vektorok távolságfüggvényei a vektorok közötti közelség mérésére szolgálnak. A gyakori távolságmetrikák közé tartozik az euklideszi távolság, a koszinusz hasonlósága és a pont termék. Ezek a függvények elengedhetetlenek a k-NN-keresésekhez és a pontos eredmények biztosításához.

A pontos legközelebbi szomszéd (ENN) vektor keresés teljes körű távolságszámítást végez az összes indexelt vektoron, hogy a legközelebbi szomszédokat egy megadott távolságmetrika alapján visszakeresse. Ez a módszer pontos, de erőforrás-igényes, így alkalmas kisebb adathalmazokhoz vagy olyan forgatókönyvekhez, ahol a pontosság a legfontosabb.

Az SQL Database Engine-ben a k-NN-keresések a VECTOR_DISTANCE függvénnyel végezhetők el, amely lehetővé teszi a vektorok közötti távolságok hatékony kiszámítását, és megkönnyíti a legközelebbi szomszédok beolvasását.

A következő példa bemutatja, hogyan lehet a k-NN módszert használni a táblázatban tárolt vektorok közül a 10 leginkább hasonlót visszaadni az adott lekérdezésvektorra content_vector.

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

A pontos keresés akkor ajánlott, ha nincs sok vektora a kereséshez (általános javaslatként kevesebb mint 50 000 vektort használ). A táblázat több vektort is tartalmazhat, ha a keresési predikátumok 50 000 vagy annál kevesebb vektorra csökkentik a szomszédkereséshez használandó vektorok számát.

Hozzávetőleges vektorindex és vektorkeresés (közelítő legközelebbi szomszédok)

Megjegyzés:

A közelítő vektorindex és vektorkeresés előnézetben van, jelenleg csak SQL Server 2025 (17.x), Azure SQL Database és SQL adatbázis Microsoft Fabric-ben érhető el.

Az adott lekérdezésvektorhoz közeli összes vektor azonosításához jelentős erőforrásokra van szükség a lekérdezésvektor és a táblázatban tárolt vektorok közötti távolság kiszámításához. Az adott lekérdezésvektorhoz közeli összes vektor keresése magában foglalja a tábla teljes vizsgálatát és a jelentős processzorhasználatot. Ezt "K-legközelebbi szomszédoknak" vagy "k-NN" lekérdezésnek nevezzük, és a legközelebbi "k" vektorokat adja vissza.

A vektorok hasonló adatokat keresnek az AI-modellekhez a felhasználói lekérdezések megválaszolásához. Ez magában foglalja a lekérdezési vektorhoz legközelebbi "k" vektorok adatbázisának lekérdezését olyan távolságmetrikák használatával, mint a pont (belső) termék, a koszinusz hasonlósága vagy az euklideszi távolság.

A K-NN-lekérdezések gyakran küzdenek a méretezhetőséggel, így sok esetben elfogadható bizonyos pontosság, különösen a felidézés feláldozása a jelentős sebességnövekedés érdekében. Ez a módszer a legközelebbi legközelebbi szomszédok (ANN) néven ismert.

A visszahívás egy fontos fogalom, amely mindenki számára ismerős lehet, aki vektorokat és beágyazásokat használ vagy tervez használni. A visszahívás valójában az algoritmus által azonosított közelítő szomszédok arányát méri a teljes keresés által visszaadott legközelebbi szomszédokkal összehasonlítva. Ezért az algoritmus által végzett közelítés minőségének jó mércéje. A tökéletes visszahívás, amely egyenértékű a közelítés hiányával, 1.

Az AI-alkalmazások esetében a kompromisszumok meglehetősen ésszerűek. Mivel a vektoros beágyazások már megközelítik a fogalmakat, az ANN használata nem befolyásolja jelentősen az eredményeket, feltéve, hogy a visszahívás közel 1. Ez biztosítja, hogy a visszaadott eredmények nagyon hasonlóak legyenek a k-NN-től kapott eredményekhez, miközben jelentősen javult a teljesítmény és jelentősen csökkent az erőforrás-használat, ami rendkívül előnyös az operatív adatbázisok számára.

Fontos tisztában lenni azzal, hogy a vektorindexre való hivatkozáskor használt "index" kifejezésnek más jelentése van, mint a relációs adatbázisokban használt indexnek. Valójában a vektorindex hozzávetőleges eredményeket ad vissza.

Az SQL Database motorban a vektorindexek a DiskANN algoritmuson alapulnak. A DiskANN egy gráf létrehozására támaszkodik, amely gyorsan végigjárja az összes indexelt vektort, hogy megkeresse az adott vektorhoz legközelebbi egyezést. A DiskANN egy gráfalapú rendszer, amely nagy mennyiségű vektoradatot indexel és keres korlátozott számítási erőforrások használatával. Hatékonyan használja az SSD-ket és a minimális memóriát a memóriabeli indexeknél lényegesen több adat kezeléséhez, miközben magas lekérdezéseket (QPS) és alacsony késést tart fenn, biztosítva a memória, a PROCESSZOR- és az I/O-használat és a keresési teljesítmény közötti egyensúlyt.

A legközelebbi szomszéd algoritmuskeresés először vektorindexet hozhat létre a CREATE VECTOR INDEX T-SQL paranccsal, majd VECTOR_SEARCH T-SQL-függvény használatával futtathatja a hozzávetőleges keresést.

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