Partager via


Recherche vectorielle et index vectoriels dans le moteur de base de données SQL

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

Le moteur de base de données SQL permet de stocker n’importe quel type de données et d’exécuter n’importe quel type de requête : structuré et non structuré, et d’effectuer une recherche vectorielle sur ces données. Il s’agit d’un bon choix pour les scénarios où vous devez effectuer une recherche sur toutes ces données ensemble, et vous ne souhaitez pas utiliser un service distinct pour la recherche qui compliquerait votre architecture.

Note

  • Les fonctionnalités vectorielles sont disponibles dans Azure SQL Managed Instance configurée avec la stratégie de mise à joursql Server 2025 ou Always-up-to-date.

Vectors

Les vecteurs sont des tableaux triés de nombres (généralement flottants) 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 ». Le type de données vectorielles dans SQL Server est conçu pour stocker efficacement ces tableaux de nombres.

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 d’apprentissage profond, 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’un incorporation pour les mots person et human, nous nous attendons à ce que leurs incorporations (représentation vectorielle) soient similaires dans la 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 plus d’informations, 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 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 retrouver 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. Ainsi, un vecteur de requête pour le mot human recherche dans l’ensemble du jeu de données des vecteurs similaires, et donc des mots semblables. Dans cet exemple, il devrait 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. Plus les vecteurs sont proches, 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 sont 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 (4 octets) simple précision. Outre le type de données, il existe des fonctions dédiées pour manipuler les vecteurs. Par exemple, il est possible de trouver la distance entre deux vecteurs à l’aide de la fonction VECTOR_DISTANCE . La fonction renvoie une valeur scalaire correspondant à la distance entre deux vecteurs, calculée en fonction de la métrique de distance spécifiée.

É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 de vecteur (proche exacte des voisins)

La recherche exacte, également appelée recherche k-nearest voisin (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 du 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_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

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 proche approximatif)

Note

L’index vectoriel approximatif et la recherche vectorielle sont en aperçu et sont actuellement disponibles uniquement dans SQL Server 2025 (17.x), Azure SQL Database et SQL Database dans Microsoft Fabric.

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-plus proches voisins » ou « k-NN » et elle retourne les « k » vecteurs les plus proches.

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 K-NN rencontrent souvent des problèmes de mise à l'échelle, ce qui rend acceptable, dans de nombreux cas, de compromettre une certaine précision, notamment le rappel, pour obtenir 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 que devrait maîtriser toute personne utilisant ou prévoyant d’utiliser des vecteurs et des incorporations. 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, équivalent à une absence d’approximation, est égal à 1.

Pour les applications IA, le compromis est tout à fait raisonnable. Étant donné que les incorporations vectorielles représentent déjà les concepts de manière approximative, 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 k-NN, 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 SQL Database, 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.

Vous pouvez commencer par créer un index vectoriel à l’aide de la commande CREATE VECTOR INDEX T-SQL, puis en utilisant VECTOR_SEARCH fonction T-SQL pour exécuter la recherche approximative.

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