Elegir un arreglo con las evaluaciones
Leer los resultados de una evaluación es agrupar los fallos por tipo y cambiar lo más barato que arregle más. Importa porque todo cambio ayuda a algunos casos y puede dañar a otros.
La primera versión de la biblioteca aprobó 5 casos de 10. El equipo tiene cuatro ideas. Solo una merece salir primero, y las notas dicen cuál.
Al final de esta lección
Nota
Puedo leer resultados de evaluación y decidir qué cambiar primero.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Tipo de fallo | la razón por la que falló un caso | invented |
| Candidato | un cambio que estás pensando hacer | |
| Regresión | un caso que aprobaba antes y ahora falla | |
| Coste por 1000 | lo que cuesta producir 1000 respuestas | |
| Arreglo más barato | el cambio que menos cuesta para lo que gana |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Agrupa los fallos por tipo
Una nota de 5 sobre 10 dice cuánto está mal, no por qué. Agrupa los cinco fallos por tipo y el trabajo se aclara.
Cada tipo tiene su causa y su arreglo barato. Un arreglo para un tipo entero es mejor que cinco arreglos para cinco casos.
Ejemplo: los cinco fallos
| Tipo | Casos | Causa probable |
|---|---|---|
| Inventada | c3, c7 | El prompt no prohíbe adivinar |
| Vaga | c5 | Se respondió con palabras generales |
| Rechazo | c8 | El prompt lo hace demasiado prudente |
| Larga | c9 | Nada limita la longitud |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Prueba primero el arreglo más barato
Ordena los candidatos por coste. Una línea en el prompt no cuesta nada. Un prompt más largo cuesta un poco en cada respuesta. Un modelo mayor cuesta el triple en cada respuesta.
Lanza primero el más barato y puntúalo. Apila el siguiente solo si la nota lo pide.
Ejemplo: cuatro candidatos
| Serie | Cambio | Aprobados | Coste por 1000 |
|---|---|---|---|
| v1 | La primera versión | 5 | 40 |
| v2 | Usar solo cifras de la hoja | 7 | 42 |
| v3 | v1, luego responder en una frase | 4 | 42 |
| v4 | v2, luego responder si la hoja tiene el dato | 9 | 44 |
| v5 | v1 con un modelo mayor | 7 | 130 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Ayuda a un caso, daña a dos
La serie v3 arregla la respuesta larga, c9. También rompe c2 y c10, que aprobaban: la regla de una frase les cortó la cifra. El total bajó de 5 a 4.
Un total puede ocultarlo. Compara las dos series caso por caso y anota qué se arregló y qué se rompió.
Un error frecuente
Advertencia
Mucha gente cree que un cambio que arregla algo es un buen cambio. Mira lo que rompió. Lanza un cambio solo si no rompe nada de lo que aprobaba, o si aceptas cada rotura a propósito.
Escribe el lector de resultados, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const fs = require(\"fs\");' '// Cinco series grabadas sobre los casos c1 a c10. v2: usar solo cifras de la hoja.' '// v3: v1 más responder en una frase. v4: v2 más responder cuando la hoja tiene el dato.' '// v5: el primer prompt con un modelo mayor. El coste es por 1000 respuestas.' 'const RUNS = {' ' v1: { cost: 40, kinds: \"ok ok invented ok vague ok invented refusal long ok\" },' ' v2: { cost: 42, kinds: \"ok ok ok ok vague ok ok refusal long ok\" },' ' v3: { cost: 42, kinds: \"ok vague invented ok vague ok invented refusal ok vague\" },' ' v4: { cost: 44, kinds: \"ok ok ok ok ok ok ok ok long ok\" },' ' v5: { cost: 130, kinds: \"ok ok ok ok vague ok ok refusal long ok\" },' '};' 'for (const name in RUNS) RUNS[name].kinds = RUNS[name].kinds.split(\" \");' 'fs.writeFileSync(\"runs.json\", JSON.stringify(RUNS, null, 1));' > analyse.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 lector de resultados, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function isOk(kind) { return kind === \"ok\"; }' 'function failures(kinds) {' ' const out = {};' ' kinds.forEach(function (k) { if (isOk(k) === false) out[k] = (out[k] || 0) + 1; });' ' return out;' '}' 'const base = RUNS.v1.kinds;' 'let best = null;' >> analyse.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 lector de resultados, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'for (const name in RUNS) {' ' const kinds = RUNS[name].kinds;' ' const fixed = [];' ' const broke = [];' ' kinds.forEach(function (k, i) {' ' if (isOk(base[i]) === false && isOk(k)) fixed.push(\"c\" + (i + 1));' ' if (isOk(base[i]) && isOk(k) === false) broke.push(\"c\" + (i + 1));' ' });' ' const passed = kinds.filter(isOk).length;' ' console.log(name, passed + \" aprobados\", \"coste \" + RUNS[name].cost, \"arreglados [\" + fixed + \"]\", \"rotos [\" + broke + \"]\", JSON.stringify(failures(kinds)));' ' if (name === \"v1\" || broke.length > 0) continue;' ' const cost = RUNS[name].cost;' ' if (best === null || passed > best.passed || (passed === best.passed && cost < best.cost)) best = { name, passed, cost };' '}' 'console.log(\"Elección: \" + best.name + \" (\" + best.passed + \" aprobados, coste \" + best.cost + \")\");' >> analyse.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lee las cinco series
docker exec -w /home/node/project agent node analyse.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 imprime el Run
| Línea | Qué dice |
|---|---|
| v2 | 7 aprobados, arregló c3 y c7, no rompió nada |
| v3 | 4 aprobados, arregló c9, rompió c2 y c10 |
| v4 | 9 aprobados, arregló cuatro casos, no rompió nada |
| v5 | 7 aprobados, coste 130 |
| Última línea | Elección: v4 (9 aprobados, coste 44) |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.