Un comparatif des capacités des bases de données vectorielles.
Mon conseil sur ce sujet c'est de ne pas se prendre trop la tête et d'utiliser les capacités de recherche vectorielle de la DB que vous utilisez déjà:
- Postgres: pgvector
- Mongo Atlas: Atlas Vector Search
- Elasticsearch: knn vector search
Si vous avez besoin de recherche avancée avec filtrage, scoring, BM25 (keyword search) et scalabilité alors Elasticsearch reste la meilleure option.
Si vous avez besoin de quelque chose de léger qui tourne dans le même process que votre application, il y a Qdrant (Python) ou LanceDB (Javascript) selon votre techno.
Un article qui explique comment découvrir des tendances lorsque l'on manipule des embeddings.
Par exemple, si l'on a les embeddings des questions posées par les utilisateurs à un Assistant, on peut utiliser la technique de k-mean clustering pour trouver quels sont les sujets les plus abordés dans les questions.
L'article explique comment utiliser Clickhouse pour calculer les centroids de chaque cluster (et donc la meilleure "représentation" du concept) mais il est possible d'utiliser d'autres méthodes, l'algorithme k-mean est assez répandu et de nombreuses implémentations existent
Voyage AI propose des modèles d'embeddings plus performants que ceux de OpenAI.
Ils sont premier du leaderboard MTEB avec leur modèle voyage-lite-02-instruct (67.13 vs 64.59 pour OpenAI), un benchmark qui mesure la performance de la recherche par embeddings.
Leur nouveau modèle d'embeddings, voyage-code-2, est meilleur que les précédents mais en plus à une fenêtre de contexte de 16K token!
Ce modèle est spécialisé pour le code mais offre aussi de très bonnes performances pour le texte normal
OpenAI dévoile plusieurs nouveautés et particulièrement un nouveau modèle d'embeddings (ada2 datait de fin 2022).
Le modèle est décliné en deux versions:
- text-embedding-3-small: 1536 dimensions, 62.3 MTEB
- text-embedding-3-large: 3072 dimensions, 64.6 MTEB
Le modèle large est en 4è position du classement MTEB. (Ada2 était à 61 MTEB)
Le prix du small est 5x moins cher que Ada2 (0.00002$ 1K token) et le large est ~ le même prix (0.00013$ pour 1K token)
La fenêtre de contexte est toujours de 8196 token, ce qui est toujours peu par rapport à celle des embeddings VoyageAI (16K) ou même de GPT4
Un article qui résume les techniques autour des embeddings d'images.
CLIP de OpenAI reste la référence Open Source pour créer des embeddings d'images même si le modèle VIT (Vision Transformer) de Google obtient de meilleures résultats en classification, cela reste encore de la recherche et il n'y a pas de moyen simple d'obtenir les embeddings sous-jacent.
https://paperswithcode.com/sota/zero-shot-transfer-image-classification-on-1
La technique des k-means cluster s'applique également aux images afin de détecter des "groupes" (ou cluster) d'images.
Un article très détaillé sur le fonctionnement des bases de données vectorielles.
Encore une fois, ces "bases de données" servent surtout à faire de la recherche sémantique qui peut être considéré comme un fonctionnalité plutôt qu'un produit à part entière.
Postgres et Elasticsearch proposent de la recherche vectoriel en plus de toutes les autres fonctionnalités d'une application tout en offrant des performances similaires.
Mistral propose maintenant ses propres API d'inférence pour leurs modèles.
Outre les modèles de génération de texte, ils proposent aussi un modèle d'embeddings en 1024 dimensions qui offre des performances similaires à ada-2 de OpenAI sur le benchmark MTEB (56.32 vs 55.26 pour Mistral en retrieval)
Au niveau du prix, c'est la même chose que OpenAI, c-a-d 0.1$ pour 1 million de tokens.
Un modèle d'embeddings de chez Google qui est plus petit que celui de OpenAI donc beaucoup moins cher et utilisable même côté client uniquement (web, mobile)
ça permet de faire de la recherche par similarité mais aussi un classifier.
Une explication détaillée de l'algorithme HNSW pour la recherche vectorielle.
J'ai beaucoup l'analogie utilisée par Qdrant avec un voyage.
Quand vous voyagez d'un petit village à un autre:
- bus pour Lyon
- train pour Paris
- avion pour Berlin
- train Hambourg
- bus pour Lüneburg
Chaque étape utilise un moyen de transport ayant moins de hub et capable de faire de plus grandes distances
L'algorithme HNSW fonctionne selon ce principe, le plan vectoriel est découpé en couches. Plus on est dans une couche haute, moins il y a de vecteurs et plus les vecteurs sont éloignés les uns des autres.
Au fur et à mesure de la recherche, on va de plus en plus bas dans les couches jusqu'à arriver à la dernière et on peut donc récupérer tous les vecteurs les plus proches en un minimum d'opérations.
Un benchmark de requêtage sur des vecteurs d'embeddings dans Postgres avec l'addon pgvector et dans le pure player Pinecone.
Sur un setup équivalent en coût chez Supabase, Postgres est 10x plus rapide avec la même précision.
Donc si on héberge sa propre base Postgres c'est encore moins cher!
A noter que Postgres est beaucoup plus qu'une base vectorielle et qu'on va pouvoir filtrer les résultats avec des WHERE, faire des jointures, etc
Une explication de fonctionnement des opérations sur les vecteurs (embedding LLM)
- distance euclidienne
- produit intérieur négatif
- similarité cosinus
C'est avec des indexes Postgres dans cet exemple. L'index HNSW est celui recommandé https://supabase.com/docs/guides/ai/vector-indexes/hnsw-indexes
Un article qui compare différentes bases de données vectorielles pour stocker les embeddings des LLMs et faire de la recherche sémantique.
A noter que si vous avez déjà Postgres ou Elasticsearch, les deux proposent un mode vectoriel.
Les bases de données dédiées aux vecteurs comme Qdrant ou Pinecone ne sont vraiment intéressantes que pour des gros volumes (> 100 000 vecteurs)
Une explication détaillée de ce que sont les embeddings et leur usage.
Les "embeddings" sont aux coeurs de tous les systèmes d'IA actuels et bien sur les Transformers (GPT, StableDiffusion, Midjourney, etc)
Ce sont des représentation mathématique de textes, d'images pouvant ensuite être traitées par des réseaux de neurones mais aussi par des fonctions mathématiques traditionnelles car ce ne sont que des vecteurs ou des matrices à N dimensions.