Comprobar un juez antes de fiarte de él
Un juez es un modelo que califica las respuestas de otro modelo. Sale barato, así que los equipos lo usan mucho. Pero un juez puede inclinarse de formas que nadie ve.
El módulo sobre evaluación y pruebas muestra un juez y su acuerdo con las personas. Esta lección va más lejos, con tres pruebas hechas con números.
Al final de esta lección
Nota
Puedo averiguar cómo está sesgado un calificador antes de apoyarme en él.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Juez | un modelo que califica respuestas |
| Kappa | el acuerdo con las personas más allá de lo que da el azar |
| Sesgo de posición | una inclinación hacia un lugar, no hacia una respuesta |
| Sesgo de longitud | una inclinación hacia la respuesta más larga |
| Conjunto de calibración | respuestas que una persona calificó para probar un juez |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
El acuerdo no basta, el azar ayuda
Supón que un juez coincide con una persona en el 90 por ciento de las respuestas. Suena bien. Pero si casi todas aprueban, un juez que siempre dice aprobado también saca mucho.
Kappa quita el azar. Va de 1, perfecto, bajando hasta 0, que no es mejor que el azar.
Ejemplo resuelto: veinte respuestas calificadas
| Medida | Valor | Cómo se calcula |
|---|---|---|
| Elementos | 20 | Contados |
| Juez y persona coinciden | 18 | Un acuerdo del 90 por ciento |
| Coincidencias por azar, por 400 | 296 | p por p, más f por f |
| Kappa | 0,62 | (360 menos 296) dividido entre (400 menos 296) |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que un acuerdo alto prueba que un juez es fiable. No es así cuando una etiqueta es mucho más común. Calcula kappa y usa un conjunto de calibración con suficientes casos de cada etiqueta.
Cambia el orden: sesgo de posición
Enseña al juez dos respuestas, X y luego Y, y anota su elección. Después enséñaselas otra vez como Y y luego X. Un juez justo elige la misma respuesta las dos veces.
Si la elección cambia, el juez siguió el lugar. Cuenta los cambios. Si son una cuarta parte de los casos o más, avisa del juez.
Cuenta cuántas veces gana la respuesta más larga
A algunos jueces les gustan las respuestas largas. Para probarlo, aparta los pares de igual longitud. Entre el resto, cuenta cuántas veces el juez elige la más larga.
La mitad más o menos es normal. Tres de cada cuatro o más indican que la longitud dirige la nota.
Escribe el ayudante del modelo, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// Los tokens de una respuesta, o null si no trae ninguno.' 'function count(data, name) {' ' return data.usage && typeof data.usage[name] === \"number\" ? data.usage[name] : null;' '}' > model.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 ayudante del modelo, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function ask(messages, sample, max) {' ' try {' ' const res = await fetch(base + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"estado \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, inTokens: count(d, \"prompt_tokens\"), outTokens: count(d, \"completion_tokens\"), recorded: false };' ' } catch (error) {' ' console.log(\"Muestra grabada: ningún modelo respondió (\" + error.message + \").\");' ' return { text: sample, inTokens: null, outTokens: null, recorded: true };' ' }' '}' 'module.exports = { ask };' >> model.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 las pruebas del juez, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const H = \"pppppfpppppfpppfpppf\";' 'const J = \"pppppppppppfpppppppf\";' 'const rows = [' ' \"1 40 55 Y Y\", \"2 62 30 X X\", \"3 48 70 Y X\", \"4 33 51 X Y\",' ' \"5 80 45 X Y\", \"6 52 52 X X\", \"7 29 66 Y Y\", \"8 71 40 X Y\",' ' \"9 44 90 Y Y\", \"10 58 36 X X\", \"11 35 62 X Y\", \"12 77 41 X X\",' '].map(function (r) {' ' const p = r.split(\" \");' ' return { x: Number(p[1]), y: Number(p[2]), one: p[3], two: p[4] };' '});' > judge.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 las pruebas del juez, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function count(text, ch) { return text.split(ch).length - 1; }' 'const n = H.length;' 'let agree = 0;' 'for (let i = 0; i < n; i++) { if (H[i] === J[i]) agree++; }' 'const chance = count(J, \"p\") * count(H, \"p\") + count(J, \"f\") * count(H, \"f\");' 'const kappa = (agree * n - chance) / (n * n - chance);' >> judge.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 las pruebas del juez, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'let first = 0;' 'let second = 0;' 'let longer = 0;' 'let unequal = 0;' 'rows.forEach(function (r) {' ' if (r.one === \"X\" && r.two === \"Y\") first++;' ' if (r.one === \"Y\" && r.two === \"X\") second++;' ' if (r.x === r.y) return;' ' unequal++;' ' if ((r.one === \"X\") === (r.x > r.y)) longer++;' '});' >> judge.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 las pruebas del juez, parte 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"acuerdo: \" + (agree * 100 / n) + \" por ciento, kappa: \" + kappa.toFixed(2));' ' console.log(\"prueba de intercambio: cambian \" + (first + second) + \" de \" + rows.length + \" (primer lugar \" + first + \", segundo lugar \" + second + \")\");' ' console.log(\"ganó la respuesta más larga: \" + longer + \" de \" + unequal + \" (\" + Math.floor(longer * 100 / unequal) + \" por ciento)\");' ' const q = \"Califica esta respuesta a ¿Dónde está la biblioteca? como aprobada o suspensa, en una palabra: Pregunta a alguien.\";' ' const reply = await ask([{ role: \"user\", content: q }], \"suspensa\", 5);' ' console.log(\"calificación en vivo: \" + reply.text);' '}' 'main();' >> judge.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta las pruebas del juez
docker exec -w /home/node/project agent node judge.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 imprimen las pruebas
| Línea | Qué muestra |
|---|---|
| acuerdo: 90 por ciento, kappa: 0.62 | Acuerdo alto, más débil sin el azar |
| prueba de intercambio: cambian 5 de 12 | Cinco elecciones siguieron el lugar |
| ganó la respuesta más larga: 9 de 11 | La más larga ganó el 81 por ciento de las veces |
| calificación en vivo: ... | Una calificación real del laboratorio. Una muestra grabada si ningún modelo responde |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.