Ранас Мукминов – Оркестрация ИИ-агентов. Claude Opus 4.7 (страница 27)
Координация — это согласование действий и изменений (см. часть VI); состояние — то, что агенты
читают и пишут совместно (см. часть VII). Эти два уровня дают самые коварные антипаттерны, потому
что отказывают недетерминированно.
Механизм. Агентам дают общее изменяемое пространство — общий файл, общую запись, разделяемую
переменную, — потому что так удобно обмениваться данными. Это первый, самый естественный способ
«соединить» агентов.
Failure mode. Гонки и конфликты записи (см. главы 40 и 41). Два агента пишут в одно и то же место
одновременно, и результат зависит от порядка, который недетерминирован. Сбой не воспроизводится,
проявляется редко и под нагрузкой. Это прямое нарушение принципа share-nothing (см. главу 54),
который для надёжного параллелизма является основой, а не опцией.
Противоядие. Share-nothing по умолчанию: агенты работают в изолированных областях (см. главу 55),
обмениваются результатами явно, а не через общую запись. Где общее состояние действительно
необходимо, к нему применяют дисциплину single-writer, блокировки или транзакции (см. главы 41 и 42)
осознанно, а не по умолчанию.
Механизм. Несколько агентов параллельно изменяют один и тот же внешний ресурс — один файл, одну
запись в хранилище, одну строку в системе, — без какой-либо координации доступа. На демонстрации
коллизия не случается, потому что агенты не пересекаются во времени.
Failure mode. Параллельные правки пересекающегося (см. главу 40) затирают друг друга или
оставляют ресурс в несогласованном состоянии. Поскольку коллизия зависит от тайминга, она редка и
почти невоспроизводима, что делает её одним из самых дорогих в отладке классов сбоев (см. главу 80).
Противоядие. Явная дисциплина доступа: single-writer на ресурс, блокировки или сериализация
изменений через выделенного агента (см. главу 41). Изменяемые ресурсы, разделяемые между агентами,
выявляются на этапе проектирования и каждому назначается режим доступа.
Механизм. Чтобы повысить надёжность, неудачные шаги повторяют (см. главу 70). При этом действия
агентов не идемпотентны: повтор выполняет операцию заново целиком.
Failure mode. Дублирование эффектов. Повтор частично выполненного действия применяет его эффект
дважды — данные дублируются, внешняя операция совершается повторно, состояние портится. Повтор,
задуманный как защита, становится источником повреждения. Особенно опасно в координации, где один
повтор отправителя порождает дубликат у каждого получателя (см. главу 43).
Противоядие. Идемпотентность как условие повторяемости: операции проектируются так, чтобы
повторное применение не меняло результат, через ключи идемпотентности и проверку «уже сделано» (см.
главу 43). Повторять разрешено только идемпотентные шаги; неидемпотентные требуют иной защиты —
компенсаций или saga (см. главу 42).
Механизм. Явный механизм согласования не строят, полагаясь на то, что агенты «договорятся сами»
через взаимодействие. Самоорганизация воспринимается как признак зрелой архитектуры.
Failure mode. Неуправляемая эмерджентность (см. главы 44 и 61): рой приходит к коллективному
поведению, которое не закладывали и которым нельзя управлять, — от тупиков и взаимных ожиданий (см.
главу 45) до livelock, где агенты бесконечно реагируют друг на друга без продвижения (см. главу 74).
Поведение системы перестаёт быть предсказуемым из поведения её частей.
Противоядие. Координация по умолчанию явная; эмерджентность допускается только там, где она
осознанно выбрана, ограничена и наблюдаема (см. главу 44). Где нужен предсказуемый результат, ставят
явный механизм согласования — оркестратор, протокол, голосование (см. главы 38 и 39), — а не
надеются на самоорганизацию.
Механизм. Агенты накапливают и переиспользуют общее знание — общую память, разделяемый контекст,
накопленные результаты (см. главы 48 и 51), — без проверки того, что в неё попадает.
Failure mode. Испорченная запись — галлюцинация, ошибка, внедрённое содержимое — попадает в общее
состояние и распространяется на всех, кто его читает (см. главу 53). Это и каскад ошибок (см. главу 67),
и канал распространения компрометации (см. главу 84), и вектор prompt injection через общую память
(см. главу 86). Один испорченный фрагмент отравляет рой целиком.
Противоядие. Локализация и недоверие: общее состояние валидируется на запись, изменения
изолируются (см. главу 53), а доверие между агентами не предполагается по умолчанию (см. главу 85).
Накопление знания сопровождается механизмом отбраковки испорченного, иначе рой обучается на
собственных ошибках.
Надёжность — способность роя продолжать работу при отказах (см. часть X). Ошибки этого уровня
проявляются только тогда, когда что-то идёт не так, — то есть всегда позже всего.
Механизм. Систему проектируют по «счастливому пути»: каждый агент вернёт результат, вовремя и
корректный. Обработку отказов откладывают, потому что на демонстрации никто не падает.
Failure mode. Первый же зависший, упавший или ответивший мусором агент останавливает или портит
работу всего роя (см. главы 68 и 69). Нет тайм-аутов — рой ждёт зависшего бесконечно; нет повторов —
случайный сбой фатален; нет circuit breaker (см. главу 70) — повторяющийся отказ перегружает систему.
Отказоустойчивость, не заложенная в архитектуру, не появляется потом.
Противоядие. Отказ агента — нормальный, ожидаемый случай, а не исключение. Тайм-ауты, повторы,
circuit breaker и переподхват зависшей работы (см. главы 70 и 72) закладываются с самого начала.
Проектируют не «что система делает, когда всё работает», а «что она делает, когда часть отказала».
Механизм. Все агенты делят общие ресурсы — общий пул, общее соединение, общий бюджет — без