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
| Palabra | Qué significa |
|---|---|
| Afirmación | una frase de un informe que puede ser verdadera o falsa |
| Fuente | el texto del que dice venir una afirmación |
| Respaldada | la fuente dice de verdad lo que dice la afirmación |
| Revisor | un segundo agente que lee una afirmación y su fuente |
| Muestreo | leer a mano unas pocas afirmaciones, elegidas con un patrón fijo |
| Invención | una 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ón | Detecta | Se le escapa |
|---|---|---|
| Programa: fuente y números | Una fuente inventada, una cifra errónea | Una afirmación que invierte el sentido |
| Modelo revisor | Muchos sentidos invertidos | Sus propios errores, y su tendencia a dar la razón |
| Muestreo por una persona | Lo que las otras dos dejaron pasar | Todo 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
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
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
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
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
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
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
docker exec -w /home/node/project agent node check.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 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ínea | Qué muestra |
|---|---|
| 1 pasa la comprobación, 2 pasa la comprobación | Números y palabras coinciden |
| 3 MARCADA: número ausente de la fuente | La afirmación dice 410, la fuente 310 |
| 4 MARCADA: palabras ausentes de la fuente | Nada en la fuente habla de préstamos |
| 5 MARCADA: fuente inexistente | Cita s7, que no existe |
| 6 pasa la comprobación | Pasa, aunque el sentido está invertido |
| Muestreo, una de cada 3 afirmaciones: 1, 4 | Las 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.