¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Qué son los embeddings y el coseno

Después de esta lección: Puedo explicar qué es un embedding y comparar dos con la similitud del coseno.

Lección de 60 min4 comandosLaboratorio de agente de programación con IA: usa opencode para explicar y corregir código, y comprueba su trabajo

La página que no comparte ninguna palabra

Un embedding es una lista de números que representa el significado de un texto. Dos textos de significado parecido dan listas que apuntan en la misma dirección, y así un programa puede comparar significados con cálculo.

Una persona busca en la web de la biblioteca "normas para llevarse libros". La página que necesita se titula "Condiciones de préstamo". No comparten ni una palabra, así que una búsqueda por palabras no encuentra nada. Los números sí pueden.

Al final de esta lección

Nota

Puedo explicar qué es un embedding y comparar dos con la similitud del coseno.

Palabras clave

PalabraQué significaEjemplo
Embeddinguna lista de números que representa un significado
Vectoruna lista de números, vista como un punto o una flecha
Producto escalarla suma de los productos de los números del mismo lugar
Similitud del cosenouna nota de cuánto apuntan igual dos flechas0.98
Recuperaciónencontrar los trozos de texto que encajan con una pregunta

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Embeddings reales y nuestros sustitutos

Un embedding real tiene cientos de números y lo produce un modelo. Nada de este módulo produce uno.

Las lecciones usan sustitutos pequeños: listas inventadas de tres números y recuentos de palabras que calcula el propio script. Así cada paso se puede ejecutar y comprobar aquí. El método es el mismo.

Un vector es una lista de números

Piensa en una lista de números como un punto en un mapa. Dos números son un punto en un mapa plano. Tres son un punto en una habitación.

Da un significado a cada lugar de la lista. Aquí los tres lugares son animal, vehículo y comida. Un número grande quiere decir que la palabra trata mucho de eso.

Ejemplo resuelto: cuatro vectores inventados

PalabraAnimalVehículoComida
gato0,90,10,1
gatito0,80,10,2
autobús0,10,90,0
churro0,10,00,9

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

El coseno puntúa cuánto se parecen

Para comparar dos vectores hacen falta tres pasos pequeños. El producto escalar multiplica los números del mismo lugar y los suma. La longitud es la raíz cuadrada del producto escalar del vector consigo mismo.

El coseno es el producto escalar dividido entre las dos longitudes. Vale 1 si las flechas apuntan igual, 0 en ángulo recto y menos de 0 si se alejan.

Ejemplo resuelto: dos vectores pequeños

PasoCuenta con a = [1, 2] y b = [2, 1]Resultado
Producto escalar1 x 2 + 2 x 14
Longitud de araíz cuadrada de (1 x 1 + 2 x 2)2,24
Longitud de braíz cuadrada de (2 x 2 + 1 x 1)2,24
Coseno4 dividido entre (2,24 x 2,24)0,8

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Escribe la cuenta como un bucle

El siguiente script guarda los cuatro vectores y escribe los tres pasos como funciones pequeñas. Muestra el coseno de cada pareja.

También construye un vector de recuentos: una lista fija de palabras y las veces que aparece cada una en una frase. Dos frases que usan las mismas palabras dan vectores que apuntan igual.

Escribe el script de vectores, parte 1

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Vectores pequeños inventados: [animal, vehículo, comida]. Un embedding real tiene cientos de números.' 'const vectors = {' '  gato: [0.9, 0.1, 0.1],' '  gatito: [0.8, 0.1, 0.2],' '  autobus: [0.1, 0.9, 0.0],' '  churro: [0.1, 0.0, 0.9],' '};' 'function dot(a, b) {' '  let total = 0;' '  for (let i = 0; i < a.length; i++) total = total + a[i] * b[i];' '  return total;' '}' 'function length(a) { return Math.sqrt(dot(a, a)); }' 'function cosine(a, b) { return dot(a, b) / (length(a) * length(b)); }' > vec.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe el script de vectores, parte 2

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const names = Object.keys(vectors);' 'for (let i = 0; i < names.length; i++) {' '  for (let j = i + 1; j < names.length; j++) {' '    const score = cosine(vectors[names[i]], vectors[names[j]]);' '    console.log(names[i] + \" y \" + names[j] + \": \" + score.toFixed(2));' '  }' '}' '// Un vector de recuentos: cuántas veces aparece cada palabra de una lista fija.' 'const vocabulary = [\"abre\", \"tarde\", \"libro\", \"multa\"];' 'function counts(sentence) {' '  const found = sentence.toLowerCase().split(\" \");' '  return vocabulary.map(function (word) {' '    return found.filter(function (one) { return one === word; }).length;' '  });' '}' >> vec.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe el script de vectores, parte 3

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const one = counts(\"abre tarde abre\");' 'const two = counts(\"libro abre tarde\");' 'console.log(\"Recuentos:\", one.join(\" \"), \"y\", two.join(\" \"));' 'console.log(\"Coseno de los recuentos:\", cosine(one, two).toFixed(2));' >> vec.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejecútalo y lee las notas

Comando
docker exec -w /home/node/project agent node vec.js

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Lo que muestra

LíneaQué indica
gato y gatito: 0.99Muy parecidos
gato y autobus: 0.22Poco parecidos
autobus y churro: 0.01Casi nada en común
Coseno de los recuentos: 0.77Las frases comparten las palabras abre y tarde

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un error frecuente

Advertencia

Mucha gente cree que un coseno de 0,9 significa "igual al 90 %". No es así. La nota solo sirve para ordenar: 0,9 está más cerca que 0,5. Úsala para poner en orden, nunca como un porcentaje de verdad.

Sobre este laboratorio y su código: Laboratorio de agente de programación con IA: usa opencode para explicar y corregir código, y comprueba su trabajo

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.