Lorsque vous développez des applications d’IA générative, vous introduisez généralement trois composants supplémentaires dans votre infrastructure : un injecteur, un LLM et une base de données vectorielle.
Cependant, si vous utilisez MariaDB, vous n’avez pas besoin d’introduire une base de données supplémentaire avec son propre dialecte SQL — ou pire — sa propre API propriétaire. Depuis la version 11.7 de MariaDB (et MariaDB Enterprise Server 11.4), vous pouvez simplement stocker vos embeddings (ou vecteurs) dans n’importe quelle colonne de n’importe quelle table — pas besoin de rendre vos applications polyglottes en matière de bases de données.
« Après l’annonce de l’aperçu de la recherche vectorielle dans MariaDB Server, la capacité de recherche vectorielle a maintenant été ajoutée à la version 11.7 de MariaDB Community Server, » écrit Ralf Gebhardt, Responsable Produit pour MariaDB Server chez MariaDB. Cela inclut un nouveau type de données (VECTOR
), un index vectoriel et un ensemble de fonctions pour la manipulation de vecteurs.
Pourquoi les vecteurs sont-ils nécessaires dans les applications d’IA générative ?
Les vecteurs sont nécessaires dans les applications d’IA générative car ils intègrent des significations complexes dans un tableau compact de nombres de longueur fixe (un vecteur). Cela est plus clair dans le contexte de la génération augmentée par recherche (ou RAG). Cette technique vous permet de récupérer des données pertinentes à partir de vos sources (API, fichiers, bases de données) pour améliorer l’entrée d’un modèle d’IA avec les données récupérées, souvent privées pour l’entreprise.
Étant donné que vos sources de données peuvent être vastes, vous avez besoin d’un moyen de trouver les éléments pertinents, étant donné que les modèles d’IA actuels ont une fenêtre contextuelle finie – vous ne pouvez pas simplement ajouter toutes vos données à une invite. En créant des morceaux de données et en faisant passer ces morceaux de données à un modèle d’IA spécial appelé incrusteur, vous pouvez générer des vecteurs et utiliser des techniques de recherche de proximité pour trouver des informations pertinentes à ajouter à une invite.
Par exemple, prenons l’entrée suivante d’un utilisateur dans un chatbot de recommandation :
I need a good case for my iPhone 15 pro.
Étant donné que votre modèle d’IA n’a pas été entraîné avec les données exactes contenant les informations sur les produits de votre magasin en ligne, vous devez récupérer les produits les plus pertinents et leurs informations avant d’envoyer l’invite au modèle.
Pour cela, vous envoyez l’entrée originale de l’utilisateur à un incrusteur et obtenez un vecteur que vous pourrez utiliser ultérieurement pour obtenir les 10 produits les plus proches de l’entrée de l’utilisateur. Une fois que vous avez ces informations (et nous verrons comment faire cela avec MariaDB plus tard), vous pouvez envoyer l’invite améliorée à votre modèle d’IA :
I need a good case for my iPhone 15 pro. Which of the following products better suit my needs?
1. ProShield Ultra Case for iPhone 15 Pro - $29.99: A slim, shock-absorbing case with raised edges for screen protection and a sleek matte finish.
2. EcoGuard Bio-Friendly Case for iPhone 15 Pro - $24.99: Made from 100% recycled materials, offering moderate drop protection with an eco-conscious design.
3. ArmorFlex Max Case for iPhone 15 Pro - $39.99: Heavy-duty protection with military-grade durability, including a built-in kickstand for hands-free use.
4. CrystalClear Slim Case for iPhone 15 Pro - $19.99: Ultra-thin and transparent, showcasing the phone's design while providing basic scratch protection.
5. LeatherTouch Luxe Case for iPhone 15 Pro - $49.99: Premium genuine leather construction with a soft-touch feel and an integrated cardholder for convenience.
Cela se traduit par des prédictions d’IA qui utilisent vos propres données.
Création de tables pour le stockage des vecteurs
Pour stocker des vecteurs dans MariaDB, utilisez le nouveau type de données VECTOR
. Par exemple :
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048)
);
Dans cet exemple, la colonne embedding
peut contenir un vecteur de 2048 dimensions. Vous devez faire correspondre le nombre de dimensions que votre « embedder » génère.
Création d’Index de Vecteurs
Pour des performances de lecture optimales, il est important d’ajouter un index à votre colonne de vecteur. Cela accélère les recherches de similarité. Vous pouvez définir l’index au moment de la création de la table comme suit :
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding)
);
Pour un contrôle accru, vous pouvez spécifier la fonction de distance que le serveur de base de données utilisera pour construire l’index, ainsi que la valeur de l’algorithme des Mondes Petits Navigables Hiérarchiques (HNSW) utilisé par MariaDB. Par exemple :
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding) M=8 DISTANCE=cosine
);
Consultez la documentation pour plus d’informations sur ces configurations.
Insertion de Vecteurs
Lorsque vous passez des données (texte, image, audio) à travers un « embedder », vous obtenez un vecteur. En général, il s’agit d’une série de nombres dans un tableau au format JSON. Pour insérer ce vecteur dans une table MariaDB, vous pouvez utiliser la fonction VEC_FromText
. Par exemple :
INSERT INTO products (name, embedding)
VALUES
("Alarm clock", VEC_FromText("[0.001, 0, ...]")),
("Cow figure", VEC_FromText("[1.0, 0.05, ...]")),
("Bicycle", VEC_FromText("[0.2, 0.156, ...]"));
N’oubliez pas que les vecteurs insérés doivent avoir le nombre correct de dimensions tel que défini dans l’instruction CREATE TABLE
.
Recherche de Similarité (Comparaison de Vecteurs)
Dans les applications RAG, vous envoyez l’entrée de l’utilisateur à un intégrateur pour obtenir un vecteur. Vous pouvez ensuite interroger les enregistrements de votre base de données qui sont plus proches de ce vecteur. Les vecteurs plus proches représentent des données qui sont sémantiquement similaires. Au moment de la rédaction de ceci, MariaDB dispose de deux fonctions de distance que vous pouvez utiliser pour la recherche de similarité ou de proximité :
VEC_DISTANCE_EUCLIDEAN
: calcule la distance en ligne droite entre deux vecteurs. Il est mieux adapté aux vecteurs dérivés de données brutes et non normalisées ou aux scénarios où la séparation spatiale est directement corrélée à la similarité, comme la comparaison de caractéristiques positionnelles ou numériques. Cependant, il est moins efficace pour des plongements à haute dimension ou normalisés car il est sensible aux différences de magnitude des vecteurs.VEC_DISTANCE_COSINE
: mesure la différence angulaire entre les vecteurs. Bon pour comparer des plongements normalisés, notamment dans des applications sémantiques comme la recherche de texte ou de documents. Il excelle à capturer la similarité de sens ou de contexte.
Gardez à l’esprit que la recherche de similarité en utilisant les fonctions précédentes est seulement approximative et dépend fortement de la qualité des vecteurs calculés et, par conséquent, de la qualité de l’intégrateur utilisé.
L’exemple suivant trouve les 10 produits les plus similaires à un vecteur donné ($user_input_vector
doit être remplacé par le vecteur réel retourné par l’intégrateur sur l’entrée de l’utilisateur) :
SELECT id, name, description
FROM products
ORDER BY VEC_DISTANCE_COSINE(
VEC_FromText($user_input_vector),
embedding
)
LIMIT 10;
Les fonctions VEC_DISTANCE_COSINE
et VEC_DISTANCE_EUCLIDEAN
prennent deux vecteurs. Dans l’exemple précédent, l’un des vecteurs est le vecteur calculé sur la base de l’entrée utilisateur, et l’autre est le vecteur correspondant à chaque enregistrement dans la table products
.
Un Exemple Pratique
J’ai préparé un exemple pratique en utilisant Java et sans frameworks d’IA afin que vous compreniez vraiment le processus de création d’applications d’IA générative exploitant les capacités de recherche vectorielle de MariaDB. Vous pouvez trouver le code sur GitHub.
Source:
https://dzone.com/articles/vector-storage-indexing-and-search-with-mariadb