18+
реклама
18+
Бургер менюБургер меню

Ранас Мукминов – Оркестрация ИИ-агентов. Claude Opus 4.7 (страница 64)

18

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

Если подзадачи интенсивно зависят друг от друга и каждая нуждается почти во всём контексте остальных, разрезание на роли создаёт стыки, через которые приходится гонять почти весь контекст туда и обратно. Тогда экономия на сжатии контекста под роль исчезает (контекст всё равно нужен весь), а координационный налог на передачах остаётся и растёт. Универсальный агент, держащий весь связный контекст внутри одного окна, здесь и дешевле, и надёжнее: ему не нужно ничего передавать, потому что всё уже у него. Признак такой задачи — невозможность описать чистую границу между подзадачами без оговорки «но ему ещё понадобится знать всё, что знает соседняя роль».

Специализация требует, чтобы роли и их границы были определены до запуска. Есть задачи, в которых структура работы выясняется только в процессе: неясно заранее, сколько будет стадий, какие компетенции понадобятся, как разложится работа. Универсальный агент справляется с этим естественно — он сам разворачивает структуру по ходу. Попытка специализировать такую задачу приводит либо к ролям, не соответствующим реальной структуре работы, либо к необходимости динамически назначать роли на лету (см. главу 21), что переносит сложность в механизм назначения и часто не окупается.

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

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

Важно, что «универсальный агент лучше» не означает «оркестрация не нужна». Один универсальный агент — это вырожденный случай, предмет соседней книги об автономном агенте. Речь о другом: даже внутри мультиагентной системы отдельные узлы стоит делать универсальными, а не дробить их ради дробления. Зрелая система — это почти всегда смесь узких и широких ролей, и инженерное искусство в том, чтобы провести границы там, где разрез дешевле целого, и не проводить их там, где целое дешевле разреза.

«Специализация против универсальности» — удобная рамка для главы, но в проектировании это не выбор из двух вариантов, а позиция на спектре. Полезно различать несколько уровней, потому что failure modes на разных участках спектра разные.

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

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

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

Важно, что положение на спектре можно выбирать по каждому рычагу роли отдельно. Глава 16 разделила роль на промпт, инструменты и права; ничто не заставляет затягивать их синхронно. Распространённая и часто оптимальная конфигурация — широкий промпт при узких правах: агент рассуждает универсально, видит задачу целиком, но физически не может сделать ничего за пределами выданных ему прав. Так система получает гибкость универсального агента в рассуждении и локализацию ущерба специализации в действии — две выгоды с разных концов спектра, потому что они привязаны к разным рычагам. Обратная конфигурация — узкий промпт при широких правах — почти всегда ошибка: агент ограничен в понимании задачи, но способен на широкие действия, то есть лишён главной выгоды специализации (предсказуемости) и несёт её главный риск (зазоры) вместе с риском универсальности (концентрация прав).

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

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

Пусть задача — внести изменение в кодовую базу по сформулированному требованию: понять требование, спланировать правку, внести её, проверить и собрать итог. Это типичная задача с естественными швами, но швы имеют разную «толщину» — через одни передаётся мало контекста, через другие почти весь.

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

Вторая раскладка — умеренная специализация по реальным швам: понимание и планирование сливаются в одну широкую роль (между ними толстый шов — его не режут), исполнение остаётся отдельным (тонкий шов до него — режут), проверка остаётся отдельной (проверяемость на этой границе критична — режут). Получаются три роли вместо пяти. Координационный налог падает, потому что устранён самый дорогой стык; ключевые выгоды специализации сохранены, потому что оставлены границы, на которых они нужны, — права исполнителя ограничены, выход проверяется отдельной ролью. Это и есть нарезка по естественным швам: число ролей определяется не числом логических шагов, а расположением мест слабой связности.

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

Отдельно стоит развеять ожидание, будто специализация сама по себе повышает надёжность за счёт того, что узкий агент «реже ошибается в своей области». Если все специализированные роли реализованы на одной модели, их ошибки коррелированы: систематическая слабость модели проявится во всех ролях сразу, и специализация не даст независимости отказов, на которую рассчитывают по аналогии с ансамблями. Узкая роль снижает дисперсию поведения, но не устраняет общий для всех ролей источник ошибок. Независимость отказов — это свойство разнообразия агентов, а не их специализации (см. главу 63), и путать эти два рычага опасно: можно построить рой из десяти узких ролей на одной модели и считать его надёжным, тогда как он падает целиком на том классе входов, на котором ошибается базовая модель.

Ошибки специализации делятся на ошибки от избытка и ошибки от недостатка. Обе наблюдаемы на уровне системы, и обе имеют характерные симптомы.

Самая частая ошибка — нарезать роли тоньше, чем требует задача, по аналогии с человеческой организацией или из стремления к «чистоте» архитектуры. Симптомы: большая доля токенов и латентности уходит на передачи между агентами, а не на работу; контекст теряется на стыках, и нижестоящие агенты регулярно не получают того, что им нужно; на границах между ролями возникают зазоры, в которые проваливаются нетипичные случаи. Корень проблемы в том, что сложность не исчезла — она переехала из агентов в топологию связей, где её труднее увидеть и отладить. Лечение — укрупнение ролей по естественным швам: слить роли, между которыми идёт интенсивный обмен контекстом, в одну широкую роль, оставив границы только там, где обмен через них мал.