Что такое 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

Рассмотрим вариант с двумя агентами (Агент А и Агент Б). Обобщённый пайплайн:

  1. Initial generation — каждый агент независимо генерирует ответ на запрос пользователя (например, решить математическую задачу).
  2. Critique round — каждый агент получает ответ другого и пишет критику: находит фактические ошибки, логические нестыковки, предлагает улучшения.
  3. Revision round — каждый агент дорабатывает свой первоначальный ответ с учётом критики оппонента.
  4. Repeat — шаги 2–3 повторяются 2–3 раза (обычно 3 итерации дают наибольший прирост качества).
  5. 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)