Un embedding es una lista de números (un vector) que representa el significado de una palabra, una frase o un documento. La magia es que cosas parecidas quedan cerca en ese espacio numérico: así una máquina, que solo entiende números, puede "medir" significados.
De palabras a vectores
Un computador no entiende "gato". Necesita números. La idea ingenua sería asignar un número a cada palabra (gato = 1, perro = 2...), pero eso no dice nada: ¿por qué "perro" estaría entre "gato" y algo con el número 3?
Un embedding hace algo mucho mejor: representa cada elemento con un vector de muchas dimensiones (por ejemplo 384 o 1536 números), aprendido de modo que la posición en ese espacio capture el significado.
Como vimos en la lección de IA generativa, este es justo el primer paso que da un LLM: convertir cada token en su embedding antes de procesarlo.
Un espacio con significado
En un buen espacio de embeddings, la cercanía equivale a parecido de significado. "Gato" y "felino" quedan casi encima; "gato" y "bolsa de valores", muy lejos.
Para medir esa cercanía no usamos la distancia común, sino la similitud coseno, que compara la dirección de dos vectores (ignorando su longitud):
Vale entre y :
- : apuntan al mismo lado → muy parecidos.
- : perpendiculares → sin relación.
- : opuestos.
Lo asombroso es que el espacio captura relaciones. El ejemplo clásico:
Las direcciones dentro del espacio codifican conceptos como "género" o "plural".
¿Cómo se obtienen?
Los embeddings se aprenden, no se escriben a mano. Un modelo se entrena con enormes cantidades de texto bajo una premisa simple: una palabra se define por la compañía que tiene. Palabras que aparecen en contextos parecidos terminan con vectores parecidos.
Hoy se usan modelos de embeddings (muchos derivados de Transformers) que reciben una frase completa y devuelven un solo vector que resume su significado.
Para qué sirven
Los embeddings son la base de muchísimas aplicaciones modernas:
- Búsqueda semántica: buscar por significado, no por palabras exactas. "¿Cómo bajo de peso?" encuentra un texto sobre "adelgazar" aunque no compartan palabras.
- RAG (Retrieval-Augmented Generation): darle a un LLM los documentos más parecidos a la pregunta para que responda con información real.
- Recomendación: sugerir productos o artículos cercanos a los que te gustaron.
- Agrupamiento y clasificación: juntar textos por tema automáticamente.
En código
Con la librería sentence-transformers obtener embeddings y compararlos toma pocas líneas:
from sentence_transformers import SentenceTransformer
import numpy as np
modelo = SentenceTransformer("all-MiniLM-L6-v2")
frases = [
"El gato duerme en el sofá",
"Un felino descansa en el sillón",
"La bolsa subió con fuerza hoy",
]
vecs = modelo.encode(frases) # matriz de 3 x 384
def coseno(a, b):
return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))
print(coseno(vecs[0], vecs[1])) # alto: significan casi lo mismo
print(coseno(vecs[0], vecs[2])) # bajo: hablan de temas distintos
Una búsqueda semántica mínima es solo esto: convertir la consulta y los documentos a vectores y ordenar por similitud.
consulta = modelo.encode("mascota descansando")
sims = [coseno(consulta, v) for v in vecs]
print(np.argsort(sims)[::-1]) # índices de las frases más parecidas primero
Para llevar
Un embedding traduce texto a un vector donde la cercanía es sinónimo de significado parecido, medida con la similitud coseno. Es el puente entre el lenguaje y las matemáticas: la pieza que hace posibles la búsqueda semántica, los sistemas RAG y las recomendaciones. Todo LLM empieza convirtiendo sus tokens en embeddings antes de decidir la siguiente palabra.
