¿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

Construir la primera versión de una IA

Después de esta lección: Puedo construir la versión más simple que se pueda medir.

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

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

PalabraQué significaEjemplo
Hoja de datosla lista corta de datos que el asistente puede usar
Caso de pruebauna pregunta con la cifra que debe llevar la respuestac4
Evaluacióncasos de prueba y una regla que corrige cada uno
Comprobaciónla regla que corrige una respuesta como válida o no
Línea basela 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

ParteEn la primera versión
PromptResponder en una frase corta
Hoja de datosNueve datos, pegados en el prompt
ModeloUno, elegido por la plataforma
ComprobaciónLa 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

Comando
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

Comando
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

Comando
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

Comando
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

Comando
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

Comando
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

Comando
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

Comando
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

Comando
docker exec -w /home/node/project agent node 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.

Lo que imprime el Run

LíneaQué dice
c1 a c10Un tipo cada una: ok, invented, vague, refusal o long
Serie grabada v15 de 10 aprobados
Línea JSON5 ok, 2 invented, 1 vague, 1 refusal, 1 long
Pregunta en directoUna llamada corta, nunca en la nota

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.