Herramientas de usuario

Herramientas del sitio


cursos:sdd:05-patrones-agenticos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
cursos:sdd:05-patrones-agenticos [2026/09/15 08:50] – Ejemplo textual en cada patron: el texto que se le da al agente, como skill claudecursos: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 8: Línea 8:
  
 ^ 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 171: Línea 172:
   * **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:+**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**, así que el encargo lleva dentro quién es y qué tiene que devolver:
  
 <code> <code>
 Eres el orquestador: no escribes código, repartes el trabajo y unes el Eres el orquestador: no escribes código, repartes el trabajo y unes el
-resultado.+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: 
 + 
 +   "Eres el diseñador. Tienes el repositorio en solo lectura: no 
 +    escribes ni modificas nada. Dado este enunciado <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: 
 + 
 +   "Eres quien implementa <parte>. Este es el trozo de diseño que te 
 +    toca: <trozo>, y estos los contratos que tienes que respetar: 
 +    <contratos>. Implementa solo eso. No toques ficheros fuera de esta 
 +    lista: <ficheros>. Devuelve el diff y los tests que añadas."
  
-1. Lanza un subagente DISEÑO con el enunciado. Que devuelva el enfoque, 
-   los ficheros afectados y los contratos. Solo lectura del repositorio. 
-2. Con ese diseño, lanza un subagente IMPLEMENTACIÓN por cada parte 
-   independiente, cada uno con su trozo del diseño y nada más. 
 3. Junta los resultados. Si dos se contradicen, resuélvelo tú y di cómo. 3. Junta los resultados. Si dos se contradicen, resuélvelo tú y di cómo.
-4. Lanza un subagente CALIDAD sobre el resultado ya unido: tests, casos 
-   límite, errores sin tratar. No puede ser ninguno de los que escribió 
-   ese código. 
-5. Si calidad devuelve bloqueantes, vuelve al punto 2, pero solo con la 
-   parte afectada. 
  
-A cada subagente pásale lo que necesita y nada más: no le des la +4. Sobre el resultado ya unido, lanza un subagente que no haya escrito 
-conversación entera.+   nada de esto: 
 + 
 +   "Eres el revisor de calidad de un código que no has escrito. Aquí 
 +    tienes el diff completo <diff> y los requisitos <requisitos>. Busca 
 +    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 
 +   afectada, añadiendo el hallazgo al encargo. 
 + 
 +A cada subagente pásale el texto que necesita, nunca la conversación 
 +entera: repartir el contexto es justamente para lo que sirve esto.
 </code> </code>
  
Línea 216: Línea 236:
 <note warning>El revisor tiene que ser **otro agente con el encargo explícito de buscar problemas**, y con límite de vueltas. Un modelo revisando su propia salida tiende a aprobarla; y sin tope de iteraciones, dos agentes se pueden pasar la tarde puliendo un detalle.</note> <note warning>El revisor tiene que ser **otro agente con el encargo explícito de buscar problemas**, y con límite de vueltas. Un modelo revisando su propia salida tiende a aprobarla; y sin tope de iteraciones, dos agentes se pueden pasar la tarde puliendo un detalle.</note>
  
-**Ejemplo.** Uno programa y otro revisa:+**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:
  
 <code> <code>
-Trabajáis dos por turnos sobre la misma tarea.+Implementa la tarea. Al terminar, di qué has hecho y qué has dejado 
 +fuera a propósito.
  
-EJECUTOR: implementa la tarea. Al terminar, di qué has hecho y qué has +Después, sin revisarlo tú, lanza un subagente con este encargo:
-dejado fuera a propósito.+
  
-REVISOR (otro agente, que no ha escrito ese código): revisa el diff +  "Eres el revisor de este cambio, que no has escrito. Aquí tienes el 
-contra estos criterios y en este orden: +   diff <diff> y el requisito que dice lo que tenía que hacer 
-  1. ¿Hace lo que pedía el requisito? Cítalo. +   <requisito>. Revisa en este orden: 
-  2. ¿Casos límite sin tratar: nulos, lista vacía, concurrencia? +     1. ¿Hace lo que pide el requisito? Cítalo. 
-  3. ¿Errores que se tragan sin registrar? +     2. ¿Casos límite sin tratar: nulos, lista vacía, concurrencia? 
-  4. ¿Los tests comprueban el comportamiento o la implementación? +     3. ¿Errores que se tragan sin registrar? 
-Marca cada hallazgo como BLOQUEANTE o MENOR. El estilo no se comenta: +     4. ¿Los tests comprueban el comportamiento o la implementación? 
-de eso ya se encarga el formateador.+   Marca cada hallazgo como BLOQUEANTE o MENOR. No comentes estilo: de 
 +   eso se encarga el formateador. Si no encuentras nada, dilo; no 
 +   inventes hallazgos para justificar la revisión."
  
-El ejecutor arregla los BLOQUEANTES y vuelve a pasar por revisión. +Arregla los BLOQUEANTES y lanza un revisor **nuevo** con el diff ya 
-Tres vueltas como máximo; a la tercera, para y resume lo que queda +corregido. Tres vueltas como máximo; a la tercera, para y resume lo que 
-abierto.+queda abierto.
 </code> </code>
  
Línea 257: Línea 279:
 El valor está en que el criterio de éxito de los dos agentes es **opuesto**, y eso impide el acuerdo cómodo al que llegan dos modelos con el mismo objetivo. El valor está en que el criterio de éxito de los dos agentes es **opuesto**, y eso impide el acuerdo cómodo al que llegan dos modelos con el mismo objetivo.
  
-**Ejemplo.** Dos agentes defienden decisiones de arquitectura distintas:+**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:
  
 <code> <code>
 Hay que decidir si el envío de correos va dentro de la petición o a una Hay que decidir si el envío de correos va dentro de la petición o a una
-cola.+cola. No lo decidas tú: monta el debate.
  
-AGENTE A: defiende la primera opción. Cómo se implementa, qué cuesta, y +Lanza un subagente:
-qué se rompe el día que el sistema tenga diez veces más tráfico. +
-AGENTE B: lo mismo, defendiendo la segunda.+
  
-Después, una ronda cada uno atacando la propuesta del otro. No vale +  "Defiende que el envío vaya dentro de la petición. Explica cómo se 
-opinar: hay que dar el escenario concreto en el que la otra opción +   implementa, qué cuesta y qué se rompe el día que haya diez veces más 
-falla, con números si los hay.+   tráfico. Este es el código de hoy: <contexto>. No te cures en salud 
 +   reconociendo las ventajas de la otra opción: tu trabajo es la mejor 
 +   versión de esta."
  
-Al final, un tercer agente decide y escribe en docs/adr/ la decisión, el +Lanza otro con el mismo encargo, cambiando la opción por la cola. 
-motivo y la opción descartada con su razón. Si las dos aguantan igual, + 
-que lo diga: entonces se elige la más fácil de deshacer.+Con las dos propuestas encima de la mesa, lanza un subagente por cada 
 +una: 
 + 
 +  "Aquí tienes una propuesta de arquitectura <propuesta>. Tu único 
 +   trabajo es encontrar el escenario concreto en el que falla: carga, 
 +   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 
 +   recibido cada una <material>. Decide una y escribe en docs/adr/ la 
 +   decisión, el motivo y la opción descartada con su razón. Si las dos 
 +   aguantan igual, dilo: entonces se elige la más fácil de deshacer."
 </code> </code>
  
 ---- ----
  
-===== 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. 
 + 
 +<uml> 
 +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) 
 +:implementar el plan; 
 +stop 
 +</uml> 
 + 
 +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 ''NullPointerException'' dentro de ''PedidoService.calcularTotal()'', y el Razonador concluye que el pedido llega sin cliente. El Refutador lee el código: el constructor de ''Pedido'' lanza una excepción si no recibe cliente, así que un pedido sin cliente nunca llega hasta ahí. La explicación es falsa, da igual cuántos tests fallen. 
 + 
 +**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 ''calcularTotal()'': el descuento, que solo se rellena cuando hay cupón»— y el Refutador intenta tumbarla también. Esta vez no puede: los 30 tests que fallan crean pedidos sin cupón y los que pasan, con cupón. Se repite hasta que una explicación aguanta, y solo entonces se arregla. Cada vuelta descarta una causa y deja un hecho más, así que el círculo se va cerrando. 
 + 
 +  * **Cuándo**: tests que unas veces pasan y otras no, código lento sin causa clara, errores cuyo origen no se ve a simple vista. 
 +  * **En contra**: más tiempo y más coste. Si la causa era obvia desde el principio, sobra. 
 +  * **Regla del Refutador**: puede comprobar hechos —leer el código, lanzar un test—, pero no propone soluciones ni escribe código. Solo señala qué paso no se sostiene y con qué prueba. 
 + 
 +**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: 
 + 
 +<code> 
 +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: qué concluyes, un paso por línea, diciendo de qué hecho 
 +    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 
 +   <contexto> y un razonamiento sobre su causa <razonamiento>. 
 +   Comprueba solo esto: 
 +     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? 
 +   Puedes comprobar lo que haga falta sin modificar nada. No propongas 
 +   soluciones ni escribas código. Devuelve cada paso que no se sostiene 
 +   con la prueba que lo tumba, o 'RAZONAMIENTO SÓLIDO'." 
 + 
 +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 'RAZONAMIENTO SÓLIDO', implementa el plan. 
 +</code> 
 + 
 +Más informnación: 
 +  * [[https://dzone.com/articles/multi-agent-infrastructure-observability|What Actually Makes AI Infrastructure Agents More Reliable (It's Not More Agents)]] 
 + 
 +===== 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 314: Línea 417:
 ---- ----
  
-===== 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 347: Línea 450:
 ---- ----
  
-===== 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 382: Línea 485:
 ---- ----
  
-===== 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 391: 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.1789455026.txt.gz · Última modificación: por claude