Bases de données vectorielles
Une base de données vectorielle stocke et gère les données sous la forme de vecteurs, qui sont des tableaux numériques de points de données.
L’utilisation de vecteurs permet des requêtes et des analyses complexes, car les vecteurs peuvent être comparés et analysés à l’aide de techniques avancées telles que la recherche de similarité vectorielle, la quantification et le clustering. Les bases de données traditionnelles ne sont pas adaptées à la gestion des données à haute dimension qui sont de plus en plus courantes dans l’analytique données. Toutefois, les bases de données vectorielles sont conçues pour gérer des données à haute dimension, telles que du texte, des images et de l’audio, en les représentant en tant que vecteurs. Les bases de données vectorielles sont utiles pour les tâches telles que l’apprentissage automatique, le traitement du langage naturel et la reconnaissance d’images, où l’objectif consiste à identifier des modèles ou des similitudes dans des jeux de données volumineux.
Cet article donne des précisions sur les bases de données vectorielles et explique conceptuellement comment utiliser un Eventhouse comme base de données vectorielle dans Real-Time Intelligence, dans Microsoft Fabric. Pour obtenir un exemple pratique, consultez Tutoriel : Utiliser un Eventhouse comme base de données vectorielle.
Concepts clés
Les concepts clés suivants sont utilisés dans les bases de données vectorielles :
Similarité des vecteurs
La similarité vectorielle est une mesure de la différence (ou de la similarité) entre deux vecteurs ou plus. La recherche de similarité vectorielle est une technique utilisée pour rechercher des vecteurs similaires dans un jeu de données. Les vecteurs sont comparés à l’aide d’un indicateur de distance, telle que la distance euclidienne ou la similarité cosinus. Plus les deux vecteurs sont proches, plus ils sont similaires.
Incorporations
Les incorporations sont un moyen courant de représenter des données dans un format vectoriel à utiliser dans les bases de données vectorielles. Une incorporation est une représentation mathématique d’une partie de données, telle qu’un mot, un document texte ou une image, conçue pour capturer sa signification sémantique. Les incorporations sont créées à l’aide d’algorithmes qui analysent les données et génèrent un ensemble de valeurs numériques qui représentent ses fonctionnalités clés. Par exemple, une incorporation pour un mot peut représenter sa signification, son contexte et sa relation avec d’autres mots. Le processus de création d’incorporations est simple. Bien qu’ils puissent être créés à l’aide de packages Python standard (par exemple, spaCy, sent2vec, Gensim), les grands modèles de langage (LLM) génèrent des incorporations de haute qualité pour la recherche de texte sémantique. Par exemple, vous pouvez envoyer du texte à un modèle d’incorporation dans Azure OpenAI et générer une représentation vectorielle qui peut être stockée pour l’analyse. Pour plus d’informations, consultez Comprendre les incorporations dans Azure OpenAI Service.
Workflow général
Le flux de travail général pour l’utilisation d’une base de données vectorielle est le suivant :
- Incorporer des données : convertissez des données en format vectoriel à l’aide d’un modèle d’incorporation. Par exemple, vous pouvez incorporer des données texte à l’aide d’un modèle OpenAI.
- Stocker des vecteurs : stockez les vecteurs incorporés dans une base de données vectorielle. Vous pouvez envoyer les données incorporées à un Eventhouse pour stocker et gérer les vecteurs.
- Requête incorporée : convertissez les données de requête en format vectoriel à l’aide du même modèle d’incorporation utilisé pour incorporer les données stockées.
- Vecteurs de requête : utilisez la recherche de similarité vectorielle pour rechercher des entrées dans la base de données qui sont similaires à la requête.
Eventhouse en tant que base de données vectorielle
Au cœur de la recherche de similarité vectorielle, il est possible de stocker, d’indexer et d’interroger des données vectorielles. Les Eventhouses fournissent une solution permettant de gérer et d’analyser de grands volumes de données, en particulier dans les scénarios nécessitant une exportation et une analyse en temps réel, ce qui en fait un excellent choix pour le stockage et la recherche de vecteurs.
Les composants suivants permettent l’utilisation d’Eventhouse en tant que base de données vectorielle :
- Le type de données dynamique, qui peut stocker des données non structurées telles que des tableaux et des conteneurs des propriétés. Par conséquent, le type de données est recommandé pour stocker des valeurs vectorielles. Vous pouvez augmenter davantage la valeur du vecteur en stockant les métadonnées associées à l’objet d’origine sous forme de colonnes distinctes dans votre table.
- Le type d’encodage
Vector16
conçu pour stocker des vecteurs de nombres à virgule flottante en précision de 16 bits, qui utiliseBfloat16
au lieu des 64 bits par défaut. Cet encodage est recommandé pour stocker des incorporations de vecteurs ML, car il réduit les exigences de stockage en fonction de quatre et accélère les fonctions de traitement vectoriel telles que series_dot_product() et series_cosine_similarity() par ordre d’ampleur. - La fonction series_cosine_similarity, qui peut effectuer des recherches de similarité vectorielle en plus des vecteurs stockés dans Eventhouse.
Optimiser pour la mise à l’échelle
Pour plus d’informations sur l’optimisation de la recherche de similarité vectorielle, lisez notre blog.
Pour optimiser les performances et les temps de recherche qui en résultent, suivez les étapes suivantes :
- Définissez l’encodage de la colonne des incorporations sur Vector16, l’encodage 16 bits des coefficients de vecteurs (au lieu de la valeur par défaut de 64 bits).
- Stockez la table de vecteurs d’incorporation sur tous les nœuds de cluster avec au moins une partition par processeur, ce qui peut être effectué en suivant les étapes ci-après :
- Limitez le nombre de vecteurs d’incorporation par partition en modifiant le paramètre ShardEngineMaxRowCount de la stratégie de partitionnement. La stratégie de partitionnement équilibre les données sur tous les nœuds avec plusieurs étendues par nœud afin que la recherche puisse utiliser tous les processeurs disponibles.
- Modifiez le paramètre RowCountUpperBoundForMerge de la stratégie de fusion. La stratégie de fusion est nécessaire pour supprimer la fusion d’étendues après l’ingestion.
Exemples d’étapes d’optimisation
Dans l’exemple suivant, une table de vecteurs statique est définie pour stocker de1 million de vecteurs. La stratégie d’incorporation est définie comme Vector16, et les stratégies de partitionnement et de fusion sont définies pour optimiser la table pour la recherche de similarité vectorielle. Pour cela, supposons que le cluster comprend 20 nœuds, chacun disposant de 16 processeurs. Les partitions de la table doivent contenir au maximum 10 000 000/(20*16)=3 125 lignes.
Les commandes KQL suivantes sont exécutées une par une pour créer la table vide et définir les stratégies et l’encodage nécessaires :
.create table embedding_vectors(vector_id:long, vector:dynamic) // This is a sample selection of columns, you can add more columns .alter column embedding_vectors.vector policy encoding type = 'Vector16' // Store the coefficients in 16 bits instead of 64 bits accelerating calculation of dot product, suppress redundant indexing .alter-merge table embedding_vectors policy sharding '{ "ShardEngineMaxRowCount" : 3125 }' // Balanced data on all nodes and, multiple extents per node so the search can use all processors .alter-merge table embedding_vectors policy merge '{ "RowCountUpperBoundForMerge" : 3125 }' // Suppress merging extents after ingestion
Ingérer les données dans la table créée et définie à l’étape précédente.