Перейти к основному содержимому

Паттерн chief-of-staff: когда оркестрировать агентов, а когда просто написать скрипт

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

Минималистичное изображение роботизированной руки, тянущейся вперёд на белом фоне.

Аргументы против того, чтобы по умолчанию выбирать рои агентов

Распространённый режим отказа в агентной инженерии — тянуться к рою раньше, чем к функции. Задача декомпозируется на роли, добавляется супервизор, и система объявляется «агентной». На деле построена распределённая система с языковой моделью в контуре, и её издержки — это знакомые издержки распределённости плюс незнакомые издержки недетерминизма.

Каждый дополнительный агент вводит передачу. На каждой передаче производящий агент сериализует своё состояние в текст, а потребляющий агент десериализует его обратно в контекст. Этот круговой обмен теряет информацию. Структурированный результат с оценкой уверенности, ссылкой на источник и флагом частичного отказа превращается в прозе в предложение, которое опускает все три. Потеря не случайна; она коррелирует ровно с той информацией, которая нужна нижестоящему агенту, чтобы решить, продолжать, повторять или эскалировать.

Накладные расходы на координацию также растут быстрее, чем экономит декомпозиция. Если задача требует T единиц работы и делится на n подзадач, идеальная экономия составляет примерно T/n. Стоимость координации — не T/n; это сумма передач, каждая из которых требует промпта, вызова модели, разбора и валидации. На практике добавление агентов за точку, где подзадачи действительно независимы, даёт систему, которая медленнее, дороже и сложнее в отладке, чем единственный вызов, который она заменила.

Самая глубокая проблема — тестируемость. Детерминированный код можно покрыть юнит-тестами. Функция, принимающая типизированный вход и возвращающая типизированный выход, имеет контракт, против которого можно писать утверждения. Промпт оркестратора — нет. Вы можете оценивать его выходы на наборе данных, и должны это делать, но вы не можете написать тест, который падает, когда оркестратор молча меняет свою политику маршрутизации между версиями модели. Промпт — это спецификация, выраженная на языке без компилятора.

Это не аргумент против мультиагентных систем. Это аргумент против того, чтобы считать их выбором по умолчанию. Паттерн chief-of-staff, как описано в этой статье об оркестрации сессий Claude Code, полезен именно потому, что называет условия, при которых координирующий слой оправдывает себя.

Сигналы, оправдывающие оркестрацию

На практике три сигнала отличают задачу, которой нужен оркестратор, от задачи, которой нужен скрипт.

Непересекающиеся наборы инструментов или непересекающиеся контексты

Если подзадаче A нужен доступ на чтение к кодовой базе, а подзадаче B — доступ на запись к цели развёртывания, им нужны разные наборы инструментов. Единый агент, владеющий обоими инструментами, должен пользоваться доверием для обоих, и его контекст должен нести схемы, учётные данные и режимы отказа обоих. Разделение означает, что контекст каждого агента меньше, а его полномочия уже. Тот же аргумент применим к контекстным окнам: если исходный материал для одной подзадачи занял бы большую часть окна, а для другой — остаток, единый агент будет усекать или суммировать, а суммирование — это и есть место, где живёт потеря информации.

Detail view of an aircraft's sophisticated control panel with instruments and switches.

Подлинная независимость

Второй агент оправдывает свою стоимость, когда он действительно независим, а не когда он переформулирует первого. Независимость означает, что он не разделяет контекст первого агента, его допущения или его режимы отказа. Верификатор, который читает тот же контекст и те же рассуждения, будет склонен соглашаться с производителем, потому что он прогоняет то же распределение по тем же токенам. Верификатор, который читает только артефакт и имеет собственные инструменты для его проверки, может не согласиться. Это несогласие и есть ценность.

Задачи с длинным горизонтом

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

Если ни один из этих трёх сигналов не присутствует, честный инженерный ответ — скрипт. Скрипт, который вызывает одну модель, валидирует выход против схемы и повторяет при отказе, тестируем, наблюдаем и дёшев. В большинстве случаев он ещё и быстрее.

Реализация паттерна

Когда оркестрация оправдана, детали реализации определяют, работает ли она. Три механизма важнее выбора фреймворка.

Единый авторитетный реестр задач

Агенты должны читать и писать один общий реестр, а не передавать друг другу прозаические резюме. Реестр — источник истины о том, что было предпринято, что удалось и что заблокировано. Каждая запись — это запись: идентификатор задачи, статус, входы, выходы и любая ошибка. Агенты захватывают задачи, обновляют статус и добавляют результаты. Оркест

Это инвертирует обычный паттерн. Вместо того чтобы оркестратор держал состояние в своём контексте и суммировал его для исполнителей, состояние живёт вне любого контекста и читается по требованию. Исполнитель, которому нужно знать, удалась ли зависимость, читает реестр, а не доверяет резюме. Контекст оркестратора остаётся малым, и в этом суть.

Close-up of automated canning equipment in a brewery, highlighting the manufacturing process.

Контракты передачи как типизированные полезные нагрузки

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

{
  "task_id": "string",
  "status": "succeeded | failed | blocked",
  "artefacts": [{"path": "string", "hash": "string"}],
  "claims": [{"text": "string", "evidence": "string"}],
  "open_questions": ["string"]
}

Схема делает две вещи. Она заставляет производящего агента различать то, что он сделал, и то, во что он верит, — а это разные вещи. И она даёт потребляющему агенту стабильный интерфейс, так что изменение в рассуждениях производителя не меняет молча вход потребителя. Там, где поле не может быть заполнено, агент обязан сказать об этом, и blocked — допустимый статус. Прозаические резюме скрывают именно этот случай.

Инструментируйте задержку передачи и потерю информации

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

Считайте оба показателя первоклассными метриками наряду с долей успешных задач и стоимостью на задачу. Система оркестрации, которая корректна, но чьи передачи занимают больше времени, чем работа, которую они координируют, — это система, которую следует свернуть обратно в скрипт.

Честный компромисс

Паттерн chief-of-staff не бесплатен и не всегда правилен. Его издержки реальны: больше движущихся частей, больше промптов для поддержки, больше режимов отказа для наблюдения и опыт отладки, охватывающий несколько контекстов вместо одного. Его выгоды тоже реальны, но условны. Они появляются, когда подзадачам нужен разный контекст, разные инструменты или независимая проверка, и в значительной степени исчезают, когда нет.

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

ПоделитьсяXLinkedInПостоянная ссылка6 мин чтения

Связанное чтение

На какие вопросы это отвечает

When should a task be handled by a single script instead of multiple agents?

When subtasks share the same context and tool set, when verification is not genuinely independent, and when the task fits in one context window. In those cases a single validated model call is testable, observable, and faster than a coordinated set of agents.

What is a handoff contract in a multi-agent system?

A handoff contract is a typed payload passed between agents, with a defined schema validated on both sides. It replaces prose summaries, which tend to omit confidence, evidence, and partial-failure information that downstream agents need.

How is information loss measured across agent handoffs?

By comparing what a producing agent emitted against what the consuming agent acted on. If open questions or artefacts in the payload are not addressed by the next action, that is a measurable loss, and its distribution over many runs shows where contracts are too thin.

Why can an orchestrator prompt be harder to maintain than code?

Deterministic code can be unit tested against a typed contract. An orchestrator prompt is a specification in a language with no compiler, so its routing policy can change silently between model versions without any test failing.