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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Buscador | el código que encuentra trozos para una pregunta | |
| Acierto | volvió el trozo correcto | |
| Tasa de aciertos | la parte de preguntas que fueron aciertos | 80 % |
| Caso de prueba | una pregunta con trozo fuente conocido | |
| Puntuación mínima | la nota más baja que vale la pena devolver | 0.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 sobre | Esperado | Recuperado | Resultado |
|---|---|---|---|
| La hora de apertura | horario | horario | Acierto |
| La multa | multas | salas | Fallo |
| La bibliotecaria | ninguno | nada | Acierto |
| El aparcamiento | ninguno | salas | Fallo |
| Reservar una sala | salas | salas | Acierto |
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
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
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
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
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
docker exec -w /home/node/project agent node score.jsSe 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ínea | Qué indica |
|---|---|
| ACIERTO a qué hora abre la biblioteca el sábado -> horario-finde | El trozo correcto |
| ACIERTO quién es la bibliotecaria -> nada | No encontró nada, y es lo correcto |
| Tasa de aciertos: 5 de 5 | Todos 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.