cursos:sdd:05-patrones-agenticos
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| cursos:sdd:05-patrones-agenticos [2026/09/15 02:13] – Monospace correcto en la tabla de memoria claude | cursos:sdd:05-patrones-agenticos [2026/10/26 16:09] (actual) – Enlaces internos: los anclajes no llevan el número de sección claude | ||
|---|---|---|---|
| Línea 2: | Línea 2: | ||
| Un patrón agéntico es una forma conocida de **conectar varias llamadas al modelo** para resolver algo que una sola llamada no resuelve bien. En el tema anterior vimos que el grafo es el mapa y el bucle es el camino; los patrones de aquí son los mapas que ya se sabe que funcionan. | Un patrón agéntico es una forma conocida de **conectar varias llamadas al modelo** para resolver algo que una sola llamada no resuelve bien. En el tema anterior vimos que el grafo es el mapa y el bucle es el camino; los patrones de aquí son los mapas que ya se sabe que funcionan. | ||
| + | |||
| + | <note tip>Cada patrón de esta página se le pide al agente **con texto**, y ese texto se deja escrito como una //skill// del proyecto (tema 2) para no reescribirlo cada vez. Los ejemplos de cada sección son eso: lo que hay que poner. El primero lleva la cabecera completa del '' | ||
| <note important> | <note important> | ||
| ^ Patrón ^ Cuándo se usa ^ | ^ Patrón ^ Cuándo se usa ^ | ||
| - | | [[#1_pipeline_prompt_chain|Pipeline]] | La tarea se parte en pasos fijos, conocidos de antemano | | + | | [[#pipeline_prompt_chain|Pipeline]] | La tarea se parte en pasos fijos, conocidos de antemano | |
| - | | [[#2_enrutador|Enrutador]] | Entradas de tipos distintos que se atienden mejor por separado | | + | | [[#enrutador|Enrutador]] | Entradas de tipos distintos que se atienden mejor por separado | |
| - | | [[#3_planificador-ejecutor|Planificador-Ejecutor]] | Conviene revisar el plan antes de que se toque nada | | + | | [[#planificador-ejecutor|Planificador-Ejecutor]] | Conviene revisar el plan antes de que se toque nada | |
| - | | [[#4_orquestador|Orquestador]] | Las subtareas no se conocen hasta ver el problema | | + | | [[#orquestador|Orquestador]] | Las subtareas no se conocen hasta ver el problema | |
| - | | [[#5_ejecutor-revisor|Ejecutor-Revisor]] | Hay criterios claros y la crítica mejora el resultado | | + | | [[#ejecutor-revisor|Ejecutor-Revisor]] | Hay criterios claros y la crítica mejora el resultado | |
| - | | [[#6_adversarios|Adversarios]] | Interesa encontrar el fallo, no pulir el acabado | | + | | [[#adversarios|Adversarios]] | Interesa encontrar el fallo, no pulir el acabado | |
| - | | [[#7_best-of-n|Best-of-N]] | Los intentos salen muy distintos y verificar es barato | | + | | [[#razonador-refutador|Razonador-Refutador]] | La causa de un fallo no está clara y conviene acertar antes de arreglar | |
| - | | [[#8_human-in-the-loop_hitl|Human-in-the-loop]] | Hay acciones irreversibles o responsabilidad de por medio | | + | | [[#best-of-n|Best-of-N]] | Los intentos salen muy distintos y verificar es barato | |
| - | | [[#9_memoria_persistente|Memoria persistente]] | El trabajo dura más que una sesión | | + | | [[#human-in-the-loop_hitl|Human-in-the-loop]] | Hay acciones irreversibles o responsabilidad de por medio | |
| + | | [[#memoria_persistente|Memoria persistente]] | El trabajo dura más que una sesión | | ||
| ---- | ---- | ||
| Línea 43: | Línea 46: | ||
| * **En contra**: latencia, y un error del paso 1 se arrastra hasta el final. De ahí que la puerta entre pasos sea obligatoria, | * **En contra**: latencia, y un error del paso 1 se arrastra hasta el final. De ahí que la puerta entre pasos sea obligatoria, | ||
| * **Condición**: | * **Condición**: | ||
| + | |||
| + | **Ejemplo.** Una funcionalidad nueva, de la petición al código. Como //skill// del proyecto, con su cabecera: | ||
| + | |||
| + | < | ||
| + | --- | ||
| + | name: pipeline-funcionalidad | ||
| + | description: | ||
| + | pida añadir algo que no existe todavía. | ||
| + | --- | ||
| + | |||
| + | Implementa la funcionalidad en cuatro pasos. No empieces uno hasta cerrar | ||
| + | el anterior. | ||
| + | |||
| + | 1. REQUISITOS: escribe en docs/ | ||
| + | pasar y cómo se comprueba. Para y espera el visto bueno. | ||
| + | 2. DISEÑO: a partir de ese fichero, escribe design.md: ficheros que se | ||
| + | | ||
| + | 3. TAREAS: parte el diseño en tareas de menos de una hora en tasks.md, | ||
| + | cada una con su criterio de hecho. | ||
| + | 4. CÓDIGO: implementa las tareas en orden. Después de cada una lanza los | ||
| + | | ||
| + | |||
| + | Si en el paso 3 o en el 4 descubres que el diseño estaba mal, vuelve al | ||
| + | paso 2 y corrígelo antes de seguir. | ||
| + | </ | ||
| ---- | ---- | ||
| Línea 69: | Línea 97: | ||
| **Siempre tiene que haber ruta por defecto.** El fallo típico del enrutador no es equivocarse de ruta, es no tener ninguna para lo que no encaja en ninguna categoría. | **Siempre tiene que haber ruta por defecto.** El fallo típico del enrutador no es equivocarse de ruta, es no tener ninguna para lo que no encaja en ninguna categoría. | ||
| + | |||
| + | **Ejemplo.** Clasificar lo que llega antes de ponerse a trabajar: | ||
| + | |||
| + | < | ||
| + | Antes de tocar nada, clasifica la petición en una de estas rutas y di en | ||
| + | una línea cuál has elegido: | ||
| + | |||
| + | - BUG: algo que ya debería funcionar y no funciona. | ||
| + | -> Reproduce el fallo con un test que falle, arregla, comprueba que el | ||
| + | test pasa. No refactorices nada más por el camino. | ||
| + | - FUNCIONALIDAD: | ||
| + | -> Flujo completo: requisitos, diseño, tareas, código. | ||
| + | - CAMBIO MECÁNICO: renombrar, mover, subir una dependencia. | ||
| + | -> Hazlo y enseña el diff. Sin especificación. | ||
| + | - NO ENCAJA: si dudas entre dos rutas, o no es ninguna, pregunta. | ||
| + | No elijas por tu cuenta. | ||
| + | </ | ||
| ---- | ---- | ||
| Línea 81: | Línea 126: | ||
| * **Riesgo**: un plan malo contamina todo lo que viene detrás, y el ejecutor no suele darse cuenta porque su trabajo es obedecer. Por eso el plan se lee. | * **Riesgo**: un plan malo contamina todo lo que viene detrás, y el ejecutor no suele darse cuenta porque su trabajo es obedecer. Por eso el plan se lee. | ||
| * **Detalle práctico**: | * **Detalle práctico**: | ||
| + | |||
| + | **Ejemplo.** Un cambio que toca varios ficheros: | ||
| + | |||
| + | < | ||
| + | FASE 1, PLAN. No escribas código todavía. | ||
| + | Lee el código afectado y escribe un plan con: | ||
| + | - los ficheros que vas a tocar y qué cambia en cada uno | ||
| + | - el orden de los cambios | ||
| + | - lo que has descartado, y por qué | ||
| + | - lo que no tienes claro, en forma de preguntas | ||
| + | |||
| + | Para y espera a que apruebe el plan. | ||
| + | |||
| + | FASE 2, EJECUCIÓN. Cumple el plan aprobado, y nada más que el plan. | ||
| + | Si a mitad descubres que no se sostiene, para y dilo en lugar de | ||
| + | improvisar otra solución por tu cuenta. | ||
| + | </ | ||
| ---- | ---- | ||
| Línea 109: | Línea 171: | ||
| * **En contra**: el orquestador es un punto único de fallo —si parte mal el trabajo al principio, todo lo de debajo sobra— y el coste se multiplica por el número de trabajadores. | * **En contra**: el orquestador es un punto único de fallo —si parte mal el trabajo al principio, todo lo de debajo sobra— y el coste se multiplica por el número de trabajadores. | ||
| * **Lo difícil está en la fusión**: juntar resultados parciales que se contradicen es más trabajo del que parece al dibujarlo. | * **Lo difícil está en la fusión**: juntar resultados parciales que se contradicen es más trabajo del que parece al dibujarlo. | ||
| + | |||
| + | **Ejemplo.** Diseño, implementación y calidad, cada uno en su agente. Un subagente **empieza de cero y no sabe nada de esta conversación**, | ||
| + | |||
| + | < | ||
| + | Eres el orquestador: | ||
| + | resultado. Cada subagente que lances arranca en blanco, así que dile en | ||
| + | el propio encargo quién es, qué le das, qué tiene que devolver y qué no | ||
| + | puede tocar. | ||
| + | |||
| + | 1. Lanza un subagente con este encargo: | ||
| + | |||
| + | " | ||
| + | escribes ni modificas nada. Dado este enunciado < | ||
| + | devuelve el enfoque, la lista de ficheros que hay que tocar y los | ||
| + | contratos entre las partes. No implementes." | ||
| + | |||
| + | 2. Parte el diseño en trozos independientes y lanza un subagente por | ||
| + | cada trozo: | ||
| + | |||
| + | " | ||
| + | toca: < | ||
| + | < | ||
| + | lista: < | ||
| + | |||
| + | 3. Junta los resultados. Si dos se contradicen, | ||
| + | |||
| + | 4. Sobre el resultado ya unido, lanza un subagente que no haya escrito | ||
| + | nada de esto: | ||
| + | |||
| + | " | ||
| + | tienes el diff completo < | ||
| + | requisitos sin cumplir, casos límite sin tratar y errores que se | ||
| + | tragan. Devuelve cada hallazgo como BLOQUEANTE o MENOR." | ||
| + | |||
| + | 5. Si vuelve algún BLOQUEANTE, repite el punto 2 solo con la parte | ||
| + | | ||
| + | |||
| + | A cada subagente pásale el texto que necesita, nunca la conversación | ||
| + | entera: repartir el contexto es justamente para lo que sirve esto. | ||
| + | </ | ||
| ---- | ---- | ||
| Línea 133: | Línea 235: | ||
| <note warning> | <note warning> | ||
| + | |||
| + | **Ejemplo.** Uno programa y otro revisa. El revisor **se lanza en ese momento** y recibe en el encargo su papel y el material, porque no ha visto nada de lo anterior: | ||
| + | |||
| + | < | ||
| + | Implementa la tarea. Al terminar, di qué has hecho y qué has dejado | ||
| + | fuera a propósito. | ||
| + | |||
| + | Después, sin revisarlo tú, lanza un subagente con este encargo: | ||
| + | |||
| + | "Eres el revisor de este cambio, que no has escrito. Aquí tienes el | ||
| + | diff < | ||
| + | < | ||
| + | 1. ¿Hace lo que pide el requisito? Cítalo. | ||
| + | 2. ¿Casos límite sin tratar: nulos, lista vacía, concurrencia? | ||
| + | 3. ¿Errores que se tragan sin registrar? | ||
| + | 4. ¿Los tests comprueban el comportamiento o la implementación? | ||
| + | Marca cada hallazgo como BLOQUEANTE o MENOR. No comentes estilo: de | ||
| + | eso se encarga el formateador. Si no encuentras nada, dilo; no | ||
| + | | ||
| + | |||
| + | Arregla los BLOQUEANTES y lanza un revisor **nuevo** con el diff ya | ||
| + | corregido. Tres vueltas como máximo; a la tercera, para y resume lo que | ||
| + | queda abierto. | ||
| + | </ | ||
| ---- | ---- | ||
| Línea 152: | Línea 278: | ||
| El valor está en que el criterio de éxito de los dos agentes es **opuesto**, | El valor está en que el criterio de éxito de los dos agentes es **opuesto**, | ||
| + | |||
| + | **Ejemplo.** Dos agentes defienden decisiones de arquitectura distintas. Cada uno recibe su papel al lanzarlo, y el papel es precisamente lo que los hace adversarios: | ||
| + | |||
| + | < | ||
| + | Hay que decidir si el envío de correos va dentro de la petición o a una | ||
| + | cola. No lo decidas tú: monta el debate. | ||
| + | |||
| + | Lanza un subagente: | ||
| + | |||
| + | " | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | Lanza otro con el mismo encargo, cambiando la opción por la cola. | ||
| + | |||
| + | Con las dos propuestas encima de la mesa, lanza un subagente por cada | ||
| + | una: | ||
| + | |||
| + | "Aquí tienes una propuesta de arquitectura < | ||
| + | | ||
| + | fallo parcial, reintentos, despliegue, operación. No vale opinar ni | ||
| + | pedir mejoras: hace falta el caso, con números si los hay." | ||
| + | |||
| + | Y con todo eso, un último subagente que no haya participado: | ||
| + | |||
| + | "Aquí tienes dos propuestas de arquitectura y los ataques que ha | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| ---- | ---- | ||
| - | ===== 7. Best-of-N ===== | + | ===== 7. Razonador-Refutador ===== |
| + | |||
| + | Antes de arreglar nada, un agente **escribe su razonamiento paso a paso** —qué ha visto, qué deduce de ello y qué piensa hacer— y otro distinto **busca el paso que no se sostiene**. Solo cuando el razonamiento aguanta se toca el código. | ||
| + | |||
| + | < | ||
| + | start | ||
| + | repeat | ||
| + | :razonador: explicacion con hechos, deducciones y plan; | ||
| + | :refutador: buscar el paso que no se sostiene; | ||
| + | backward:la prueba en contra pasa a ser un hecho; | ||
| + | repeat while (razonamiento solido) is (no) not (si) | ||
| + | : | ||
| + | stop | ||
| + | </ | ||
| + | |||
| + | Se parece a los dos anteriores, pero mira otra cosa y en otro momento: | ||
| + | |||
| + | ^ ^ Revisor ^ Adversario ^ Refutador ^ | ||
| + | | Pregunta | ¿Cumple los criterios? | ¿Por dónde falla? | ¿Se deduce esto de lo que hemos visto? | | ||
| + | | Mira | El resultado terminado | Una propuesta o una implementación | La explicación del problema | | ||
| + | | Cuándo | Después de hacerlo | Antes o después | Antes de tocar nada | | ||
| + | |||
| + | El fallo que evita es muy común: **una solución impecable para un problema que no era el problema**. El modelo ve un síntoma, se convence de una causa y la arregla con todo detalle. El Refutador hace las preguntas incómodas: ¿eso lo has comprobado o lo supones?, ¿de verdad se sigue de lo anterior?, ¿hay otra explicación para lo mismo? | ||
| + | |||
| + | **Por qué gana el Refutador aunque tenga menos pruebas.** Para que una explicación sea cierta tiene que cumplirse **todo** lo que exige; para que sea falsa basta con que falle **una sola cosa**. Por eso mil pistas a favor no pesan nada frente a un hecho que la hace imposible. | ||
| + | |||
| + | Por ejemplo, fallan 30 tests con '' | ||
| + | |||
| + | **Qué pasa cuando gana.** El trabajo no termina ahí: vuelve al Razonador, y **lo que ha tumbado la explicación pasa a ser un hecho comprobado**. Con esa pista nueva, el Razonador propone otra explicación —«el cliente nunca es nulo, así que el nulo sale de otro campo que usa '' | ||
| + | |||
| + | * **Cuándo**: | ||
| + | * **En contra**: más tiempo y más coste. Si la causa era obvia desde el principio, sobra. | ||
| + | * **Regla del Refutador**: | ||
| + | |||
| + | **Ejemplo.** Encontrar la causa de un fallo antes de arreglarlo. El auditor **se lanza en ese momento** y no sabe nada del problema, así que el encargo lleva el contexto y el razonamiento: | ||
| + | |||
| + | < | ||
| + | Hay un fallo y no está claro de dónde viene. No toques código todavía. | ||
| + | |||
| + | FASE 1, RAZONAMIENTO. Escribe tres listas: | ||
| + | - HECHOS: lo que has visto de verdad: errores, trazas, qué tests | ||
| + | fallan y cuáles no. Solo lo comprobado. | ||
| + | - DEDUCCIONES: | ||
| + | sale cada uno. | ||
| + | - PLAN: qué cambiarías y qué esperas que pase después. | ||
| + | |||
| + | FASE 2, REFUTACIÓN. Sin revisarlo tú, lanza un subagente con este encargo: | ||
| + | |||
| + | "Eres un auditor de lógica. Aquí tienes el contexto del problema | ||
| + | < | ||
| + | | ||
| + | 1. ¿Se da algo por cierto sin haberlo comprobado? | ||
| + | 2. ¿Hay algún paso que no se deduce del anterior? | ||
| + | 3. ¿Hay otra causa que explique los mismos hechos y se ha pasado | ||
| + | por alto? | ||
| + | | ||
| + | | ||
| + | con la prueba que lo tumba, o ' | ||
| + | |||
| + | FASE 3. Si vuelve algún fallo, añade sus pruebas a HECHOS, formula otra | ||
| + | explicación que las respete y lanza un auditor nuevo. Tres vueltas como | ||
| + | máximo; a la tercera, para y resume lo descartado y lo que queda abierto. | ||
| + | Con ' | ||
| + | </ | ||
| + | |||
| + | Más informnación: | ||
| + | * [[https:// | ||
| + | |||
| + | ===== 8. Best-of-N ===== | ||
| Se lanza **el mismo encargo N veces en paralelo** —con temperatura alta o con modelos distintos— y se elige el mejor resultado. Sirve porque los intentos salen genuinamente distintos entre sí. | Se lanza **el mismo encargo N veces en paralelo** —con temperatura alta o con modelos distintos— y se elige el mejor resultado. Sirve porque los intentos salen genuinamente distintos entre sí. | ||
| Línea 168: | Línea 394: | ||
| * **Cuándo**: | * **Cuándo**: | ||
| * **En contra**: cuesta N veces. Se reserva para el trozo difícil, no para todo el trabajo. | * **En contra**: cuesta N veces. Se reserva para el trozo difícil, no para todo el trabajo. | ||
| + | |||
| + | **Ejemplo.** Tres diseños, y solo uno se implementa: | ||
| + | |||
| + | < | ||
| + | Diseña TRES soluciones distintas para esta tarea. Distintas de verdad: | ||
| + | si las tres son la misma con otros nombres, vuelve a empezar. | ||
| + | |||
| + | De cada una: el enfoque en cinco líneas, los ficheros que toca, qué se | ||
| + | gana, qué se paga, y qué pasa el día que haya que añadir un proveedor | ||
| + | más. | ||
| + | |||
| + | Compáralas en una tabla contra estos criterios, por orden: | ||
| + | 1. cumple el requisito | ||
| + | 2. esfuerzo de implementación | ||
| + | 3. lo que cuesta cambiarla dentro de un año | ||
| + | 4. cuánto código nuevo mete en el proyecto | ||
| + | |||
| + | Recomienda una, y di en qué caso cambiaría la recomendación. | ||
| + | No implementes ninguna hasta que te diga cuál. | ||
| + | </ | ||
| ---- | ---- | ||
| - | ===== 8. Human-in-the-loop (HITL) ===== | + | ===== 9. Human-in-the-loop (HITL) ===== |
| No es «que alguien lo mire»: es **decidir en qué puntos concretos se para y se espera a una persona**. | No es «que alguien lo mire»: es **decidir en qué puntos concretos se para y se espera a una persona**. | ||
| Línea 184: | Línea 430: | ||
| <note tip>**La persona va en la puerta, no en cada paso.** Un flujo que pide confirmación de todo acaba aprobándose a ciegas, y eso es peor que no tener puerta: da la sensación de control sin el control. Las capas de abajo —límites, | <note tip>**La persona va en la puerta, no en cada paso.** Un flujo que pide confirmación de todo acaba aprobándose a ciegas, y eso es peor que no tener puerta: da la sensación de control sin el control. Las capas de abajo —límites, | ||
| + | |||
| + | **Ejemplo.** La persona aprueba la especificación antes de que empiece el diseño: | ||
| + | |||
| + | < | ||
| + | Escribe la especificación en requirements.md y PARA. | ||
| + | |||
| + | No empieces el diseño, no escribas código, no propongas el paso | ||
| + | siguiente. Termina el documento con dos listas: | ||
| + | |||
| + | - las decisiones que has tomado por tu cuenta porque el enunciado no | ||
| + | las decía (esta es la parte importante: es donde se cuela lo que yo | ||
| + | no quería) | ||
| + | - las preguntas que necesitas que conteste una persona | ||
| + | |||
| + | Sigo yo. Cuando te diga " | ||
| + | respuesta es una corrección de los requisitos. | ||
| + | </ | ||
| ---- | ---- | ||
| - | ===== 9. Memoria persistente ===== | + | ===== 10. Memoria persistente ===== |
| Un agente empieza de cero cada sesión. La memoria persistente es lo que le permite retomar el trabajo y acumular lo aprendido. Tres tipos, con papeles distintos: | Un agente empieza de cero cada sesión. La memoria persistente es lo que le permite retomar el trabajo y acumular lo aprendido. Tres tipos, con papeles distintos: | ||
| Línea 199: | Línea 462: | ||
| Lo que hay que decidir explícitamente es la **política de actualización**: | Lo que hay que decidir explícitamente es la **política de actualización**: | ||
| + | |||
| + | **Ejemplo.** Los ficheros que el agente lee al empezar y mantiene al terminar: | ||
| + | |||
| + | < | ||
| + | La memoria de este proyecto son ficheros. Antes de nada, lee: | ||
| + | |||
| + | .kiro/ | ||
| + | docs/ | ||
| + | docs/ | ||
| + | |||
| + | Reglas: | ||
| + | - Si algo de lo que te digo contradice lo que hay escrito, gana lo | ||
| + | escrito y me avisas. | ||
| + | - Toda decisión que afecte a tareas futuras va a docs/adr/ el mismo día. | ||
| + | - Al terminar una tarea, márcala en tasks.md. La sesión siguiente | ||
| + | empieza leyendo ese fichero, no preguntándome por dónde ibas. | ||
| + | - Si un documento ha dejado de ser verdad, corrígelo en el mismo cambio | ||
| + | que lo desmiente. Nunca escribas encima dejando debajo la versión | ||
| + | vieja. | ||
| + | </ | ||
| ---- | ---- | ||
| - | ===== 10. Cómo elegir ===== | + | ===== 11. Cómo elegir ===== |
| ^ Patrón ^ Fuerte en ^ Su límite ^ Coste ^ | ^ Patrón ^ Fuerte en ^ Su límite ^ Coste ^ | ||
| Línea 211: | Línea 494: | ||
| | Ejecutor-Revisor | Calidad con criterios claros | Sin criterios, no converge | Medio-alto | | | Ejecutor-Revisor | Calidad con criterios claros | Sin criterios, no converge | Medio-alto | | ||
| | Adversarios | Encontrar lo que falla | No mejora el acabado | Medio | | | Adversarios | Encontrar lo que falla | No mejora el acabado | Medio | | ||
| + | | Razonador-Refutador | Acertar con la causa antes de arreglar | Sobra si la causa era obvia | Medio | | ||
| | Best-of-N | Calidad cuando verificar es barato | Se paga N veces | Alto | | | Best-of-N | Calidad cuando verificar es barato | Se paga N veces | Alto | | ||
| | HITL | Responsabilidad y lo irreversible | El humano es el cuello de botella | Bajo, pero lento | | | HITL | Responsabilidad y lo irreversible | El humano es el cuello de botella | Bajo, pero lento | | ||
cursos/sdd/05-patrones-agenticos.1789431191.txt.gz · Última modificación: por claude
