Agentes con LLMs: estructura mínima que no se desmorona
Construir un agente con un LLM es fácil: un loop, un prompt y una herramienta. Construir un agente que no se atasca, alucina con los datos o ejecuta la misma acción diez veces ya es otra cosa. Esta es la estructura mínima que separa el demo del producto.
El bucle percibir-actuar
El núcleo de cualquier agente es un bucle de tres pasos:
- Percibir: obtener el estado actual (entrada del usuario + contexto del sistema).
- Decidir: el LLM elige la siguiente acción (responder o invocar una herramienta).
- Actuar: ejecutar la herramienta y devolver su resultado al contexto.
while (!terminado) {
const contexto = `Estado: ${estado}\nHerramientas: ${herramienta(json)}\nHistorial: ${historial}`;
const accion = await llm(contexto + prompt);
if (accion.tipo === 'fin') terminado = true;
else historial.push(await ejecutar(accion.herramienta));
}
El contexto se inyecta, no se “recuerda”
Un LLM no tiene memoria: tiene la ventana de contexto. Todo lo que el agente “sabe” debe caber en la prompt de cada iteración. Esto tiene una consecuencia práctica: no guardes en el historial lo que no haga falta, y trunca lo que exceda la ventana, priorizando los mensajes recientes y el resultado de herramientas por encima de mensajes intermedios.
Herramientas con contrato, no con texto
Define cada herramienta con un esquema (nombre, argumentos, descripción) y valida las salidas. Si el LLM devuelve JSON malformado, reintenta una vez con el error en contexto; si falla de nuevo, aborta. Un agente que asume que sus herramientas devuelven siempre datos válidos es un agente que devuelve datos corruptos en producción.
Evaluación: el agente SIN test es una apuesta
Antes de medir precisión, mide robustez del flujo: prepara 20-30 trayectorias de ejemplo, ejecuta el agente y marca si llegó al objetivo, cuántas vueltas dio y si llamó herramientas que no debía. Ese harness de evaluación es lo que te permite cambiar de modelo sin volver a empezar.
La regla de oro
Un agente útil no es el que parece inteligente: es el que ejecuta un trabajo acotado con pasos verificables. Acota el scope, inyecta contexto, contrata las herramientas y evalúa. El resto es prompt-polish.