Selector Group Chat
SelectorGroupChat implementa un equipo donde los participantes se turnan para transmitir mensajes a todos los demás miembros. Un modelo generativo (por ejemplo, un LLM) selecciona al siguiente participante basado en el contexto compartido, permitiendo así una colaboración dinámica y consciente del contexto.
Características clave:
Selección del hablante basada en modelo.
Roles y descripciones de participantes configurables.
Prevención opcional de turnos consecutivos del mismo hablante.
Personalización del mensaje de selección.
Función personalizada de selección para reemplazar la selección basada en modelo por defecto.
¿Cómo Funciona?
SelectorGroupChat es un chat grupal similar a RoundRobinGroupChat, pero con un mecanismo de selección del siguiente hablante basado en un modelo. Cuando el equipo recibe una tarea mediante los métodos run() o run_stream(), se ejecutan los siguientes pasos:
El equipo analiza el contexto actual de la conversación, incluyendo el historial y los atributos de
name(nombre) ydescription(descripción) de los participantes, para determinar quién será el siguiente hablante utilizando un modelo generativo. Por defecto, el equipo no seleccionará al mismo participante de manera consecutiva, salvo que sea el único agente disponible. Esto se puede cambiar configurandoallow_repeated_speaker=True. También puedes proporcionar una función personalizada para reemplazar la selección por defecto.El equipo solicita al agente seleccionado que proporcione una respuesta, la cual se transmite posteriormente a todos los demás participantes.
Se verifica la condición de terminación para determinar si la conversación debe finalizar. En caso contrario, el proceso se repite desde el paso 1.
Cuando la conversación termina, el equipo retorna un TaskResult que contiene el historial completo de la conversación generada durante la tarea.
Una vez que el equipo finaliza la tarea, el contexto de la conversación se mantiene dentro del equipo y todos los participantes, permitiendo que la siguiente tarea pueda continuar desde este contexto. Para reiniciar completamente el contexto de conversación, utiliza el método reset().
En esta sección mostraremos cómo utilizar SelectorGroupChat con un ejemplo sencillo relacionado con una tarea de búsqueda web y análisis de datos.
Ejemplo: Búsqueda/Análisis Web
Agentes
Este sistema utiliza tres agentes especializados:
Agente de planificación: Coordinador estratégico que descompone tareas complejas en subtareas manejables.
Agente de búsqueda web: Especialista en recuperación de información que utiliza la herramienta
search_web_tool.Agente analista de datos: Especialista en cálculos equipado con la herramienta
percentage_change_tool.
Las herramientas search_web_tool y percentage_change_tool son herramientas externas que los agentes pueden utilizar para realizar sus tareas.
Vamos a crear ahora los agentes especializados utilizando la clase AssistantAgent. Es importante tener en cuenta que los atributos name y description de los agentes son utilizados por el modelo para determinar quién será el siguiente hablante, por lo cual se recomienda proporcionar nombres y descripciones significativas.
Flujo de Trabajo
La tarea es recibida por
SelectorGroupChat, que selecciona al agente más apropiado (normalmente el agente planificador) para manejar la tarea inicial.El agente planificador analiza la tarea, la divide en subtareas y asigna cada una al agente más apropiado usando el formato:
<agente> : <tarea>.Según el contexto de la conversación, el administrador de
SelectorGroupChatselecciona dinámicamente al siguiente agente para manejar la subtarea asignada.El agente de búsqueda web realiza búsquedas una a una, guardando resultados en el historial compartido.
El analista de datos procesa la información usando herramientas de cálculo cuando se selecciona.
El proceso continúa hasta que:
El agente planificador determina que las subtareas están completas y envía "TERMINATE".
Se cumple una condición alternativa de terminación (por ejemplo, un número máximo de mensajes).
Cuando definas tus agentes, asegúrate de incluir descripciones claras, pues estas se usan para decidir el siguiente agente en hablar.
Condiciones de Terminación
Utilizaremos dos condiciones de terminación:
TextMentionTermination: finaliza la conversación cuando el agente planificador envía "TERMINATE".MaxMessageTermination: limita la conversación a 25 mensajes para evitar bucles infinitos.
Mensaje del Selector (Selector Prompt)
Selector Prompt)SelectorGroupChat usa un modelo para seleccionar al próximo agente basado en el contexto conversacional. Utilizaremos un mensaje de selección personalizado para ajustarnos al flujo de trabajo.
Las variables de cadena disponibles en la plantilla del selector son:
{participants}: Los nombres de los candidatos disponibles para selección. El formato es["<nombre1>", "<nombre2>", ...].{roles}: Una lista separada por saltos de línea con los nombres y descripciones de los agentes candidatos. El formato para cada línea es:"<nombre> : <descripción>".{history}: El historial de la conversación formateado como una secuencia separada por doble salto de línea con nombres y contenido del mensaje. El formato para cada mensaje es:"<nombre> : <contenido del mensaje>".
Consejo
Intenta no sobrecargar el modelo con demasiadas instrucciones en el selector.
¿Qué es demasiado? Depende de las capacidades del modelo que esté utilizando.
Por lo general, si escribes varias condiciones para cada agente, es una señal de que deberías considerar usar una función de selección personalizada o dividir la tarea en tareas más pequeñas y secuenciales que sean gestionadas por agentes o equipos separados.
Ejecutando el Equipo
Creamos el equipo con los agentes, condiciones de terminación y mensaje personalizado:
Ahora podemos ejecutar el equipo con una tarea relacionada con la búsqueda y análisis de datos sobre un jugador de la NBA.
Como podemos ver, después de que el Agente de Búsqueda Web realiza las búsquedas necesarias y el Agente Analista de Datos completa los cálculos requeridos, descubrimos que ¡Dwyane Wade fue el jugador de los Miami Heat con más puntos en la temporada 2006-2007 y que el cambio porcentual en sus rebotes totales entre las temporadas 2007-2008 y 2008-2009 es del 85.98%!
Función Personalizada para Selección
En ocasiones, queremos un mejor control sobre el proceso de selección. Para lograrlo, podemos definir el argumento selector_func con una función personalizada que reemplace la selección predeterminada basada en el modelo. Esto nos permite implementar lógicas más complejas de selección y transiciones basadas en el estado.
Por ejemplo, podríamos querer que el Agente de Planificación hable inmediatamente después de cualquier agente especializado para verificar el progreso.
Del registro de la conversación podemos observar que el Agente de Planificación siempre habla inmediatamente después de los agentes especializados.
Consejo:
Cada agente participante realiza solo un paso (ejecutar herramientas, generar respuestas, etc.) en cada turno. Si deseas que un AssistantAgent repita hasta dejar de retornar un ToolCallSummaryMessage al completar todas las herramientas necesarias, puedes hacerlo verificando el último mensaje y devolviendo el agente si es un ToolCallSummaryMessage.
Función Personalizada para Candidatos
Otra posible necesidad podría ser seleccionar automáticamente al siguiente hablante desde una lista filtrada de agentes. Para esto, podemos definir el parámetro candidate_func con una función personalizada que permita filtrar la lista de agentes potenciales para la selección de hablante en cada turno del chat grupal.
Esto nos permite restringir la selección del siguiente hablante a un conjunto específico de agentes después de un agente dado.
En el registro de la conversación puedes observar que el Planning Agent regresa a la conversación después de que el Web Search Agent y el Data Analyst Agent tomaron sus turnos, y al notar que la tarea no se completó como se esperaba, vuelve a llamar al Web Search Agent para obtener valores actualizados y posteriormente al Data Analyst Agent para calcular el porcentaje de cambio.
Retroalimentación del Usuario
Podemos agregar UserProxyAgent al equipo para proporcionar retroalimentación del usuario durante la ejecución. Ver Human-in-the-Loop para más detalles sobre UserProxyAgent.
Para utilizar el UserProxyAgent en el ejemplo de búsqueda web, simplemente lo añadimos al equipo y actualizamos la función del selector para verificar siempre la retroalimentación del usuario después de que hable el agente planificador. Si el usuario responde con "APPROVE", la conversación continúa; de lo contrario, el agente planificador vuelve a intentarlo hasta que el usuario apruebe.
Ahora, la retroalimentación del usuario está incorporada al flujo de conversación, y el usuario puede aprobar o rechazar las decisiones del agente planificador.
Uso de Modelos de Razonamiento
Si usas un modelo de razonamiento como Saptiva Cortex, deberás mantener el selector prompt y los mensajes del sistema lo más simples y directos posible. Esto se debe a que los modelos de razonamiento ya son buenos para elaborar sus propias instrucciones a partir del contexto que se les proporciona.
Esto también significa que ya no necesitamos un agente de planificación para descomponer la tarea, ya que el SelectorGroupChat que usa un modelo de razonamiento puede hacerlo por sí mismo.
En el siguiente ejemplo, usaremos Saptiva Cortex como modelo para los agentes y el equipo, y no utilizaremos un agente de planificación. Además, mantendremos el selector prompt y los mensajes del sistema lo más simples posible.
Última actualización