Registro de decisiones de una función de IA
Un registro de decisiones es una lista corta de las elecciones detrás de una función, cada una con sus opciones, su elección y su prueba. Importa porque dentro de seis meses nadie recordará por qué el equipo mantuvo el modelo pequeño.
El equipo de la biblioteca ha tomado cinco decisiones en cuatro semanas. Un script comprueba ahora que cada una apunta a un registro que existe.
Al final de esta lección
Nota
Puedo anotar las decisiones detrás de una función para que otros las sigan.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Registro de decisiones | una lista fechada de elecciones y sus razones | |
| Opción | uno de los caminos que podías tomar | |
| Elección | la opción que tomaste | |
| Prueba | un registro que muestra por qué elegiste | eval:v4 |
| Revisar | volver a mirar cuando cambian las pruebas |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Opciones, elección y prueba
Una entrada dice qué se decidió, qué opciones había, cuál se tomó y qué mostró que era acertada. Lleva fecha e identificador.
Las opciones son lo más importante. Una decisión con una sola opción no fue una decisión. El lector necesita ver a qué renunciaste.
Ejemplo: la decisión D4
| Campo | Valor |
|---|---|
| Decisión | Limitar los intentos a 2 |
| Opciones | Tope de 2, o mantener 5 |
| Elección | Tope de 2 |
| Prueba | event:cause_found y log:11 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una prueba es un enlace comprobable
Escribe la prueba como un identificador: eval:v4 para una serie, log:11 para una hora, event:cause_found para un evento. Un script puede entonces comprobar que cada una existe.
También puede detectar una entrada sin prueba, una elección que no está entre las opciones y un id usado dos veces.
Añade una entrada, nunca reescribas una
Las decisiones cambian cuando cambian las pruebas. No edites la entrada antigua. Añade una nueva que diga a cuál sustituye.
El registro muestra entonces lo que creías y cuándo, que es lo que necesita un lector.
Un error frecuente
Advertencia
Mucha gente cree que un registro de decisiones es papeleo que se escribe después. Escrito después, se convierte en una historia que encaja con el resultado. Escribe cada entrada el mismo día, con las pruebas de ese día.
Escribe el registro de decisiones, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const fs = require(\"fs\");' 'const DECISIONS = [' ' { id: \"D1\", date: \"2026-03-02\", decision: \"Poner la hoja de datos en el prompt\", options: [\"en el prompt\", \"buscar primero\"], choice: \"en el prompt\", evidence: [\"eval:v1\"] },' ' { id: \"D2\", date: \"2026-03-09\", decision: \"Prohibir cifras que no estén en la hoja\", options: [\"añadir una regla\", \"no hacer nada\"], choice: \"añadir la regla\", evidence: [\"eval:v2\"] },' ' { id: \"D3\", date: \"2026-03-16\", decision: \"Mantener el modelo pequeño\", options: [\"modelo pequeño\", \"modelo mayor\"], choice: \"modelo pequeño\", evidence: [\"eval:v5\", \"cost:v5\"] },' > decisions.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 registro de decisiones, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' { id: \"D4\", date: \"2026-03-24\", decision: \"Limitar los intentos a 2\", options: [\"tope de 2\", \"mantener 5\"], choice: \"tope de 2\", evidence: [\"event:cause_found\", \"log:11\"] },' ' { id: \"D5\", date: \"2026-03-25\", decision: \"Aceptar respuestas largas sobre impresión\", options: [\"aceptar\", \"acortar\"], choice: \"aceptar\", evidence: [] },' '];' 'fs.writeFileSync(\"decisions.json\", JSON.stringify(DECISIONS, null, 1));' >> decisions.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crea decisions.json
docker exec -w /home/node/project agent node decisions.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el comprobador del registro, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const fs = require(\"fs\");' 'function known() {' ' const ids = [];' ' [\"v1\", \"v2\", \"v3\", \"v4\", \"v5\"].forEach(function (v) { ids.push(\"eval:\" + v); });' ' [\"08\", \"09\", \"10\", \"11\", \"12\", \"13\", \"14\"].forEach(function (h) { ids.push(\"log:\" + h); });' ' [\"sheet_published\", \"alert_fired\", \"cause_found\", \"attempts_capped\", \"cost_normal\"].forEach(function (c) { ids.push(\"event:\" + c); });' ' return ids;' '}' > check-log.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 comprobador del registro, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function run() {' ' const entries = JSON.parse(fs.readFileSync(\"decisions.json\", \"utf8\"));' ' const ids = known();' ' const seen = [];' ' let bad = 0;' ' for (const e of entries) {' ' const problems = [];' ' if (e.evidence.length === 0) problems.push(\"no_evidence\");' ' else if (e.evidence.some(function (id) { return ids.includes(id) === false; })) problems.push(\"unknown_evidence\");' ' if (e.options.includes(e.choice) === false) problems.push(\"bad_choice\");' ' if (seen.includes(e.id)) problems.push(\"duplicate_id\");' ' seen.push(e.id);' ' if (problems.length > 0) { bad = bad + 1; console.log(e.id, problems.join(\" \")); }' ' }' ' console.log(entries.length + \" decisiones, \" + bad + \" con problemas\");' '}' 'module.exports = { run };' 'if (require.main === module) run();' >> check-log.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Comprueba el registro
docker exec -w /home/node/project agent node check-log.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 comprobador
| Línea | Qué dice |
|---|---|
| D2 | bad_choice |
| D3 | unknown_evidence |
| D5 | no_evidence |
| Última línea | 5 decisiones, 3 con problemas |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Escribe la corrección
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const fs = require(\"fs\");' 'const entries = JSON.parse(fs.readFileSync(\"decisions.json\", \"utf8\"));' 'entries[1].choice = \"añadir una regla\"; // la elección es una de las opciones' 'entries[2].evidence = [\"eval:v5\"]; // cost:v5 no es un registro' 'entries[4].evidence = [\"eval:v4\"]; // v4 aún tiene la respuesta larga, c9' 'fs.writeFileSync(\"decisions.json\", JSON.stringify(entries, null, 1));' 'require(\"./check-log\").run();' > fix-log.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Arregla el registro y comprueba de nuevo
docker exec -w /home/node/project agent node fix-log.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.