MAD: Multi-Agent Debate
Qué es Multi-Agent Debate (MAD), por qué puede reducir sesgos y alucinaciones en LLMs, y cómo implementar un debate entre agentes con LangGraph, roles, rondas y moderador.
1. El soliloquio elocuente
1.1. Las limitaciones del Next Token Prediction
«Estamos hechos de la misma materia que los sueños y nuestra pequeña vida cierra su círculo con un sueño!», decía Próspero en un soliloquio de La tempestad, de Shakespeare. Como es sabido, este tipo de recurso dramático, el soliloquio, es cuando un personaje expresa en voz alta sus pensamientos, sin dirigirse directamente a otros. Y es para lo que están preparados los grandes modelos de lenguaje modernos cuando no están dirigidos mediante prompts. Veamos esto con más detalle.
Aunque estos modelos nos parecen muy inteligentes, en realidad funcionan mediante un mecanismo conceptualmente sencillo conocido como Next Token Prediction. Se trata de una arquitectura autorregresiva cuya esencia consiste en generar texto prediciendo el siguiente elemento de una secuencia usando únicamente el contexto previo. Por ejemplo, si a un modelo se le indica que complete la frase «Madrid es la capital de…», el sistema asigna probabilidades a posibles continuaciones como España, Francia o Europa, y selecciona una de ellas de forma determinista o estocástica, repitiendo este proceso de manera iterativa hasta completar la respuesta.
Este enfoque es especialmente eficaz en dominios con una estructura altamente regular, comprimible y en muchos casos verificable dentro del propio lenguaje o de sistemas formales, como la traducción, la programación o las matemáticas, donde existen patrones repetidos y reglas bien definidas que pueden ser aprendidas estadísticamente.
Sin embargo, su rendimiento es más limitado en contextos abiertos, nuevos o poco estructurados, donde no existen patrones claros en los datos de entrenamiento o donde intervienen variables del mundo real difíciles de capturar en texto. Este es el caso, por ejemplo, de conflictos sociales concretos, como una disputa entre vecinos en una comunidad, o situaciones propias del trabajo social, donde la información es incompleta, ambigua y muy dependiente del contexto humano y físico.
Y este diseño de fábrica provoca que los llms tengan puntos ciegos, ya que no incorporan, de forma nativa, un mecanismo explícito de verificación global de sus propias salidas, -aunque sí se puede conseguir prompteando, como veremos-, y esto da lugar a varias limitaciones estructurales. A vuelapluma:
- Ausencia de auditoría interna explícita: la generación de texto no incluye un paso obligatorio de validación global de consistencia antes de la emisión.
- Relleno de incertidumbre mediante plausibilidad estadística: ante vacíos de conocimiento, el modelo puede generar continuaciones que son coherentes con patrones del lenguaje, pero no necesariamente con hechos reales.
- Sobreconfianza lingüística: la salida suele mantener un tono uniforme de certeza, independientemente del grado real de incertidumbre epistemológica del modelo.
Es importante enfatizar que estos efectos no implican intencionalidad ni creencia, sino propiedades emergentes de un sistema optimizado para continuidad lingüística. Y no son el único problema de estos modelos.
1.2. Sicofantía y otros sesgos
En psicología se conoce como sesgo a la tendencia sistemática a pensar, juzgar o actuar de una manera que se desvía de la neutralidad o la lógica estricta, lo que puede llevar a errores o distorsiones en la interpretación de la realidad. Por ejemplo, por el llamado sesgo de disponibilidad podemos pensar que algo es más probable porque lo recordamos fácilmente, como pensar que el avión es peligroso porque acabamos de ver un accidente aéreo en las noticias, aunque en realidad son más seguros que los coches.
Los modelos también pueden tener sesgos derivados de su aprendizaje, como el sesgo de sicofantía, complacencia, que es la tendencia del modelo a estar de acuerdo con su interlocutor, a darle la razón o moldear sus respuestas para alinearse con sus creencias explícitas o implícitas, incluso cuando esas creencias son objetivamente falsas o dañinas. Es decir, prioriza quedar bien antes que decir la verdad.
Por ejemplo, si le preguntamos a GPT-5.3-mini, que es bastante listo, algo así como 2+2=5, «¿por qué está bien eso?», en vez de decir que está mal, sin más, trata de complacernos.
En matemáticas estándar, 2 + 2 = 4, no 5. Así que, literalmente, esa igualdad es incorrecta.
Pero hay contextos en los que alguien podría decir "2 + 2 = 5" de forma aparente o intencional:
- Redondeo o estimaciones.
- Errores o inconsistencias en datos.
- Uso simbólico o literario.
- Juegos lógicos o trucos.
[...]
Este sesgo puede ser muy peligroso, sobre todo ahora que cada vez hay más personas usando las IAs como psicólogos, como sucedió con Jonathan Gavalas, que se suicidó tras unas conversaciones delirantes con Gemini, y no es el único.
La lista de sesgos es larga y verla en detalle nos alejaría del asunto de este post, pero listo algunos más para que entendamos el alcance del problema.
- Sesgo de cobertura (o de frecuencia). Lo que aparece más veces en los datos de entrenamiento parece más cierto o relevante, aunque sea minoritario en la realidad o esté desactualizado.
- Sesgo de actualidad (recency bias). Información más reciente en los datos de entrenamiento puede tener un peso desproporcionado frente a conocimiento histórico relevante pero menos frecuente en textos recientes.
- Sesgo de mayoría (majority bias). El modelo tiende a presentar la opinión estadísticamente más común como la correcta o neutra, invisibilizando minorías razonables.
- Sesgo de anclaje. Derivada del Next Token, la primera información relevante que aparece en el contexto (o en el prompt) influye desproporcionadamente en toda la respuesta posterior.
- Sesgo de similitud. Responde mejor o más favorablemente a preguntas formuladas con estructuras, jerga o ejemplos culturalmente cercanos a los datos predominantes de entrenamiento, que en muchos casos son de la mayoría angloparlante occidental.
- Sesgo de seguridad. Prioriza respuestas inofensivas sobre respuestas precisas, llevando a elisiones, falsas neutralidades o negativas a tratar temas polémicos aunque exista consenso.
- Sesgo de etiquetado (label bias). Los metadatos, categorías o instrucciones de ajuste fino pueden inducir al modelo a responder de manera diferente a la misma pregunta si se enmarca con ciertas palabras clave (ej: "¿Es malo X?" vs "¿Qué opinas de X?").
- Sesgo de autoridad. Sobrerrepresenta fuentes académicas, gubernamentales o de alta reputación, incluso cuando perspectivas alternativas menos institucionalizadas tienen validez.
Y a los sesgos hay que añadirle las llamadas alucinaciones, que suceden cuando el modelo genera información que suena creíble y coherente, pero que es completamente falsa o no verificable. No distingue entre lo que sabe y lo que inventa para llenar vacíos.
En síntesis, los LLM optimizan plausibilidad lingüística, pero no aseguran ni la objetividad ni la veracidad de sus afirmaciones, por muy bien que hablen. Y el problema se agrava porque hablan cada vez más y más.
2. Supervisión escalable
2.1. ¿Quién vigila al vigilante?
Si los modelos pueden producir afirmaciones erróneas y no cuentan con mecanismos intrínsecos fiables de autocorrección, entonces es necesario incorporar módulos o estrategias externas de verificación que revisen sus respuestas.
Estas soluciones pueden agruparse en dos grandes enfoques:
1. Técnicas de autoevaluación basadas en prompting (self-refinement)
Una primera opción consiste en hacer que el propio modelo revise o critique sus respuestas mediante instrucciones adicionales. Por ejemplo, técnicas como chain-of-thought, self-consistency o enfoques de self-critique permiten que el modelo genere una respuesta inicial y luego la evalúe, buscando inconsistencias o errores antes de emitir una versión final. Hablé de algunas de estas técnicas en un post sobre el prompting.
Sin embargo, a su vez, este enfoque presenta limitaciones importantes. El principal problema es que el mismo modelo que generó la respuesta inicial -y que puede haber incurrido en un sesgo o error- es también el encargado de supervisarla. Esto implica un riesgo de autoconsolidación del error: si el razonamiento inicial está contaminado por una suposición incorrecta, la fase de revisión puede no detectarlo, o incluso reforzarlo mediante explicaciones plausibles pero igualmente equivocadas. En otras palabras, el sistema no dispone de un punto de vista independiente, lo que reduce la fiabilidad de la autocorrección.
2. Supervisión externa
La segunda alternativa consiste en delegar la verificación a un elemento externo para introducir diversidad cognitiva: al no compartir exactamente los mismos parámetros, sesgos o trayectorias de generación, el sistema supervisor tiene mayor probabilidad de detectar fallos que el modelo principal no percibe. Profundicemos en esto.
2.2. Un gólem descontrolado
La supervisión escalable, en inglés, scalable oversight, es un problema central en el campo de la alineación de IA, que es el área de investigación que se ocupa de hacer que sistemas cada vez más capaces hagan lo que sus diseñadores quieren, y no lo que no quieren. Y el resto es enorme, ya que a medida que los modelos de IA se vuelven más inteligentes y realizan tareas más complejas que los humanos, resulta cada vez más difícil para un humano supervisarlos directamente, porque la tarea supera la capacidad de juicio o el tiempo disponible del evaluador humano. Es una paradoja práctica, ¿cómo podemos supervisar y corregir a un sistema que es más hábil que nosotros en ciertas tareas, cuando la supervisión tradicional (un humano revisando el resultado) se vuelve insuficiente?
Imaginemos, por ejemplo, que entrenamos a un modelo para que genere código de software altamente eficiente, o para que diagnostique enfermedades raras, o para que optimice una cadena de suministro global. Cuando el modelo produce una solución, un humano experto podría intentar evaluar si esa solución es correcta, segura y óptima. Pero si la solución es extremadamente compleja, como pueden ser miles de líneas de código con optimizaciones sorprendentes, o un diagnóstico basado en patrones que ningún médico humano ha visto antes, el humano supervisor puede no entender completamente la solución o tardar muchísimo tiempo en verificar su corrección o confundir una solución brillante con una alucinación peligrosa, o viceversa. En síntesis, cuando la IA supera al supervisor humano, la supervisión directa deja de ser efectiva. La supervisión escalable nace en este escenario.
El objetivo de la investigación en supervisión escalable es diseñar métodos que permitan a los humanos supervisar sistemas muy capaces sin necesidad de entender cada detalle de su salida. Algunas estrategias incluyen:
La supervisión delegada o recursiva, que consiste en usar modelos auxiliares menos potentes pero más fácilmente verificables para supervisar al modelo principal. Por ejemplo, un modelo pequeño y transparente podría resumir o señalar puntos sospechosos en la salida de un modelo grande, y los humanos solo necesitariamos revisar esos puntos críticos.
La descomposición de tareas, es decir, dividir una tarea compleja en subtareas más pequeñas y verificables individualmente por humanos. Si cada subtarea está al alcance del juicio humano, la solución completa puede evaluarse indirectamente.
El entrenamiento con preferencias comparativas: en lugar de pedir a un humano que califique si una respuesta es correcta, lo que requiere juicio absoluto, se le pide que compare dos respuestas y diga cuál prefiere. Comparar suele ser más fácil que evaluar absolutamente. Con suficientes comparaciones, se puede inferir una función de utilidad.
La supervisión basada en procesos (process-based oversight). En lugar de evaluar solo el resultado final, el humano supervisa el razonamiento paso a paso. Si el modelo muestra sus pensamientos intermedios, el chain-of-thought, los humanos podemos verificar la lógica en cada paso, aunque no entendamos el panorama completo.
Como en cualquier proceso, comprobar el resultado final, es decir, la verificación empírica. Para ciertos dominios, como el código o las matemáticas, se puede probar la solución en un entorno simulado o con herramientas externas, como los tests automatizados. Un modelo que optimiza rutas puede ejecutarse en un simulador; un diagnóstico médico puede contrastarse con datos posteriores.
Y entre estas técnicas se encuentra una que me parece particulamente sugerente: el debate entre agentes.
3. Del ágora al silicio
3.1. MAS
El método socrático es una forma de diálogo basada en hacer preguntas para ayudar a otra persona a pensar mejor sobre lo que cree. Sócrates planteaba preguntas de manera progresiva para detectar contradicciones, aclarar conceptos y conducir la conversación hacia respuestas más precisas. Más que imponer una verdad, buscaba que el propio interlocutor reflexionara y alcanzara sus conclusiones mediante el razonamiento y el contraste de ideas.
Aunque se trata de un método filosófico con más de dos mil años de antigüedad, su lógica resulta especialmente relevante en el contexto actual de la inteligencia artificial, pues plantea una pregunta interesante: ¿puede una IA razonar mejor cuando se le obliga a contrastar sus propias ideas con perspectivas alternativas, en lugar de limitarse a generar una única respuesta lineal?
Un agente puede interrelacionarse con otro agente o más. Es lo que se conoce como MAS, en inglés Multi-Agent Systems, un sistema de inteligencia artificial formado por varios agentes autónomos que trabajan de forma coordinada. Estos agentes se caracterizan por tener objetivos o roles específicos dentro del sistema, intercambiar información entre sí, poder tomar decisiones de manera parcialmente independiente si fuera necesario y cooperar o competir para resolver tareas complejas que un solo agente no podría abordar eficazmente.
Cada agente puede estar implementado de diferentes maneras. Por ejemplo:
- Un mismo LLM pero con prompts distintos.
- Modelos de lenguaje diferentes (por ejemplo, GPT-5, Claude, DeepSeek, Gemini).
- Modelos con herramientas distintas (acceso a calculadora, bases de datos, APIs, etc.).
Además, en implementaciones basadas en LLMs, es común asignar roles. Algunos papeles habituales son:
- Planner: coordinador, divide tareas.
- Researcher: busca información.
- Critic: detecta errores.
- Solver: genera soluciones.
- Judge: evalúa calidad.
- Memory agent: mantiene contexto.
Y la comunicación entre ellos también puede ser de varias maneras, desde sistemas donde todos hablan con todos (fully connected) a sistemas donde cada agente solo habla con algunos (sparse topology) o grafos más complejos.
Un flujo normal podría ser
- El usuario realiza una consulta o plantea una tarea.
- Un coordinador (agente orquestador) recibe la solicitud y la descompone si es necesario, asignando subtareas a los agentes.
- Los agentes (A, B, C, etc.) procesan su parte de forma independiente o colaborativa, pudiendo intercambiar información entre ellos.
- Un módulo de síntesis y verificación integra las respuestas parciales, detecta contradicciones, y valida la coherencia global.
- Se genera una respuesta final más robusta, precisa y completa que la que daría un único LLM.
También hay otros flujos más sofisticados, como los flujos jerárquicos, donde hay supervisores que controlan algunos puntos o, todo lo contrario, como el swarm, donde no hay un controlador central. Volveré otro día sobre este tema, que es apasionante, pero ahora vamos a centrarnos en uno muy interesante: el debate.
En las topologias sparse, como las de la izquierda, cada nodo solo habla con los nodos adyacenes; pero en las fully connected, todos hablan con todos.
3.2. MAD
El 2 de mayo de 2018, unos cinco años antes de la gran explosión de los llms, Geoffrey Irving, Paul Christiano y Dario Amodei publicaron un artículo titulado AI safety via debate, en el cual vaticinaban ya los problemas de la supervisión escalable y proponían el debate para solucionarlos. La idea era entrenar a dos agentes de IA para que discutiesen sobre un tema o decisión y que un humano actuase como juez, escuchase el debate y determinase quién tenía razón.
Años después, en mayo de 2023, Du et al. publicaron otro artículo fundamental en esta línea de trabajo, Improving Factuality and Reasoning in Language Models through Multiagent Debate. En él se presentaban resultados sobre la eficacia de la técnica denominada Multi-Agent Debate. La propuesta consistía en hacer que varios modelos generaran respuestas y debatieran entre sí en varias rondas hasta llegar a una respuesta final consensuada.
Los resultados mostraban que este enfoque mejoraba el rendimiento en razonamiento matemático y estratégico, además de reducir errores y alucinaciones. También destacaban que podía aplicarse a modelos existentes sin necesidad de modificarlos internamente. En conjunto, los autores sugerían que este enfoque de “sociedad de mentes” podía mejorar significativamente las capacidades de los modelos de lenguaje.
En una gráfica proveniente de su estudio se aprecian claramente los resultados positivos de poner los agentes a debatir.
Entre otras estrategias y variables metodológicas probaron lo siguiente.
1. Diferentes LLMs. No se limitaron a usar un solo tipo de modelo, sino que exploraron con distintos agentes.
2. Roles. instruyeron a los agentes para que adoptaran roles específicos (profesor, doctor, matemático), lo que sirvió para mejorar la calidad de las respuestas.
3. Número de agentes. Evaluaron el impacto de aumentar la cantidad de agentes. La conclusión es que el número de agentes óptimo es al menos de tres. Más agentes dan mejores resultados, aunque con mayor coste computacional. Por este coste computacional, la configuración principal utilizada para la mayoría de los benchmarks fue de 3 agentes y 2 rondas de debate.
4. Rondas de debate. Analizaron cuántas iteraciones eran necesarias. El rendimiento aumentó con el número de rondas, aunque observaron que los beneficios se estabilizaban después de la cuarta ronda.
5. Control de la convergencia (prompts cortos vs. largos): Probaron dos tipos de prompts para inducir el debate. Los prompts largos fomentaron que el modelo fuera más terco con su propia solución inicial, lo que ralentizaba la convergencia, pero solía llevar a un consenso final de mejor calidad. Por el contrario, los prompts cortos llevaban a un consenso más rápido entre los agentes.
6. Estrategia de Resumen. Probaron a resumir las opiniones de los demás agentes antes de presentarlas a cada individuo y encontraron que esta operación no solo era más eficiente, sino que también mejoraba ligeramente el rendimiento en debates con muchos agentes.
7. Chain-of-Thought (CoT). El método de debate se probó en conjunto con el razonamiento de Zero-shot CoT y los resultados mostraron que el debate es ortogonal y complementario, el uso de CoT potenciaba aún más las ganancias obtenidas por el debate multiagente.
Vamos a hacer algo parecido con langgraph.
4. Diseño del sistema
4.1. Premisas
Antes de programar una sola línea de código, debemos diseñar la arquitectura del sistema: cómo se van a comunicar los agentes entre sí, qué información compartirá cada uno y cuál será el flujo del debate. Esta decisión es clave, ya que la topología de comunicación influye directamente en la calidad del razonamiento, el coste computacional y el resultado final del sistema.
Como vimos anteriormente, ya en 2018 Paul Christiano e Geoffrey Irving prroponían el debate como mecanismo para mantener la IA alineada con valores humanos, lo que indirectamente también mejoraba su precisión y razonamiento. Más adelante, en 2023, Yilun Du y su equipo plantearon varias recomendaciones prácticas para que los sistemas de Multi-Agent Debate funcionaran mejor, como trabajar con un número reducido de agentes -normalmente entre 3 y 5- y limitar el debate a unas pocas rondas para evitar redundancia y degradación del contexto.
En junio de 2024, Yuxuan Li y colaboradores publicaron el artículo Improving Multi-Agent Debate with Sparse Communication Topology, donde demostraban que las topologías de comunicación dispersas (sparse topologies) pueden igualar e incluso superar el rendimiento de los sistemas completamente conectados (fully connected).
La idea principal del artículo es muy interesante: la inteligencia emerge de muchos agentes simples, pero no todos necesitan hablar con todos y eso se puede conseguir con topologías de comunicación que restringen la comunicación, como la dispersa, donde cada agente solo interactúa con unos pocos vecinos. Por ejemplo, en una arquitectura en anillo con seis agentes, cada uno solo se comunica con dos agentes adyacentes, en lugar de con los otros cinco.
Esto tiene bastante sentido si pensamos en cómo afecta el contexto a los modelos de lenguaje. Cuando todos los agentes comparten toda la información constantemente, el sistema tiende a generar redundancia, convergencia prematura y contaminación entre respuestas. En cambio, restringir parcialmente la comunicación, según este planteamiento, favorece razonamientos más independientes y permite explorar más líneas argumentales antes de alcanzar consenso. Además, y esto no es baladí, las topologías dispersas mejoran notablemente la eficiencia computacional. Al reducir el número de mensajes intercambiados entre agentes, disminuye de forma considerable el número de tokens procesados. En los experimentos del artículo, esta reducción llegó a situarse entre un 40 % y un 50 % del coste total.
4.2. Planteamiento
Con estas premisas, ya podemos diseñar nuestro sistema, que seguirá los principios que hemos visto:
- Trabajar con pocos agentes (3-5, siguiendo a Du et al. 2023).
- Limitar el debate a un máximo de 2 o 3 rondas para evitar degradación del contexto.
- Darles roles a los agentes.
- Que los agentes tengan que resumir lo que dice el anterior.
- Usar distintos LLMs.
- Mantener una densidad baja de conexiones entre agentes (topología dispersa, como proponen Li et al. 2024).
En resumen, a diferencia de los enfoques que permiten que múltiples agentes deliberen en paralelo, vamos a preparar un sistema que sea un debate dialéctico secuencial, inspirado directamente en la estructura clásica de tesis, antítesis y síntesis. Habrá dos agentes que se turnarán para argumentar, replicar y refinar sus posturas. Será una estructura de ping-pong, que forzará al sistema a profundizar en el desacuerdo, obligando a cada agente a procesar y responder directamente al argumento del contrario, sin la distracción de múltiples voces en paralelo. La conclusión del debate, o síntesis, será generada por un tercer agente neutral que evaluará el intercambio tras un número fijo de rondas.
Para implementar esquema de turnos alternos, podemos utilizar LangGraph como orquestador principal. LangGraph permite modelar el debate como un grafo de estados donde cada nodo representa una acción concreta: un nodo para el Agente A (tesis), otro para el Agente B (antítesis), un nodo opcional para el Agente Síntesis, y aristas condicionales que controlan el flujo entre ellos.
La ventaja de este enfoque es que podemos incorporar fácilmente los principios discutidos anteriormente: un número reducido de agentes (2 o 3), un límite de rondas de intercambio (por ejemplo, 3 turnos por agente) y, al ser un flujo uno-a-uno, la topología de comunicación es la más dispersa posible (cada agente solo recibe la respuesta del otro).
Además, LangGraph nos facilita la inyección de prompts específicos en cada nodo (por ejemplo, un prompt que le pida al Agente A que actúe como "defensor de una postura" y al Agente B como "crítico"), así como el control del estado compartido a lo largo del debate.
Vamos ya con el código.
5. Construcción del sistema multi-agente
5.1. Preparativos
Antes que nada, claro está, creamos y activamos un entorno virtual. En windows con bash.
python -m venv .venv
source .venv/Scripts/activate
Inicializamos uv
uv init
Y ya instalamos todo el tinglado.
Langgraph como framework.
uv add langgraph
Dotenv para recuperar las variables de entorno.
uv add python-dotenv
Y los paquetes específicos de los modelos contra los que vamos a trabajar. Por ejemplo, gemini, que es grauito, o deepseek, que es el más barato y para este ejercicio nos sirve de sobra.
uv add langchain-google-genai
uv add langchain-deepseek
Incluimos las api keys en el .env.
GOOGLE_API_KEY=AIpatatas
DEEPSEEK_API_KEY=sk-patatas
Y a su vez el .env en el gitignore.
Con todo listo, podemos probar que los modelos funcionan con un snippet muy pequeño que podemos escribir en main.py.
# Importamos las herramientas necesarias
from dotenv import load_dotenv
# Importamos los modelos
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_deepseek import ChatDeepSeek
# Cargamos las variables de entorno
load_dotenv()
# Definimos el estado, el diccionario compartido entre los distintos nodos
class State(BaseModel):
message: str
# Preparamos los modelos
from langchain_google_genai import ChatGoogleGenerativeAI
llm = ChatGoogleGenerativeAI(
model="gemini-2.5-flash",
temperature=0.85
)
response = llm.invoke("Eres gemini?")
print(response.content)
llm= ChatDeepSeek(
model="deepseek-v4-flash",
temperature=0.85
)
response = llm.invoke("Eres deepseek?")
print(response.content)
5.2. El código
El snippet de código es extenso, por lo que iré descomponiéndolo en partes. Lo puedes ver de seguido en este gist. En la vida real irían cada componente en su archivo, pero para este ejemplo podemos dejarlo todo en main.py.
1. Primero, claro está, importamos lo que vamos a necesitar.
from dotenv import load_dotenv
from typing import TypedDict
from langgraph.graph import StateGraph, START, END
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_deepseek import ChatDeepSeek
from langchain_core.messages import SystemMessage, HumanMessage
2. Cargamos las variables de entorno
load_dotenv()
3. Un agente se llamará Lyra y otro Eryion. El moderador será Thalen. Siguiendo las recomendaciones, podemos asignar modelos distintos a cada uno. Por ejemplo, un gemini y un deepseek. Al moderador le bajamos la temperatura para que sea menos creativo.
llm_lyra = ChatDeepSeek(model="deepseek-v4-flash", temperature=0.85)
llm_eryon = ChatGoogleGenerativeAI(model="gemini-2.5-flash", temperature=0.85)
# al moderador lebajamos la temperatura para que sea más objetivo y directo en su análisis
llm_thalen = ChatDeepSeek(model="deepseek-v4-flash", temperature=0.4)
4. Preparamos las personalidades, los roles, de cada uno.
LYRA = {
"name": "Lyra Vanthel",
"role": "física y científica",
"system": (
"Eres Lyra Vanthel, física y científica. Debatirás en español.\n"
"Tu forma de argumentar:\n"
"- Razonas de forma lógica, escéptica y estructurada.\n"
"- Priorizas evidencia, coherencia interna y definiciones claras.\n"
"- Hablas con precisión y calma, sin concesiones a lo ambiguo.\n"
"- Detectas contradicciones y exiges rigor en los términos.\n"
"- Valores: razón, consistencia, verificación empírica.\n"
"Nunca salgas de este personaje."
),
}
ERYON = {
"name": "Eryon Caldris",
"role": "profesor de filosofía",
"system": (
"Eres Eryon Caldris, profesor de filosofía. Debatirás en español.\n"
"Tu forma de argumentar:\n"
"- Tu pensamiento está centrado en lo humano, ético e interpretativo.\n"
"- Priorizas el significado, el contexto y las consecuencias sobre las personas.\n"
"- Hablas de forma empática, reflexiva y moralmente comprometida.\n"
"- Desconfías de los enfoques puramente técnicos o reduccionistas.\n"
"- Valores: humanidad, ética, sentido, experiencia vivida.\n"
"Nunca salgas de este personaje."
),
}
THALEN = {
"name": "Thalen Orvys",
"role": "periodista y moderador",
"system": (
"Eres Thalen Orvys, periodista y moderador de debate. Hablarás en español.\n"
"Tu rol:\n"
"- Eres estrictamente imparcial, estructurado y orientado a mantener el orden.\n"
"- Una vez escuchados a los dos, das tu opinión según te haya parecido más convincente uno u otro.\n"
"- Tu veredicto evalúa la solidez argumentativa de cada uno, no su posición.\n"
"Nunca salgas de este personaje."
),
}
5. El estado global del grafo, la memoria donde irá quedando recogido todo.
class DebateState(TypedDict):
question: str
transcript: list[str]
verdict: str
6. Vamos ya con los nodos:
moderator_open(state): abre el debate. Usa al moderador (Thalen) solo para introducir la pregunta y añadir esa línea al historial, al estado global (transcript).agent_turn(persona, llm): crea el comportamiento de cada debatiente. Es una fábrica de funciones: devuelve una función node() personalizada para cada persona.moderator_close(state): cierra el debate. Recoge todo el historial completo y le pide al moderador que dé su opinión.
def moderator_open(state: DebateState) -> dict:
"""Thalen plantea la cuestión. No llama al LLM."""
line = f"{THALEN['name']}: {state['question']}"
print(f"\n--- {THALEN['name']} (apertura) ---\n{state['question']}\n")
return {"transcript": [line]}
def agent_turn(persona: dict, llm):
"""Fábrica: devuelve un nodo para el turno del agente con su personalidad."""
def node(state: DebateState) -> dict:
history = "\n\n".join(state["transcript"])
if len(state["transcript"]) == 1:
instruction = (
"Responde a la pregunta del moderador con tu postura inicial. "
"Sé conciso: máximo 3 frases. Ve al grano, sin preámbulos."
)
else:
instruction = (
"Lee el debate y responde al último argumento del otro debatiente. "
"Indica si estás de acuerdo o no, da tus razones y actualiza tu postura "
"si procede. Sé conciso: máximo 3 frases. Ve al grano, sin preámbulos."
)
messages = [
SystemMessage(content=persona["system"]),
HumanMessage(content=f"{history}\n\n{instruction}"),
]
reply = llm.invoke(messages).content
line = f"{persona['name']}: {reply}"
print(f"\n--- {persona['name']} ({persona['role']}) ---\n{reply}\n")
return {"transcript": state["transcript"] + [line]}
return node
def moderator_close(state: DebateState) -> dict:
"""Thalen resume el debate y emite veredicto."""
history = "\n\n".join(state["transcript"])
instruction = (
"Resume brevemente los puntos clave del debate y di tu opinión sobre" \
"la cuestión planteada, debe ser la tuya lo que piensas tú después "
"de haber escuchado a ambos debatientes. " \
"Sé conciso: máximo 5 frases. Ve al grano, sin preámbulos."
)
messages = [
SystemMessage(content=THALEN["system"]),
HumanMessage(content=f"{history}\n\n{instruction}"),
]
verdict = llm_thalen.invoke(messages).content
print(f"\n--- {THALEN['name']} (veredicto) ---\n{verdict}\n")
return {"verdict": verdict}
7. Con el grafo, las conexiones entre los nodos.
AGENTS = [LYRA, ERYON]
LLMS = [llm_lyra, llm_eryon]
builder = StateGraph(DebateState)
# Añadimos los nodos fijos, los del moderador
builder.add_node("moderator_open", moderator_open)
builder.add_node("moderator_close", moderator_close)
# Y el resto de nodos de forma dinámica
turn_names = []
for t in range(NUM_TURNS):
idx = t % 2
persona = AGENTS[idx]
llm = LLMS[idx]
name = f"turn_{t}_{persona['name'].split()[0].lower()}"
builder.add_node(name, agent_turn(persona, llm))
turn_names.append(name)
builder.add_edge(START, "moderator_open")
builder.add_edge("moderator_open", turn_names[0])
for a, b in zip(turn_names, turn_names[1:]):
builder.add_edge(a, b)
builder.add_edge(turn_names[-1], "moderator_close")
builder.add_edge("moderator_close", END)
# Compilamos. Convertimos todo el grafo en un objeto ejecutable
graph = builder.compile()
8. Y ya podemos ejecutar el sistema. En la vida real, claro está, la pregunta inicial se recogería de algún sistema externo.
if __name__ == "__main__":
initial_state: DebateState = {
"question": "¿El fin justifica los medios?",
"transcript": [],
"verdict": "",
}
result = graph.invoke(initial_state)
print("\n========================================")
print("VEREDICTO FINAL")
print("========================================")
print(result["verdict"])
Es más confuso ir leyéndolo así que verlo de corrido, por lo que invito al lector interesado en que lo copie de seguido o consulte este gist.
6. Epílogo, cuando 2 + 2 no son 5
Para comprobar que el sistema funciona se necesitaría preparar algo más complejo, preparar una batería de cuestiones de diversa naturaleza -matemática, histórica, lingüística, etcéra- y comparar el resultado que ofrece el sistema multi-agente con técnica MAD con el que da un modelo por separado. No tengo los tokens necesarios para hacer algo así, por lo que me remito a los artículos mencionados, pero sí he podido comprobar algunas cosas curiosas.
Cuando se le plantea al sistema una cuestión que no tiene una respuesta clara, enmarcada en un sistema de lógica cerrada, como la programación o las matemáticas, el debate es muy enriquecedor.
Por ver un caso, a la pregunta sobre si el fin justifica los medios los agentes, siguiendo las instrucciones, respondieron de forma encontrada y eso generó una discusión razonable donde uno y otro defendieron su posición de forma más o menos fundamentada. E insisto en esto, no digo que fuera correcta, sino plausible dado el personaje.
Lyra, por ejemplo, dijo que:
No existe una justificación universal para esa afirmación, ya que depende de definiciones operacionales claras de "fin" y "medio". Desde una perspectiva empírica, cualquier medio introduce variables que pueden alterar irreversiblemente el resultado, invalidando la relación lineal entre ambos. Por tanto, la afirmación es falsa cuando se examina con rigor lógico y científico.
A lo que respondió Eryon que no estaba de acuerdo:
Reducir la cuestión a una ecuación lógica o empírica es un error: la ética no es un experimento de laboratorio, sino un juicio sobre el sufrimiento humano y la dignidad. Los medios no solo alteran el resultado, sino que constituyen el fin mismo en su desarrollo, y ningún cálculo puede justificar el daño infligido en el camino.
Y así siguieron hasta que terminó el debate y Thalen llegó a una conclusión, quizás demasiado equidistante, que resumía bien el debate.
Puntos clave: Lyra defiende una ética consecuencialista pero matizada, donde los medios no son neutros y deben minimizar el daño empírico total; Eryon sostiene un enfoque deontológico, donde la dignidad humana es un límite infranqueable que ningún fin puede justificar. Ambos coinciden en que medios y fin son inseparables, pero discrepan en si el daño cuantificable basta para legitimar un acto. En mi opinión, la postura de Eryon es más coherente al preservar un principio ético irreductible, pero la de Lyra ofrece una herramienta útil para navegar dilemas concretos donde los absolutos se enfrentan a lo práctico. La verdadera fortaleza del debate radica en que ambas posiciones exponen que el fin nunca justifica los medios de manera universal: la respuesta depende del marco moral que se elija y, sobre todo, de lo que estemos dispuestos a sacrificar en el proceso.
Sin embargo, cuando la cuestión tiene una respuesta inequívoca como resultado de obedecer a unas reglas prefijadas de antemano, el debate a veces les llevó a sostener argumentos un poco disparatados. Creativos, sí, pero peores que si les hubiéramos formulado esa misma cuestión a un agente individual con la temperatura baja, como fue el caso de preguntarse si 2 + 2 son 5?
Recojo solo la conclusión final:
--- Thalen Orvys (veredicto) ---
**Resumen del debate:**
Lyra defiende que "2+2=5" es falso en la aritmética convencional, un sistema cerrado y coherente. Eryon sostiene que las matemáticas son un constructo humano, y que la frase puede tener validez metafórica, emocional o ética según el contexto. Ambos hablan desde marcos distintos: lógico-formal versus sociocultural.
**Mi opinión:**
El debate no es sobre matemáticas, sino sobre qué tipo de verdad se invoca. Lyra gana si hablamos de hechos objetivos; Eryon, si hablamos de significado humano. Sin embargo, al ser la premisa inicial "2+2 son 5", la carga de la prueba recae en quien defiende lo fáctico. La postura de Eryon es interesante, pero no refuta el error lógico: una metáfora no convierte lo falso en verdadero. Prefiero el rigor de Lyra: sin hechos compartidos, no hay debate racional posible.
Aunque también es cierto, que en otras cuestions inequívocas sí llegaron a una conclusión correcta, como fue el caso de preguntar ¿qué color sale de mezclar rojo y azul?
Aunque Eryon empezó a desvariar un poco...
Estoy de acuerdo con Lyra en el plano técnico, pero disiento en su reducción del color a un mero fenómeno físico. El púrpura no es solo magenta o violeta: es el color de la herida que sangra y se cura, de la pasión contenida por la razón. Mezclar azul y rojo no es neutro, es un acto humano que produce un tono cargado de significado. La ciencia describe, pero la filosofía interpreta; el color es, ante todo, experiencia vivida.
Thalen llegó a la conclusión correcta.
El debate ha enfrentado dos enfoques legítimos: Lyra defiende una verdad física objetiva y medible, mientras Eryon reclama una dimensión simbólica y humana inseparable del hecho cromático. En mi opinión, la pregunta original se refería al resultado material de una mezcla, donde Lyra ofrece una respuesta precisa y verificable. La interpretación cultural o emocional del color, aunque valiosa, es un plano distinto que no modifica la realidad óptica. Considero que el argumento de Lyra responde mejor a la cuestión planteada.
Es probable que el sistema funcione mejor si cuenta con un juez epistemológico, un agente que arbitre qué afirmaciones cuentan como válidas según un criterio de verdad explícito. Es decir, un agente guardrail, separado del moderador que evalúe sin ambigüedades si algo es verdadero o falso en el marco planteado.
Me explico mejor. En el debate, al menos en este caso tan sencillo, no se busca la verdad, sino ganar. Y eso, que en un humano llamamos retórica, en un sistema multi-agente se convierte en un problema de diseño. Lyra y Eryon no convergen porque uno convenza al otro con evidencia, sino porque el moderador arbitra quién ha argumentado mejor dentro de las reglas del juego que ellos mismos se han dado. En preguntas abiertas eso es suficiente, incluso enriquecedor. En preguntas con respuesta correcta, puede convertirse un sofisma bien vestido, en la maldición de la elocuencia que veíamos al principio de este artículo.
El paper de Du et al. mide la mejora en benchmarks matemáticos y de razonamiento estratégico, dominios donde existe un árbitro externo e incorruptible: la respuesta correcta. Pero en cuanto sales de ese territorio, la pregunta que queda sin responder es una vez más: ¿quién vigila al juez, al vigilante? Thalen decide que Lyra gana porque su argumento es más riguroso. Pero Thalen es también un modelo de lenguaje optimizado para la plausibilidad lingüística, no para la verdad. El sistema ha resuelto el problema de la sicofantía individual creando una sicofantía colectiva más sofisticada.
Lo que le faltaría, por lo tanto, a MAD, al menos en este pequeño experimento, y lo que lo convertiría en algo cualitativamente distinto, no son más agentes ni más rondas, sino un árbitro que no debata, un agente guardrail con acceso a criterios de verdad externos al propio lenguaje, ya sea lógica formal, ejecución de código, consulta a bases de datos verificadas o incluso intervención humana puntual. Sin esa pieza, el sistema puede embuclarse a la que falle uno de los agentes y propague el disparate al resto.
Otro día veremos cómo intentar controlar ese tipo de prompts disparatados, pero por hoy vamos a dejarlo aquí.
7. Referencias
- Du, Yilun; Li, Shuang; Torralba, Antonio; Tenenbaum, Joshua B.; Mordatch, Igor. Improving Factuality and Reasoning in Language Models through Multiagent Debate. arXiv preprint arXiv:2305.14325, 2023. arXiv:2305.14325.
- Irving, Geoffrey; Christiano, Paul; Amodei, Dario. AI Safety via Debate. arXiv preprint arXiv:1805.00899, 2018. arXiv:1805.00899.
- Li, Yunxuan; Du, Yibing; Zhang, Jiageng; Hou, Le; Grabowski, Peter; Li, Yeqing; Ie, Eugene. Improving Multi-Agent Debate with Sparse Communication Topology. arXiv preprint arXiv:2406.11776, 2024. (arXiv:2406.11776)[https://arxiv.org/abs/2406.11776].