Skip to main content

Command Palette

Search for a command to run...

Embeddings

Lo que un senior dev necesita saber

Updated
•7 min read•View as Markdown
Embeddings

Buscas “cómo manejar errores de autenticación” en la documentación interna de tu empresa y el sistema te devuelve un documento titulado “Troubleshooting OAuth 2.0 failures”. Cero coincidencias de palabras, cien por ciento de relevancia. Eso son los embeddings en acción.

Si llevas tiempo escuchando el término pero nunca te has detenido a entender qué hay debajo, este es el momento. No porque sea el buzzword del año, sino porque es una herramienta que resuelve problemas reales que antes requerían soluciones mucho más complejas.

Qué son realmente

Un embedding es un array de floats de longitud fija, típicamente entre 384 y 3072 elementos, donde la posición del vector en un espacio geométrico codifica el significado semántico del texto de entrada. No es un hash ni es compresión. Es una traducción del lenguaje humano a coordenadas en un espacio multidimensional.

La intuición más útil es pensar en coordenadas GPS, pero para el significado. Así como dos ubicaciones cercanas en un mapa comparten características geográficas, dos textos con embeddings cercanos comparten características semánticas. “Cancelar suscripción” y “dar de baja mi cuenta” producen vectores que apuntan a la misma región del espacio, aunque no compartan ninguna palabra.

Para medir qué tan “cerca” están dos vectores se usan métricas de distancia. La más común es cosine similarity, que mide el ángulo entre dos vectores ignorando su magnitud, lo que resulta útil al comparar textos de distinta longitud. La distancia euclidiana considera tanto dirección como magnitud, y es apropiada cuando los valores absolutos importan. El dot product, en el caso de vectores normalizados como los de OpenAI, produce exactamente el mismo resultado que cosine similarity. En la práctica, si usas embeddings de OpenAI, las tres métricas te darán el mismo ranking de resultados.

Un detalle importante: cuando ves que un modelo produce vectores de 1536 dimensiones, esas dimensiones no son interpretables individualmente. No puedes decir “la dimensión 5 representa formalidad” o “la dimensión 12 indica si es una pregunta”. La información semántica está distribuida a lo largo de todas las dimensiones, de una forma que ni siquiera los investigadores que entrenaron estos modelos pueden explicar completamente.

Patrones estadísticos, no comprensión

Este es quizá el punto más importante para usar embeddings con las expectativas correctas. Los embeddings capturan patrones estadísticos de co-ocurrencia en el texto de entrenamiento, no “significado” en el sentido humano de la palabra.

La hipótesis subyacente es simple: las palabras se entienden por la compañía que mantienen. Si “gato” y “perro” aparecen frecuentemente en contextos similares (cerca de palabras como “mascota”, “veterinario”, “alimentar”), sus embeddings quedarán cerca en el espacio vectorial. Levy y Goldberg demostraron en 2014 que Word2Vec, uno de los primeros modelos de embeddings, básicamente factoriza una matriz de co-ocurrencias de palabras.

La famosa analogía “king − man + woman ≈ queen” funciona precisamente por esto: las relaciones analógicas entre palabras corresponden a relaciones entre sus estadísticas de co-ocurrencia. Pero hay un matiz que casi nadie menciona. En el paper original, las palabras de entrada se excluyen al buscar el resultado. Si no se excluyen, el resultado de esa operación aritmética sería “king” otra vez, no “queen”. Queen es el segundo más cercano. Esto no invalida la utilidad de los embeddings, pero sí ayuda a calibrar expectativas sobre cuán “mágicos” son realmente.

Cómo los usa la IA internamente

Cada vez que interactúas con un LLM como GPT-4 o Claude, los embeddings son el primer paso del procesamiento. El texto se tokeniza (se divide en subpalabras) y cada token se convierte en un vector mediante una tabla de lookup. En GPT-2, esta tabla tiene aproximadamente 38 millones de parámetros dedicados solo a convertir tokens en vectores iniciales.

Estos vectores pasan por capas de transformers, donde la atención permite que cada token “mire” a todos los demás y ajuste su representación según el contexto. El embedding de “banco” en “me senté en el banco del parque” termina siendo muy diferente del de “banco” en “fui al banco a depositar un cheque”. Esto contrasta con modelos más antiguos, donde cada palabra tenía un único vector fijo sin importar el contexto.

Los modelos de embeddings que usamos para búsqueda semántica (como text-embedding-3 de OpenAI) no son los mismos que generan texto. Están optimizados específicamente para producir representaciones donde la cercanía geométrica corresponda a similitud semántica, usando técnicas como contrastive learning, que acerca embeddings de textos similares y aleja los de textos distintos.

Para qué sirven en la práctica

La búsqueda semántica es el caso de uso más directo. La búsqueda tradicional por keywords falla cuando el usuario usa términos diferentes a los del documento. Buscas “athletic footwear” y no encuentras documentos que dicen “running shoes”. Con embeddings, ambos textos ocupan regiones cercanas del espacio vectorial y la búsqueda funciona. Spotify implementó esto para podcasts: antes, buscar “electric cars climate impact” devolvía cero resultados, aunque existieran episodios relevantes.

RAG (Retrieval Augmented Generation) es probablemente la aplicación más relevante hoy. La arquitectura es directa: generas embeddings de tus documentos y los guardas en una base de datos vectorial. Cuando un usuario hace una pregunta, generas el embedding de esa pregunta, buscas los documentos más cercanos y los inyectas como contexto en el prompt del LLM. El modelo genera una respuesta basada en tus datos reales en lugar de alucinar. Es más barato que el fine-tuning y permite usar datos privados o actualizados sin reentrenar el modelo.

Los sistemas de recomendación también se benefician enormemente. Airbnb entrenó embeddings para 4.5 millones de propiedades usando 800 millones de sesiones de búsqueda. La técnica consistió en tratar la secuencia de listings que un usuario clickea como una “oración”, donde cada listing es una “palabra”. El resultado fue una mejora del 21 % en el click-through rate para recomendaciones de propiedades similares.

Otros usos incluyen clasificación de texto sin datos de entrenamiento (generando embeddings de las descripciones de cada categoría y comparando similitud), detección de duplicados que identifica parafraseos además de copias exactas, y clustering automático de documentos por tema.

Las limitaciones que nadie menciona

La negación es un punto ciego crítico. Los embeddings de “I like football” y “I do not like football” son casi idénticos, porque ambos hablan de fútbol y preferencias personales. Un desarrollador reportó que buscar “laptops without touch screens” devolvía resultados de laptops con pantalla táctil. Esto no es un bug, es una limitación fundamental de cómo funcionan los embeddings.

Los sesgos del corpus de entrenamiento también se heredan. Un estudio encontró que, de las 1,000 palabras más frecuentes en embeddings populares, el 77 % están más asociadas con hombres que con mujeres. Conceptos asociados a hombres tienden a ser verbos de acción; los asociados a mujeres, adjetivos de apariencia. Si construyes un sistema de búsqueda de candidatos usando embeddings, estos sesgos pueden filtrarse en los resultados.

Cambiar de modelo implica re-embeddear todo. Los embeddings de distintos modelos viven en espacios vectoriales incompatibles. No puedes mezclar vectores de text-embedding-ada-002 con text-embedding-3-small en la misma base de datos. Para un corpus de millones de documentos, migrar a un modelo nuevo supone costos significativos de cómputo y coordinación.

Los textos muy cortos o muy largos también son problemáticos. Una sola palabra como “Java” mezcla el lenguaje de programación con la isla indonesia. Un documento de 10,000 tokens comprimido en 1,536 dimensiones inevitablemente pierde información. La práctica estándar es dividir documentos largos en chunks de 500 a 1,000 tokens, con todos los trade-offs que eso conlleva.

Cómo empezar

La forma más rápida es usar la API de OpenAI:

from openai import OpenAI

client = OpenAI()

response = client.embeddings.create(
    model="text-embedding-3-small",
    input="Tu texto aquí"
)

embedding = response.data[0].embedding  # lista de 1536 floats

Para almacenar y buscar embeddings a escala necesitas una base de datos vectorial. Pinecone es la opción managed más popular. Weaviate y Qdrant son alternativas open source sólidas. Si ya usas PostgreSQL, pgvector te permite añadir capacidades vectoriales sin nueva infraestructura y funciona bien hasta decenas de millones de vectores.

Si prefieres no depender de APIs externas, sentence-transformers es la librería estándar para embeddings open source, con miles de modelos preentrenados disponibles en Hugging Face.

La idea que queda

Los embeddings son una de esas herramientas que, una vez que entiendes, empiezas a ver oportunidades en todos lados. Cualquier problema que implique “encontrar cosas similares” o “entender de qué trata un texto” probablemente tenga una solución elegante con embeddings.

La clave para usarlos bien es entender qué son realmente: detectores de patrones estadísticos con puntos ciegos específicos, no sistemas de comprensión. Cuando dejas de esperar que "entiendan" y los tratas como lo que son (una traducción del lenguaje a geometría) tus sistemas mejoran.

Recursos para profundizar: