¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cómo comprobar las afirmaciones de un agente

Después de esta lección: Puedo detectar cuándo el informe de un trabajador no está respaldado por sus fuentes, y marcar las afirmaciones que fallan.

Lección de 70 min7 comandosLaboratorio de agente de programación con IA: usa opencode para explicar y corregir código, y comprueba su trabajo

Un informe es una lista de afirmaciones

El informe de un trabajador es un conjunto de afirmaciones, y cada una dice venir de una fuente. Importa porque un trabajador que no encuentra respuesta suele escribir una que suena bien.

El orquestador no lo nota al leer. Tiene que comprobar cada afirmación contra la fuente que nombra.

Al final de esta lección

Nota

Puedo detectar cuándo el informe de un trabajador no está respaldado por sus fuentes, y marcar las afirmaciones que fallan.

Palabras clave

PalabraQué significa
Afirmaciónuna frase de un informe que puede ser verdadera o falsa
Fuenteel texto del que dice venir una afirmación
Respaldadala fuente dice de verdad lo que dice la afirmación
Revisorun segundo agente que lee una afirmación y su fuente
Muestreoleer a mano unas pocas afirmaciones, elegidas con un patrón fijo
Invenciónuna afirmación que el trabajador inventó para tapar un hueco

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Tres comprobaciones, de barata a cara

La más barata es un programa. ¿Existe la fuente citada, y están en ella los números de la afirmación? Detecta fuentes inventadas y cifras erróneas.

La siguiente es un revisor, un modelo que lee la afirmación y la fuente. La más cara es una persona, que lee unas pocas afirmaciones elegidas con una regla fija.

Ejemplo resuelto: qué detecta cada comprobación

ComprobaciónDetectaSe le escapa
Programa: fuente y númerosUna fuente inventada, una cifra erróneaUna afirmación que invierte el sentido
Modelo revisorMuchos sentidos invertidosSus propios errores, y su tendencia a dar la razón
Muestreo por una personaLo que las otras dos dejaron pasarTodo lo que no se elige

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Por qué inventan los trabajadores

Un trabajador gana por dar una respuesta, así que quedarse con las manos vacías parece un fallo. Dile que no responder está permitido: un encargo que pide contestar «no encontrado» cuando el material no lo dice.

Luego cuenta las respuestas «no encontrado». Un trabajador que nunca las da probablemente inventa.

Un error frecuente

Advertencia

Mucha gente lee una cita como una prueba. Una afirmación que nombra una fuente puede seguir equivocándose sobre ella. Lo que se comprueba es si la fuente lo dice, nunca si la afirmación nombra una.

Escribir el ayudante del modelo, parte 1

Comando
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.

Escribir el ayudante del modelo, parte 2

Comando
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.

Escribir el comprobador, parte 1

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const SOURCES = {' '  s1: \"Encuesta: 212 de 400 visitantes pidieron abrir los domingos.\",' '  s2: \"Personal: seis horas a 18 euros la hora son 108 euros cada domingo.\",' '  s3: \"Visitas: el sábado hubo 310 visitas el mes pasado, un día de semana 120.\",' '};' 'const CLAIMS = [' '  { text: \"212 de 400 visitantes pidieron abrir los domingos.\", source: \"s1\" },' '  { text: \"El personal del domingo cuesta 108 euros.\", source: \"s2\" },' '  { text: \"El sábado hubo 410 visitas el mes pasado.\", source: \"s3\" },' '  { text: \"La mayoría quiere préstamos más largos.\", source: \"s1\" },' '  { text: \"El personal considera justa esa apertura.\", source: \"s7\" },' '  { text: \"Las visitas entre semana superaron a las del sábado.\", source: \"s3\" },' '];' > check.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribir el comprobador, parte 2

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function numbers(t) { return t.match(/[0-9]+/g) || []; }' 'function words(t) {' '  return (t.toLowerCase().match(/\p{L}+/gu) || []).filter(function (w) { return w.length >= 5; });' '}' >> check.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribir el comprobador, parte 3

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Una comprobación barata: la fuente existe, sus números coinciden y la mitad de las palabras largas están.' 'function why(c) {' '  const text = SOURCES[c.source];' '  if (text === undefined) return \"fuente inexistente\";' '  const have = numbers(text);' '  if (numbers(c.text).some(function (n) { return have.includes(n) === false; })) return \"número ausente de la fuente\";' '  const w = words(c.text);' '  const found = w.filter(function (x) { return words(text).includes(x); });' '  return 2 * found.length >= w.length ? \"\" : \"palabras ausentes de la fuente\";' '}' >> check.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribir el comprobador, parte 4

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  CLAIMS.forEach(function (c, i) {' '    console.log((i + 1) + \" \" + (why(c) === \"\" ? \"pasa la comprobación\" : \"MARCADA: \" + why(c)));' '  });' '  console.log(\"Muestreo, una de cada 3 afirmaciones: \" + [1, 4].join(\", \"));' '  const c = CLAIMS[5];' '  const q = [{ role: \"user\", content: \"Fuente: \" + SOURCES.s3 + \" Afirmación: \" + c.text + \" ¿La fuente respalda la afirmación? Responde sí o no.\" }];' '  const r = await ask(q, \"no\", 10);' '  console.log(\"Revisor sobre la afirmación 6: \" + r.text.trim());' '}' 'main();' >> check.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejecutar el comprobador

Comando
docker exec -w /home/node/project agent node check.js

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Lo que el programa no ve

La afirmación 6 dice que las visitas entre semana superaron a las del sábado. La fuente dice lo contrario. El programa la deja pasar, porque las palabras coinciden. Solo un revisor o una persona lee el sentido.

La única llamada en vivo pregunta a un revisor por esa afirmación. Su respuesta puede cambiar en cada ejecución, y puede ser errónea.

Una salida posible

LíneaQué muestra
1 pasa la comprobación, 2 pasa la comprobaciónNúmeros y palabras coinciden
3 MARCADA: número ausente de la fuenteLa afirmación dice 410, la fuente 310
4 MARCADA: palabras ausentes de la fuenteNada en la fuente habla de préstamos
5 MARCADA: fuente inexistenteCita s7, que no existe
6 pasa la comprobaciónPasa, aunque el sentido está invertido
Muestreo, una de cada 3 afirmaciones: 1, 4Las afirmaciones que leería una persona
Revisor sobre la afirmación 6: …Una segunda opinión, nunca una prueba

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Sobre este laboratorio y su código: Laboratorio de agente de programación con IA: usa opencode para explicar y corregir código, y comprueba su trabajo

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.