Разработка системы аудита действий AI-агентов (Audit Trail)

Когда несколько AI-агентов действуют параллельно, разобрать инцидент без журнала почти невозможно: непонятно, кто, что и почему сделал. Мы разрабатываем систему аудита действий AI-агентов под ключ — от схемы событий до регламентов передачи. Время разбора инцидента сокращается в разы, а решения становятся проверяемыми.
Часто задаваемые вопросы

Аудит действий AI-агентов: где теряется прослеживаемость

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

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

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

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

Аудит действий AI-агентов строится не на количестве логов, а на сквозной связи шагов. Разбираем, как это закрывается технически.

Что меняется после внедрения: разбор инцидентов и отказы

Время локализации причины

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

Доля инцидентов с неподтверждённой причиной падает до единичных случаев — по каждому есть входные данные, решение агента и результат его проверки. Принцип тот же, что в наблюдаемости сервисов OpenTelemetry, только разметка расширена действиями агента: видно не «что-то упало», а на каком шаге и по чьему разрешению.

Какие классы отказов уходят

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

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

Способы сбора событий: сравнение вариантов

Полнота журнала зависит от того, в какой точке перехватывается событие. Чем ближе к агенту, тем больше деталей попадает в запись — планы, промежуточные рассуждения, аргументы вызовов; чем дальше от него, тем ниже накладные расходы на запись и тем меньше шансов потерять событие при сбое самого агента. На практике варианты не конкурируют, а дополняют друг друга.

Вариант Когда подходит Ограничения
Сбор событий внутри агента Нужны рассуждения, планы и промежуточные шаги, а не только факт вызова Держится на дисциплине кода: пропустили вызов — событие исчезло из журнала
Перехват вызовов инструментов на промежуточном слое Агент обращается к внешним сервисам, базам и файлам В записи видны только вызовы инструментов, внутренняя логика остаётся за кадром
Сбор на стороне оркестратора В процессе несколько агентов и подзадач, важна маршрутизация Детализация ниже, нагрузка ложится на узел оркестрации
Поток от поставщика модели Модель внешняя, доступа к её коду нет Состав полей и задержку задаёт поставщик, часть деталей не отдаётся

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

Порядок внедрения: от схемы событий до передачи

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

  1. Разбор текущих цепочек: проходим по вызовам модели, инструментам и внешним сервисам, отмечаем, где теряется идентификатор сессии и где решение принимается без записи.
  2. Схема событий: согласуем закрытый перечень — запрос к модели, вызов инструмента, отказ политики, изменение состояния. Каждому событию назначаем обязательные атрибуты и связь по идентификатору цепочки.
  3. Словарь полей журнала: типы, обязательность, формат времени и правила маскирования персональных данных — до того, как записи начнут накапливаться.
  4. Настройка сбора событий: подключаем источники, буферизацию на случай недоступности хранилища и защиту от потери записей при сбое агента.
  5. Разграничение доступа: роли на чтение, выгрузку и администрирование; обращение к самому журналу — тоже событие.
  6. Проверка на тестовом контуре: успешный вызов, отказ, обрыв связи, повторная доставка — сверяем полноту записей и восстановление цепочки по идентификатору.
  7. Приёмка системы аудита и передача: разбираем выборку реальных цепочек, отдаём документацию и обучаем дежурную смену разбору инцидентов.

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

Комплект на выходе: схемы, политики, регламенты

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

  • Схема потоков событий — путь от вызова агентом инструмента до записи в хранилище: точки перехвата, буфер, повторные отправки, поведение при недоступности приёмника. По ней видно, какие действия агента в журнал не попадают.
  • Словарь полей — значение каждого поля, обязательность, допустимые форматы. Без него разбор инцидента превращается в догадки о том, что именно записал агент.
  • Политики доступа к журналу — кто и при каких условиях читает записи, срок хранения, запрет правки. Журнал дописываемый: изменить прошлую запись нельзя технически, а не «по инструкции».
  • Роли и права на чтение — отдельные наборы для дежурной смены, разбора инцидентов, аудита и службы безопасности: каждый видит свой срез, полный доступ не выдаётся по умолчанию.
  • Правила маскирования данных — что вырезается до записи: персональные данные, ключи доступа, содержимое обращений. Маскирование стоит на входе, поэтому в хранилище чувствительные значения не попадают.
  • Регламент разбора инцидентов — классификация событий, срок реакции, кто принимает решение остановить агента, как фиксируются выводы. К нему приложены инструкции для дежурной смены: что смотреть и что собрать до подключения разбирающегося.

Документацию передаём в ваш репозиторий и сопровождаем первые изменения, пока команда не начнёт править её сама.

Кейс: разбор инцидента до и после внедрения журнала

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

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

Что изменили

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

Метрики до и после

  • Расследование эпизода: три недели ручного поиска → выборка по агенту, сессии и интервалу времени за часы.
  • Атрибуция действий: подтверждалась менее чем для половины вызовов → 100%, с версией инструкций и инициатором на каждом шаге.
  • Откат: полное восстановление базы → точечный откат только затронутых записей.

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

Что делать, если система уже работает в продакшене?

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

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

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

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

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

Сомнения по журналу аудита: разбираем по пунктам

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

Агент вызовет модель напрямую, минуя общий шлюз — запись потеряется?

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

В записях окажутся персональные данные — что с этим делать?

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

Сколько хранить записи, чтобы журнал не стал балластом?

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

Записи можно переписать задним числом — как это исключить?

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

Обсудим вашу задачу и вернёмся с планом

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

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

Опишите задачу в таком виде — вернёмся с оценкой, планом этапов и составом работ.

Направления AI-разработки

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139