La primera versión de una función de IA
La primera versión de una función de IA es la más simple que puedes medir. Lleva un prompt, un modelo y un conjunto pequeño de preguntas de prueba. Importa porque no se puede mejorar lo que no se sabe puntuar.
La biblioteca Los Almendros ya tiene su encargo. El equipo construye un asistente que responde con una hoja de nueve líneas y lo puntúa con diez preguntas.
Al final de esta lección
Nota
Puedo construir la versión más simple que se pueda medir.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Hoja de datos | la lista corta de datos que el asistente puede usar | |
| Caso de prueba | una pregunta con la cifra que debe llevar la respuesta | c4 |
| Evaluación | casos de prueba y una regla que corrige cada uno | |
| Comprobación | la regla que corrige una respuesta como válida o no | |
| Línea base | la primera nota, la que superan las versiones siguientes |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un prompt, un modelo, una hoja
La versión más simple tiene cuatro partes. Un prompt de sistema con una regla. Una hoja de datos dentro de él. Un modelo. Una comprobación de la respuesta.
No tiene búsqueda, ni memoria, ni segundo modelo. Cada parte ausente es una parte que aún no puede fallar. Añades una solo cuando una nota lo pide.
Ejemplo: la versión 1
| Parte | En la primera versión |
|---|---|
| Prompt | Responder en una frase corta |
| Hoja de datos | Nueve datos, pegados en el prompt |
| Modelo | Uno, elegido por la plataforma |
| Comprobación | La cifra correcta, ninguna otra, 40 palabras |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una evaluación son casos y una regla
Un caso de prueba es una pregunta y la cifra que debe llevar la respuesta. La comprobación corrige cada respuesta con la misma regla.
Aquí la comprobación encuentra cuatro tipos de fallo. Un rechazo. Una cifra inventada que no está en la hoja. Una respuesta vaga, sin la cifra correcta. Una respuesta larga, de más de 40 palabras.
Empieza con diez casos
Diez casos son pocos a propósito. Puedes leer cada respuesta y ver por qué falla cada una.
Los casos salen de lo que pregunta la gente, no de lo que es fácil. Cuando aparece un fallo real más tarde, lo añades como caso 11. La evaluación crece con las pruebas.
Un error frecuente
Advertencia
Mucha gente cree que una buena demostración es una evaluación. Una demostración es un caso que tú elegiste. Una evaluación son muchos casos que no elegiste, corregidos con la misma regla. Una demostración dice lo que puede funcionar.
Escribe la ayuda 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\";' '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 || 200 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"estado \" + res.status);' ' return (await res.json()).choices[0].message.content;' > 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 ayuda del modelo, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' } catch (error) {' ' console.log(\"Muestra grabada: ningún modelo respondió (\" + error.message + \").\");' ' const list = [].concat(sample);' ' const turn = messages.filter(function (m) { return m.role === \"assistant\"; }).length;' ' return list[Math.min(turn, list.length - 1)];' ' }' '}' '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 evaluación, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const SHEET = \"Préstamo 3 semanas. Renovar 2 veces. Multa 20 céntimos al día. Abierto de 9 a 17. Límite 8 libros. Carné nuevo 5 euros. Sala 4 horas. Impresión 10 céntimos por página. Menores de 18 gratis.\";' 'const LIMIT = 40; // el máximo de palabras de una respuesta' 'const SHEET_NUMBERS = SHEET.match(/[0-9]+/g);' > eval.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 evaluación, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const RAW = [' ' [\"c1\", \"¿Cuánto tiempo puedo quedarme un libro?\", \"3\", \"Puedes quedarte un libro 3 semanas.\", 6, false],' ' [\"c2\", \"¿Puedo renovar un libro?\", \"2\", \"Sí, puedes renovarlo 2 veces.\", 5, false],' ' [\"c3\", \"¿Cuánto es la multa por retraso?\", \"20\", \"La multa es de 50 céntimos al día.\", 8, false],' ' [\"c4\", \"¿A qué hora abrís?\", \"9\", \"Abrimos a las 9 todos los días.\", 7, false],' ' [\"c5\", \"¿A qué hora cerráis?\", \"17\", \"Cerramos por la tarde.\", 4, false],' >> eval.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 evaluación, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' [\"c6\", \"¿Cuántos libros puedo llevarme?\", \"8\", \"Puedes llevarte 8 libros a la vez.\", 7, false],' ' [\"c7\", \"¿Cuánto cuesta un carné nuevo?\", \"5\", \"Un carné nuevo cuesta 7 euros.\", 6, false],' ' [\"c8\", \"¿Puedo reservar una sala todo el día?\", \"4\", \"No puedo ayudarte con eso. Pregunta mejor en el mostrador.\", 10, true],' ' [\"c9\", \"¿Cuánto cuesta imprimir?\", \"10\", \"Imprimir cuesta 10 céntimos por página. El blanco y negro y el color cuestan lo mismo. Pagas en el mostrador con tarjeta o con monedas. Las impresoras están junto a la ventana del este, al lado de las mesas grandes, y los escáneres de allí son gratis para todo el mundo, con o sin carné.\", 55, false],' >> eval.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 evaluación, parte 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' [\"c10\", \"¿Pueden apuntarse los niños?\", \"18\", \"Los menores de 18 tienen carné gratis.\", 7, false],' '];' 'const CASES = RAW.map(function (r) {' ' return { id: r[0], q: r[1], expect: r[2], reply: r[3], length: r[4], refused: r[5] };' '});' >> eval.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 evaluación, parte 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function kind(c) {' ' if (c.refused) return \"refusal\";' ' const found = c.reply.match(/[0-9]+/g) || [];' ' for (const n of found) {' ' if (SHEET_NUMBERS.includes(n) === false) return \"invented\";' ' }' ' if (found.includes(c.expect) === false) return \"vague\";' ' if (c.length > LIMIT) return \"long\";' ' return \"ok\";' '}' 'const counts = {};' 'for (const c of CASES) {' ' const k = kind(c);' ' counts[k] = (counts[k] || 0) + 1;' ' console.log(c.id, k);' '}' 'console.log(\"Serie grabada v1:\", counts.ok, \"de\", CASES.length, \"aprobados\");' 'console.log(JSON.stringify(counts));' 'require(\"fs\").writeFileSync(\"eval-v1.json\", JSON.stringify(CASES, null, 1));' >> eval.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 evaluación, parte 6
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function live() {' ' const system = \"Responde en una frase corta, usando solo esta hoja: \" + SHEET;' ' const messages = [{ role: \"system\", content: system }, { role: \"user\", content: \"¿A qué hora abrís?\" }];' ' const reply = await ask(messages, \"Abrimos a las 9 todos los días.\", 40);' ' const found = reply.match(/[0-9]+/g) || [];' ' console.log(\"Pregunta en directo:\", reply);' ' console.log(\"Lleva la cifra 9:\", found.includes(\"9\"), \"(no cuenta en la nota)\");' '}' 'live();' >> eval.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Puntúa la versión 1
docker exec -w /home/node/project agent node eval.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é dice |
|---|---|
| c1 a c10 | Un tipo cada una: ok, invented, vague, refusal o long |
| Serie grabada v1 | 5 de 10 aprobados |
| Línea JSON | 5 ok, 2 invented, 1 vague, 1 refusal, 1 long |
| Pregunta en directo | Una llamada corta, nunca en la nota |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.