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:

  1. Indexar: convertir documentos en embeddings y almacenar (ej.: vector DB).
  2. Consultar: convertir la pregunta del usuario en embedding.
  3. Recuperar: buscar los k vectores más similares al embedding de la pregunta (usando coseno o dot product).
  4. 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

ConceptoPapel
Similaridad de cosenoMide el alineamiento semántico entre vectores (embedding de pregunta vs. embeddings de fragmentos).
RAGUsa esta métrica para elegir el contexto más relevante antes de llamar a la LLM.
Efecto en las LLMsMenos 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).