Cómo escribir un diseño de una página
Un diseño de una página dice cómo va a funcionar y a fallar una función respaldada por un modelo, antes de que nadie la construya. Nombra la pasarela, la cola, las evaluaciones, el presupuesto, el plan de respaldo y las reglas de seguridad en un solo sitio. Importa porque cada una de estas decisiones es barata sobre el papel y cara de añadir después.
Dos ingenieros recuerdan cada uno un límite de ritmo distinto. La página de diseño lo resuelve, y un script puede comprobar la página.
Al final de esta lección
Nota
Puedo escribir un diseño de una página para una función respaldada por un modelo.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Página de diseño | una página que dice cómo funciona una función |
| Requisito | una afirmación que el diseño debe cumplir |
| Plan de respaldo | lo que pasa cuando falla una llamada al modelo |
| Presupuesto | lo máximo que puede gastar una función |
| Evaluación | una prueba de calidad sobre casos fijos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Seis secciones cubren una función
Escribe una sección corta por cada asunto. Pasarela: claves, límites, elección de modelo. Cola: qué llamadas son tareas y cómo se limitan los reintentos. Evaluaciones: los casos y la nota de aprobado. Presupuesto: el límite y qué pasa al llegar a él. Respaldo: lo que ve el usuario cuando falla una llamada. Seguridad: qué puede llevar el prompt y qué se registra.
Una página obliga a elegir. Bastan dos frases por sección.
Ejemplo resuelto: qué debe decir cada sección
| Sección | Un requisito que cumple | Expresión que buscar |
|---|---|---|
| Pasarela | Quien llama nunca tiene la clave del proveedor | clave de cliente |
| Cola | El trabajo lento no bloquea una petición | tarea, reintento |
| Evaluaciones | Un cambio se juzga con casos fijos | casos, tasa de acierto |
| Presupuesto | El gasto tiene un techo | tope diario |
| Respaldo | El usuario siempre recibe algo | respuesta simple |
| Seguridad | Se minimizan los datos personales y los registros son seguros | datos personales, registro |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un script puede comprobar una página de diseño
Convierte cada requisito en una sección y unas pocas expresiones que deben aparecer. Un script corto lee la página y lista lo que falta. No puede juzgar si el diseño es bueno. Solo prueba que la página respondió a cada pregunta.
Ejecútalo en la revisión y mantén la página corta: un límite de palabras también es un requisito.
Un error frecuente
Advertencia
Mucha gente cree que un diseño que pasa el script es un buen diseño. El script comprueba que se menciona un tema, no que la decisión sea acertada. Pasar es el comienzo de la revisión, nunca su final.
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\";' '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 el ayudante 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 comprobación del diseño, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Un diseño de una página para una función que resume tickets, inventado para la lección.' 'const design = {' ' gateway: \"Quien llama usa una clave de cliente. La pasarela aplica un límite de ritmo de 60 por minuto y elige el modelo.\",' ' queue: \"Un resumen es una tarea. Un trabajador la ejecuta y un reintento tiene tope de tres intentos.\",' ' evals: \"Cuarenta casos con respuestas conocidas. Comparamos la tasa de acierto de cada versión del prompt.\",' ' budget: \"Un tope diario por equipo. Al pasarlo, la función lo dice y se detiene.\",' ' fallback: \"Si el modelo falla, probamos un segundo modelo y luego mostramos las primeras líneas del ticket.\",' ' security: \"Los tickets pueden tener datos personales, así que el prompt recibe solo lo necesario.\",' '};' > design.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 comprobación del diseño, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const reqs = [' ' { id: \"R1\", section: \"gateway\", words: [\"clave de cliente\", \"límite de ritmo\"] },' ' { id: \"R2\", section: \"queue\", words: [\"tarea\", \"reintento\"] },' ' { id: \"R3\", section: \"evals\", words: [\"casos\", \"tasa de acierto\"] },' ' { id: \"R4\", section: \"budget\", words: [\"tope diario\"] },' ' { id: \"R5\", section: \"fallback\", words: [\"respuesta simple\"] },' ' { id: \"R6\", section: \"security\", words: [\"datos personales\", \"registro\"] },' '];' >> design.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 comprobación del diseño, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function check(d, rs, maxWords) {' ' const out = [];' ' rs.forEach(function (r) {' ' const text = (d[r.section] || \"\").toLowerCase();' ' if (text.trim() === \"\") { out.push(r.id + \": no hay sección \" + r.section); return; }' ' r.words.forEach(function (w) { if (text.indexOf(w) < 0) out.push(r.id + \": falta \" + w); });' ' });' ' let n = 0;' ' for (const k in d) n += d[k].split(\" \").length;' ' if (n > maxWords) out.push(\"demasiado largo: \" + n + \" palabras\");' ' return out;' '}' 'const problems = check(design, reqs, 120);' 'problems.forEach(function (p) { console.log(\"Problema:\", p); });' 'console.log(\"Requisitos cumplidos:\", reqs.length - problems.length, \"de\", reqs.length);' >> design.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Comprueba la página de diseño
docker exec -w /home/node/project agent node design.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Este Run no necesita modelo
La comprobación es código simple sobre texto, así que no hace ninguna llamada. El ayudante se escribe para los ejercicios siguientes, y un Run que llama a un modelo imprime una Muestra grabada con etiqueta cuando ninguno responde.
El diseño es inventado. Un diseño real nombra tus propios servicios y tus propios números.
Una salida posible
| Línea | Qué muestra |
|---|---|
| Problema: R5: falta respuesta simple | El respaldo nunca dice qué ve el usuario al final |
| Problema: R6: falta registro | La sección de seguridad no dice nada de los registros |
| Requisitos cumplidos: 4 de 6 | Cuatro secciones respondieron a cada pregunta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.