Partager via


Vue d’ensemble de la recherche vectorielle et des index vectoriels dans le moteur de base de données SQL

S’applique à : SQL Server 2025 (17.x) Préversion de la base de données SQL Azure SQL DatabaseAzure SQL Managed InstanceSQL dans Microsoft Fabric

Les vecteurs sont des tableaux ordonnés de nombres (généralement des floats) qui peuvent représenter des informations sur certaines données. Par exemple, une image peut être représentée en tant que vecteur de valeurs de pixels, ou une chaîne de texte peut être représentée comme vecteur de valeurs ASCII. Le processus pour transformer les données en vecteur est appelé vectorisation.

Remarque

Incorporations

Les incorporations sont des vecteurs qui représentent des caractéristiques importantes des données. Les incorporations sont souvent apprises à l’aide d’un modèle Deep Learning, et les modèles Machine Learning et IA les utilisent comme fonctionnalités. Les incorporations peuvent également capturer la similarité sémantique entre des concepts similaires. Par exemple, lors de la génération d’une incorporation pour les mots person et human, nous nous attendons à ce que leurs incorporations (représentation vectorielle) soient similaires en valeur, car les mots sont également sémantiquement similaires.

Azure OpenAI propose des modèles pour créer des incorporations à partir de données texte. Le service décompose le texte en jetons et génère des incorporations à l’aide de modèles pré-entraînés par OpenAI. Pour en savoir plus, consultez Création d’incorporations avec Azure OpenAI.

Une fois les incorporations générées, elles peuvent être stockées dans une base de données SQL Server. Cela vous permet de stocker les incorporations en même temps que les données qu’elles représentent et d’effectuer des requêtes de recherche vectorielle pour rechercher des points de données similaires.

La recherche vectorielle fait référence au processus de recherche de tous les vecteurs d’un jeu de données qui sont similaires à un vecteur de requête spécifique. Par conséquent, un vecteur de requête pour le mot human recherche dans l’ensemble du jeu de données des vecteurs similaires, et ainsi des mots similaires : dans cet exemple, il doit trouver le mot person comme une correspondance proche. Cette proximité, ou cette distance, est mesurée à l’aide d’une métrique de distance telle que la distance cosinus. Les vecteurs plus proches sont, plus ils sont similaires.

SQL Server fournit une prise en charge intégrée des vecteurs via le type de données vector . Les vecteurs sont stockés dans un format binaire optimisé, mais exposés sous forme de tableaux JSON pour des raisons pratiques. Chaque élément du vecteur est stocké à l’aide d’une valeur à virgule flottante simple précision (4 octets). Outre le type de données, il existe des fonctions dédiées pour fonctionner sur des vecteurs. Par exemple, il est possible de trouver la distance entre deux vecteurs à l’aide de la fonction VECTOR_DISTANCE . La fonction retourne une valeur scalaire avec la distance entre deux vecteurs en fonction de la métrique de distance que vous spécifiez.

Étant donné que les vecteurs sont généralement gérés en tant que tableaux de floats, la création d’un vecteur peut simplement faire passer un tableau JSON à un type de données vectoriel. Par exemple, le code suivant crée un vecteur à partir d’un tableau 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;

Ou utilisez le transtypage implicite

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;

Il en va de même pour convertir un vecteur en tableau JSON :

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

Recherche exacte et distance vectorielle (voisin le plus proche exact)

La recherche exacte, également appelée recherche k-Nearest Neighbor (k-NN), implique le calcul de la distance entre un vecteur donné et tous les autres vecteurs d’un jeu de données, le tri des résultats et la sélection des voisins les plus proches en fonction d’une métrique de distance spécifiée. Cette méthode garantit une récupération précise des voisins les plus proches, mais peut être gourmande en calcul, en particulier pour les jeux de données volumineux.

Les fonctions de distance de vecteur sont utilisées pour mesurer la proximité entre les vecteurs. Les métriques de distance courante incluent la distance euclide, la similarité cosinus et le produit point. Ces fonctions sont essentielles pour effectuer des recherches k-NN et garantir des résultats précis.

La recherche vectorielle de voisin le plus proche (ENN) effectue un calcul de distance exhaustive sur tous les vecteurs indexés pour garantir la récupération des voisins les plus proches en fonction d’une métrique de distance spécifiée. Cette méthode est précise mais gourmande en ressources, ce qui le rend adapté aux jeux de données ou scénarios plus petits où la précision est primordiale.

Dans le moteur de base de données SQL, les recherches k-NN peuvent être effectuées à l’aide de la fonction VECTOR_DISTANCE , ce qui permet un calcul efficace des distances entre les vecteurs et facilite la récupération des voisins les plus proches.

L’exemple suivant montre comment effectuer k-NN pour retourner les 10 premiers vecteurs les plus similaires stockés dans la content_vector table au vecteur @qvde requête donné.

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

L’utilisation d’une recherche exacte est recommandée lorsque vous n’avez pas de nombreux vecteurs à rechercher (moins de 50 000 vecteurs comme recommandation générale). La table peut contenir beaucoup plus de vecteurs tant que vos prédicats de recherche réduisent le nombre de vecteurs à utiliser pour la recherche voisine à 50 000 ou moins.

Index vectoriel approximatif et recherche vectorielle (voisin le plus proche approximatif)

L’identification de tous les vecteurs proches d’un vecteur de requête donné nécessite des ressources substantielles pour calculer la distance entre le vecteur de requête et les vecteurs stockés dans la table. La recherche de tous les vecteurs proches d’un vecteur de requête donné implique une analyse complète de la table et une utilisation significative du processeur. Il s’agit d’une requête « K-Nearest Neighbors » ou « KNN » et retourne les vecteurs les plus proches « k ».

Les vecteurs sont utilisés pour rechercher des données similaires pour les modèles IA afin de répondre aux requêtes utilisateur. Cela implique l’interrogation de la base de données pour les vecteurs « k » les plus proches du vecteur de requête à l’aide de métriques de distance telles que le produit point (interne), la similarité cosinus ou la distance euclide.

Les requêtes KNN ont souvent du mal à évoluer, ce qui rend acceptable dans de nombreux cas de compromettre la précision, notamment sur le rappel, pour des gains de vitesse significatifs. Cette méthode est connue sous le nom de voisins les plus proches approximatifs (ANN).

Le rappel est un concept important qui devrait devenir familier à tout le monde utilisant ou prévoyant d'utiliser des vecteurs et des embeddings. En fait, le rappel mesure la proportion des voisins les plus proches approximatifs identifiés par l’algorithme, comparés aux voisins les plus proches exacts qu’une recherche exhaustive retournerait. Par conséquent, il s’agit d’une bonne mesure de la qualité de l’approximation que l’algorithme effectue. Un rappel parfait, sans approximation, est égal à 1.

Pour les applications IA, le compromis est tout à fait raisonnable. Étant donné que les incorporations vectorielles ont déjà des concepts approximatifs, l’utilisation d’ANN n’affecte pas considérablement les résultats, à condition que le rappel soit proche de 1. Cela garantit que les résultats retournés sont très similaires à ceux de KNN, tout en offrant des performances largement améliorées et une utilisation considérablement réduite des ressources, ce qui est très bénéfique pour les bases de données opérationnelles.

Il est important de comprendre que le terme « index » lorsqu’il est utilisé pour faire référence à un index vectoriel a une signification différente de celle utilisée pour utiliser les bases de données relationnelles. En fait, un index vectoriel retourne des résultats approximatifs.

Dans le moteur MSSQL, les index vectoriels sont basés sur l’algorithme DiskANN . DiskANN s’appuie sur la création d’un graphique pour parcourir rapidement tous les vecteurs indexés pour trouver la correspondance la plus proche à un vecteur donné. DiskANN est un système basé sur des graphiques pour l’indexation et la recherche de grands ensembles de données vectorielles à l’aide de ressources de calcul limitées. Il utilise efficacement les disques SSD et la mémoire minimale pour gérer beaucoup plus de données que les index en mémoire, tout en conservant des requêtes élevées par seconde (QPS) et une faible latence, ce qui garantit un équilibre entre l’utilisation de la mémoire, le processeur et l’utilisation des E/S et les performances de recherche.

La recherche de voisins approximatifs peut être effectuée en commençant par créer un index vectoriel à l'aide de la commande T-SQL CREATE VECTOR INDEX, puis en utilisant la fonction T-SQL VECTOR_SEARCH pour lancer la recherche approximative.

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