Паттерны: оркестратор, конвейер, дебаты
Агентов можно соединять по-разному. Разбираем три базовых топологии и когда какая уместна.
Топология мультиагентной системы — схема, по которой агенты соединены и передают работу: централизованно (оркестратор), линейно (конвейер) или через спор (дебаты).
1. Оркестратор — исполнители
Главный агент-оркестратор получает задачу, разбивает её и раздаёт специализированным исполнителям, затем собирает результаты. Исполнители друг с другом не общаются — всё идёт через центр.
- Плюс: понятный поток, лёгкий контроль, центр видит всю картину.
- Минус: оркестратор — узкое место и единая точка отказа.
- Когда: задача делится на независимые подзадачи разных типов.
2. Конвейер (pipeline)
Агенты выстроены в линию: выход одного — вход следующего. Извлечь → обработать → оформить. Каждый этап делает своё и передаёт дальше.
- Плюс: простая и предсказуемая структура.
- Минус: ошибка раннего этапа тянется дальше; нет возврата назад.
- Когда: этапы известны и идут строго по порядку.
Покажем конвейер из трёх агентов: извлечение → суммирование → отчёт.
def extractor(rows):
# каждая строка вида "товар=цена" -> список цен
return [int(r.split("=")[1]) for r in rows]
def summer(prices):
return sum(prices)
def reporter(total):
return f"Итоговая сумма заказа: {total} руб."
rows = ["хлеб=40", "молоко=80", "сыр=300"]
# выход одного агента — вход следующего
prices = extractor(rows)
total = summer(prices)
report = reporter(total)
print("извлечено:", prices)
print("сумма:", total)
print("отчёт:", report)
Вывод:
извлечено: [40, 80, 300] сумма: 420 отчёт: Итоговая сумма заказа: 420 руб.
3. Дебаты (debate)
Несколько агентов спорят ради качества: один предлагает ответ, другой критикует, иногда третий судит. Спор вскрывает слабые места, которые один агент пропустил бы.
- Плюс: выше качество и надёжность на сложных вопросах.
- Минус: дорого — несколько агентов на одну задачу.
- Когда: цена ошибки высока, нужен «взгляд со стороны».
def proposer(claim):
return "Утверждаю: " + claim
def critic(claim):
objections = {"земля плоская": "противоречит снимкам из космоса"}
return objections.get(claim.lower(), "возражений нет")
def judge(objection):
return "Отклонено" if objection != "возражений нет" else "Принято"
claim = "Земля плоская"
print(proposer(claim))
objection = critic(claim)
print("Критик:", objection)
print("Судья:", judge(objection))
Вывод:
Утверждаю: Земля плоская Критик: противоречит снимкам из космоса Судья: Отклонено
Сравнение
| Паттерн | Структура | Когда |
| Оркестратор | центр раздаёт и собирает | независимые подзадачи |
| Конвейер | линия, выход → вход | строгий порядок этапов |
| Дебаты | спор предложение/критика | высокая цена ошибки |
Итог
- Оркестратор централизует: раздаёт подзадачи исполнителям и собирает результат.
- Конвейер выстраивает агентов в линию «выход → вход» для последовательных этапов.
- Дебаты повышают качество через спор, но дороги; их берут, когда цена ошибки велика.
Проверьте себя
1. Как устроен паттерн «оркестратор — исполнители»?
AАгенты выстроены в линию
BЦентральный агент раздаёт подзадачи исполнителям и собирает их результаты
CАгенты спорят между собой
DВсе агенты делают одно и то же
2. В чём слабость конвейера (pipeline) из агентов?
AОн слишком быстрый
BОшибка раннего этапа тянется дальше по линии, возврата назад нет
CОн требует оркестратора
DВ нём агенты не могут специализироваться
3. Зачем применяют паттерн дебатов, несмотря на его дороговизну?
AЧтобы сэкономить вызовы LLM
BСпор предложения и критики вскрывает слабые места и повышает качество на сложных задачах
CЧтобы убрать необходимость в инструментах
DЧтобы ускорить ответ