Phase 16 - Lesson 10

Group Chat y Selección de Oradores

El GroupChat de AutoGen y el GroupChat de AG2 comparten una misma conversación entre N agentes; una función selectora (LLM, round-robin o personalizada) elige quién habla a continuación. Este es el arquetipo de la conversación multiagente emergente: los agentes no conocen su rol en un grafo estático, simplemente reaccionan al pool compartido. La semántica de GroupChat de AutoGen v0.2 se preservó en la bifurcación (fork) de AG2; AutoGen v0.4 la reescribió como un modelo de actor impulsado por eventos. Microsoft puso a AutoGen en modo de mantenimiento en febrero de 2026 y lo fusionó con Semantic Kernel en el Microsoft Agent Framework (RC de febrero de 2026). La primitiva GroupChat sobrevive en ambas líneas, AG2 y Microsoft Agent Framework: apréndelo una vez, úsalo en todas partes.

Tipo: Aprender + Construir Lenguajes: Python (stdlib) Prerrequisitos: Phase 16 · 04 (Primitive Model) Tiempo: ~60 minutos

Problema

Los grafos estáticos (LangGraph) son excelentes cuando se conoce el flujo de trabajo. Las conversaciones reales no son estáticas: a veces el programador le pregunta al revisor, a veces al investigador, a veces al redactor. Codificar de forma fija cada posible transición produce una explosión de aristas. Lo que se busca son agentes que reaccionen a un pool compartido, con alguna función que decida quién habla a continuación.

Eso es exactamente lo que hace el GroupChat de AutoGen.

Concepto

La estructura

              ┌─── shared pool ────┐
              │   m1  m2  m3  ...  │
              └─────────┬──────────┘
                        │ (everyone reads all)
      ┌───────┬─────────┼─────────┬───────┐
      ▼       ▼         ▼         ▼       ▼
    Agent A  Agent B  Agent C  Agent D  Selector
                                           │
                                           ▼
                                  "next speaker = C"

Cada agente ve cada mensaje. Se invoca una función selectora en cada turno para elegir quién habla a continuación.

Los tres tipos de selector

Round-robin. Ciclo fijo. Determinista. Escala linealmente en N pero ignora el contexto: un programador obtiene el turno incluso cuando el tema es una revisión legal.

LLM-selected. Una llamada a un LLM que lee el pool reciente y devuelve al mejor siguiente orador. Sensible al contexto pero lento: cada turno agrega una llamada al LLM. El valor predeterminado de AutoGen.

Custom. Una función de Python con la lógica que desees. Típico: LLM-selected con reglas de respaldo o fallback (por ejemplo, "siempre darle el turno al verificador después del programador").

La API ConversableAgent

agent = ConversableAgent(
    name="coder",
    system_message="You write Python.",
    llm_config={...},
)
chat = GroupChat(agents=[coder, reviewer, tester], messages=[])
manager = GroupChatManager(groupchat=chat, llm_config={...})

GroupChatManager contiene al selector. Cuando un agente completa un turno, el manager llama al selector, el cual devuelve el siguiente agente. El ciclo continúa hasta una condición de terminación.

Terminación

Tres patrones comunes:

  • Límite de rondas (Max rounds). Límite estricto sobre el total de turnos.
  • Token "TERMINATE". Os agentes podem emitir um mensagem centinela; el manager se detiene cuando aparece uno.
  • Verificación de objetivo alcanzado. Un verificador ligero se ejecuta en cada turno y detiene el chat cuando se completa el objetivo.

La división AutoGen → AG2 y la fusión con Microsoft Agent Framework

A principios de 2025, Microsoft comenzó una importante reescritura de AutoGen (v0.4) en torno a un modelo de actor impulsado por eventos. La comunidad bifurcó (fork) la semántica de GroupChat de AutoGen v0.2 como AG2, preservando la API que los primeros adoptantes habían integrado.

En febrero de 2026, Microsoft anunció que AutoGen entraría en modo de mantenimiento y que el modelo de actor impulsado por eventos se fusionaría en Microsoft Agent Framework (RC de febrero de 2026, ahora fusionado con Semantic Kernel). El concepto de GroupChat sobrevive en ambas vías; los detalles de implementación difieren. AG2 es el upstream preferido para código compatible con v0.2.

Cuándo es adecuado GroupChat

  • Conversaciones emergentes. No deseas cablear previamente cada posible siguiente orador.
  • Tareas con mezcla de roles. El programador le pregunta al investigador, el investigador al archivista, el archivista le vuelve a preguntar al programador. El flujo no es un DAG (Grafo Acíclico Dirigido).
  • Resolución exploratoria de problemas. Piensa en una "reunión de lluvia de ideas" (brainstorming), no en una "línea de ensamblaje".

Cuándo falla

  • Determinismo estricto. El selector de LLM puede ser inconsistente. Mismo prompt, diferentes ejecuciones, diferentes siguientes oradores.
  • Cascadas de adulación (Sycophancy cascades). Los agentes ceden ante quien habló con más confianza. Escribe contra-prompts explícitamente.
  • Saturación de contexto (Context bloat). Cada agente lee cada mensaje anterior; después de 10 turnos, el contexto es enorme. Utiliza proyecciones (Lección 15) para delimitar las vistas.
  • Oradores dominantes (Hot speakers). Un agente domina la conversación porque el selector favorece sus especialidades. Introduce el equilibrio de oradores (speaker balance) como una función del selector.

Group chat vs supervisor

Mismas primitivas, diferentes valores predeterminados:

  • Supervisor: un agente planifica y otros ejecutan. El selector es "preguntar al planificador qué hacer".
  • Group chat: todos los agentes son pares; el selector es una función sobre el pool compartido.

Ambos usan las cuatro primitivas de la Lección 04. Group chat tiene como valor predeterminado la orquestación seleccionada por LLM (LLM-selected) y el estado compartido de pool completo.

Constrúyelo

code/main.py implementa un GroupChat desde cero en la biblioteca estándar (stdlib) de Python. Tres agentes (programador, revisor, manager), variantes round-robin y seleccionadas por LLM (LLM-selected), y una terminación mediante un token TERMINATE.

La demostración imprime la transcripción de la conversación más el seguimiento de decisiones del selector para ambas variantes.

Ejecuta:

python3 code/main.py

Úsalo

outputs/skill-groupchat-selector.md configura un selector de GroupChat para una tarea determinada: round-robin frente a seleccionado por LLM o personalizado, y qué entradas del selector (mensajes recientes, especialidades de los agentes, recuento de turnos) utilizar.

Ponlo en Producción

Lista de verificación:

  • Límite de rondas (Max rounds). Siempre. 10-20 para tareas típicas.
  • Métrica de equilibrio de oradores (Speaker-balance). Realiza un seguimiento de los turnos por agente; genera una alerta cuando el desequilibrio supere un umbral.
  • Token de terminación. TERMINATE o un agente verificador dedicado.
  • Proyección o memoria delimitada. Después de aproximadamente 10 mensajes, considera darle a cada agente solo una vista delimitada (scoped view) para evitar la saturación del contexto.
  • Registro del selector (Selector logging). Para las variantes seleccionadas por LLM, registra tanto la entrada del selector como su elección. De lo contrario, la depuración es imposible.

Ejercicios

  1. Ejecuta code/main.py. Compara la conversación bajo round-robin frente a la seleccionada por LLM (LLM-selected). ¿Qué agente domina en cada caso?
  2. Agrega una regla de "máximo de intervenciones por agente" (max-speaks-per-agent) en el selector. ¿Cómo afecta esto a la transcripción?
  3. Implementa una terminación de objetivo alcanzado: detén el chat cuando el revisor devuelva "aprobado" ("approved"). ¿Con qué frecuencia se activa antes del límite de rondas?
  4. Lee la documentación estable de AutoGen sobre GroupChat (https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/design-patterns/group-chat.html). Identifica el selector predeterminado utilizado por GroupChatManager.
  5. Lee el repositorio de AG2 (https://github.com/ag2ai/ag2) y compara su GroupChat v0.2 con la versión v0.4 impulsada por eventos. ¿Qué propiedad concreta (rendimiento, tolerancia a fallas, composabilidad) agrega la v0.4?

Términos Clave

Término Lo que la gente dice Lo que realmente significa
GroupChat "Agentes en una sala de chat" Pool de mensajes compartido + función selectora. Primitiva de AutoGen / AG2.
Speaker selection (Selección de oradores) "Quién habla a continuación" La función que elige al siguiente agente. Round-robin, seleccionado por LLM (LLM-selected) o personalizado.
GroupChatManager "El anfitrión de la reunión" Componente de AutoGen que posee el selector y recorre los turnos.
ConversableAgent "El agente base" Clase base de AutoGen; un agente que puede enviar y recibir mensajes.
Termination token (Token de terminación) "La palabra de parada" Cadena centinela (generalmente TERMINATE) que finaliza el chat.
Hot speaker (Orador dominante) "Un agente domina" Modo de falla en el que el selector sigue eligiendo al mismo agente.
Context bloat (Saturación de contexto) "El pool crece sin límites" Cada agente lee cada mensaje anterior; el contexto crece con los turnos.
Projection (Proyección) "Vista delimitada" Vista específica de rol en el pool compartido para evitar la saturación del contexto.

Lecturas Adicionales

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).