¿Seguro, o solo con mucha voz?
Mostrar la incertidumbre es enseñar cuánta seguridad tiene una respuesta, con palabras y números que coincidan con lo que de verdad se sabe. Importa porque un número falsamente exacto engaña.
Una aplicación del tiempo dice «73,4 % de probabilidad de lluvia». Otra dice «probablemente lloverá». Si el pronóstico solo es fiable a la decena, la segunda es más honesta.
Al final de esta lección
Nota
Puedo mostrar cuánta seguridad tiene una respuesta sin falsa precisión.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Puntuación | un número de cuánta seguridad tiene una respuesta | 64 |
| Etiqueta | una palabra elegida a partir de una puntuación | media |
| Punto de corte | la puntuación donde cambia la etiqueta | |
| Falsa precisión | un número con más cifras de las que sabes | |
| Fuente | el texto del que salió una respuesta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una palabra se usa mejor que un 64
Una puntuación como 64 dice poco a casi todo el mundo. Una palabra como «media» le dice qué hacer: comprobarlo.
Elige los puntos de corte una vez, anótalos y úsalos en todas partes. Así «alta» significa lo mismo en cada pantalla.
No muestres cifras que no tienes
Una puntuación de 64 sacada de una comprobación aproximada no es de verdad 64 ni 63. Muestra «cerca de 60», o solo la etiqueta.
Muestra también de dónde salió la respuesta. Una fuente permite comprobarla. Cuando la puntuación es muy baja, el diseño honesto rechaza y explica por qué.
Un error frecuente
Advertencia
Mucha gente cree que la confianza que da el propio modelo es una probabilidad real. No siempre lo es. Trata una puntuación como una guía aproximada y compara las etiquetas con casos conocidos. Mantén estables los cortes: una puntuación mayor nunca debe dar una etiqueta peor.
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 el generador de etiquetas, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const CUTS = [[80, \"alta\"], [50, \"media\"]];' 'const ANSWERS = [' ' { id: \"q1\", score: 95 },' ' { id: \"q2\", score: 80 },' ' { id: \"q3\", score: 67 },' ' { id: \"q4\", score: 49 },' ' { id: \"q5\", score: 15 },' '];' > showing.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 generador de etiquetas, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function label(score) {' ' for (const c of CUTS) {' ' if (score >= c[0]) return c[1];' ' }' ' return \"baja\";' '}' 'function blurred(score) {' ' return Math.floor((score + 5) / 10) * 10;' '}' >> showing.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 generador de etiquetas, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const counts = { alta: 0, media: 0, baja: 0 };' ' for (const a of ANSWERS) {' ' counts[label(a.score)]++;' ' console.log(a.id + \" puntuación \" + a.score + \" se muestra cerca de \" + blurred(a.score) + \" etiqueta \" + label(a.score));' ' }' ' console.log(\"cuentas \" + JSON.stringify(counts));' ' const msg = \"Escribe una frase corta que diga a una alumna que no estás seguro y que compruebe la fuente.\";' ' const reply = await ask([{ role: \"user\", content: msg }], \"No estoy seguro de esto. Comprueba la fuente, por favor.\", 30);' ' console.log(\"frase de rechazo: \" + reply.text);' '}' 'main();' >> showing.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 el generador de etiquetas
docker exec -w /home/node/project agent node showing.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Qué imprime el Run
| Línea | Qué muestra |
|---|---|
| q1 puntuación 95 se muestra cerca de 100 etiqueta alta | Alta, y el número va redondeado |
| q2 puntuación 80 se muestra cerca de 80 etiqueta alta | El 80 está en el corte, así que es alta |
| q4 puntuación 49 se muestra cerca de 50 etiqueta baja | El redondeo dice 50 y la etiqueta dice baja |
| cuentas {"alta":2,"media":1,"baja":2} | Dos en cada extremo y una en medio |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.