Dot.Blog

Consulting DotNet C#, XAML, WinUI, WPF, MAUI, IA

Benchmark des méthodes de similarité : Cosinus, produit scalaire, distance euclidienne

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 !

Faites des heureux, PARTAGEZ l'article !