- La mayoría de los equipos que construyen sistemas basados en LLM intentan empezar por agentes (Agents), pero en la mayoría de los casos terminan colapsando por la complejidad, la falta de control y la dificultad para depurar
- Los verdaderos patrones de agente, donde se necesitan memoria, RAG, uso de herramientas y control del flujo de trabajo, en realidad son poco comunes; la mayoría de los problemas pueden resolverse mejor con flujos de trabajo simples (encadenamiento, paralelización, enrutamiento, etc.)
- Se recomienda aplicar primero 5 patrones de flujo de trabajo con LLM útiles en la práctica, y usar agentes con cuidado solo cuando de verdad sean necesarios
- Encadenamiento de prompts, paralelización, enrutamiento, orquestador-worker, evaluador-optimizador
- Incluso cuando se necesitan agentes, al final lo más importante sigue siendo la participación humana, el control claro y la observabilidad (Observability)
¿De verdad se necesitan agentes de IA?
- Perspectiva de Hugo Bowne-Anderson, quien ofrece consultoría y capacitación sobre construcción de sistemas con LLM a distintos ingenieros y equipos, incluidos Netflix, Meta y la Fuerza Aérea de EE. UU.
Un mal comienzo: por qué todos se obsesionan con los agentes
- Muchos equipos, al iniciar un proyecto con LLM, introducen primero estructuras complejas como agentes, memoria, enrutamiento, uso de herramientas y personalidad
- Cuando se implementan en la práctica, se presentan con frecuencia comportamientos anómalos y fallas persistentes en áreas como la colaboración entre agentes, la selección de herramientas y la memoria de largo plazo
- Como ejemplo, en un proyecto de agente de investigación basado en CrewAI, se experimentó que cada rol (investigador, resumidor y coordinador) no lograba colaborar como se esperaba y el sistema terminaba desmoronándose sin remedio
¿Qué es un agente?
- Cuatro características de un sistema con LLM: memoria, recuperación de información (RAG), uso de herramientas y control del flujo de trabajo
- La última, el control del flujo de trabajo (cuando el LLM decide directamente el siguiente paso o si debe usar una herramienta), es lo que se considera una característica agentiva
- En la mayoría de las tareas reales, los flujos de trabajo simples (encadenamiento, enrutamiento, etc.) muestran mayor estabilidad
Patrones de flujo de trabajo con LLM que conviene usar en la práctica en lugar de agentes
1. Encadenamiento de prompts (Prompt Chaining)
- Descripción: divide varias tareas en una serie de etapas (una cadena), de modo que el LLM procese cada paso de forma secuencial
- Ejemplo: extraer nombre, cargo y empresa de un perfil de LinkedIn → añadir información adicional de esa empresa (misión, vacantes, etc.) → redactar un correo personalizado con base en el perfil y la información de la empresa
- Ventajas: como cada etapa está claramente separada, es fácil rastrear y corregir la causa cuando aparece un bug; favorece la depuración y el mantenimiento
- Lineamientos:
- Adecuado para tareas conectadas de manera secuencial
- Si falla una sola etapa, toda la cadena puede venirse abajo
- Si se divide en tareas pequeñas, se logran resultados más predecibles y una depuración más sencilla
2. Paralelización (Parallelization)
- Descripción: ejecuta múltiples tareas independientes al mismo tiempo para acelerar el proceso completo
- Ejemplo: extraer en paralelo varios elementos como educación, experiencia y habilidades de distintos perfiles para reducir el tiempo total de procesamiento
- Ventajas: es eficiente incluso con grandes volúmenes de datos en extracción o procesamiento independiente, y encaja bien en entornos de procesamiento distribuido
- Lineamientos:
- Funciona bien cuando cada tarea es independiente y la ejecución simultánea mejora de forma importante la velocidad total
- Hay que prestar atención a excepciones como race conditions, timeouts y otros problemas durante la ejecución paralela
- Adecuado para procesar grandes cantidades de datos y analizar varias fuentes al mismo tiempo
3. Enrutamiento (Routing)
- Descripción: el LLM clasifica los datos de entrada y los dirige automáticamente al flujo de trabajo correspondiente
- Ejemplo: en una herramienta de soporte al cliente, clasificar si la entrada es una consulta sobre producto, un problema de pago o una solicitud de reembolso, y luego procesarla automáticamente con el flujo adecuado; si el tipo es ambiguo, enviarla al manejador por defecto
- Ventajas: aplica lógica de procesamiento especializada según el tipo de entrada y separa de forma limpia los distintos casos
- Lineamientos:
- Úsalo cuando se necesite un tratamiento distinto según el tipo de entrada o la situación
- En casos límite o excepcionales, el enrutamiento puede fallar o dejar entradas sin clasificar
- Es indispensable diseñar un manejador catch-all para casos no clasificados o excepcionales
4. Orquestador-worker (Orchestrator-Worker)
- Descripción: un LLM con rol de orquestador descompone la tarea y toma decisiones para delegar subtareas a workers (LLM de ejecución), controlando directamente el flujo general y el orden
- Ejemplo: clasificar un perfil objetivo como tech o non-tech → si es tech, delegar la generación del correo a un worker especializado; si es non-tech, delegarlo a otro worker
- Ventajas: separa la toma de decisiones (clasificación/juicio) de la ejecución (procesamiento individual), lo que favorece el control dinámico del flujo y la escalabilidad
- Lineamientos:
- Adecuado cuando cada tarea requiere manejo especializado, o cuando hay bifurcaciones complejas y coordinación paso a paso
- Si el orquestador descompone o delega mal una tarea, se generan errores en todo el flujo
- Mantén la lógica explícita y simple, y diseña con claridad la delegación, el orden y las condiciones de término
5. Evaluador-optimizador (Evaluator-Optimizer)
- Descripción: el LLM evalúa el resultado (score/feedback) y, si no cumple con el criterio, lo corrige o mejora de forma iterativa
- Ejemplo: generar un borrador de correo → el evaluador entrega puntaje de calidad y feedback → si cumple un umbral o supera el máximo de iteraciones, termina; si no, vuelve a corregirse
- Ventajas: permite mejorar iterativamente la calidad del resultado final hasta alcanzar el nivel objetivo, y resulta útil cuando se aprovechan criterios cuantitativos
- Lineamientos:
- Adecuado para situaciones donde la calidad importa más que la velocidad y se necesita optimización iterativa
- Sin una condición de término, puede caer en un bucle infinito
- Es esencial definir criterios de calidad claros y límites de iteración
Cuándo sí se necesitan agentes
- Los agentes muestran su verdadero valor en entornos donde está garantizada la intervención humana en tiempo real (Human-in-the-loop)
- Ejemplo 1: apoyo en ciencia de datos: consultas SQL, visualización, recomendaciones de análisis de datos, etc., donde el LLM prueba enfoques creativos y una persona evalúa o corrige el resultado
- Ejemplo 2: partner creativo: ideas de copy, propuestas de titulares, recomendaciones de estructura de texto, etc., donde la corrección de rumbo y la revisión de calidad por parte de una persona son clave
- Ejemplo 3: asistente de refactorización de código: sugerencias de patrones de diseño, detección de edge cases, optimización de código, etc., donde el desarrollador aprueba o complementa
- Característica: los agentes no son más efectivos cuando “resuelven todo por su cuenta”, sino en entornos donde una persona corrige errores y orienta la dirección en tiempo real
Cuándo los agentes no son adecuados
- Sistemas enterprise y mission-critical (finanzas, salud, legal, etc.):
- Como la confiabilidad de la automatización y el comportamiento determinista son importantes, una estructura en la que un agente LLM tome decisiones resulta riesgosa
- Deben usarse patrones de control claros, como orquestador o enrutamiento
- Cualquier situación en la que la estabilidad y la previsibilidad sean importantes
- Casos anómalos: problemas en los que el agente elige mal herramientas repetidamente sin contexto ni memoria, o fracasa en la división del trabajo y la coordinación, haciendo colapsar todo el flujo
- Factores de falla de los sistemas de agentes que aparecen con frecuencia en la práctica
- Falta de diseño de un sistema de memoria explícito, lo que provoca pérdida de contexto
- Pocas restricciones en la selección de herramientas (uso innecesario o incorrecto de tools)
- Dependencia exclusiva de una estructura de delegación libre, que termina fallando en la coordinación colaborativa
Lecciones para el diseño en la práctica
- Incluso al introducir agentes, sigue siendo indispensable contar con un nivel de diseño, observabilidad y control comparable al de un sistema de software bien terminado
- Más que usar frameworks complejos de agentes, es más rápido y seguro diseñar con observabilidad (Observability), bucles de evaluación claros y una estructura con control directo
Conclusión (TL;DR)
- Los agentes suelen estar sobrevalorados y usarse en exceso
- La mayoría de las tareas reales se resuelve mejor con patrones de flujo de trabajo simples
- Los agentes muestran su verdadero valor en entornos donde hay intervención humana directa
- En sistemas estables, más bien pueden convertirse en un factor de riesgo
- Diseña con observabilidad, control explícito y una estructura de evaluación iterativa
- En lugar de frameworks complejos de agentes, la clave para desarrollar servicios basados en LLM de forma más rápida y segura es diseñar con observabilidad, bucles de evaluación claros y una estructura con control directo
6 comentarios
Hace un mes, para aprender qué era la programación con IA usando CURSOR, empecé a desarrollar un framework de desarrollo.
Durante unas 3 semanas, repetí el ciclo de ver cómo el código fuente, que había sido validado con éxito por un Agente de IA, se arruinaba, e intenté por todos los medios controlar al Agente de IA, pero fracasé.
Entonces me di cuenta de que, antes de desarrollar el framework, lo prioritario era desarrollar el código fuente para controlar al Agente de IA.
Al final, exactamente un mes después de haber empezado para entender qué era la IA, logré completar el desarrollo de un software 100% implementable y 100% operable por IA con control perfecto sobre el Agente de IA (más precisamente, sin necesidad de un LLM externo ni de un Agente de IA).
Ahora llevo 14 días avanzando en el proceso de crear y hacer cumplir reglas operativas mientras sigo entrenando esa META IA para una mayor sofisticación; al mismo tiempo, estoy migrando, mejorando y estandarizando en paralelo tres sistemas MES que antes habían sido creados de forma incompleta por personas, y ya estoy entrando en la etapa final.
Y ahora también me estoy preparando para otra evolución.
Pero, en el prompt chaining, ¿no sería válido llamar también agentes por separado al LLM que ejecuta cada prompt, al worker de ejecución, al worker orquestador, al LLM evaluador, etc.?
Ah, así que existe eso de que “el control final del flujo de trabajo (que el LLM decida por sí mismo el siguiente paso o si usar una herramienta) se considera una característica agéntica”. Entendido. Entonces era un texto dirigido a los
autonomous agents. Todavía no conozco muy bien el tema de los agentes, así que...Opiniones de Hacker News
delegate, división de tareas y demás. Pero la forma de construir instrucciones y definir comandos —sobre todo si en una UI se pueden especificar fácilmente comandos de herramientas— es más flexible y está un nivel arriba de abstracción respecto a un workflow. Los workflows visuales al final siguen siendo programación frágil y difícil de ajustar. Hace 6 a 12 meses esto no era posible, aunque si el LLM no es bueno entonces sigue sin aplicar. En términos generales, como todavía son pocos los modelos que hacen bien el instruction following y la integración con herramientas, conviene aplicar agentes sobre esos modelos. En los próximos 1 o 2 años habrá una tendencia grande de agentes para usar navegador/computadora. Estos también incorporarán buenos sistemas de memoria y un “modo demostración/observación” para aprender (grabando) cómo el usuario usa la UI, y también aprenderán procedimientos optimizados a partir de instrucciones humanas, ya sean verbales o escritashttps://github.com/astronomer/airflow-ai-sdk
Yo también actualmente estoy haciendo algo llamado UseDesktop
https://youtu.be/aBkbsvMxP_A?si=uaugxKQEu4ZEz7jq
usedesktop.com
que es un Computer-use Agent, y estoy de acuerdo con la mayor parte.
Este texto, más que dar tips prácticos, solo cubre un panorama general, así que si agregara algunos consejos más para cuando desarrollas un agentic/agent basado en LLM, al final los LLM están basados en transformers (i.e., razonamiento probabilístico; en vez de entender semánticamente el siguiente token/palabra con base en el token/state actual y el contexto, generan el output de forma probabilística), así que por muy bien que escribas el sys prompt, muchas veces no te dan la respuesta que quieres (e.g., les pides que respondan en formato JSON y a veces se les olvida un
}o cosas así). Por eso, siempre es indispensable agregar varias fallback fn basadas en regex.Y cuando escribes un sys prompt para que entregue structured output, normalmente conviene usar un non reasoning model, y mientras más largo sea el contexto, más seguido aparecen alucinaciones, así que más bien es mejor crear varios sys prompt y encadenarlos.
Si estás desarrollando un servicio, pueden ocurrir muchos errores, así que la clave es diseñar la arquitectura del servicio de forma modular y fault tolerant (e.g., hacer el supervisor agent async y los demás agent sync), sobre todo con estos sistemas agentic/agent donde el unexpected output ocurre con frecuencia.
Por eso, desde el principio conviene escribir el código respetando al máximo el SRP y de forma declarative; quiero decir que es mejor abordarlo de manera funcional (=sin side effects y con un flujo intuitivo).
Y dependiendo de si usas el LLM vía API o si vas a servir tú mismo el modelo, será diferente, pero si vas a servir directamente un SLM o LLM, es mejor no hacer model serving en el mismo servidor donde alojas el backend, y separar en otros servidores las tareas IO bound y las CPU bound tasks (i.e., tareas que requieren GPU, multiplicación de matrices, etc.), porque así queda mejor en términos de fault tolerance (e.g., hospedar las CPU bound task en Runpod).
Hay varios tips de desarrollo más, pero lo dejo hasta aquí para que no se haga demasiado largo.
Ojalá le sirva a alguien.
Muchas gracias por compartir tu valiosa experiencia y opinión. De verdad ayuda muchísimo contar con la perspectiva de alguien que está en el terreno.