Dans le monde des bases vectorielles (QDrant, Milvus, Weaviate), choisir la bonne méthode de comparaison entre vecteurs est essentiel. Cela influe directement sur la qualité des résultats, la pertinence sémantique et parfois même la performance.
Cet article propose un rappel rapide des 3 méthodes principales, un exemple en C#, et des recommandations basées sur des cas concrets.
📐 1. Les 3 méthodes principales
|
Méthode
|
Description
|
Valeur typique
|
|
Similarité cosinus
|
Angle entre deux vecteurs (proximité directionnelle)
|
[-1 ; 1] (plus c’est proche de 1, mieux c’est)
|
|
Produit scalaire
|
Multiplication coordonnée à coordonnée, sans normalisation
|
Peut être > 1
|
|
Distance euclidienne
|
Distance géométrique entre les deux vecteurs
|
[0 ; +∞] (plus c’est proche de 0, mieux c’est)
|
📦 2. Exemple en C# – Comparaison de 3 vecteurs
static float CosineSimilarity(float[] a, float[] b)
{
float dot = 0, normA = 0, normB = 0;
for (int i = 0; i < a.Length; i++)
{
dot += a[i] * b[i];
normA += a[i] * a[i];
normB += b[i] * b[i];
}
return dot / (MathF.Sqrt(normA) * MathF.Sqrt(normB));
}
static float DotProduct(float[] a, float[] b) => a.Zip(b, (x, y) => x * y).Sum();
static float EuclideanDistance(float[] a, float[] b) => MathF.Sqrt(a.Zip(b, (x, y) => (x - y) * (x - y)).Sum());
Testons avec :
var a = new float[] { 0.5f, 0.1f, 0.2f };
var b = new float[] { 0.4f, 0.12f, 0.25f };
var c = new float[] { -0.6f, -0.2f, 0.1f };
Résultat :
Cos(a, b) = 0.992
Cos(a, c) = -0.734
Dot(a, b) = 0.305
Dot(a, c) = -0.29
Dist(a, b) = 0.0707
Dist(a, c) = 1.204
🧪 3. Quel score utiliser dans QDrant ?
QDrant supporte 3 métriques :
- Cosine (défaut recommandé)
- Dot (rapide, mais à manipuler avec prudence)
- Euclidean (utile si les vecteurs ne sont pas normalisés)
"vectors": {
"size": 512,
"distance": "Cosine"
}
QDrant convertit automatiquement les distances en score de similarité croissant.
✅ Recommandations pratiques
|
Cas d’usage
|
Méthode conseillée
|
|
Embeddings OpenAI / texte normalisé
|
Cosine
|
|
Données brutes (sans normalisation)
|
Euclidean
|
|
Moteur rapide interne (score brut)
|
Dot
|
- Toujours normaliser vos vecteurs si vous utilisez Cosine
- Éviter Dot si vous ne comprenez pas parfaitement vos vecteurs
🔚 Conclusion
Le choix de la métrique de similarité n’est pas anodin. La similarité cosinus reste le choix de référence pour les embeddings textuels, tandis que le produit scalaire peut être utile en interne pour des performances maximales.
Stay Tuned !