SincroDev Logo SincroDev

Embeddings: Cómo los LLM entienden el significado (sin leer como humanos)


Cuando un modelo ve texto, no “entiende” palabras como nosotros. Primero las transforma en números.

Esos números, organizados en vectores, se llaman embeddings. Son la base de casi todo sistema moderno de búsqueda semántica, recomendación y RAG.

Si RAG es el motor, los embeddings son el mapa.

Embeddings en una frase

Un embedding es una representación numérica de un texto donde la cercanía matemática intenta reflejar similitud de significado.

Texto parecido en significado, vectores cercanos en el espacio.

Intuición rápida

Imagina un espacio con miles de dimensiones.

  • “recuperar contraseña”
  • “restablecer clave”

No son la misma frase, pero suelen terminar cerca.

En cambio:

  • “configurar factura electrónica”

quedará en otra zona del espacio porque el tema es distinto.

¿Para qué se usan en desarrollo?

  1. Búsqueda semántica: encontrar por intención, no por coincidencia exacta.
  2. RAG: recuperar chunks relevantes antes de llamar al LLM.
  3. Recomendaciones: sugerir contenido similar.
  4. Deduplicación: detectar textos casi iguales.
  5. Clustering: agrupar documentos por tema.

Flujo típico con embeddings

1) Indexación

  • Tomas documentos.
  • Los divides en chunks.
  • Generas un embedding por chunk.
  • Guardas vector + texto + metadatos en una vector DB.

2) Consulta

  • Generas embedding de la pregunta.
  • Buscas vecinos más cercanos (top_k).
  • Devuelves los fragmentos más similares para responder o mostrar.

Similitud: coseno vs distancia

Para comparar vectores se usan métricas como:

  • Cosine similarity: mide orientación entre vectores.
  • Dot product: útil en algunos modelos normalizados.
  • Euclidean distance: distancia geométrica clásica.

En práctica, para texto, el coseno suele ser una primera opción sólida.

Ejemplo mínimo (pseudocódigo)

# Indexación
for chunk in chunks:
    vec = embed(chunk.text)
    vector_db.upsert(
        id=chunk.id,
        vector=vec,
        metadata={"doc": chunk.doc_id, "section": chunk.section},
        text=chunk.text,
    )

# Consulta
q = "no puedo entrar a mi cuenta"
q_vec = embed(q)
results = vector_db.search(q_vec, top_k=5)

for r in results:
    print(r.score, r.metadata["doc"], r.text[:120])

Decisiones que impactan de verdad

Tamaño de chunk

  • Muy chico: pierde contexto.
  • Muy grande: baja precisión.

Como punto de partida práctico: 400 a 800 tokens con algo de solapamiento.

Modelo de embeddings

No todos los modelos sirven igual para todos los idiomas o dominios.

  • Evalúa español si tu contenido principal está en español.
  • Evita mezclar embeddings de modelos distintos en el mismo índice.

Metadatos

Sin metadatos, el sistema queda “ciego”.

Guarda al menos:

  • source
  • titulo
  • fecha
  • tipo_documento
  • permisos

Esto permite filtrar por producto, versión o nivel de acceso.

Re-rank

Un patrón útil: recuperar 20 chunks por vector y luego re-rankear a 5 con un modelo adicional.

Suele subir precisión en preguntas ambiguas.

Errores comunes

  1. Usar embeddings para todo, incluso cuando una consulta exacta (ID, email, SKU) sería mejor con búsqueda clásica.
  2. No reindexar cuando cambian documentos.
  3. Ignorar evaluación offline con preguntas reales de usuarios.
  4. Asumir que “más top_k” siempre mejora resultados.
  5. No controlar permisos en retrieval (riesgo de fuga de datos).

Embeddings + RAG: conexión directa

En RAG, los embeddings no generan la respuesta: seleccionan el contexto que verá el LLM.

Si selección es mala, la respuesta también.

Por eso, en muchos proyectos, optimizar retrieval da más mejora que cambiar de modelo generativo.

Checklist práctico para producción

  • Define dataset de evaluación (pregunta, contexto esperado, respuesta esperada).
  • Mide recall@k y precisión de contexto.
  • Loguea consultas y chunks recuperados.
  • Versiona índices y pipeline de ingesta.
  • Configura filtros por permisos desde el primer día.

Los embeddings no son “magia de IA”. Son infraestructura semántica. Bien diseñados, convierten texto desordenado en conocimiento recuperable y utilizable por tus aplicaciones.