Sdílet prostřednictvím


Vektorové vyhledávání a vektorové indexy v databázovém stroji SQL

Platí pro: SQL Server 2025 (17.x) Azure SQL Database Azure SQLManaged InstanceSQL Database v Microsoft Fabric

Databázový stroj SQL poskytuje možnost ukládat jakýkoli druh dat a spouštět jakýkoli druh dotazu: strukturovaný a nestrukturovaný a provádět vektorové vyhledávání na těchto datech. Je to dobrá volba pro scénáře, kdy potřebujete prohledávat všechna tato data společně a nechcete pro vyhledávání používat samostatnou službu, která by komplikovala vaši architekturu.

Poznámka:

  • Funkce vektorů jsou dostupné ve službě Azure SQL Managed Instance nakonfigurované pomocí zásad aktualizaceSQL Serveru 2025 nebo Always-up-to-date.

Vectors

Vektory jsou uspořádaná pole čísel (obvykle float), která mohou představovat informace o některých datech. Obrázek může být například reprezentován jako vektor hodnot pixelů nebo řetězec textu může být reprezentován jako vektor hodnot ASCII. Proces převodu dat na vektor se nazývá vektorizace. Datový typ vektoru v SQL Serveru je navržený tak, aby tato pole čísel ukládaly efektivně.

Zakotvení

Vkládání jsou vektory, které představují důležité funkce dat. Vkládání se často učí pomocí modelu hlubokého učení a modely strojového učení a AI je využívají jako funkce. Vkládání může také zachytit sémantickou podobnost mezi podobnými koncepty. Například při generování vektorové reprezentace pro slova person a humanbychom očekávali, že jejich vektorové reprezentace budou podobné hodnotou, protože slova jsou také sémanticky podobná.

Azure OpenAI nabízí modely pro vytváření vložených dat z textových dat. Služba rozdělí text na tokeny a vygeneruje vkládání pomocí modelů předem natrénovaných metodou OpenAI. Další informace najdete v části Vytváření embeddingů pomocí Azure OpenAI.

Po vygenerování embeddingů je možné je uložit do databáze SQL Serveru. To vám umožní uložit vložené položky spolu s daty, která představují, a provádět vektorové vyhledávací dotazy za účelem vyhledání podobných datových bodů.

Vektorové vyhledávání odkazuje na proces hledání všech vektorů v datové sadě, které se podobají konkrétnímu vektoru dotazu. Proto vektor dotazu pro slovo human prohledá celou datovou sadu podobných vektorů, a proto podobná slova: v tomto příkladu by měl najít slovo person jako blízkou shodu. Tato blízkost nebo vzdálenost se měří pomocí metriky vzdálenosti, jako je kosinus. Čím blíže jsou vektory, tím více jsou si podobné.

SQL Server poskytuje integrovanou podporu vektorů prostřednictvím vektoru datového typu. Vektory se ukládají v optimalizovaném binárním formátu, ale zpřístupní se jako pole JSON pro usnadnění. Každý prvek vektoru je uložen pomocí plovoucí desetinné hodnoty s jednoduchou přesností (4 bajty). Kromě datového typu existují vyhrazené funkce pro práci s vektory. Pomocí funkce VECTOR_DISTANCE je například možné najít vzdálenost mezi dvěma vektory. Funkce vrátí skalární hodnotu s vzdáleností mezi dvěma vektory na základě zadané metriky vzdálenosti.

Vzhledem k tomu, že vektory se obvykle spravují jako pole čísel s plovoucí čárkou, je možné vytvořit vektor jednoduše přetypováním pole JSON na datový typ vektoru. Například následující kód vytvoří vektor z pole JSON:

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;

Nebo použijte implicitní převod typů.

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;

To samé platí pro převod vektoru na pole JSON:

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

Přesné vyhledávání a vzdálenost vektoru (přesné nejbližší sousedy)

Přesné hledání, označované také jako k-nejbližší soused (k-NN), zahrnuje výpočet vzdálenosti mezi daným vektorem a všemi ostatními vektory v datové sadě, řazením výsledků a výběrem nejbližších sousedů na základě zadané metriky vzdálenosti. Tato metoda zaručuje přesné vyhledávání nejbližších sousedů, ale může být výpočetně náročná, zejména pro velké datové soubory.

Funkce vektorové vzdálenosti se používají k měření blízkosti mezi vektory. Mezi běžné metriky vzdálenosti patří euklidová vzdálenost, kosinus podobnost a tečkovaný součin. Tyto funkce jsou nezbytné pro provádění hledání k-NN a zajištění přesných výsledků.

Přesné vyhledávání nejbližšího vektoru souseda (ENN) provádí důkladný výpočet vzdáleností mezi všemi indexovanými vektory, aby se zajistilo načtení nejbližších sousedů na základě zadané metriky vzdálenosti. Tato metoda je přesná, ale náročná na prostředky, takže je vhodná pro menší datové sady nebo scénáře, kdy je přesnost nejdůležitější.

V databázovém stroji SQL lze vyhledávání k-NN provést pomocí funkce VECTOR_DISTANCE , která umožňuje efektivní výpočet vzdáleností mezi vektory a usnadňuje načtení nejbližších sousedů.

Následující příklad ukazuje, jak pomocí k-NN vrátit prvních 10 nejvíce podobných vektorů uložených v tabulce content_vector vzhledem k danému vektoru @qv dotazu.

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

Použití přesného vyhledávání se doporučuje, pokud nemáte k dispozici mnoho vektorů pro vyhledávání (méně než 50 000 vektorů jako obecného doporučení). Tabulka může obsahovat mnoho vektorů, pokud predikáty hledání snižují počet vektorů, které se mají použít pro hledání sousedů, na 50 000 nebo méně.

Přibližný vektorový index a vektorové vyhledávání (přibližní nejbližší sousedi)

Poznámka:

Přibližný vektorový index a vektorové vyhledávání jsou v náhledu a v současnosti dostupné pouze v SQL Server 2025 (17.x), Azure SQL Database a SQL databázi v Microsoft Fabric.

Identifikace všech vektorů v blízkosti daného vektoru dotazu vyžaduje dodatečné zdroje k výpočtu vzdálenosti mezi vektorem dotazu a vektory uloženými v tabulce. Hledání všech vektorů blízko daného vektoru dotazu zahrnuje úplné prohledávání tabulky a významné využití procesoru. Tomu se říká dotaz "K-nejbližší sousedy" nebo "k-NN" a vrátí nejbližší vektory "k".

Vektory se používají k vyhledání podobných dat pro modely AI pro odpovědi na dotazy uživatelů. To zahrnuje dotazování databáze na "k" vektory nejbližší k vektoru dotazu pomocí metrik vzdálenosti, jako je skalární součin, kosinová podobnost nebo Eukleidovská vzdálenost.

Dotazy K-NN se často potýkají se škálovatelností, což v mnoha případech umožňuje vyměnit určitý stupeň přesnosti, zejména zachycení, za významné zvýšení rychlosti. Tato metoda je známá jako přibližní nejbližší sousedé (ANN).

Výběr je důležitý koncept, který by měl být známý všem, kteří používají nebo plánují používat vektory a embeddingy. Ve skutečnosti relevantní zpětná vazba měří podíl přibližných nejbližších sousedů identifikovaných algoritmem ve srovnání s přesnými nejbližšími sousedy, které by vrátilo vyčerpávající vyhledávání. Proto je dobrým měřením kvality aproximace, kterou algoritmus provádí. Perfektní úplnost, která odpovídá žádné aproximaci, je 1.

U aplikací umělé inteligence je kompromis poměrně rozumný. Vzhledem k tomu, že vektorová vložení již přibližují koncepty, použití ANN nemá významný vliv na výsledky, pokud je připomínka blízko 1. Tím se zajistí, že vrácené výsledky budou velmi podobné výsledkům z k-NN, ale nabízejí výrazně vyšší výkon a výrazně snižuje využití prostředků, což je velmi výhodné pro provozní databáze.

Je důležité si uvědomit, že výraz "index" při odkazování na vektorový index má jiný význam než index, se kterým pracujete v relačních databázích. Ve skutečnosti index vektoru vrací přibližné výsledky.

Ve stroji SQL Database jsou vektorové indexy založené na algoritmu DiskANN . DiskANN spoléhá na vytvoření grafu, který umožňuje rychle procházet všechny indexované vektory a najít nejbližší shodu k danému vektoru. DiskANN je systém založený na grafech pro indexování a vyhledávání velkých sad vektorových dat pomocí omezených výpočetních prostředků. Efektivně využívá disky SSD a minimální paměť ke zpracování výrazně více dat než indexů v paměti a současně udržuje vysoké dotazy za sekundu (QPS) a nízkou latenci a zajišťuje rovnováhu mezi využitím paměti, procesorem a vstupně-výstupními operacemi a výkonem vyhledávání.

Pomocí příkazu CREATE VECTOR INDEX T-SQL je možné nejprve vytvořit přibližný vyhledávací algoritmus nejbližšího souseda a pak pomocí VECTOR_SEARCH funkce T-SQL spustit přibližné vyhledávání.

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