Cómo dividir prompts gigantes para reducir el desperdicio de tokens en agentes
Una estructura monolítica que agrupa todo tipo de guías y herramientas en un solo prompt de sistema muestra sus limitaciones rápidamente. Con solo alargar un poco la conversación, el agente olvida las instrucciones ubicadas a mitad del prompt. Los costos de inferencia se disparan debido a la retransmisión redundante de decenas de miles de tokens en cada solicitud, y hay que esperar un largo rato hasta que aparece el primer token.
En la práctica, este problema se resuelve con una estructura de carga contextual por etapas basada en el estándar abierto agentskills.io. El método consiste en invocar el skill adecuado solo en el momento necesario para ahorrar tokens.
Criterios para separar en archivos Markdown de skills independientes
Los prompts de sistema monolíticos deben dividirse según los límites del dominio, los permisos de ejecución de herramientas y la frecuencia de ejecución. Para evitar que los skills entren en conflicto durante la búsqueda por similitud de embeddings, se deben mantener tres o menos skills activos simultáneamente en una sola sesión.
En la parte superior de cada archivo de skill separado, se debe incluir un frontmatter en YAML que especifique un identificador (usando solo guiones, letras minúsculas en inglés y números) y el propósito operativo.
`yaml
name: backend-api-generator
description: Generates Spring Boot REST API controller and service boilerplate code. Use when the user asks to create API endpoints, build REST controllers, or define DTO mappings for backend services.
when_to_use:
- User requests new REST API endpoint creation
- User provides database schema and asks for controller layer implementation
- Do NOT use for: database migration SQL, frontend component generation
allowed-tools:
- read_file
- write_file
- list_directory
effort: medium
`
El proceso para crear una estructura de carga por etapas es sencillo:
- Al inicializar el agente, solo se cargan en el prompt los metadatos del frontmatter en YAML de todos los skills dentro del directorio (aproximadamente 100 tokens por skill).
- Cuando llega una solicitud del usuario, se compara la similitud semántica con las descripciones de los skills para cargar de forma dinámica únicamente el cuerpo del skill necesario.
- En la fase de ejecución, se ejecutan los scripts auxiliares requeridos según las instrucciones del cuerpo y solo se incluyen los resultados en el contexto.
Al cambiar una estructura monolítica que ocupaba constantemente de 15,000 a 30,000 tokens a una estructura de carga diferida SKILL.md, la sobrecarga inicial de tokens se reduce en más del 90%. Según los datos de pruebas internas de Anthropic, es posible acortar la latencia p95 del 12% al 40% y disminuir el consumo promedio de tokens por conversación en un 29.6%.
Restricciones internas para prevenir la contaminación del contexto
Cuando se cargan múltiples skills en cadena, es frecuente que las instrucciones del skill anterior permanezcan en la sesión y distorsionen la tarea siguiente. Para las inspecciones de alto riesgo o las tareas que generan muchos registros, es necesario configurar una bifurcación de contexto (context: fork) en el frontmatter YAML para aislar el proceso a nivel de sistema.
`yaml
name: security-vulnerability-auditor
description: Audits backend source code for OWASP top 10 security flaws. Use when auditing code security or checking for SQL injection vulnerabilities.
context: fork
model: claude-sonnet-4-20250514
effort: high
`
Tampoco se puede omitir la definición clara de contratos de datos (Data Contracts) para las entradas y salidas.
- Se declaran la estructura de argumentos y la lista de herramientas permitidas (allowed-tools) en los metadatos YAML para prevenir ejecuciones arbitrarias de Bash o llamadas de red indiscriminadas.
- Se especifican reglas para un esquema de salida en formato JSON puro sin envoltorios de Markdown dentro del cuerpo.
- Se limitan las instrucciones para que solo devuelvan el resultado final a la sesión de conversación.
`markdown
Output Schema Contract
All responses must strictly adhere to the following JSON structure without markdown wrapping:
{
"status": "SUCCESS" | "FAILED",
"generated_files": [
{
"path": "string",
"content": "string"
}
],
"error_message": "string | null"
}
`
Aislar los procesos secundarios evita que los registros de llamadas a herramientas inunden la sesión principal. Al mantenerse limpia la sesión de conversación principal, también se reduce la probabilidad de errores al transferir datos entre subagentes.
Diseño de código defensivo para bloquear bucles infinitos
Si los requisitos son ambiguos o se repiten los errores en las llamadas a herramientas, el agente cae en un bucle de reintentos infinitos. Es en esos momentos cuando decenas de dólares en costos de API desaparecen en cuestión de minutos. Incluir una lista de verificación de verificación estática paso a paso (Verification Checklist) en el cuerpo del archivo de skill permite que el agente realice autoverificaciones antes de dar la tarea por terminada.
`markdown
Execution & Self-Testing Protocol
Before declaring the task finished, you MUST sequentially execute the following verification checklist:
- [Pre-check] Verify that all required input parameters are present. If mandatory arguments are missing, STOP immediately and ask the developer for input.
- [Generation] Write the requested implementation code.
- [Syntax Verification] Check the written code for missing imports, unresolved symbols, and syntax errors.
- [Self-Correction] If a syntax error is identified, attempt correction ONCE. Do not re-run the file write tool more than twice for the same error.
`
La forma de escribir un cortafuegos o disyuntor (Circuit Breaker) que detenga físicamente los bucles también es sencilla:
- Se especifica el número máximo de llamadas a herramientas (MAXIMUM_TOOL_CALL_LIMIT: 3) en la parte superior del skill.
- Se anotan restricciones para detener llamadas adicionales a herramientas si el mismo código de error ocurre dos veces seguidas.
- Se indica que, al cumplirse la condición de parada, se debe detener la ejecución de inmediato y mostrar una plantilla de notificación.
`markdown
[SKILL EXECUTION HALTED]
Skill Name: backend-api-generator
Failure Reason: [Brief error description]
Attempts Made: [Number of retries]
Suggested Action: [Action required by backend developer]
`
Para tareas peligrosas como la eliminación de archivos o el borrado de bases de données, es más seguro configurar la opción disable-model-invocation: true. Esto evita que el agente los invoque por su cuenta y limita su ejecución únicamente a cuando el desarrollador introduce manualmente el comando de barra diagonal (/skill-name).
Versionado y despliegue en un repositorio compartido del equipo
Cuando los miembros del equipo escriben skills en conjunto, deben seguir la arquitectura de directorios estándar de agentskills.io para no sufrir con conflictos en los archivos Markdown. Dentro de la carpeta principal se dividen y organizan claramente el cuerpo, los scripts de CLI, la documentación de referencia y los recursos de plantillas estáticas.
| Ruta de directorio y archivo |
Rol |
Guía de redacción |
| skills/api-generator/SKILL.md |
Documento de punto de entrada obligatorio |
Incluye el frontmatter YAML y las instrucciones de procedimientos clave (menos de 500 líneas) |
| skills/api-generator/scripts/ |
Carpeta de código ejecutable |
Ubicación de los scripts CLI en Python/Bash que el agente invoca si es necesario |
| skills/api-generator/references/ |
Carpeta de documentación de referencia auxiliar |
Contiene especificaciones de API grandes, esquemas de BD y documentos de guías de estilo |
| skills/api-generator/assets/ |
Carpeta de plantillas de recursos estáticos |
Almacena código repetitivo (boilerplate) generado y muestras de archivos de configuración |
Para verificar la calidad de los skills, se utiliza el framework de evaluación promptfoo.
- Se especifican la ruta del SKILL.md sujeto a prueba y el modelo LLM en el archivo promptfooconfig.yaml.
- Se redactan casos de prueba que validen la coincidencia de intenciones y el cumplimiento del formato JSON.
- Se ejecuta el comando npx promptfoo@latest eval en la terminal para medir la tasa de cumplimiento de las instrucciones.
`yaml
description: "Backend Agent Skills Validation Suite"
prompts:
- "file://skills/api-generator/SKILL.md"
providers:
- id: "anthropic:messages:claude-3-5-sonnet-20241022"
tests:
- description: "Test automatic skill activation for REST API generation query"
vars:
user_query: "Create a Spring Boot REST Controller for User Management."
assert:
- type: icontains
value: "backend-api-generator"
- type: javascript
value: "output.includes('@RestController') && output.includes('ResponseEntity')"
`
Al realizar despliegues, se combina una estrategia de desarrollo basada en troncos (trunk-based development) utilizando ramas de corta duración con etiquetas Git (v1.2.0). Si el agente se comporta de manera errónea en producción, es posible regresar de inmediato al punto anterior ejecutando el comando git checkout tags/v1.1.0 -b hotfix/rollback.