¿Qué son los embeddings y cómo se usan en la IA?
En la incipiente rama de la Inteligencia Artificial hay un concepto que quizás hayas oído alguna vez pero que no comprendas al 100% su significado o su motivo de existir. Se trata de los embeddings, unas representaciones numéricas de datos que están asociados al significado de aquellos datos que se desean representar. Son algo esencial para el funcionamiento de los modelos de lenguaje (LLM) y para la creación de aplicaciones que implementan funcionalidades avanzadas de IA.
¿Qué son los embeddings?
En pocas palabras, los embeddings son representaciones numéricas de datos en forma de vectores, de un modo matemático puro y asumible por los modelos de IA y las operaciones que realizan para procesar de forma eficiente toda la información que manejan.
Los modelos de IA usan diversos tipos de datos como texto, imágenes, audio, etc. Sin embargo, estos modelos no dejan de ser programas informáticos, de una complejidad elevada, pero programas en el fondo. Por tanto, no pueden procesar toda la información que hay en los datos que manejan como lo haríamos nosotros. En lugar de ello necesitan traducir esa información compleja y no estructurada en una forma que los modelos de machine learning puedan procesar eficientemente.
En este ámbito los modelos LLM usan los embeddings, ya que les permiten capturar de una manera matemática los significados de los datos que manejan y poder encontrar relaciones semánticas entre elementos. Para ello, en estas representaciones matemáticas, palabras o frases con significados similares terminan ubicadas cerca unas de otras en el espacio vectorial. Esto posibilita tareas como búsqueda semántica, clustering, recomendación o clasificación.
Funcionamiento de los LLM embeddings
Los Large Language Models (LLM) generan embeddings como parte del proceso interno que realizan para la comprensión del lenguaje. Estos embeddings no son simplemente una conversión directa, sino el resultado de múltiples transformaciones, donde los LLM generalmente usan lo que llamamos Transformers.
De tokens a vectores
Como sabrás, la IA hace una primera división del texto en tokens. Estos tokens son más o menos como las palabras, aunque no necesariamente van a corresponder un token a una palabra completa, sino que podrían ser subpalabras o incluso caracteres.
Por otra parte tenemos los embeddings o más concretamente la capa de embeddings que es es un área de una red neuronal que convierte cada token en un vector denso de números. De este modo, cada token se asocia inicialmente con un vector numérico a través de una tabla de embeddings aprendida durante el entrenamiento.
Este vector inicial ya contiene cierta información semántica, pero aún es limitado en contexto. De hecho, en modelos modernos se refinan según el contexto y se combinan con otras capas, como la autoatención y la codificación posicional.
Proyección matemática del lenguaje en espacios vectoriales de alta dimensionalidad
Una vez convertidos en vectores, los tokens se representan en espacios de alta dimensionalidad. Para que te hagas una idea de su magnitud, podemos encontrar vectores de 768 o de 1024 dimensiones.
Estas dimensiones no tienen que ver con el nivel de razonamiento sino más bien con el nivel de detalle. Por tanto, a más dimensiones pueden dar más margen para separar conceptos y capturar matices, pero también aumentan el coste y la memoria. En todo caso, en estos espacios, la proximidad entre vectores refleja siempre relaciones semánticas entre los elementos.
Gracias a esta proyección matemática se permiten operaciones como medir similitud mediante distancia coseno o agrupar conceptos relacionados. Puedes entender este proceso como una proyección matemática donde el lenguaje se transforma en geometría.
El papel del mecanismo de autoatención (Self-Attention) para capturar el contexto semántico
Dentro del funcionamiento que realizan los modelos de lenguaje hay multitud de procesos para refinar su comportamiento y uno de ellos es el mecanismo de autoatención. Básicamente es la parte del proceso Transformer que permite que cada token analice los demás tokens de la secuencia, de modo que se pueda decidir cuáles son más relevantes al interpretar su significado.
Gracias al mecanismo de self-attention cada token tiene en cuenta el resto de tokens de la secuencia, de modo que el modelo puede procesar el contenido de manera más global, en vez de entender los tokens o las palabras de forma aislada.
Mediante este mecanismo de self-attention es posible que el embedding de una palabra cambie según el contexto. Por ejemplo, la palabra «banco» tendrá representaciones diferentes en función de si se refiere a una entidad financiera o a un lugar donde sentarse.
Codificación posicional
Otro de los procesos de los Transformers es la codificación posicional. Ésta se da porque los modelos no tienen una noción fija de cuál debería de ser el orden de las palabras, por lo que necesitan incorporar información sobre la posición de cada token en la secuencia.
Para ello los modelos realizan codificaciones posicionales, que se suman a los embeddings iniciales y con ello se consigue entender mejor qué función realiza cada palabra dentro de una oración más compleja. No es lo mismo «salir para correr» que «correr para salir».
Extracción de pesos en las capas ocultas del Transformer para generar la representación final
Y, por último, se deben tener en cuenta los pesos en las capas ocultas del transformer para generar la representación final. Esto es importante porque, a medida que los datos pasan por múltiples capas del Transformer, los vectores se transforman progresivamente. En este proceso, cada capa ajusta los embeddings refinando su significado en función del contexto.
El embedding final puede extraerse en realidad de distintas formas según el uso. Podría ser la salida de una capa específica, el promedio de todos los tokens, o el embedding de un token especial. Es entonces el vector final el que se utiliza en tareas como búsqueda semántica o clasificación.
Modelos multimodales e image embeddings
Si para la procesar el texto ya resulta bastante complejo el concepto y la obtención de los embeddings la cosa se puede complicar todavía más para los modelos multimodales, que son capaces de trabajar con entradas y salidas en distintos tipos de formatos, como las imágenes o los vídeos.
Para conseguir que todo funcione de una manera similar, lo que hacen los modelos multimodales es representar distintos tipos de datos en espacios vectoriales compatibles.
¿Qué son los image embeddings?
Los image embeddings son representaciones vectoriales de imágenes donde se capturan características visuales de esas imágenes como las formas, colores, texturas o patrones. Estos embeddings de imagen permiten comparar material gráfico, buscar imágenes similares o incluso relacionarlas con texto.
El hecho de que los embeddings de imagen y de texto sean compatibles hace que una imagen de un gato tendrá un embedding cercano al de la palabra «gato» en modelos multimodales.
Embeddings de audio, vídeo y código fuente
Lo mismo que hemos explicado para los embeddings de imágenes se puede aplicar también a los embeddings obtenidos a partir de otros tipos de datos. Obviamente, el proceso para llegar a ellos variará pero al final la representación será similar.
No obstante existen algunas otras consideraciones que se tendrán en cuenta al crear los embeddings. Por ejemplo, cuando se trata de audio, se tendrán en cuenta características como tono, ritmo o espectro. Por ejemplo, para el código fuente se capturarán estructuras sintácticas y semánticas del código, permitiendo tareas como búsqueda de funciones o detección de duplicados.
Modelos de embedding cruzados
Cuando se trata de calcular embeddings existen dos enfoques:
- Por un lado tenemos los modelos tradicionales bi-encoder, que procesan cada parte por un lado distinto, por ejemplo el texto o la imagen de manera separada. Esto produce una salida de vector numérico aislado.
- Luego tenemos los Cross-Modal embeddings o embedding cruzados que consiguen trabajar de manera simultánea con diferentes tipos de datos de entrada, consiguiendo una salida principal en un espacio vectorial compartido.
Los embedding cruzados son más potentes cuando se trata de encontrar matices e interacciones semánticas profundas, aunque a la vez requieren mayor procesamiento. Lo bueno es que hace que se puedan comparar de manera exacta por ejemplo, texto con imágenes o audio con descripciones.
Gracias a los embedding cruzados podemos realizar búsquedas cruzadas complejas, por ejemplo buscar una imagen que tiene un significado determinado, o una escena determinada de un vídeo donde se encuentra el significado buscado. CLIP de OpenAI, que es capaz de enlazar texto e imágenes, es un ejemplo claro de este enfoque. Pero hay otros como Qwen3-VL que también funcionan muy bien cuando se trata de realizar un procesamiento cruzado entre imágenes y texto.
Principales proveedores de embeddings models
En el panorama de la IA los modelos LLM son las puntas de lanza más visibles pero también existen modelos que se especializan en la creación de embeddings de manera particular. El objetivo de este tipo de modelos es convertir texto, imágenes o audio en vectores numéricos que podrías utilizar más tarde para búsqueda semántica, RAG o clasificación, entre otras cosas. Vamos a ver ahora cuáles son los proveedores y soluciones para generar embeddings más importantes en la actualidad.
Embeddings OpenAI
OpenAI ofrece modelos de embeddings optimizados para tareas de búsqueda semántica, clustering y RAG que se caracterizan por una alta calidad semántica junto con un buen rendimiento y el uso en múltiples idiomas.
Gemini embeddings
El ecosistema de IA de Google también ofrece modelos de embeddings integrados en los servicios de Gemini. También ofrecen un buen rendimiento en tareas multimodales y están optimizados para grandes volúmenes de datos.
Ollama embeddings
Ollama es una herramienta de código abierto con la que podemos ejecutar modelos de embeddings de forma local. Es ideal porque te ahorra que tus datos tengan que viajar al cloud, lo que lo hace especialmente adecuado cuando tienes que respetar niveles de privacidad elevados.
Aparte de control total sobre los datos también destaca el hecho de que puede trabajar con múltiples modelos open source, por lo que puedes tener todo el procesamiento en local, sin depender de APIs externas y ahorrar costes.
Modelos Open Source en Hugging Face
Hugging Face es una plataforma donde podemos encontrar una gran variedad de modelos de embeddings open source, como Sentence Transformers o modelos basados en BERT.
Si te interesa el tema de la IA seguro que ya conoces esta Hugging Face, que destaca por su amplia comunidad. En ella podemos encontrar soluciones de lo más diverso.
La importancia de una embeddings database
Cuando trabajamos con un modelo de Inteligencia Artificial, como los LLM, tenemos que lidiar con un inmenso volumen de embeddings, con cientos o miles de dimensiones numéricas.
Las bases de datos tradicionales no están preparadas para trabajar con este inmenso volumen ni con estos tipos de datos, por lo que son ineficientes para buscar y comparar embeddings de forma rápida. Es por ello que existen bases de datos de embeddings que están construidas justamente para trabajar con estos datos vectoriales y realizar comparaciones en milisegundos.
¿Qué es una base de datos vectorial y por qué las bases de datos relacionales no sirven para vectores?
Una base de datos vectorial es un sistema optimizado para almacenar y consultar vectores de alta dimensionalidad, como los que tenemos en los embeddings. Su principal función por tanto es permitir búsquedas por similitud en los vectores de muchas dimensiones, de modo que se puedan encontrar los vectores más cercanos a uno dado.
Realizar consultas sobre vectores se vuelve extremadamente costoso en términos de rendimiento para las bases de datos tradicionales. En cambio si le pides lo mismo a una base de datos vectorial lo podrá hacer prácticamente sin despeinarse.
Para ello, las bases de datos vectoriales utilizan estructuras como HNSW (Hierarchical Navigable Small World) o IVF (Inverted File Index) que permiten búsquedas aproximadas rápidas incluso con millones de vectores.
Métricas de similitud matemática
El objetivo principal cuando trabajamos con embeddings es compararlos. Para ello se utilizan métricas matemáticas que determinan la cercanía entre vectores. Las métricas más frecuentes son:
- Similitud del coseno: esta es la principal y mide el ángulo entre dos vectores, siendo especialmente útil cuando importa la dirección más que la magnitud.
- Distancia euclidiana: calcula la distancia directa entre dos puntos en el espacio multidimensional.
- Producto escalar: que resulta útil en modelos donde la magnitud del vector también tiene significado.
En términos prácticos, si dos frases tienen embeddings que comparten alta similitud en alguna de sus métricas es probable que compartan un significado cercano, aunque no usen las mismas palabras.
Arquitectura RAG (Generación Aumentada por Recuperación)
La arquitectura RAG es una herramienta muy interesante para mejorar las prestaciones de los modelos LLM cuando necesitamos que trabajen con datos que no conocen mediante su entrenamiento.
Para ello se combinan modelos generativos con sistemas de recuperación basados en embeddings, de modo que no dependen únicamente del conocimiento interno del modelo. Esta herramienta es la que usa por ejemplo Google NotebookLM para ofrecer su servicio. Si te interesa el tema no dejes de leer el post dedicado a RAG.
Preparación de datos y estrategias de chunking para la generación de embeddings
Cuando hacemos un sistema RAG tenemos que realizar varios pasos con los datos antes de convertirlos en embeddings. Uno de los pasos más importantes es el proceso de chunking o fragmentación del contenido, que vamos a describir en los siguientes puntos.
La importancia crítica de la fragmentación (Chunking) del texto antes de la vectorización
Los modelos de embeddings tienen límites de longitud de entrada. Si queremos que funcionen bien es ideal trabajar con fragmentos manejables de texto porque si vectorizases documentos completos, se perdería la posibilidad de interpretar cada una de las partes que tiene ese documento.
Así pues, el chunking permite dividir el contenido en unidades más pequeñas y coherentes, facilitando la recuperación de información específica.
Estrategias de fragmentación
Para conseguir un chunking adecuado puedes aplicar distintas estrategias para dividir el texto, según el contexto y el tipo de contenido:
- Por longitud fija: dividir en bloques de N tokens o caracteres. Esta estrategia, aunque parezca poco lógica ya consigue el objetivo buscado de mantener chunks manejables.
- Basado en estructura: otra estrategia es usar párrafos, secciones, elementos de listas o encabezados como límites naturales.
- Semántico: mediante esta estrategia se trata de identificar cambios de tema o contexto mediante análisis del contenido. Es por tanto más costosa.
- Basado en formato: que te permite aprovechar estructuras de documentos como HTML o Markdown para conseguir los bloques.
El papel del solapamiento (Overlap) para preservar el contexto continuo entre fragmentos contiguos
Muchas veces no se quiere hacer chunks totalmente aislados. A veces se juega con un solapamiento que como su nombre indica se basa en repetir parte del contenido entre fragmentos consecutivos. Esto ayuda a evitar la pérdida de contexto en los límites de cada chunk, algo que es muy importante sobre todo cuando no hemos roto el contenido por su significado. Generalmente se trabaja entre un 10% y un 30% del tamaño del chunk de solapamiento.
Limpieza y normalización de datos
Además de romper los contenidos en partes, antes de realizar los embeddings también es importante limpiar la entrada para mejorar la calidad de las representaciones vectoriales.
Esto quiere decir que tenemos que eliminar cualquier cosa superflua, como por ejemplo etiquetas HTML, scripts o contenido duplicado. También es importante normalizar espacios, caracteres especiales y codificación. Incluso unificar formatos por ejemplo cuando se trabaja con fechas o unidades de medida.
Todo esto es importante para conseguir que los embeddings sean adecuados, aunque dependiendo del modelo de embeddings que vayamos a usar es posible que nos solicite algunas medidas adicionales para normalizar correctamente el contenido que vayamos a convertir en vectores.