¿Con qué frecuencia inventa datos una respuesta?
Una alucinación es una afirmación de una respuesta que su fuente no respalda. Un bot de ayuda que dice que una biblioteca abre a las 8 cuando abre a las 9 ha alucinado.
Para controlarlo, lo mides como una tasa y dices cuánto te fías de esa tasa.
Al final de esta lección
Nota
Puedo medir con qué frecuencia una respuesta dice lo que su fuente no dice.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Afirmación | un hecho que dice una respuesta |
| Fuente | el texto en el que debe apoyarse la respuesta |
| Sin respaldo | una afirmación que la fuente no sostiene |
| Tasa | las afirmaciones sin respaldo como parte del total |
| Intervalo | el margen en el que puede estar de verdad una tasa |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Comprueba cada afirmación con la fuente
Parte una respuesta en afirmaciones, un hecho en cada una. Para cada afirmación, pregunta si la fuente lo dice.
Una primera pasada sencilla usa palabras clave. Una afirmación está respaldada cuando todas las palabras clave que necesita están en la fuente. No lo está cuando falta una.
Ejemplo resuelto: cuatro afirmaciones sobre una fuente
| Afirmación | Palabras clave | ¿Están en la fuente? | Veredicto |
|---|---|---|---|
| Abre a las 9 | abre, 9 | Las dos | Respaldada |
| Tiene 30 ordenadores | ordenadores, 30 | Falta el 30 | Sin respaldo |
| El retraso cuesta 20 céntimos | retraso, 20, cuesta | Las tres | Respaldada |
| Abre los domingos | domingos | Falta | Sin respaldo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La tasa es un recuento entre otro recuento
Cuenta las afirmaciones sin respaldo. Divide entre todas las afirmaciones y escríbelo como porcentaje. Tres afirmaciones sin respaldo de ocho son el 37,5 %.
Cuenta afirmaciones, no respuestas. Una respuesta con cinco afirmaciones, una de ellas falsa, es una afirmación mala de cinco.
Remuestrea para ver cuánto varía la tasa
Escribe las 40 afirmaciones como 0 si tienen respaldo y 1 si no. Saca 40 de esa lista al azar, devolviendo cada una después de sacarla. Cuenta los unos.
Repite 200 veces y ordena los recuentos. El 6.º y el 195.º marcan el margen. Una semilla fija hace que los sorteos se repitan.
Ejemplo resuelto: 6 sin respaldo de 40
| Paso | Resultado |
|---|---|
| Afirmaciones y sin respaldo | 40 y 6 |
| Tasa | 15 % |
| Recuento ordenado más bajo del margen | 2, es decir, el 5 % |
| Recuento ordenado más alto del margen | 10, es decir, el 25 % |
| Qué informar | 15 %, margen de 5 a 25 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que 6 sin respaldo de 40 significa que la tasa real es exactamente el 15 %. Es solo lo que muestra esta muestra. Otras 40 afirmaciones podrían dar el 10 o el 20. Informa de la tasa con su intervalo.
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 tasa y el intervalo, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const source = \"La Biblioteca del Puerto abre a las 9 y cierra a las 17 de lunes a viernes. Tiene 12 ordenadores. Los socios pueden llevarse 6 libros durante 3 semanas. El retraso cuesta 20 céntimos al día.\";' 'const have = source.toLowerCase().split(\".\").join(\" \").split(\" \");' 'const claims = [' ' \"abre 9\", \"cierra 17\", \"ordenadores 12\", \"ordenadores 30\",' ' \"llevarse 6 libros\", \"semanas 4\", \"retraso 20 cuesta\", \"domingos\",' '].map(function (c) { return c.split(\" \"); });' > rate.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 tasa y el intervalo, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function supported(needs) {' ' return needs.every(function (w) { return have.indexOf(w) >= 0; });' '}' 'const bad = claims.filter(function (c) { return supported(c) === false; });' 'const flags = \"0001000001000001000000100000100000010000\".split(\"\").map(Number);' >> rate.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 tasa y el intervalo, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function interval(list, seed) {' ' const n = list.length;' ' const counts = [];' ' let s = seed;' ' for (let r = 0; r < 200; r++) {' ' let total = 0;' ' for (let k = 0; k < n; k++) { s = (s * 16807) % 2147483647; total += list[s % n]; }' ' counts.push(total);' ' }' ' counts.sort(function (a, b) { return a - b; });' ' return [counts[5] * 100 / n, counts[194] * 100 / n];' '}' >> rate.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 tasa y el intervalo, parte 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"sin respaldo: \" + bad.length + \" de \" + claims.length + \" (\" + (bad.length * 100 / claims.length) + \" por ciento)\");' ' const ones = flags.filter(function (f) { return f === 1; }).length;' ' const span = interval(flags, 12345);' ' console.log(\"prueba mayor: \" + ones + \" de \" + flags.length + \" = \" + (ones * 100 / flags.length) + \" por ciento\");' ' console.log(\"intervalo: de \" + span[0] + \" a \" + span[1] + \" por ciento\");' ' const q = \"La fuente dice que la biblioteca abre a las 9. ¿Está respaldada esta afirmación: abre a las 8? Una frase corta.\";' ' const sample = \"No, la fuente dice que abre a las 9, así que la afirmación no está respaldada.\";' ' const reply = await ask([{ role: \"user\", content: q }], sample, 60);' ' console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> rate.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 tasa y el intervalo
docker exec -w /home/node/project agent node rate.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 Run
| Línea | Qué muestra |
|---|---|
| sin respaldo: 3 de 8 (37.5 por ciento) | La comprobación por palabras clave en ocho afirmaciones |
| prueba mayor: 6 de 40 = 15 por ciento | Una lista grabada de 40 afirmaciones |
| intervalo: de 5 a 25 por ciento | El margen remuestreado |
| el modelo dijo: ... | Una comprobación real del laboratorio. Una muestra grabada si ningún modelo responde |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.