Cette page explique comment choisir parmi les fonctions de distance vectorielle fournies dans Spanner pour mesurer la similarité entre les embeddings vectoriels.
Une fois que vous avez généré des embeddings à partir de vos données Spanner, vous pouvez effectuer une recherche de similarité à l'aide de fonctions de distance vectorielle. Le tableau suivant décrit les fonctions de distance vectorielle dans Spanner.
| Fonction | Description | Formule | Relation avec l'augmentation de la similarité |
|---|---|---|---|
| Produit scalaire | Calcule le cosinus de l'angle \(\theta\) multiplié par le produit des magnitudes vectorielles correspondantes. | \(a_1b_1+a_2b_2+...+a_nb_n\) \(=|a||b|cos(\theta)\) | Augmente |
| Distance de cosinus | La fonction de distance de cosinus soustrait la similarité cosinus de un (cosine_distance() = 1 - cosine similarity). La similarité cosinus mesure le cosinus de l'angle \(\theta\) entre deux vecteurs.
|
1 - \(\frac{a^T b}{|a| \cdot |b|}\) | Diminue |
| Distance euclidienne | Mesure la distance en ligne droite entre deux vecteurs. | \(\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+...+(a_N-b_N)^2}\) | Diminue |
Choisir une mesure de similarité
Selon que tous vos embeddings vectoriels sont normalisés ou non, vous pouvez déterminer la mesure de similarité à utiliser pour trouver la similarité. Un embedding vectoriel normalisé a une magnitude (longueur) de 1,0 exactement.
De plus, si vous savez avec quelle fonction de distance votre modèle a été entraîné, utilisez cette fonction de distance pour mesurer la similarité entre vos embeddings vectoriels.
Données normalisées
Si vous disposez d'un ensemble de données dans lequel tous les embeddings vectoriels sont normalisés, les trois fonctions fournissent les mêmes résultats de recherche sémantique. En substance, bien que chaque fonction renvoie une valeur différente, ces valeurs sont triées de la même manière. Lorsque les embeddings sont normalisés, DOT_PRODUCT() est généralement la plus efficace en termes de calcul, mais la différence est négligeable dans la plupart des cas. Toutefois, si votre application est très sensible aux performances, DOT_PRODUCT() peut vous aider à les optimiser.
Données non normalisées
Si vous disposez d'un ensemble de données dans lequel les embeddings vectoriels ne sont pas normalisés, il n'est pas mathématiquement correct d'utiliser DOT_PRODUCT() comme fonction de distance, car le produit scalaire en tant que fonction ne mesure pas la distance. Selon la façon dont les embeddings ont été générés et le type de recherche préféré, la fonction COSINE_DISTANCE() ou EUCLIDEAN_DISTANCE() produit des résultats de recherche qui sont subjectivement meilleurs que l'autre fonction.
Il peut être nécessaire d'expérimenter avec COSINE_DISTANCE() ou EUCLIDEAN_DISTANCE() pour déterminer celle qui convient le mieux à votre cas d'utilisation.
Vous ne savez pas si les données sont normalisées ou non
Si vous ne savez pas si vos données sont normalisées ou non et que vous souhaitez utiliser DOT_PRODUCT(), nous vous recommandons d'utiliser COSINE_DISTANCE() à la place.
COSINE_DISTANCE() est semblable à DOT_PRODUCT(), mais avec une normalisation intégrée.
La similarité mesurée à l'aide de COSINE_DISTANCE() est comprise entre 0 et 2. Un résultat proche de 0 indique que les vecteurs sont très similaires.
Étape suivante
- Découvrez comment effectuer une recherche vectorielle en trouvant le k plus proche voisin.
- Découvrez comment exporter des embeddings vers Gemini Enterprise Agent Platform Vector Search.
- En savoir plus sur les fonctions GoogleSQL
COSINE_DISTANCE(),EUCLIDEAN_DISTANCE(), etDOT_PRODUCT(). - En savoir plus sur les fonctions
spanner.cosine_distance(),spanner.euclidean_distance(), and spanner.dot_product()PostgreSQL.