¿Qué son las incrustaciones? Los vectores y la similitud del coseno se explican de forma sencilla
Las incrustaciones permiten a las computadoras comparar significados en lugar de hacer coincidir palabras exactas. Impulsan la búsqueda semántica, las recomendaciones y RAG. Aprenda qué son, cómo se mide la similitud y dónde le decepcionan.
- Una incrustación es una lista de números que representa el significado de un texto, una imagen u otros datos.
- Elementos similares terminan con números similares, por lo que el significado se puede comparar con las matemáticas.
- La similitud del coseno compara la dirección y es una forma común de puntuar qué tan parecidas son dos incrustaciones.
- Solo compare incrustaciones del mismo modelo y pruebe los resultados con sus propios datos.
Busque “cómo recuperar mi dinero” y un buen sistema debería encontrar una página titulada “Política de reembolso”, aunque los dos no comparten palabras importantes. Esa capacidad proviene de las incrustaciones, una de las ideas más útiles de la IA moderna.
Esta guía explica las incrustaciones sin grandes cálculos matemáticos. Ejecutamos un pequeño ejemplo en Python 3.13 y su resultado se muestra a continuación. Los vectores que contiene son los que creamos a mano, con solo tres números cada uno, para que la idea sea fácil de ver. Las incrustaciones reales provienen de un modelo entrenado y, a menudo, tienen cientos o miles de números.
¿Qué es una incrustación?
Una incrustación es una representación de algo como una lista de números, llamada vector. Se entrena un modelo para que los elementos con significados relacionados obtengan vectores que estén muy juntos.
"kitten" -> [0.9, 0.8, 0.1]
"cat" -> [0.9, 0.7, 0.2]
"invoice" -> [0.0, 0.1, 0.9]
Una vez que el texto tiene esta forma, una computadora puede calcular qué tan similares son dos fragmentos de texto, lo que no puede hacer directamente con palabras. Las incrustaciones tampoco se limitan a palabras. Se pueden incrustar frases, documentos completos, imágenes, audio y productos.
¿Por qué no simplemente hacer coincidir palabras clave?
| Consulta y documento | Búsqueda de palabras clave | Búsqueda incrustada |
|---|---|---|
| “devolución de dinero” y “política de reembolso” | Lo extraño, no hay palabras compartidas. | puedo encontrarlo |
| “laptop” y “notebook” | lo extraña | puedo encontrarlo |
| “error E1042” y una página con “E1042” | lo encuentra exactamente | Puede que me lo pierda |
| “banco” (río) y “banco” (dinero) | los trata por igual | Puede separarlos, dado el contexto. |
Nuestra guía de RAG muestra esto en la práctica. Una simple búsqueda de recuento de palabras obtuvo un resultado de cero para “¿Cuándo podré recuperar mi dinero?” contra un documento de reembolso, ya que no compartieron palabras. Tenga en cuenta también la tercera fila: los identificadores exactos son una debilidad de las incrustaciones, por lo que la búsqueda de palabras clave todavía tiene un lugar.
Piensa en un mapa
Imagine colocar cada palabra en un mapa enorme, donde la ubicación refleja el significado. “Gato” y “gatito” se sientan casi uno al lado del otro, “perro” está en el mismo vecindario y “factura” está en una ciudad diferente. Para encontrar palabras relacionadas, simplemente mira cerca.
Una incrustación real funciona de la misma manera, excepto que el mapa tiene cientos de dimensiones en lugar de dos. La gente no puede imaginarse eso, pero las matemáticas funcionan igual. Los números individuales generalmente no tienen un significado claro, como “furriness”. Lo que importa es la posición general.
Un pequeño ejemplo práctico
A continuación se explica cómo comparar nuestros vectores hechos a mano:
import math
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
return dot / (math.sqrt(sum(x * x for x in a)) *
math.sqrt(sum(y * y for y in b)))
vectors = {
"kitten": [0.9, 0.8, 0.1],
"cat": [0.9, 0.7, 0.2],
"dog": [0.8, 0.3, 0.2],
"invoice": [0.0, 0.1, 0.9],
}
for word in ("kitten", "dog", "invoice"):
print(word, round(cosine(vectors["cat"], vectors[word]), 3))
# kitten 0.994
# dog 0.955
# invoice 0.238
Frente a “gato”, “gatito” obtiene la puntuación más alta, “perro” le sigue y “factura” es mucho más baja. Elegimos estos vectores para producir ese patrón, por lo que la clasificación no prueba nada sobre el lenguaje real. Sólo muestra cómo se comporta el cálculo. Una búsqueda semántica hace lo mismo en tres pasos: incrustar la consulta, calificarla con cada elemento almacenado y ordenar.
query = [0.85, 0.75, 0.15]
sorted(vectors, key=lambda w: cosine(query, vectors[w]), reverse=True)
# ['kitten', 'cat', 'dog', 'invoice']
Similitud del coseno
Cada vector puede considerarse como una flecha que apunta desde el origen. La similitud del coseno mide el ángulo entre dos flechas, ignorando su longitud. Confirmamos los valores clave:
cosine([1, 2, 3], [2, 4, 6]) # 1.0 same direction
cosine([1, 0], [0, 1]) # 0.0 unrelated (at right angles)
cosine([1, 0], [-1, 0]) # -1.0 opposite directions
| Puntuación | Significado |
|---|---|
| Cerca de 1 | Apunta casi en la misma dirección, muy similar. |
| Cerca de 0 | No relacionado |
| Cerca de -1 | Apuntar en direcciones opuestas |
Mira la primera línea. [2, 4, 6] es el doble de largo que [1, 2, 3], pero la puntuación es perfecta de 1,0, porque lo único que cuenta es la dirección. Esto es útil para el texto, donde la longitud puede reflejar cosas como el tamaño del documento en lugar del significado. Tenga cuidado también con los umbrales. No existe una puntuación universal que signifique “similar”, ya que los rangos útiles difieren de un modelo a otro, así que pruebe con sus propios datos.
Otras medidas de distancia
| Medida | lo que mira | Notas |
|---|---|---|
| Similitud del coseno | Solo ángulo | Un valor predeterminado común para el texto |
| Producto escalar | Ángulo y longitud | Rápido e igual al coseno en vectores normalizados. |
| distancia euclidiana | Distancia en línea recta | Más pequeño significa más similar |
La diferencia es fácil de ver. Esos mismos dos vectores con una puntuación de coseno de 1,0 tienen una distancia euclidiana de 3,742, ya que uno es más largo que el otro. Muchos sistemas normalizan vectores, escalando cada uno a una longitud de 1. Después de eso, el producto escalar y el coseno dan la misma respuesta, y lo confirmamos: ambos dieron 0,955 para “gato” y “perro”. Consulta la documentación de tu modelo para ver qué medida recomienda.
Cómo se aprenden las incrustaciones
Nadie asigna estos números a mano en sistemas reales. Una red neuronal los aprende durante el entrenamiento. Una idea temprana e influyente es que las palabras que aparecen en contextos similares tienden a tener significados similares, como “Le di de comer a mi gato” y “Le di de comer a mi perro”. Modelos como Word2Vec y GloVe aprendieron vectores de palabras a partir de esos patrones.
Más tarde, los modelos basados en transformadores como BERT hicieron que las incorporaciones tuvieran en cuenta el contexto, por lo que “banco” podría obtener un vector diferente en “orilla del río” y “préstamo bancario”. Muchos modelos modernos incorporan frases o pasajes completos a la vez. Nuestra guía de modelos de lenguaje grandes explica cómo los transformadores manejan el contexto.
Donde se utilizan incrustaciones
| uso | como ayuda |
|---|---|
| búsqueda semántica | Encuentra resultados por significado, en lugar de palabras exactas |
| trapo | Recupera pasajes relevantes para un modelo de lenguaje. |
| Recomendaciones | Sugiere artículos similares a los que te gustaron. |
| Agrupación | Tickets de soporte para grupos o reseñas por tema |
| Detección de duplicados | Detecta preguntas o listados similares |
| Clasificación | Proporciona funciones para modelos simples. |
| Detección de anomalías | Marca artículos lejos de todo lo demás |
Buscando a escala
Nuestro ejemplo comparó una consulta con cada elemento, lo que se conoce como búsqueda exacta. Esto funciona bien para miles de elementos, pero se vuelve lento con muchos millones. Los índices aproximados del vecino más cercano (ANN) como HNSW resuelven esto. Encuentran rápidamente coincidencias muy reñidas, renunciando a una pequeña posibilidad de perderse al mejor.
Las bases de datos y extensiones vectoriales, como pgvector para PostgreSQL, proporcionan estos índices junto con filtrado y almacenamiento. Nuestra guía de bases de datos vectoriales cubre las opciones. Para un proyecto pequeño, es posible que no necesite uno en absoluto, y una búsqueda en memoria es una buena manera de comenzar.
Consejo: Considere la búsqueda híbrida desde el principio. La combinación de similitud incrustada con concordancia de palabras clave a menudo da mejores resultados que cualquiera de las dos opciones por separado, particularmente cuando los usuarios buscan códigos de productos, nombres o mensajes de error.
Elegir un modelo de incrustación
- Idioma. Si tu contenido está en hindi o tamil, por ejemplo, comprueba que el modelo lo maneja bien.
- Dominio. Los modelos generales pueden tener dificultades con términos médicos o legales especializados.
- Dimensiones. Más dimensiones pueden capturar más detalles, pero cuestan más almacenamiento y memoria.
- Costo y alojamiento. Compare una API alojada con un modelo abierto que pueda ejecutar usted mismo, especialmente para datos privados.
- Longitud de entrada. Los modelos tienen un límite, por lo que los documentos largos deben dividirse primero en partes.
La mejor prueba son tus propios datos. Recopile unas 20 consultas reales junto con los documentos que deberían encontrar y compare cómo las clasifica cada modelo. Es posible que los puntos de referencia publicados no reflejen su contenido.
Limitaciones
- Bloqueo de modelo. Los vectores de diferentes modelos no se pueden comparar. Si cambias de modelo, debes incrustar todo nuevamente.
- Términos exactos. Es posible que los ID, códigos y nombres raros no coincidan de manera confiable.
- Negación. “Reembolsos permitidos” y “reembolsos no permitidos” pueden aparecer muy juntos, a pesar de que significan cosas opuestas.
- Similar no significa correcto. Una coincidencia cercana puede estar desactualizada o simplemente ser incorrecta.
- Sesgo. Las incrustaciones pueden absorber estereotipos de sus datos de entrenamiento.
- El coseno no es mágico. Los investigadores han cuestionado qué tan significativo es en algunas incorporaciones aprendidas, por lo que deben tratarse las puntuaciones como una señal útil y no como una medida de verdad.
Errores comunes
- Mezcla de modelos. Incrustar consultas y documentos con el mismo modelo y versión.
- Usar un umbral de similitud en todas partes. Sintonícelo para cada modelo y tarea.
- Incrustar documentos enormes por completo. El significado se diluye, así que fragméntelos primero.
- Omitir evaluación. Sin consultas de prueba, no se puede saber si un cambio ayudó.
- Usar incrustaciones para todo. Si los usuarios buscan ID exactas, un índice de base de datos normal es mejor.
Conclusión
Una incrustación convierte el significado en números, de modo que el software pueda comparar ideas en lugar de cadenas. El concepto es simple, mientras que el trabajo práctico consiste en elegir un modelo, fragmentar datos y probar consultas reales. Para probarlo usted mismo, incruste algunas docenas de sus propios documentos con cualquier modelo de incrustación, búsquelos con preguntas reales y vea dónde le sorprenden los resultados.
Preguntas frecuentes
¿Qué son las incrustaciones en términos simples?
Las incrustaciones son listas de números que representan significado. Los elementos con significado similar obtienen números similares, lo que permite a una computadora compararlos matemáticamente.
¿Qué es la similitud del coseno?
Mide el ángulo entre dos vectores, de -1 a 1. Una puntuación cercana a 1 significa que apuntan casi en la misma dirección, lo que sugiere un contenido similar.
¿Cuál es la diferencia entre incrustaciones y tokens?
Un token es un fragmento de texto que procesa un modelo. Una incrustación es un vector numérico que representa el significado de un token, oración o documento.
¿Cuántas dimensiones debe tener un empotramiento?
Depende del modelo, y lo común es de cientos a unos pocos miles. Más puede capturar más detalles, pero cuesta más almacenamiento, así que pruebe lo que necesita su caso de uso.
¿Necesito una base de datos vectorial para usar incrustaciones?
No. Se pueden buscar colecciones pequeñas en la memoria. Las bases de datos vectoriales se vuelven útiles con colecciones más grandes, actualizaciones frecuentes o necesidades de filtrado.
sigue aprendiendo
¿Necesitas ayuda con pruebas, WordPress o SEO?
Ayudamos a los equipos a enviar mejor software y hacer crecer sus sitios. Cuéntenos en qué está trabajando y le sugeriremos un siguiente paso claro.
Más guías sobre testing, IA y desarrollo moderno
¿Te gustó este artículo? Elige un tema y salta directo a nuestros tutoriales más recientes.
Explicación de las alucinaciones de la IA: por qué los modelos de lenguaje inventan cosas y cómo reducirlas
Se explicaron las alucinaciones de la IA: qué son, por qué los modelos de lenguaje las producen, tipos comunes, cómo reducirlas con conexión a tierr…
Leer artículo →DevOpsExplicación de las variables de entorno: archivos .env, secretos y configuración bien hechos
Variables de entorno explicadas con ejemplos de Python que ejecutamos: leerlas y configurarlas, por qué cada valor es una cadena, archivos .env, her…
Leer artículo →Desarrollo de softwareExplicación de la limitación de velocidad de API: algoritmos, encabezados y manejo de errores 429
La limitación de la tasa de API se explica con una simulación que ejecutamos: depósito de tokens, ventana fija, ventana deslizante, 429 respuestas, …
Leer artículo →Automatización de pruebasBurlarse en Python: unittest.mock, patch y los errores que hacen que las pruebas mientan
Burlarse en Python con unittest.mock, probado: Mock y return_value, side_effect, parches donde se usa un nombre, especificación y autospec, fechas d…
Leer artículo →Pruebas de softwareExplicación de la cobertura del código: cobertura de línea versus sucursal y lo que realmente significa 100%
Cobertura del código explicada con una ejecución real de cobertura.py: cobertura de línea, rama y condición, lectura de un informe, por qué una cobe…
Leer artículo →Bases de datos y SQLDELETE vs TRUNCATE vs DROP en SQL: diferencias, reversión y cuándo usar cada uno
DELETE vs TRUNCATE vs DROP explicado con SQL probado: qué elimina cada uno, reversión, activadores, restablecimiento de identidad, velocidad y en qu…
Leer artículo →Bases de datos y SQLVistas SQL explicadas: cree, use y evite los errores, con ejemplos
Vistas SQL explicadas con consultas que ejecutamos: creación de una vista, resultados en vivo, ocultación de columnas, rendimiento, vistas actualiza…
Leer artículo →Desarrollo de softwareInterfaz TypeScript versus tipo: diferencias reales, probadas con el compilador
Interfaz TypeScript versus tipo, verificado con el compilador real: qué pueden hacer ambos, qué puede hacer solo uno, fusión de declaraciones, exten…
Leer artículo →Desarrollo de softwarePython *args y **kwargs explicados: funciones flexibles con ejemplos claros
Python *args y **kwargs explicados con el código que ejecutamos: empaquetado y desempaquetado, orden de parámetros, argumentos solo de palabras clav…
Leer artículo →Desarrollo de softwareFunciones Lambda de Python: sintaxis, usos reales y cuándo no utilizarlas
Funciones lambda de Python explicadas con el código que ejecutamos: sintaxis, clasificación con clave, mapa y filtro, cierres, trampa de enlace tard…
Leer artículo →Inteligencia artificial¿Qué son los agentes de IA? Cómo funcionan, con un bucle de agente simple que puedes ejecutar
¿Qué son los agentes de IA? Una guía sencilla sobre el bucle del agente, las herramientas, la memoria y las barreras de seguridad, con un pequeño bu…
Leer artículo →DevOpsMonitoreo versus observabilidad: la verdadera diferencia, con registros, métricas y seguimientos
Explicación del monitoreo versus observabilidad: fallas conocidas y desconocidas, registros, métricas y seguimientos, un recorrido por incidentes de…
Leer artículo →DevOpsDocker Volumes versus Bind Mounts: persistir los datos del contenedor de la manera correcta
Se explican los volúmenes de Docker frente a los montajes de enlace: por qué desaparecen los datos del contenedor, volúmenes con nombre, montajes de…
Leer artículo →Automatización de pruebasTDD vs BDD: diferencias clave, una función creada en ambos sentidos y cuándo usar cada una
TDD vs BDD explicado con una característica de descuento construida en ambos sentidos: refactor rojo-verde con el código que ejecutamos, escenarios …
Leer artículo →Pruebas de softwarePruebas de Aceptación de Usuario (UAT): Proceso, Lista de Verificación y Ejemplos Reales
Explicación de las pruebas de aceptación del usuario: quién las ejecuta, en qué se diferencia del control de calidad, un proceso de siete pasos, una…
Leer artículo →Bases de datos y SQLValores NULL de SQL explicados: IS NULL, COALESCE, NULLIF y las trampas que se deben evitar
Los valores NULL de SQL se explican con las consultas que ejecutamos: lógica de tres valores, IS NULL, COALESCE, NULLIF, cómo los agregados, las uni…
Leer artículo →Bases de datos y SQLDeclaración SQL CASE WHEN: sintaxis, ejemplos reales y errores comunes
CASO SQL CUANDO se explicó con las consultas que ejecutamos: formularios simples y buscados, orden de condiciones, pivotes con SUMA, trucos COUNT, c…
Leer artículo →Desarrollo de software¿Qué es JWT? Tokens web JSON explicados con un ejemplo práctico
¿Qué es JWT? JSON Web Tokens explicó: las tres partes, un token creado y manipulado en el código que ejecutamos, JWT vs sesiones, almacenamiento, to…
Leer artículo →Desarrollo de softwareExplicación del bucle de eventos de JavaScript: pila de llamadas, microtareas y temporizadores con ejemplos
El bucle de eventos de JavaScript explicado con el código que ejecutamos: pila de llamadas, colas de tareas y microtareas, por qué setTimeout 0 no e…
Leer artículo →Desarrollo de softwareExplicación de los generadores y el rendimiento de Python: ahorre memoria con ejemplos reales
Los generadores de Python y el rendimiento se explican con el código que ejecutamos: cómo se pausan y reanudan, midieron el ahorro de memoria, canal…
Leer artículo →Inteligencia artificial¿Qué son las incrustaciones? Los vectores y la similitud del coseno se explican de forma sencilla
¿Qué son las incrustaciones? Una guía en lenguaje sencillo sobre vectores, similitud de cosenos y búsqueda semántica, con un pequeño ejemplo que eje…
Leer artículo →DevOpsImplementación azul-verde versus implementación canaria: diferencias, compensaciones y cómo elegir
Explicación de la implementación azul-verde versus canaria: cómo funciona cada uno, costo, riesgo y reversión, agrupación estable de usuarios que pr…
Leer artículo →Desarrollo de softwareGit merge vs rebase: diferencias, ejemplos y cuándo usar cada uno
Git merge vs rebase explicado con salida real del log, una tabla comparativa, la regla de oro del rebase y un flujo de trabajo seguro para equipos.
Leer artículo →Desarrollo de softwareList comprehension en Python: sintaxis, ejemplos y cuándo evitarla
List comprehension en Python explicada: sintaxis, filtros, if-else, bucles anidados, tiempos medidos y cuándo es mejor un bucle for normal.
Leer artículo →