Lección 3: Descomponer una tarea compleja en un flujo de trabajo
Objetivos de aprendizaje:
- Dominar las tres estrategias de descomposición de tareas
- Identificar las dependencias entre tareas
- Convertir una descomposición en un flujo de trabajo ejecutable
Requisitos: Lección 2: Bloques de construcción de un flujo de trabajo: pasos, estado, bifurcaciones y bucles | Siguiente: Lección 4 >>
De «no sé por dónde empezar» a pasos claros
Te cae una tarea en el escritorio: «Divide nuestra app monolítica de Rails en una arquitectura de microservicios». Eso es una tarea compleja. No sabes por dónde empezar, cuántos pasos lleva ni qué hace cada paso.
La descomposición de tareas es la forma de tomar una tarea vaga y demasiado grande y partirla en pasos pequeños y claros.1
Una buena descomposición cumple tres estándares:
- Cada subtarea es lo bastante pequeña como para terminarse en una sola llamada a un agente o en una función.
- Las dependencias entre subtareas son explícitas: sabes cuáles tienen que ejecutarse en orden y cuáles pueden ejecutarse en paralelo.
- Cada subtarea tiene entradas y salidas claras: la salida de un paso puede alimentar directamente al siguiente.
Si descompones bien, escribir el flujo de trabajo se siente como encajar piezas de Lego. Si descompones mal, descubrirás a mitad de la ejecución que faltan pasos, que el orden está mal o que los datos no fluyen.2
Estrategia 1: descomposición secuencial
Cuándo usarla: la tarea tiene un orden claro de principio a fin y cada paso depende del resultado del anterior.
Cómo: trabaja hacia atrás desde el final. Pregunta «¿qué entrada necesita este paso? ¿De dónde viene esa entrada?».
Ejemplo: generar documentación técnica
Tarea: generar documentación de cara al usuario para una API.
Descomposición hacia atrás:
Convertido en un flujo de trabajo:
Cadena de dependencias:
¿Puede el paso 2 ejecutarse en paralelo con el paso 1? No: el paso 2 necesita los endpoints del paso 1.
¿Puede el paso 3 ejecutarse en paralelo con el paso 2? No: el paso 3 necesita los examples del paso 2.
Cómo es la descomposición secuencial: una cadena larga de dependencias, pocas oportunidades de paralelizar, pero con una lógica clara.3
Estrategia 2: descomposición paralela
Cuándo usarla: la tarea se divide en varias subtareas independientes que no dependen entre sí.
Cómo: detecta el patrón «haz Y para cada X»: cada X se puede procesar en paralelo.
Ejemplo: auditoría de seguridad de una base de código
Tarea: auditar 100 archivos en busca de problemas de seguridad.
Descomposición paralela:
Forma:
Patrón fan-out-reduce: esta es la forma más común de la descomposición paralela.4
- Fan out: repartir la tarea entre muchos agentes en paralelo.
- Reduce: fusionar todos los resultados en una salida final.
La potencia de la descomposición paralela: 100 archivos, 2 minutos para auditar cada uno. La ejecución secuencial lleva 200 minutos; la ejecución paralela lleva 2 (suponiendo que no haya límites de recursos).
Estrategia 3: descomposición híbrida
Cuándo usarla: en la mayoría de las tareas reales. Algunas partes se ejecutan en paralelo y otras tienen que ejecutarse en orden.
Cómo: primero encuentra las fases de alto nivel (que tienen que ejecutarse en orden) y después busca las oportunidades de paralelismo dentro de cada fase.
Ejemplo: una refactorización a gran escala
Tarea: actualizar 50 componentes de Vue 2 a Vue 3.
Descomposición híbrida:
Convertido en un flujo de trabajo:
Grafo de dependencias del híbrido:
El corazón de la descomposición híbrida: conservar el orden que de verdad necesitas mientras exprimes cada oportunidad de paralelizar.3
Usar un LLM para ayudarte a descomponer
También puedes delegar la descomposición a un LLM. Las tres formas funcionan: prompting zero-shot, prompting chain-of-thought y prompting few-shot (guiado por ejemplos).1
Zero-shot
Chain-of-thought
Few-shot
La ventaja de la descomposición con LLM: redacta rápido un primer plan y detecta pasos que se te podrían haber pasado.
La desventaja de la descomposición con LLM: puede quedarse demasiado abstracta (decir «analiza los datos» en lugar de «calcula la complejidad ciclomática de cada archivo»), así que necesita que una persona la afine.1
Consejos prácticos para detectar dependencias
Consejo 1: pregunta «¿podría este paso ejecutarse antes del primero?»
Si la respuesta es «sí», pueden ejecutarse en paralelo. Si es «no, necesita el resultado del primer paso», hay una dependencia.
Consejo 2: dibuja el grafo de dependencias
¿Pueden el paso 2 y el paso 3 ejecutarse en paralelo? Sí: ambos dependen solo del paso 1.
¿Pueden el paso 3 y el paso 4 ejecutarse en paralelo? No: el paso 4 depende del paso 2.
Un grafo donde las flechas significan dependencia y nunca vuelven al inicio tiene un nombre formal: un DAG (grafo acíclico dirigido). El paso 1 no depende de nada, así que es una hoja que el grafo puede ejecutar primero. Ordenar todos los pasos de modo que nunca se viole la dirección de una flecha se llama orden topológico.
Consejo 3: revisa el flujo de datos
Enumera la entrada y la salida de cada paso:
Si la entrada del paso X viene de la salida del paso Y, X depende de Y.
Errores comunes al descomponer
Error 1: pasos demasiado grandes
¿Qué cubre «preparar los datos»? ¿Leer archivos? ¿Parsear la configuración? ¿Conectarse a una base de datos? Demasiado vago.
Error 2: sin pasos de manejo de errores
¿Y si el paso 2 falla? El servicio A ya está desplegado pero B no, y el sistema queda en un estado inconsistente.
Error 3: ignorar las oportunidades de paralelismo
Esto procesa un servicio a la vez. Lento.
Siguiente: Lección 4: Gestión de estado y paso de contexto — aprende a pasar y gestionar correctamente los datos entre los pasos de un flujo de trabajo.