Multi-Agent Debate
Multi-Agent Debate es un patrón de diseño multiagente que simula una interacción de varios turnos donde, en cada turno, los agentes intercambian sus respuestas entre sí y refinan dichas respuestas basándose en lo que reciben de otros agentes.
Este ejemplo muestra una implementación del patrón multi-agent debate para resolver problemas matemáticos del benchmark GSM8K.
Hay dos tipos de agentes en este patrón: agentes solucionadores (solvers) y un agente agregador. Los agentes solucionadores están conectados de forma dispersa (sparse) siguiendo la técnica descrita en Improving Multi-Agent Debate with Sparse Communication Topology. Los solucionadores son responsables de resolver los problemas matemáticos e intercambiar respuestas con otros agentes. El agregador se encarga de distribuir los problemas a los solucionadores, esperar sus respuestas finales y agregarlas para obtener la respuesta final.
🔄 Funcionamiento del patrón:
El usuario envía un problema matemático al agente agregador.
El agregador distribuye el problema a los agentes solucionadores.
Cada solucionador procesa el problema y publica una respuesta a sus vecinos.
Cada solucionador usa las respuestas de sus vecinos para refinar su propia respuesta, y publica una nueva.
Se repite el paso 4 durante un número fijo de rondas. En la última ronda, cada solucionador publica una respuesta final.
El agregador utiliza votación por mayoría para agregar las respuestas finales y obtener la respuesta definitiva, que luego se publica.
import re
from dataclasses import dataclass
from typing import Dict, List
from saptiva_agents import SAPTIVA_LEGACY
from saptiva_agents.core import (
DefaultTopicId,
MessageContext,
RoutedAgent,
SingleThreadedAgentRuntime,
TypeSubscription,
default_subscription,
message_handler,
)
from saptiva_agents.models import (
AssistantMessage,
LLMMessage,
SystemMessage,
UserMessage,
)
from saptiva_agents.base import SaptivaAIChatCompletionClientProtocolo de Mensajes
Primero, definimos los mensajes utilizados por los agentes. IntermediateSolverResponse es el mensaje intercambiado entre los agentes solucionadores en cada ronda, y FinalSolverResponse es el mensaje publicado por los agentes solucionadores en la ronda final.
Agente Solucionador
El agente solucionador es responsable de resolver problemas matemáticos e intercambiar respuestas con otros agentes solucionadores. Al recibir un SolverRequest, el agente solucionador utiliza un modelo LLM para generar una respuesta. Luego, publica un IntermediateSolverResponse o un FinalSolverResponse dependiendo del número de ronda.
Al agente solucionador se le asigna un tipo de tópico, el cual se utiliza para indicar el tópico al que debe publicar las respuestas intermedias. Este tópico es suscrito por sus agentes vecinos para recibir respuestas de este agente — más adelante mostraremos cómo se realiza esto.
Usamos default_subscription() para permitir que los agentes solucionadores se suscriban al tópico por defecto, que es el utilizado por el agente agregador para recolectar las respuestas finales de los agentes solucionadores.
Agente Agregador
El agente agregador es responsable de manejar la pregunta del usuario y distribuir los problemas matemáticos a los agentes solucionadores.
El agregador se suscribe al tópico por defecto utilizando default_subscription(). Este tópico por defecto se utiliza para recibir la pregunta del usuario, recolectar las respuestas finales de los agentes solucionadores y publicar la respuesta final de nuevo al usuario.
En una aplicación más compleja, donde se desea aislar el debate multiagente como un subcomponente, se debería utilizar type_subscription() para definir un tipo de tópico específico para la comunicación entre agregador y solucionadores, y hacer que tanto el solucionador como el agregador publiquen y se suscriban a ese tipo de tópico.
Configuración de un Debate
Ahora configuraremos un debate multiagente con 4 agentes solucionadores y 1 agente agregador. Los agentes solucionadores estarán conectados de forma dispersa, como se ilustra en la figura a continuación:
Cada agente solucionador está conectado a otros dos agentes solucionadores. Por ejemplo, el agente A está conectado a los agentes B y C.
Primero, vamos a crear un runtime y registrar los tipos de agentes.
Ahora crearemos la topología de los agentes solucionadores utilizando TypeSubscription, que asigna el tipo de tema de publicación de cada agente solucionador a los tipos de agente de sus vecinos.
Resolviendo Problemas Matemáticos
Ahora ejecutemos el debate para resolver un problema matemático. Publicamos un SolverRequest en el tema por defecto (default topic), y el agente agregador iniciará el debate.
Última actualización