¿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

Medir la recuperación con la tasa de aciertos

Después de esta lección: Puedo encontrar los trozos que responden a una pregunta y decir qué tal lo he hecho.

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

Encontró algo, pero ¿era lo correcto?

La recuperación consiste en encontrar los trozos que responden a una pregunta. Medirla es hacer preguntas cuya respuesta ya conoces y contar cuántas veces vuelve el trozo correcto.

La web de una biblioteca siempre muestra tres resultados. El personal dice que funciona bien. Nadie ha contado. Sin contar, no puedes saber si un cambio mejoró o empeoró las cosas.

Al final de esta lección

Nota

Puedo encontrar los trozos que responden a una pregunta y decir qué tal lo he hecho.

Palabras clave

PalabraQué significaEjemplo
Buscadorel código que encuentra trozos para una pregunta
Aciertovolvió el trozo correcto
Tasa de aciertosla parte de preguntas que fueron aciertos80 %
Caso de pruebauna pregunta con trozo fuente conocido
Puntuación mínimala nota más baja que vale la pena devolver0.3

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

Un caso de prueba tiene fuente conocida

Escribe preguntas y, para cada una, el id del trozo que contiene la respuesta. Pasa el buscador por cada pregunta. Un acierto es que el id correcto esté entre los trozos que devuelve.

La tasa de aciertos es el número de aciertos dividido entre el número de preguntas. Cuatro aciertos en cinco preguntas son una tasa del 80 %.

Algunas preguntas no tienen respuesta

La gente pregunta cosas que los documentos no cubren. Para esas, el resultado correcto es nada. Si el buscador devuelve su trozo menos malo, un paso posterior puede construir una respuesta con el texto equivocado.

Una puntuación mínima ayuda. Devuelve un trozo solo si su nota llega al mínimo. Si no, devuelve una lista vacía.

Ejemplo resuelto: cinco casos de prueba

Pregunta sobreEsperadoRecuperadoResultado
La hora de aperturahorariohorarioAcierto
La multamultassalasFallo
La bibliotecarianingunonadaAcierto
El aparcamientoningunosalasFallo
Reservar una salasalassalasAcierto

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

Puntúa un buscador en un script

El siguiente script reconstruye el almacén de la biblioteca de la lección 3 con los mismos vectores de recuentos. Añade una puntuación mínima de 0,3 y devuelve como mucho un trozo.

Después pasa cinco casos de prueba, uno de ellos sin respuesta, y muestra cada resultado y la tasa de aciertos.

Escribe el script de puntuación, parte 1

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const vocabulary = [\"abre\", \"cierra\", \"sábado\", \"domingo\", \"prestar\", \"libro\", \"retraso\", \"multa\", \"sala\", \"biblioteca\", \"hora\", \"semana\"];' 'const chunks = [' '  { id: \"horario-semana\", text: \"La biblioteca abre a las 9:00 y cierra a las 18:00 de lunes a viernes.\" },' '  { id: \"horario-finde\", text: \"El sábado la biblioteca abre a las 10:00 y cierra a las 14:00. El domingo está cerrada.\" },' '  { id: \"prestamo\", text: \"Se pueden prestar 8 libros durante 3 semanas. Cada libro se puede renovar dos veces por internet.\" },' '  { id: \"multas\", text: \"Un libro devuelto con retraso cuesta 20 céntimos al día. La multa no pasa de 10 euros.\" },' '  { id: \"salas\", text: \"Una sala de estudio admite a 6 personas. Reserva la sala en el mostrador o por internet para 2 horas.\" },' '];' > score.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 puntuación, parte 2

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function stem(word) { return word.length > 3 && word.endsWith(\"s\") ? word.slice(0, -1) : word; }' 'function vectorOf(text) {' '  const words = text.toLowerCase().replace(/[^a-z0-9áéíóúüñ ]/g, \" \").split(\" \").filter(function (w) { return w.length > 0; }).map(stem);' '  return vocabulary.map(function (term) {' '    return words.filter(function (word) { return word === term; }).length;' '  });' '}' 'function cosine(a, b) {' '  let dot = 0, sa = 0, sb = 0;' '  for (let i = 0; i < a.length; i++) { dot += a[i] * b[i]; sa += a[i] * a[i]; sb += b[i] * b[i]; }' '  return sa === 0 || sb === 0 ? 0 : dot / Math.sqrt(sa * sb);' '}' 'const store = chunks.map(function (c) { return { id: c.id, vector: vectorOf(c.text) }; });' 'const MINIMUM = 0.3;' >> score.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 puntuación, parte 3

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function retrieve(question) {' '  const query = vectorOf(question);' '  let best = { id: \"\", score: 0 };' '  store.forEach(function (item) {' '    const score = cosine(query, item.vector);' '    if (score > best.score) best = { id: item.id, score: score };' '  });' '  return best.score >= MINIMUM ? [best.id] : [];' '}' >> score.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 puntuación, parte 4

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const cases = [' '  { question: \"a qué hora abre la biblioteca el sábado\", expected: \"horario-finde\" },' '  { question: \"cuántos libros se pueden prestar\", expected: \"prestamo\" },' '  { question: \"cuánto cuesta un retraso\", expected: \"multas\" },' '  { question: \"puedo reservar una sala\", expected: \"salas\" },' '  { question: \"quién es la bibliotecaria\", expected: null },' '];' 'let hits = 0;' 'cases.forEach(function (one) {' '  const found = retrieve(one.question);' '  const hit = one.expected === null ? found.length === 0 : found.indexOf(one.expected) >= 0;' '  if (hit) hits = hits + 1;' '  console.log((hit ? \"ACIERTO \" : \"FALLO   \") + one.question + \" -> \" + (found.join(\" \") || \"nada\"));' '});' 'console.log(\"Tasa de aciertos:\", hits, \"de\", cases.length);' >> score.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 la tasa

Comando
docker exec -w /home/node/project agent node score.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
ACIERTO a qué hora abre la biblioteca el sábado -> horario-findeEl trozo correcto
ACIERTO quién es la bibliotecaria -> nadaNo encontró nada, y es lo correcto
Tasa de aciertos: 5 de 5Todos los casos fueron aciertos

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

Un error frecuente

Advertencia

Mucha gente cree que la recuperación funciona si siempre devuelve algo. Para una pregunta que los documentos no pueden responder, devolver algo es un fallo. Cuenta también esas preguntas y dale al buscador una forma de decir nada.

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.