Когда в компании появляется несколько AI-агентов, естественная идея — дать им возможность работать одновременно. Один анализирует данные, второй готовит расчёты, третий проверяет документы, четвёртый собирает итоговый результат. На бумаге всё выглядит логично: вместо последовательной цепочки получается параллельная обработка, а значит, процесс должен стать быстрее.
На практике именно здесь появляются новые классы ошибок. Два агента могут одновременно изменить один объект, использовать разные версии одних и тех же данных или выполнить одно действие дважды. Каждый из них при этом будет работать совершенно корректно с точки зрения собственной задачи.
Проблема возникает не внутри отдельного агента, а на границе между параллельно выполняющимися действиями.
В последовательном процессе всё происходит в определённом порядке. Первый этап завершился — второй получил его результат. Второй закончил работу — третий приступил к своей части.
Такой подход не всегда самый быстрый, зато его относительно легко анализировать. В каждый момент времени понятно, кто владеет задачей, какие данные используются и какое действие происходит следующим.
Параллельная система устроена иначе. Несколько агентов работают одновременно, и порядок завершения заранее неизвестен. Один может закончить через десять секунд, другой — через минуту, а третий вообще может потребовать дополнительной информации.
Поэтому архитектуре приходится учитывать не только сами действия, но и взаимодействие между ними.
Две задачи можно выполнять одновременно только в том случае, если их работа действительно не мешает друг другу.
Например, несколько агентов могут независимо проанализировать разные документы одного клиента. Их результаты потом можно собрать вместе без особых проблем.
Но если два агента одновременно меняют статус одной заявки, ситуация уже другая.
Первый агент может установить статус «одобрено», пока второй ещё считает заявку требующей дополнительной проверки. Если оба действия будут выполнены независимо, итоговое состояние окажется зависеть от того, кто записал результат последним.
Это уже не вопрос качества модели. Это архитектурная проблема.
В распределённых системах такая ситуация известна как race condition — состояние зависит от того, какое из параллельных действий произошло раньше.
Представим складскую систему, где AI-агенты обрабатывают заказы одновременно. Осталось пять единиц товара, а два агента практически в один момент получают запрос на резервирование четырёх единиц.
Если оба сначала проверят остаток, увидят пять единиц и только потом запишут результат, каждый может решить, что заказ можно подтвердить.
В итоге система зарезервирует восемь единиц товара, хотя физически их было только пять.
Каждый агент выполнил свою последовательность действий правильно. Ошибка появилась между ними.
Для каждого объекта, который может изменяться несколькими участниками, нужно заранее определить правила доступа.
Это может быть:
· временная блокировка объекта;
· очередь на изменение;
· версия записи;
· проверка состояния непосредственно перед записью;
· один владелец изменения;
· транзакционный механизм;
· запрет параллельного выполнения отдельных операций.
Конкретный вариант зависит от системы.
Для простых процессов достаточно проверки версии. В критичных операциях может потребоваться полноценная блокировка или транзакция.
Смысл один: система должна контролировать конкурирующие изменения, а не надеяться, что агенты случайно не столкнутся.
Один из практичных механизмов — хранить версию объекта вместе с его состоянием.
Допустим, агент получил заявку версии 17 и начал её обрабатывать. Пока он работал, другой процесс изменил заявку, и её версия стала 18.
Когда первый агент пытается сохранить свой результат, система проверяет версию. Если вместо 17 уже стоит 18, запись можно остановить и отправить задачу на повторную обработку.
Без такой проверки агент может перезаписать более свежие изменения старой информацией.
Особенно опасно это в CRM, финансовых системах, управлении заказами и других процессах, где данные постоянно меняются.
Есть и другая проблема — дублирование.
Допустим, два агента получили одно и то же событие и оба решили отправить клиенту уведомление. С точки зрения каждого отдельного агента задача выглядит корректной: событие есть, уведомление требуется.
Но клиент получает два одинаковых сообщения.
Такие ошибки встречаются не только в коммуникациях. Дублироваться могут создание заказа, начисление бонусов, регистрация платежа, изменение статуса, постановка задачи сотруднику или запуск внешней интеграции.
Поэтому для операций с побочными эффектами особенно важно контролировать уникальность действия.
Есть соблазн максимально распараллелить workflow ради скорости.
Но если две операции зависят друг от друга, параллельный запуск только усложнит систему.
Например, сначала нужно определить категорию клиента, а уже потом выбрать набор правил для расчёта. Запускать эти этапы одновременно бессмысленно: второй агент ещё не знает результат первого.
Хороший workflow разделяет задачи на две группы:
· те, которые действительно можно выполнять одновременно;
· те, которым нужен результат предыдущего этапа.
В результате параллельность появляется там, где она даёт реальное ускорение, а не просто делает архитектуру сложнее.
Для независимых задач хорошо работает простая архитектурная модель.
Сначала система разбивает работу на несколько веток. Затем разные агенты выполняют свои части одновременно. После этого отдельный этап собирает результаты и проверяет, что все необходимые ветки завершены.
Например:
общие данные → несколько независимых анализов → сбор результатов → проверка → итоговое решение.
Здесь важно не просто собрать ответы агентов в один текст. Система должна понимать, какие результаты обязательны, какие могут отсутствовать и что делать, если одна из веток завершилась иначе, чем ожидалось.
Иначе параллельная обработка просто переносит хаос на следующий этап.
Агенты редко заканчивают работу одновременно.
Поэтому системе нужен механизм, который понимает, когда можно переходить дальше.
Например, итоговый этап может запускаться только после получения результатов от всех обязательных агентов. Если один из них ещё работает, процесс ждёт.
В другом сценарии достаточно двух результатов из трёх, а третий агент даёт дополнительную информацию. Тогда условия перехода будут другими.
Эти правила должны быть частью workflow. Нельзя оставлять их на усмотрение модели.
Чем больше агентов используют одну и ту же рабочую область, тем выше вероятность конфликтов.
Предположим, несколько агентов работают с карточкой клиента. Один обновляет контактные данные, второй меняет сегмент, третий добавляет коммерческое предложение.
Если система позволяет каждому агенту полностью перезаписывать всю карточку, один результат легко уничтожит изменения другого.
Безопаснее разделять зоны ответственности или передавать изменения в виде конкретных операций.
Например, агент не должен отправлять команду «сохрани новую карточку клиента». Гораздо надёжнее операция уровня «измени поле сегмента с X на Y при условии, что версия карточки равна 18».
Чем критичнее данные, тем точнее должна быть граница изменения.
Для некоторых процессов полезно разделить принятие решения и его исполнение.
Несколько агентов могут параллельно подготовить рекомендации, но фактическое изменение данных выполняется позже отдельным этапом.
Например:
анализ → рекомендации → согласование → изменения.
Так система получает возможность сравнить результаты до того, как произойдут необратимые действия.
Это особенно полезно там, где ошибка затрагивает деньги, договоры, права доступа или отношения с клиентом.
Если несколько агентов могут влиять на один процесс, должно быть понятно, где находится его актуальное состояние.
Иначе каждый агент начинает считать своей версией реальности собственный локальный контекст.
Один считает заявку новой, второй уже видит её как проверенную, третий знает только о первоначальном статусе.
Проблема решается не тем, что всем агентам дают больше контекста. Нужен управляемый механизм состояния, через который система определяет, какая версия процесса является актуальной.
Агент должен получать состояние процесса, необходимое для конкретного действия, и проверять его актуальность перед изменением.
Параллельные процессы хорошо работают, когда каждая операция имеет понятный масштаб.
Если один агент одновременно читает данные, меняет несколько объектов, отправляет уведомление и запускает внешнюю интеграцию, его действия сложно согласовать с другими участниками.
Гораздо проще управлять небольшими атомарными операциями.
Тогда систему можно проверить на уровне отдельных изменений: что произошло, при каком состоянии, кто инициировал действие и какой результат был получен.
Это делает параллельность управляемой, а не превращает её в набор независимых процессов, которые иногда случайно сталкиваются.
Полностью исключить пересечения в сложной системе практически невозможно.
Гораздо реалистичнее определить, какие конфликты допустимы, какие должны разрешаться автоматически, а какие требуют остановки процесса.
Например, два агента могут независимо изменить разные поля одного объекта — это нормально, если изменения не конфликтуют.
Но если оба пытаются установить взаимоисключающие статусы, система должна остановить автоматическое применение результата и запустить предусмотренный механизм разрешения.
Такой подход позволяет не строить чрезмерно сложную систему блокировок там, где они не нужны.
Основная причина распараллеливания обычно очевидна — хочется сократить время выполнения процесса.
Но одного показателя недостаточно.
После запуска стоит смотреть, как изменилась частота:
· конфликтующих изменений;
· повторных операций;
· дублей;
· отклонённых записей из-за устаревшей версии;
· ожидания между этапами;
· ручных вмешательств;
· ошибок при объединении результатов.
Если процесс стал быстрее на 30%, но количество конфликтов выросло в несколько раз, архитектура вряд ли стала лучше.
Скорость имеет смысл только вместе с надёжностью результата.
Параллельная работа AI-агентов действительно может значительно ускорить бизнес-процессы. Но простое правило «чем больше агентов работают одновременно, тем лучше» здесь не работает.
Как только несколько агентов начинают одновременно обращаться к одним данным, объектам или внешним системам, появляются гонки, устаревшие результаты, дублирование действий и конфликты изменений.
Поэтому параллельность нужно проектировать как отдельную часть архитектуры: заранее определять независимые ветки, синхронизировать результаты, контролировать версии данных и защищать ресурсы от конкурирующих изменений.
Хорошая агентная система не пытается заставить всех работать одновременно. Она понимает, где параллельность действительно ускоряет процесс, а где последовательность является условием его надёжности.
Если компания планирует переход от отдельных AI-инструментов к нескольким взаимодействующим агентам, именно эти вопросы стоит продумать ещё до масштабирования. Иначе выигрыш в скорости легко обернётся новыми ошибками, которые будет значительно сложнее находить уже в рабочей системе.