¿Era una persona o un programa?
La transparencia de la IA consiste en avisar a la gente cuando trata con un sistema de IA y mostrar lo que ha creado. Importa porque confiamos de otra forma en una respuesta si sabemos que la escribió un programa.
La otra mitad es guardar registros. Cuando algo sale mal, una revisión necesita saber qué se preguntó, qué modelo respondió y quién lo aprobó.
Al final de esta lección
Nota
Puedo avisar de que hay una IA, etiquetar lo que crea y guardar los registros que necesita una revisión.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Aviso | decir a alguien que trata con una IA | |
| Etiqueta | una marca visible que dice que lo hizo la IA | |
| Registro | una nota guardada de una respuesta de la IA | |
| Versión del modelo | el modelo exacto que respondió | v3 |
| Conservación | cuánto tiempo se guarda un registro | |
| Ficha del sistema | una página corta que describe una función de IA |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Avisa de que responde una IA
Dilo antes de que la persona confíe en la respuesta, en un sitio donde lo vea. Ponlo al empezar un chat, junto a una respuesta o en las primeras palabras de una llamada.
Añade en una línea qué puede hacer y qué no, y cómo hablar con una persona. Fijar expectativas a fondo se enseña en Cómo fijar expectativas de una función de IA.
Etiqueta lo que hizo la IA
Un texto, una imagen o un resumen hecho por un modelo lleva una etiqueta corta que el lector puede ver. La etiqueta dice quién lo hizo, no si está bien.
Cuando un archivo sale de tu producto, pon también una nota en sus propiedades. Así la etiqueta sigue ahí aunque alguien copie el archivo.
Ejemplo resuelto: dónde decirlo
| Lugar | Qué ve la persona |
|---|---|
| Al empezar un chat | Estás hablando con un asistente de IA. Una persona puede atenderte. |
| Debajo de una imagen | Hecho con IA |
| Al pie de un borrador de correo | Redactado con IA, revisado por Lucía Romero |
| Primeras palabras de una llamada | Te atiende un asistente automático. |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Qué debe guardar un registro
Un registro guarda qué se preguntó, qué versión del modelo respondió y qué persona aprobó una acción. Sin la versión, nadie puede saber qué modelo se equivocó.
Guarda un registro solo mientras una revisión lo necesite, y deja fuera los datos personales que no hagan falta. Registrar sin riesgos se enseña en Registrar con seguridad en una aplicación de IA, y los datos personales en Privacidad y protección de datos.
Un error frecuente
Advertencia
Mucha gente cree que más registros siempre dan más seguridad, así que lo guarda todo para siempre. Un registro lleno de datos personales, guardado durante años, es un riesgo en sí mismo. Guarda solo los campos que necesita una revisión, y solo el tiempo que los necesita.
Una ficha corta describe la función
Una ficha del sistema, o ficha del modelo, es una página corta sobre una función o un modelo de IA. Da su propósito, sus límites, cómo se evaluó, quién es su responsable y cómo contactar con esa persona.
Escríbela para alguien que nunca ha visto la función. Un campo en blanco es un hueco, igual que un hueco en una revisión.
Las normas lo piden cada vez más
Las normas de la UE y del Reino Unido piden cada vez más a quien crea IA que avise, etiquete y guarde registros. Qué pide cada norma, y desde cuándo, cambia según el lugar y con el tiempo.
Esto es información general, no asesoramiento jurídico: consulta el texto oficial vigente o pregunta a alguien cualificado. Hacer estas cosas no basta por sí solo para que un producto cumpla ninguna norma.
Ejemplo resuelto: una ficha corta
| Campo | Ayudante de pedidos |
|---|---|
| Propósito | Responde preguntas sobre pedidos |
| Límites | No puede cambiar pagos ni direcciones |
| Evaluaciones | 40 casos grabados, 37 aprobados |
| Responsable | Marta Gil |
| Contacto | [email protected] |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
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 la comprobación de registros, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' '' 'const KEEP_DAYS = 90; // un registro más antiguo se borra' '// Registros inventados de un asistente de atención al cliente. La edad es un número de días, no un reloj.' 'const records = [' ' { id: 1, asked: \"¿Dónde está mi pedido?\", version: \"v3\", action: false, approvedBy: \"\", age: 12, personal: false },' ' { id: 2, asked: \"Reembolsa el pedido 88\", version: \"v3\", action: true, approvedBy: \"\", age: 30, personal: false },' ' { id: 3, asked: \"Cambia mi dirección\", version: \"\", action: true, approvedBy: \"Tomás Vega\", age: 120, personal: false },' ' { id: 4, asked: \"¿Por qué me cobraron dos veces?\", version: \"v2\", action: false, approvedBy: \"\", age: 5, personal: true },' '];' > records.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 la comprobación de registros, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function problems(r) {' ' const found = [];' ' if (r.asked.trim() === \"\") found.push(\"sin pregunta\");' ' if (r.version.trim() === \"\") found.push(\"sin versión del modelo\");' ' if (r.action && r.approvedBy.trim() === \"\") found.push(\"sin aprobador\");' ' if (r.age > KEEP_DAYS) found.push(\"fuera de plazo\");' ' if (r.personal) found.push(\"datos personales innecesarios\");' ' return found;' '}' >> records.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 la comprobación de registros, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Una ficha corta de la función. Cada campo debe tener texto.' 'const card = { purpose: \"Responder sobre pedidos\", limits: \"No puede cambiar pagos\", evaluations: \"\", owner: \"Marta Gil\", contact: \"[email protected]\" };' 'const labels = { purpose: \"propósito\", limits: \"límites\", evaluations: \"evaluaciones\", owner: \"responsable\", contact: \"contacto\" };' >> records.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 la comprobación de registros, parte 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' records.forEach(function (r) {' ' const p = problems(r);' ' console.log(\"Registro \" + r.id + \": \" + (p.length === 0 ? \"correcto\" : p.join(\", \")));' ' });' ' const empty = Object.keys(card).filter(function (k) { return card[k].trim() === \"\"; });' ' console.log(\"A la ficha le falta: \" + (empty.length === 0 ? \"nada\" : empty.map(function (k) { return labels[k]; }).join(\", \")));' ' const q = \"Escribe una frase corta que una ventana de chat muestre para avisar al usuario de que habla con un sistema de IA.\";' ' const r = await ask([{ role: \"user\", content: q }], \"Estás hablando con un asistente de IA. Puede equivocarse, y una persona puede atenderte.\", 60);' ' console.log(\"Un aviso posible: \" + r.text);' '}' 'main();' >> records.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 la comprobación de registros
docker exec -w /home/node/project agent node records.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una salida posible
| Línea | Qué muestra |
|---|---|
| Registro 1: correcto | No falta nada |
| Registro 2: sin aprobador | Un reembolso sin ninguna persona nombrada |
| Registro 3: sin versión del modelo, fuera de plazo | Nadie sabe qué modelo respondió, y es demasiado antiguo |
| Registro 4: datos personales innecesarios | Guarda más de lo que necesita una revisión |
| A la ficha le falta: evaluaciones | La ficha no dice nada de las pruebas |
| Un aviso posible: ... | Tu propia llamada. Cambia en cada ejecución, o dice Muestra grabada |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.