Mixture-of-Agents (MoA)

[object Object]

Mixture-of-Agents (MoA, смесь агентов) — техника, при которой несколько LLM организованы в слои: на первом слое proposers генерируют разные варианты ответа, на следующих слоях aggregators синтезируют и улучшают их. Ключевое наблюдение: модель нередко пишет лучший ответ, когда видит несколько альтернативных версий решения.

В 2026 году MoA лучше воспринимать не как универсальную замену сильной single-model, а как ensemble pattern для quality-over-latency маршрутов. Это не дефолт для чатов, а специальный режим для задач, где цена ответа выше цены дополнительных вызовов.

Представьте консилиум врачей. Сначала три специалиста (терапевт, хирург, невролог) независимо изучают пациента и ставят свои диагнозы. Затем главный врач читает все три мнения и составляет итоговое заключение, учитывая лучшее из каждого. Mixture-of-Agents работает так же: несколько моделей дают свои ответы, а модель-агрегатор собирает из них лучший финальный ответ.

Суть в двух словах

MoA использует свойство LLM, которое авторы называют «collaborativeness» — способность модели улучшать свой ответ, когда она видит ответы других моделей. Даже если эти «другие» модели слабее.

Архитектура: несколько слоёв, в каждом — набор моделей. Модели первого слоя получают задачу и отвечают независимо. Модели следующего слоя получают задачу + все ответы предыдущего слоя и генерируют улучшенный ответ. На последнем слое — один aggregator, который выдаёт финальный результат.

ПромптClaude
Ты — aggregator в системе Mixture-of-Agents. Вот ответы трёх моделей на вопрос «Как объяснить квантовые вычисления простыми словами?»

**Модель A:** Квантовые компьютеры используют кубиты вместо битов. Кубит может быть и 0, и 1 одновременно благодаря суперпозиции. Это позволяет проверять множество вариантов параллельно.

**Модель B:** Обычный компьютер перебирает варианты по одному, квантовый — все сразу. Это как если бы вы искали книгу в библиотеке: обычный компьютер проверяет полку за полкой, а квантовый смотрит на все полки одновременно.

**Модель C:** Квантовые вычисления основаны на суперпозиции и запутанности. Суперпозиция = кубит в двух состояниях одновременно. Запутанность = два кубита связаны. Практическое применение: криптография, поиск лекарств, оптимизация.

Синтезируй лучший ответ из трёх, взяв сильные стороны каждого.
Ответ модели

Квантовые вычисления простыми словами

Обычный компьютер работает с битами — нулями и единицами. Квантовый компьютер использует кубиты, которые благодаря суперпозиции могут быть и 0, и 1 одновременно.

Аналогия: представьте библиотеку, где нужно найти одну книгу. Обычный компьютер проверяет полки по очереди. Квантовый компьютер «смотрит» на все полки одновременно.

Второе ключевое свойство — запутанность: кубиты связаны между собой, изменение одного мгновенно влияет на другой. Суперпозиция + запутанность вместе позволяют обрабатывать огромное число вариантов параллельно.

Практически это полезно для задач, где нужно перебрать множество вариантов: взлом шифров, поиск новых лекарств, оптимизация маршрутов.

MoA даёт максимальный выигрыш при генерации текстов (эссе, обзоры, объяснения), где разные модели дают разные перспективы. Менее эффективна для задач с единственным правильным ответом (математика, код), где Self-Consistency или мажоритарное голосование проще и дешевле.

Как работает Mixture-of-Agents

Свойство collaborativeness

Авторы обнаружили, что LLM дают лучшие ответы, когда видят ответы других моделей — даже более слабых. Это свойство назвали «collaborativeness». Модели делятся на:

  • Proposers — модели, чьи ответы полезны для других (хорошие «доноры»)
  • Aggregators — модели, которые хорошо синтезируют чужие ответы

Не все модели одинаково хороши в обеих ролях. Например, WizardLM — отличный proposer, но слабый aggregator.

Архитектура слоёв

Бенчмарки

AlpacaEval 2.0 LC Win Rate (%)
MoA (open-source)65%
GPT-4o57%
Claude 3 Opus40%
Llama 3 70B34%
Одна модель (GPT-4o)
AlpacaEval 2.0: 57.5% MT-Bench: 9.18 Одна точка отказа Стоимость: $5-15 / 1M токенов
MoA (6 open-source моделей)
AlpacaEval 2.0: 65.1% (+7.6%) MT-Bench: 9.40 Отказоустойчивость — redundancy Стоимость: $2-5 / 1M токенов (open-source)

Плюсы

  • Open-source MoA побеждает GPT-4o (65.1% vs 57.5%)
  • Разнообразие перспектив: разные модели замечают разные аспекты
  • Отказоустойчивость: сбой одной модели не ломает всю систему
  • Гибкость: можно менять модели без переобучения
  • Масштабируемость: добавление слоёв и моделей улучшает качество

Минусы

  • Высокая задержка: 3 слоя × 6 моделей = 18 LLM-вызовов
  • Стоимость: даже open-source модели требуют GPU
  • Инфраструктурная сложность: развернуть и мониторить множество моделей
  • Не все задачи выигрывают: для math/code мажоритарное голосование проще
MoA с 3 слоями × 3 модели = 9 LLM-вызовов (часть можно параллелить). Задержка финального ответа — минимум 3 последовательных LLM-вызова. Для real-time приложений (чат-боты) это может быть неприемлемо. MoA лучше подходит для пакетной обработки и задач, где качество важнее скорости.

Как понимать MoA в 2026

Сегодня MoA логично ставить рядом с best-of-N generation, evaluator-optimizer loops, ensemble reranking и cross-model review. То есть основная ценность подхода не в “агентности” как таковой, а в controlled diversity. Вы получаете несколько кандидатных траекторий и заставляете более сильный слой их собирать, фильтровать и улучшать.

Где техника реально окупается

MoA особенно оправдан там, где:

  • качество ответа критичнее latency;
  • разные модели действительно вносят разные сильные стороны;
  • downstream стоимость ошибки выше стоимости дополнительных инференсов.

Типичные сценарии: long-form writing, technical synthesis, research summaries, evaluation datasets и offline batch generation.

Где MoA становится слишком тяжёлым

Подход быстро теряет смысл, если ответы и так достаточно хороши в single-model режиме, proposers слабо отличаются и дают почти одинаковые варианты, а агрегатор не умеет реально критиковать, а просто красиво склеивает. Поэтому в production MoA обычно стоит включать точечно, по дорогим маршрутам, а не как универсальный слой на весь трафик.

ПромптChatGPT
Я хочу реализовать MoA для задачи «написание технических обзоров». Какой набор моделей-proposers и aggregator ты рекомендуешь, и почему?
Ответ модели

Рекомендуемая конфигурация для технических обзоров:

Proposers (слой 1) — 3 модели с разными сильными сторонами:

  1. Llama 3.1 70B — хорошее техническое понимание, детальные объяснения
  2. Qwen2.5 72B — сильная в структурировании, хорошие сравнительные таблицы
  3. Mixtral 8x22B — разнообразный стиль, нестандартные перспективы

Aggregator (финальный слой): Claude Sonnet — отлично синтезирует, структурирует, поддерживает единый стиль

Почему:

  • Разные «школы обучения» дают разные перспективы на одну тему
  • Llama хорош в фактах, Qwen в структуре, Mixtral в неожиданных инсайтах
  • Claude как aggregator соединяет всё в связный, стилистически единый текст

Альтернатива (бюджетная): все proposers на Llama 3.1 8B (разные temperature), aggregator — Llama 3.1 70B.

Техническая реализация

MoA pipeline с asyncio

import asyncio
from dataclasses import dataclass
from openai import AsyncOpenAI

@dataclass
class MoAConfig:
    """Конфигурация Mixture-of-Agents."""
    proposers: list[str]       # модели для генерации
    aggregator: str            # модель для синтеза
    n_layers: int = 2          # количество слоёв (1 = proposers + aggregator)
    temperature: float = 0.7


async def call_model(
    client: AsyncOpenAI,
    model: str,
    system: str,
    user: str,
    temperature: float = 0.7
) -> str:
    """Вызов одной модели."""
    resp = await client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": user}
        ],
        temperature=temperature
    )
    return resp.choices[0].message.content


PROPOSER_SYSTEM = "Дай подробный, вдумчивый ответ на вопрос."

AGGREGATOR_SYSTEM = """Ты — aggregator в системе Mixture-of-Agents.
Тебе даны ответы нескольких моделей на один вопрос.
Синтезируй лучший финальный ответ:
- Возьми сильные стороны каждого ответа
- Исправь ошибки и неточности
- Дай связный, структурированный итог
- Не упоминай, что ты синтезируешь ответы других моделей"""

REFINER_SYSTEM = """Тебе даны несколько ответов на вопрос.
Улучши их: исправь неточности, добавь пропущенное, убери избыточное.
Дай свой улучшенный ответ."""


async def moa_layer(
    client: AsyncOpenAI,
    task: str,
    models: list[str],
    prev_responses: list[str] | None,
    system: str,
    temperature: float
) -> list[str]:
    """Один слой MoA: параллельные вызовы моделей."""
    if prev_responses:
        refs = "\n\n".join(
            f"--- Ответ {i+1} ---\n{r}"
            for i, r in enumerate(prev_responses)
        )
        user_prompt = f"Вопрос: {task}\n\nОтветы предыдущего слоя:\n{refs}\n\nДай свой улучшенный ответ."
    else:
        user_prompt = task

    tasks = [
        call_model(client, model, system, user_prompt, temperature)
        for model in models
    ]
    return await asyncio.gather(*tasks)


async def mixture_of_agents(
    task: str,
    config: MoAConfig,
    base_url: str | None = None
) -> str:
    """Полный pipeline Mixture-of-Agents."""
    client = AsyncOpenAI(base_url=base_url)

    responses = None

    # Слои proposers / refiners
    for layer in range(config.n_layers):
        system = PROPOSER_SYSTEM if layer == 0 else REFINER_SYSTEM
        responses = await moa_layer(
            client, task, config.proposers,
            responses, system, config.temperature
        )

    # Финальная агрегация
    refs = "\n\n".join(
        f"--- Ответ {i+1} ---\n{r}"
        for i, r in enumerate(responses)
    )
    final = await call_model(
        client, config.aggregator, AGGREGATOR_SYSTEM,
        f"Вопрос: {task}\n\nОтветы:\n{refs}",
        temperature=0.3
    )

    return final


# Пример использования
async def main():
    config = MoAConfig(
        proposers=[
            "meta-llama/Llama-3-70b-chat-hf",
            "Qwen/Qwen2.5-72B-Instruct",
            "mistralai/Mixtral-8x22B-Instruct-v0.1"
        ],
        aggregator="meta-llama/Llama-3-70b-chat-hf",
        n_layers=2,
        temperature=0.7
    )

    result = await mixture_of_agents(
        task="Объясни разницу между RAG и fine-tuning для продакшена",
        config=config,
        base_url="https://api.together.xyz/v1"  # Together AI API
    )
    print(result)

# asyncio.run(main())

Бюджетный вариант: одна модель, разные temperature

async def budget_moa(
    task: str,
    model: str = "gpt-4o-mini",
    n_proposers: int = 5,
    temperatures: list[float] | None = None
) -> str:
    """
    Бюджетный MoA: одна модель с разными temperature.
    Дешевле полноценного MoA, но даёт часть выигрыша.
    """
    client = AsyncOpenAI()
    temps = temperatures or [0.3, 0.5, 0.7, 0.9, 1.1]

    # Генерация разнообразных ответов
    tasks = [
        call_model(client, model, PROPOSER_SYSTEM, task, t)
        for t in temps[:n_proposers]
    ]
    proposals = await asyncio.gather(*tasks)

    # Агрегация
    refs = "\n\n".join(
        f"--- Вариант {i+1} ---\n{r}"
        for i, r in enumerate(proposals)
    )
    return await call_model(
        client, model, AGGREGATOR_SYSTEM,
        f"Вопрос: {task}\n\nВарианты:\n{refs}",
        temperature=0.2
    )
  1. Одинаковые модели без разнообразия — если все proposers идентичны и temperature=0, вы получите одинаковые ответы. Используйте разные модели или разные temperature.
  2. Слишком много слоёв — больше 3 слоёв редко даёт прирост, но умножает стоимость и задержку. Оптимально: 2 слоя (proposers + aggregator).
  3. Aggregator слабее proposers — aggregator должен быть самой сильной моделью в пуле. Слабый aggregator не сможет качественно синтезировать сильные ответы.

Проверьте себя

Проверьте себя

1. Что такое collaborativeness в контексте MoA?

2. Какой результат MoA показала на AlpacaEval 2.0?

3. Какая роль должна быть у самой сильной модели в MoA?