Что такое multi-agent debate и как он улучшает качество ответов?
Краткий тезис
Multi-agent debate — это техника, в которой несколько LLM-агентов (обычно 2–5) последовательно генерируют, критикуют и улучшают ответы на сложный запрос, имитируя научную дискуссию. Каждый раунд агенты обмениваются аргументами, выявляют логические ошибки и достигают консенсуса. Это повышает точность на 10–20% в задачах рассуждения, математики и факт-чекинга за счёт итеративной самокоррекции, но требует O(n²) вызовов LLM.
1. Определение и базовая идея
Multi-agent debate (многоагентная дискуссия) — это подход, при котором несколько LLM-агентов (автономных копий или экземпляров языковой модели с разными ролями) сообща решают задачу. В отличие от простого ансамблирования (голосования по независимым ответам), агенты активно взаимодействуют: один предлагает решение, другой указывает на ошибки, третий предлагает альтернативу, и так несколько итераций, пока не будет достигнут консенсус или не выявится лучший ответ.
Процесс вдохновлён научными дебатами и командной работой, где критика коллег устраняет слепые пятна одного исследователя. В контексте LLM это позволяет компенсировать известные слабости моделей — склонность к галлюцинациям, логическим ошибкам и предвзятости.
2. Отличие от ансамблирования и self-consistency
| Техника | Взаимодействие агентов | Использование контекста | Типичное качество |
|---|---|---|---|
| Простое голосование (majority vote) | Нет; каждый генерирует ответ независимо | Только свой ответ | Базовый уровень |
| Self-consistency (Wang et al.) | Нет; один агент генерирует несколько траекторий, затем голосование | Разные траектории одной модели | +5–10% по сравнению с greedy decoding |
| Multi-agent debate | Да; агенты обмениваются ответами и критикой в раундах | Чужие аргументы, критика, исправления | +10–20% для сложных рассуждений |
Ключевое отличие — итеративное взаимодействие. В debate агенты не просто усредняют мнения, а активно исправляют друг друга, что приводит к более глубокому анализу.
3. Типовой pipeline multi-agent debate
Рассмотрим вариант с двумя агентами (Агент А и Агент Б). Обобщённый пайплайн:
- Initial generation — каждый агент независимо генерирует ответ на запрос пользователя (например, решить математическую задачу).
- Critique round — каждый агент получает ответ другого и пишет критику: находит фактические ошибки, логические нестыковки, предлагает улучшения.
- Revision round — каждый агент дорабатывает свой первоначальный ответ с учётом критики оппонента.
- Repeat — шаги 2–3 повторяются 2–3 раза (обычно 3 итерации дают наибольший прирост качества).
- Final voting — после последней итерации все ответы собираются, и применяется голосование (чаще всего — независимое оценивание каждым агентом всех финальных ответов, выбор лучшего). Либо можно просто взять ответ агента с наибольшей уверенностью.
Пример промпта для агента-критика:
«Вы — критик. Проанализируйте следующий ответ. Найдите логические ошибки, неполноту, несоответствие фактам. Напишите, как можно исправить. Ответ: {...}»
Пример промпта для агента-ревизора:
«Вы — решатель. Получив критику, исправьте свой ответ. Учтите все замечания и предложите улучшенный вариант.»
4. Почему это работает? Механизмы улучшения
Debate улучшает качество ответов благодаря нескольким когнитивным механизмам:
- Диверсификация гипотез — разные агенты могут по-разному интерпретировать запрос, что увеличивает покрытие возможных решений.
- Взаимная критика — один агент может заметить ошибку, которую другой не видит (эффект «свежего взгляда»). Это снижает overconfidence (чрезмерную уверенность модели в своём первоначальном ответе).
- Итеративная самокоррекция — в процессе агенты не только исправляют ошибки, но и узнают новые аргументы, расширяют своё понимание задачи.
- Консенсус как фильтр — если после нескольких раундов множество агентов сходятся на одном ответе, он с высокой вероятностью верен (эффект «мудрости толпы»).
Исследования (Du et al., 2023; Liang et al., 2023) показывают, что debate особенно эффективен для задач, требующих многошагового рассуждения, где один прямой запрос к LLM часто даёт сбой.
5. Примеры задач, где multi-agent debate эффективен
- Математические задачи (GSM8K, MATH): агенты проверяют вычисления друг друга.
- Логические рассуждения (ProntoQA, HotpotQA): выявление противоречий в цепочке умозаключений.
- Факт-чекинг и верификация утверждений — один агент утверждает факт, другой ищет контраргументы.
- Юридический анализ — моделирование позиций защиты и обвинения.
- Генерация кода — агенты-программисты рецензируют и исправляют код друг друга.
В каждом из этих случаев debate помогает отсеять ошибочные рассуждения, которые модель не может обнаружить сама.
6. Метрики и ожидаемый прирост качества
Типичные метрики для оценки улучшения:
- Accuracy (точность) на задачу — процент правильных ответов.
- Consistency — процент примеров, где финальный ответ стабилен при повторных запусках (debate часто повышает воспроизводимость).
- Faithfulness — насколько ответ соответствует заданному контексту (если контекст есть).
Ожидаемый прирост accuracy:
| Тип задачи | Базовый LLM (greedy) | Self-consistency (n=5) | Multi-agent debate (2 агента, 3 раунда) |
|---|---|---|---|
| GSM8K (математика) | ~55% | ~65% | ~72% |
| HotpotQA (рассуждение) | ~60% | ~68% | ~75% |
| Fact-checking | ~70% | ~74% | ~82% |
Цифры приблизительные, но тренд ясен: debate даёт дополнительный буст в 5–10 процентных пунктов поверх self-consistency.
7. Компромиссы и цена (O(n²) вызовов)
Основной недостаток — вычислительная стоимость. Если у нас N агентов и K раундов, то общее число вызовов LLM:
- Initial generation: N вызовов.
- Каждый раунд critique + revision: на каждую пару агентов? В простейшей реализации каждый агент получает все ответы других (N-1) и пишет критику, затем каждый исправляет свой. Это 2 × (N-1) × K вызовов для N агентов? Точнее: в каждом раунде каждый агент генерирует критику на чужие ответы (N-1) и исправляет свой (1). Итого (N-1 + 1) = N вызовов на агента за раунд. Таким образом, за K раундов — N × K вызовов, а с учётом initial — N(1+K). Но часто критику и ревизию объединяют в один промпт, тогда N × (1 + K). Для N=2, K=3 это 8 вызовов. Для N=3, K=3 — 12 вызовов. Если же реализовать полное взаимное рецензирование (каждый оценивает каждого), то количество растёт как O(N²) за раунд. В литературе обычно используют 2–3 агента и 2–3 раунда, чтобы компромисс был приемлем.
Другие компромиссы:
- Latency (задержка) — каждый раунд добавляет время вызова LLM, итоговое время может быть в 5–10 раз больше, чем один запрос.
- Cost (стоимость) — пропорционально числу токенов, которые генерируются во всех раундах.
- Сложность реализации — нужно управлять состоянием агентов, очередями сообщений, промптами для критики.
8. Варианты реализации (роли, промпты, количество итераций)
Роли агентов могут быть однородными (все одинаковые, но с разными seed) или специализированными:
- Advocate — защищает первоначальный ответ.
- Critic — ищет слабые места.
- Mediator — оценивает аргументы и предлагает синтез.
Выбор числа агентов и раундов:
- 2 агента — минимальная конфигурация, даёт заметное улучшение.
- 3–4 агента — для сложных задач с высокой неопределённостью.
- Больше 5 агентов обычно не нужно: прирост качества насыщается, а стоимость растёт квадратично.
Количество раундов:
- 1 раунд (одна критика) — улучшение уже заметно.
- 2–3 раунда — оптимально.
- Более 3 раундов приводит к зацикливанию (агенты начинают соглашаться без существенных изменений).
Пример реализации на Python (псевдокод):
class DebateAgent:
def __init__(self, [model](/wiki/model), role_prompt):
self.[model](/wiki/model) = [model](/wiki/model)
self.[role](/wiki/Role) = role_prompt
def generate_response(self, [query](/wiki/Query)):
return self.[model](/wiki/model)([prompt](/wiki/prompt)=self.[role](/wiki/Role) + [query](/wiki/Query))
def [critique](/wiki/Critique)(self, other_response):
return self.[model](/wiki/model)([prompt](/wiki/prompt)=f"Критикуй ответ: {other_response}")
def revise(self, my_response, [critique](/wiki/Critique)):
return self.[model](/wiki/model)([prompt](/wiki/prompt)=f"Исправь ответ {my_response} с учётом: {[critique](/wiki/Critique)}")
def multi_agent_debate([query](/wiki/Query), n_agents=2, n_rounds=3):
agents = [DebateAgent([model](/wiki/model), [role](/wiki/Role)) for [role](/wiki/Role) in [roles](/wiki/Roles)[:n_agents]]
[responses](/wiki/responses) = [a.generate_response([query](/wiki/Query)) for a in agents]
for _ in range(n_rounds):
critiques = [578. Что такое agentic loop и как он работает?](/answers/578)
---
## Навигация
- Предыдущий: [580](/answers/580)
- Следующий: [582](/answers/582)
- Индекс: [00. Индекс разборов](/answers)