Definición matemática
La similaridad de coseno entre dos vectores A y B en un espacio euclidiano es el coseno del ángulo θ entre ellos. Formalmente:
A · B Σᵢ AᵢBᵢ
similaridad(A,B) = ------- = ----------------------------
‖A‖ ‖B‖ √(Σᵢ Aᵢ²) · √(Σᵢ Bᵢ²)
Es decir: producto interno de los vectores dividido por el producto de sus normas L2. En la práctica: es el producto interno (dot product) de los vectores normalizados. Cuando los vectores ya están normalizados (norma L2 = 1), la similaridad de coseno se reduce al dot product:
import numpy as np
def cosine_similarity(a: np.ndarray, b: np.ndarray) -> float:
"""Similaridad de coseno: valor en [-1, 1]. 1 = idénticos, 0 = ortogonales, -1 = opuestos."""
a_norm = a / np.linalg.norm(a)
b_norm = b / np.linalg.norm(b)
return float(np.dot(a_norm, b_norm))
- 1: misma dirección (máxima similaridad)
- 0: ortogonales (sin relación)
- -1: direcciones opuestas
Para embeddings de texto, los valores suelen estar en [0, 1] porque los modelos generan vectores en semi-espacios donde ángulos > 90° son raros.
Embeddings y espacio semántico
Las LLMs y los modelos de embedding (Sentence-BERT, OpenAI Embeddings, Cohere, etc.) mapean texto a vectores densos en R^n (típicamente n = 384, 768, 1536 o más). En ese espacio:
- Textos semánticamente cercanos quedan geométricamente cercanos
- La similaridad de coseno (o el dot product con vectores normalizados) mide esa cercanía
Es decir: buscar “textos parecidos” se convierte en buscar “vectores con coseno alto”.
Por qué la similaridad de coseno ayuda a las LLMs
1. Retrieval (RAG) y contexto relevante
En RAG (Retrieval-Augmented Generation), el flujo es:
- Indexar: convertir documentos en embeddings y almacenar (ej.: vector DB).
- Consultar: convertir la pregunta del usuario en embedding.
- Recuperar: buscar los k vectores más similares al embedding de la pregunta (usando coseno o dot product).
- Generar: inyectar esos fragmentos como contexto en el prompt de la LLM.
Si el retrieval devuelve fragmentos irrelevantes, la LLM tiende a “alucinar” o desviarse. Si devuelve fragmentos muy similares a la pregunta, el contexto es relevante y la respuesta tiende a ser más precisa y anclada en los datos. La similaridad de coseno es la métrica que ordena qué fragmentos son más relevantes.
2. Independencia de la magnitud (norma)
A diferencia de la distancia euclidiana, la similaridad de coseno no depende del tamaño del vector, solo de la dirección. Eso es útil porque:
- Documentos largos generan vectores con norma mayor; con distancia euclidiana, un doc largo podría ser siempre “más lejano”.
- Con coseno, un párrafo corto y un documento largo pueden ser igual de similares a la pregunta si el contenido semántico está alineado.
3. Eficiencia en producción
Con vectores normalizados (norma L2 = 1), similaridad de coseno = dot product. En muchos vector DBs (Pinecone, Weaviate, pgvector, etc.):
- Índices como IVF o HNSW están optimizados para nearest neighbor por dot product o coseno.
- La búsqueda es sub-lineal en el número de vectores (no hace falta comparar con todos).
Eso permite escalar RAG a millones de chunks sin degradar la latencia.
Implementación típica en RAG
# Pseudocódigo de retrieval con similaridad de coseno
def retrieve(query: str, top_k: int = 5) -> list[Chunk]:
query_embedding = embedding_model.encode(query, normalize_embeddings=True)
# El vector DB devuelve los top_k por similaridad de coseno (o dot product)
results = vector_db.search(query_embedding, top_k=top_k, metric="cosine")
return [hit.chunk for hit in results]
Normalizar en la indexación y en la query garantiza que estás usando coseno (dot product en vectores unitarios).
Resumen
| Concepto | Papel |
|---|---|
| Similaridad de coseno | Mide el alineamiento semántico entre vectores (embedding de pregunta vs. embeddings de fragmentos). |
| RAG | Usa esta métrica para elegir el contexto más relevante antes de llamar a la LLM. |
| Efecto en las LLMs | Menos alucinación y respuestas más precisas cuando el contexto recuperado tiene alta similaridad con la pregunta. |
Cuanto mejor sea el retrieval (y por tanto el uso de similaridad de coseno), mejor suele ser el rendimiento de la LLM en tareas basadas en conocimiento (QA, soporte, documentación).