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

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

18

Канал сообщений наследует классические отказы передачи из распределённых систем, и они подробно разобраны в главе 30; здесь — их перечень в привязке к выбору канала.

Потеря. Сообщение отправлено, но не доставлено: транспорт его потерял, получатель упал до обработки, сеть разорвалась. Отправитель, если он не ждёт подтверждения, может этого не заметить и считать работу переданной. Защита — подтверждения доставки и повторы, что немедленно тянет за собой проблематику семантики доставки (см. главу 29): повтор может привести к дублированию.

Дублирование. То же сообщение доставлено дважды — из-за повтора после неподтверждённой доставки или из-за сбоя транспорта. Если обработка сообщения не идемпотентна (см. главу 43), дубль вызывает повторное выполнение работы: задача запускается дважды, изменение применяется дважды. Для недетерминированных агентов это особенно коварно, потому что два запуска одной подзадачи могут дать разные результаты.

Переупорядочивание. Сообщения, отправленные в одном порядке, доставлены в другом. Если получатель полагается на порядок (сначала «начни задачу», потом «вот данные для неё»), нарушение порядка ломает логику. Гарантии порядка — отдельная и дорогая тема (см. главу 29); многие транспорты порядок не гарантируют вовсе.

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

Общая черта отказов канала сообщений: они локальны в смысле затронутых сторон. Сбой доставки между агентом A и агентом B касается этой пары; он не портит состояние агента C, который в обмене не участвовал. Это принципиальное отличие от общей памяти, где отказ затрагивает всех, кто на состояние опирается, и это отличие — один из главных доводов в пользу сообщений там, где изоляция отказов важна.

Общая память переворачивает модель. Вместо того чтобы передавать данные адресату, агенты помещают их в разделяемое пространство и наблюдают за изменениями этого пространства. Архитектурно канал состоит из носителя состояния (доска, общее хранилище, разделяемый контекст) и механизма доступа, регулирующего, кто и когда может читать и писать. Механизм доступа здесь играет роль, аналогичную транспорту в канале сообщений, но задача у него принципиально иная: не доставить порцию данных от A к B, а согласовать конкурентный доступ многих агентов к одному изменяемому состоянию.

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

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

Общая память оправдана, когда координация по своей природе не адресна — когда заранее неизвестно, кто отреагирует на изменение состояния, и когда решение строится многими агентами инкрементально, через постепенное дополнение общего пространства. Это ровно условия применимости blackboard (см. главу 11): неизвестный заранее порядок шагов, разнородный оппортунистический вклад, изменчивый состав агентов. Если задачу можно разложить в адресный поток — известно, кто кому что передаёт, — общая память избыточна, и канал сообщений проще и надёжнее.

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

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

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

Гонки и потеря обновлений. Два агента читают состояние, независимо вычисляют изменение и пишут обратно; второй затирает первого (lost update). В канале сообщений такого нет — сообщение одного агента не уничтожает сообщение другого. В общей памяти незащищённая параллельная запись прямо ведёт к потере работы. Защита — дисциплина конкурентного доступа (см. главу 41): единственный писатель на участок, проверка версии при записи, атомарные операции.

Несогласованное чтение. Агент читает состояние в момент, когда оно частично обновлено другим агентом, и видит непротиворечивую на вид, но фактически промежуточную картину. Действуя на её основе, он принимает неверное решение. Это проблематика моделей согласованности (см. главу 49): какие гарантии чтения даёт общее состояние и какие аномалии оно допускает.

Отравление. Один агент кладёт в общую память ошибочное или враждебное содержимое, и оно немедленно становится входом для всех остальных, которые строят на нём выводы. Ошибка не остаётся локальной, а распространяется через состояние и усиливается, превращаясь в каскад (см. главу 67). В присутствии недоверенного входа общая память становится вектором атаки: prompt injection, попавший в разделяемое состояние, достигает через него всех читателей (см. главу 86). Это центральная тема главы 53 — отравление общей памяти и его локализация.

Неограниченный рост. Общее состояние накапливает все промежуточные данные. Для агентов на языковых моделях это двойная деградация: чтение состояния стоит токенов и ограничено размером контекста, а среди накопленного труднее найти актуальное. Требуется явная политика жизненного цикла данных (см. главу 52).

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

Артефакт — это результат работы агента, оформленный как самостоятельный объект с именем и устойчивым существованием. Файл с кодом, сгенерированный документ, структурированная запись с идентификатором, образ, дамп данных — всё это артефакты. Канал артефактов состоит из хранилища, где артефакты живут, и схемы именования, по которой их находят. Агент-производитель кладёт артефакт в хранилище под определённым именем; агент-потребитель позже обращается к этому имени и получает артефакт.

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

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