Истина через столкновение мнений

Одинокая LLM уверенно выдаёт ответ — и так же уверенно ошибается, не замечая своих слабых мест (мы разбирали это в уроке про проверку и критику). Reflection добавлял одного критика. Debate идёт дальше: несколько агентов активно спорят об ответе. Каждый не просто оценивает — он защищает свою версию и атакует чужие. Слабый аргумент под перекрёстным огнём разваливается, сильный — выдерживает и укрепляется.

Идея давняя: так устроены научная дискуссия, судебный процесс, парламентские дебаты. Общество веками использует спор как механизм отсеивания плохих идей. Multi-agent debate переносит это на агентов: несколько «умов» с разными позициями честнее одного, потому что вынуждены обосновывать себя и отвечать на возражения.

ℹ️ Debate ≠ ансамбль/голосование

Не путай с простым ансамблем (voting из урока про параллелизм), где N агентов независимо дают ответ, а мы берём большинство. В Debate агенты видят ответы друг друга и реагируют — спорят раунд за раундом. Голосование — параллельное и «слепое»; дебаты — итеративные и «зрячие»: аргументы влияют друг на друга.

Как устроены дебаты

Каноническая схема: несколько дебатёров (обычно 2–3) получают вопрос и дают первые ответы с обоснованием. Дальше идут раунды: каждый видит ответы оппонентов, критикует их и уточняет/защищает свой. После нескольких раундов судья (отдельный агент) читает всю дискуссию и выносит вердикт — какой ответ победил (или синтезирует итог).

100%
колёсико — масштаб  ·  зажать и тянуть — перемещение
дебатёры (спорят N раундов) агент A позиция 1 агент B позиция 2 критикуют друг друга ↕ раунд ×N судья читает спор → вердикт ответ вся дискуссия → дебатёры видят ответы друг друга и спорят раунды → судья выбирает победивший
Debate: скелет (концептуально)
python
debaters = [agent("оптимист"), agent("скептик")]   # разные позиции
transcript = []

# первый раунд — независимые ответы
for d in debaters:
    transcript.append(d.answer(question))

# раунды спора: каждый видит чужие ответы и отвечает
for _ in range(N_ROUNDS):
    for d in debaters:
        transcript.append(d.rebut(question, transcript))   # критикует + уточняет

# судья выносит вердикт по всей дискуссии
verdict = judge.decide(question, transcript)

Обрати внимание на две вещи. Во-первых, дебатёрам полезно дать разные роли/позиции (оптимист vs скептик, «за» vs «против») — иначе они быстро согласятся и спорить будет не о чем. Во-вторых, судья — отдельный агент: он не участвовал в споре, поэтому оценивает беспристрастнее (тот же принцип независимого критика).

Когда спор реально помогает

Debate — дорогой паттерн (много раундов × много агентов = много вызовов LLM), поэтому применять его надо там, где он окупается.

✅ Debate помогает
  • сложные рассуждения, где легко ошибиться
  • спорные вопросы без очевидного ответа
  • высокая цена ошибки (важные решения)
  • задачи, где нужна проверка логики аргументами
❌ Debate лишний
  • простые фактологические вопросы
  • есть объективная проверка (тесты, факт) → verifier
  • важны скорость и цена
  • ответ очевиден — спорить не о чем
✅ Где есть «истина» — бери verifier, не debate

Если ответ можно объективно проверить (код проходит тесты, факт есть в источнике), спор — не лучший инструмент: дешевле и надёжнее верификатор из урока про проверку и критику. Debate силён там, где нет однозначной проверки, а качество зависит от рассуждения: стратегические решения, оценки, сложная логика, этические дилеммы. Спор проверяет аргументы, когда проверить факт нельзя.

Сходимость и её ловушки

Хороший спор сходится: с раундами позиции сближаются к обоснованному ответу. Но у сходимости две ловушки, которые важно контролировать.

  • Ложный консенсус (конформизм). Агенты — вежливые LLM, склонные соглашаться. Есть риск, что они быстро «поддакнут» друг другу и сойдутся на неверном ответе, не поспорив по-настоящему. Лечится жёсткими ролями («ты обязан оспаривать») и температурой/разнообразием.
  • Отсутствие сходимости. Наоборот — агенты упираются каждый в своё и спорят бесконечно. Нужен лимит раундов и решающий голос судьи.
⚠️ Лимит раундов и судья — обязательны

Debate — это цикл, а значит нужен предохранитель: фиксированное число раундов (обычно 2–3, дальше прирост качества падает, а стоимость растёт) плюс судья, который обязан вынести вердикт. Без этого спор либо зациклится, либо выродится в поддакивание. И следи за разнообразием позиций — если дебатёры одинаковые, спора не выйдет.

Debate среди паттернов

Паттерн Агенты работают Суть
Supervisor / Pipeline / Swarm над разными частями распределение работы
Voting (ансамбль) над одним, независимо параллельно + большинство
Reflection автор + один критик self-critique петля
Debate над одним, споря столкновение аргументов + судья

Debate — «тяжёлая артиллерия» повышения качества: дороже голосования и Reflection, но и глубже — потому что аргументы проверяются в столкновении, а не просто складываются. Резервируй его для действительно трудных вопросов.

Типичные ошибки

❌ Ошибка 1: одинаковые дебатёры

Если у агентов нет разных позиций/ролей, они мгновенно согласятся — спора не будет. Задавай противоположные установки («защищай A» / «защищай B»).

❌ Ошибка 2: ложный консенсус

Вежливые модели склонны поддакивать и сходиться на неверном. Требуй в промпте активно оспаривать и не соглашаться без веских причин.

❌ Ошибка 3: нет лимита раундов и судьи

Без предела спор зациклится, без судьи — не будет итога. Фиксируй число раундов (2–3) и обязательный вердикт.

❌ Ошибка 4: Debate для простого/проверяемого

Для фактов и задач с объективной проверкой спор — дорого и излишне. Там нужен verifier, а Debate — для трудных рассуждений без явной проверки.

Шпаргалка

Debate — всё в одном месте
text
ПАТТЕРН: N агентов спорят над ОДНИМ вопросом → судья выбирает ответ
  каждый ЗАЩИЩАЕТ свою позицию и АТАКУЕТ чужие → слабое отсеивается

DEBATE ≠ VOTING:
  voting — независимо, «слепо», параллельно, большинство
  debate — видят друг друга, спорят раундами, судья решает

СХЕМА:
  дебатёры (разные позиции!) → первые ответы →
  раунды: критикуют+уточняют (видят чужое) → судья (отдельный) → вердикт

ЛОВУШКИ СХОДИМОСТИ:
  ложный консенсус (поддакивание) → жёсткие роли «оспаривай»
  нет сходимости → лимит раундов + решающий судья

✅ КОГДА: сложные рассуждения · спорные вопросы · высокая цена ошибки
❌ НЕ НАДО: простые факты · есть объективная проверка → VERIFIER · важна цена

СРЕДИ ПАТТЕРНОВ: дороже voting/Reflection, но глубже (аргументы ПРОВЕРЯЮТСЯ)

ПРАВИЛА:
  • РАЗНЫЕ позиции дебатёров (иначе нет спора)
  • промпт: активно оспаривать, не поддакивать
  • лимит раундов (2–3) + обязательный судья
  • где есть «истина» → verifier, а не debate

Практическое задание

Устрой спор агентов:

Задание: дебаты по спорному вопросу

  1. Возьми вопрос без очевидного ответа (например, «стоит ли стартапу с 3 разработчиками сразу переходить на микросервисы?»). Создай двух дебатёров с противоположными позициями и одного судью.
  2. Проведи 2–3 раунда: первый — независимые ответы, дальше — каждый критикует оппонента и уточняет своё, видя всю дискуссию.
  3. Дай судье весь транскрипт и попроси вынести обоснованный вердикт (или синтез). Оцени: стал ли итоговый ответ глубже, чем первый ответ любого дебатёра в одиночку?
  4. Сделай дебатёров одинаковыми (без разных позиций) и увидь ложный консенсус — они быстро согласятся. Верни разные роли.
  5. Сравни стоимость: во сколько раз больше вызовов LLM, чем у одиночного ответа? Оправдан ли Debate для этого вопроса?
  6. Со звёздочкой: возьми фактологический вопрос с проверяемым ответом и покажи, что здесь verifier дешевле и надёжнее дебатов — почувствуй границу применимости.

Что дальше

Мы разобрали четыре топологии координации: Supervisor, Pipeline, Swarm, Debate. Все они опираются на то, как агенты обмениваются данными. Последний урок раздела — про два фундаментальных подхода к этому обмену: shared state против message passing.