La fórmula: cos(θ) = (A · B) / (||A|| × ||B||), donde A · B es el producto punto y ||A||, ||B|| son las magnitudes (longitudes) de los vectores. Al dividir por las magnitudes, la similitud del coseno mide solo la dirección — un vector [1, 2, 3] es idéntico en similitud del coseno a [2, 4, 6] porque apuntan en la misma dirección. Esta normalización es la razón por la que el coseno funciona bien para embeddings: la dirección codifica el significado, mientras que la magnitud puede variar según la longitud del texto o particularidades del modelo.
Si los embeddings ya están normalizados a longitud unitaria (magnitud 1), la similitud del coseno es igual al producto punto — y el producto punto es más rápido de calcular (sin división). La mayoría de los modelos de embedding producen vectores normalizados exactamente por esta razón. Al usar una base de datos vectorial, verifica si tus embeddings están normalizados: si lo están, usa producto punto (más rápido). Si no, usa similitud del coseno (correcto independientemente de la normalización).
La similitud del coseno trata todas las dimensiones por igual, pero algunas dimensiones del embedding pueden ser más importantes que otras. También mide similitud de dirección general, lo que puede pasar por alto diferencias matizadas. Dos oraciones sobre "programación en Python" y "Python la serpiente" podrían tener una similitud del coseno moderadamente alta porque comparten el concepto "Python". Medidas de similitud más sofisticadas (métricas aprendidas, re-ranking con cross-encoder) pueden captar distinciones más finas a mayor costo computacional.