Límites y coste de los agentes de código
Un agente de código trabaja por pasos, y cada paso cuesta tiempo y dinero. Sin presupuesto ni regla de parada, un agente puede dar vueltas una hora con una tarea que tú harías en diez minutos.
Cada cambio que hace sigue necesitando tu revisión, y eso también cuesta tu tiempo. Unos números sencillos muestran cuándo merece la pena dar una tarea a un agente.
Al final de esta lección
Nota
Puedo fijar un presupuesto y una regla de parada para un agente de código y decidir si vale la pena darle una tarea.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Paso | una acción de un agente: leer, editar o ejecutar | |
| Presupuesto | el máximo de pasos o de dinero de una ejecución | |
| Regla de parada | una condición que termina antes una ejecución | |
| Paciencia | pasos permitidos sin progreso | 3 |
| Minutos netos | minutos ahorrados tras escribir y revisar |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un presupuesto y una regla de parada
Da a cada ejecución un presupuesto: como mucho 10 pasos y como mucho 40 céntimos. Dale también paciencia: si el número de tests que pasan no ha subido en 3 pasos, para.
Comprueba después de cada paso, en un orden fijo: terminado, fuera de presupuesto, sin progreso, sin pasos. La primera condición que se cumple termina la ejecución.
Ejemplo resuelto: la ejecución atascada, paso a paso
| Paso | Coste | Gastado | Pasan de 6 | Pasos desde la última subida |
|---|---|---|---|---|
| 1 | 4 | 4 | 2 | 0 |
| 2 | 5 | 9 | 3 | 0 |
| 3 | 6 | 15 | 3 | 1 |
| 4 | 5 | 20 | 3 | 2 |
| 5 | 6 | 26 | 3 | 3, así que para: sin progreso |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Tiempo ahorrado frente a tiempo gastado
Un agente no te ahorra todos los minutos que la tarea lleva a mano. Sigues gastando minutos en escribir la tarea y revisar el cambio. Los minutos netos son los minutos a mano menos esas dos cosas.
Conserva una tarea cuando el neto es 0 o menos. Consérvala también si es de riesgo alto, como una comprobación de pagos o borrar datos, digan lo que digan los minutos.
Ejemplo resuelto: cuatro tareas
| Tarea | A mano | Especificación más revisión | Neto | Decisión |
|---|---|---|---|---|
| Renombrar una función en 12 archivos | 40 | 15 | 25 | Delegar |
| Añadir una página de documentación | 30 | 15 | 15 | Delegar |
| Corregir una errata de una línea | 2 | 5 | -3 | Conservar |
| Cambiar la comprobación de pagos | 60 | 40 | 20 | Conservar: riesgo alto |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que el tiempo de un agente es gratis porque trabaja mientras uno hace otra cosa. Tu propio tiempo se va en la tarea, la revisión y los arreglos. Cuenta esos minutos antes de delegar, y conserva el trabajo de riesgo alto diga lo que diga la cuenta.
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 el script de presupuesto, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const LIMIT = { steps: 10, cents: 40, patience: 3 };' 'const runs = {' ' \"constante\": { total: 6, cost: [3, 4, 3, 5, 4, 3], passing: [1, 2, 3, 4, 5, 6] },' ' \"atascado\": { total: 6, cost: [4, 5, 6, 5, 6, 7, 6, 5], passing: [2, 3, 3, 3, 3, 3, 3, 3] },' ' \"caro\": { total: 8, cost: [9, 12, 10, 11, 9], passing: [1, 2, 3, 4, 5] },' '};' > budget.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 script de presupuesto, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function stop(r) {' ' let spent = 0;' ' let best = 0;' ' let rose = 0;' ' for (let i = 0; i < r.cost.length; i += 1) {' ' const step = i + 1;' ' spent += r.cost[i];' ' if (r.passing[i] > best) { best = r.passing[i]; rose = step; }' ' if (best === r.total) return \"terminado en el paso \" + step + \", \" + spent + \" céntimos\";' ' if (spent > LIMIT.cents) return \"fuera de presupuesto en el paso \" + step + \", \" + spent + \" céntimos\";' ' if (step - rose >= LIMIT.patience) return \"sin progreso en el paso \" + step + \", \" + spent + \" céntimos\";' ' if (step >= LIMIT.steps) return \"sin pasos en el paso \" + step + \", \" + spent + \" céntimos\";' ' }' ' return \"fin del registro, \" + spent + \" céntimos\";' '}' >> budget.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 script de presupuesto, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const tasks = [' ' { name: \"renombrar una función en 12 archivos\", byHand: 40, spec: 5, review: 10, risk: \"bajo\" },' ' { name: \"añadir una página de documentación\", byHand: 30, spec: 5, review: 10, risk: \"bajo\" },' ' { name: \"corregir una errata de una línea\", byHand: 2, spec: 3, review: 2, risk: \"bajo\" },' ' { name: \"cambiar la comprobación de pagos\", byHand: 60, spec: 10, review: 30, risk: \"alto\" },' '];' 'function decide(t) {' ' if (t.risk === \"alto\") return \"conservar: riesgo alto\";' ' const net = t.byHand - t.spec - t.review;' ' return net > 0 ? \"delegar, ahorra \" + net + \" minutos\" : \"conservar: no ahorra nada\";' '}' >> budget.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 script de presupuesto, parte 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' Object.keys(runs).forEach(function (name) { console.log(name + \": \" + stop(runs[name])); });' ' tasks.forEach(function (t) { console.log(t.name + \": \" + decide(t)); });' ' const q = \"En una frase corta: ¿por qué un agente de código debe parar cuando no avanza?\";' ' const sample = \"Una ejecución que no se acerca solo gasta más dinero y te deja más cosas que revisar.\";' ' const reply = await ask([{ role: \"user\", content: q }], sample, 60);' ' console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> budget.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 el script de presupuesto
docker exec -w /home/node/project agent node budget.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 | Lo que muestra |
|---|---|
| constante: terminado en el paso 6, 22 céntimos | Pasan todos los tests dentro del presupuesto |
| atascado: sin progreso en el paso 5, 26 céntimos | Tres pasos sin subir |
| caro: fuera de presupuesto en el paso 4, 42 céntimos | Superó los 40 céntimos |
| renombrar una función en 12 archivos: delegar, ahorra 25 minutos | Vale la pena dársela a un agente |
| añadir una página de documentación: delegar, ahorra 15 minutos | También vale la pena, aunque ahorra menos |
| corregir una errata de una línea: conservar: no ahorra nada | Más rápido a mano |
| cambiar la comprobación de pagos: conservar: riesgo alto | Se conserva digan lo que digan los minutos |
| el modelo dijo: ... | Una frase del laboratorio. Una línea de Muestra grabada si ningún modelo responde |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.