Я слишком рано понёс первые результаты в наш продукт. Тогда это выглядело логично: мы прикрутили агентный ИИ к анализу логов и поведения пользователей в regulated продукте с реальными денежными операциями, качество обнаружения пошло вверх, аналитики по фроду стали меньше возвращать инженерам мусорные кейсы.
Снаружи это уже выглядело рабочим слоем защиты: аналитики видели меньше мусора, инженеры получали более понятные issues, и продукт наконец увидел практическую пользу вместо очередного демо. Я примерно так и сказал: “смотрите, это уже не игрушка”. Плохая фраза, как оказалось.
Потому что как только защита начинает работать, даже чуть-чуть, вокруг сразу появляются нормальные взрослые вопросы. А давайте это в платежи? А в бонусный абьюз? А в L7? А в социнженерию? А в странные кейсы саппорта, где один тикет внезапно объясняет половину графика? Вопросы честные. Только дорогие.
И в системах с живым противником есть ещё одна неприятная деталь: рабочая защита становится сигналом для другой стороны.
Пишу по собственному инженерному опыту. Детали слегка обобщены и обезличены, потому что в антифроде лишняя конкретика быстро превращается в инструкцию для другой стороны.
Контекст: деньги и постоянно живой противник
Это был регулируемый продукт с реальными денежными операциями на нескольких рынках, обычная радость: бот-сети, охотники за бонусами, мультиаккаунтинг, схемы с выводами, фрод-группы, L7-трафик, который выглядит скучно и почти легитимно до тех пор, пока ты не положишь рядом тайминги, историю аккаунта, отпечаток устройства, платёжное поведение и пару тикетов из саппорта.
Классические правила в такой погоде живут плохо. Сигнатуры протухают, пороги подбираются, и через какое-то время дашборд начинает уверенно описывать вчерашнего атакующего: графики красивые, просто немного поздно.
Я не буду делать вид, что мы изобрели магическую кнопку “найти фрод”. Никакой магии там не было. Была уже существующая антифрод-машина, куча грязных сигналов, нормальные аналитики, SRE, безопасность, продуктовая боль, и попытка посадить агентный слой внутрь контура управления. Вариант с модной шапкой на макушке системы тут бы быстро развалился. Вот тут и стало интересно.
Стек, для ясности
Нижний уровень агентов был на LangChain и LangGraph. Оркестрация шла через Claude Agent SDK. Пайплайны крутил Dagster. События жили в Kafka, аналитика в ClickHouse, расследования в OpenSearch, всё это ехало на Kubernetes. Модели были смешанные: OpenAI, Anthropic, локальные модели с LoRA там, где локальные модели имели смысл по стоимости или приватности. Langfuse закрывал трассировку, проверки качества и стоимость.
Агентный слой работал рядом с антифродом и безопасностью, используя их как набор инструментов. Агент мог сходить в ClickHouse за срезом, сравнить когорту с прошлой неделей, проверить похожую форму API-вызовов в OpenSearch, изменить выборку, предложить обновление правила, поднять кейс человеку или собрать summary для ручной проверки.
В некоторых местах решение было автоматическим: поставить флаг, поменять выборку, временно прижать подозрительный сценарий. В местах, где речь про деньги, человек оставался в контуре, потому что если агент может блокировать движение денег, не надо давать ему косплеить отдел фрода. Ну такое.
Красивый пересказ логов быстро перестал быть интересным. LLM это умеет, конечно, но это уровень демо. Настоящая польза появилась там, где система начала участвовать в цикле управления: заметила смещение паттерна, поменяла выборку, подготовила объяснение для аналитика, предложила правило, потом получила обратную связь, что это ложное срабатывание, и этот фидбек вернулся в проверку качества (вот тут пришлось повозиться с тем, как не превратить фидбек в помойку).
То есть это перестало быть дашбордом. Дашборд показывает проблему, а эта штука пыталась в неё вмешиваться.
Данные были грязные. Как обычно
Очень хочется рассказывать такие истории через аккуратное хранилище признаков, но у нас было примерно пятнадцать источников, и каждый со своей версией правды.
События аутентификации почти нормальные, пока какая-нибудь наследованная интеграция не пропустит поле. Отпечатки устройств полезные, пока команда не начинает верить им как паспорту. Платежи и выводы говорят одно, использование бонусов добавляет другое, статус KYC меняет контекст, потом приходит тикет поддержки с одной неприятной фразой (дословно не приведу, по понятным причинам), и ты такой: “а, вот почему график выглядел странно”.
География, IP, признаки прокси, задержки по времени, поведение в сессии, форма API-вызовов, продуктовые события. Грязно, полезно, полно лжи и “временных” названий из 2018 года.
Один слабый сигнал почти ничего не значит. Десять слабых сигналов во времени уже начинают быть историей, и агент мог сказать что-то вроде: этот аккаунт похож на когорту, которую мы заблокировали на прошлой неделе, но антифрод-скоринг почему-то говорит “нормально”.
Или вот этот API-вызов ниже L7-порога, только тайминг у него поехал, давайте здесь поднимем выборку; или поведение при выводе денег не бьётся с нормальным жизненным циклом аккаунта. Я перефразирую, но недалеко.
Таблица метрик была некрасивой, потому что продовые таблицы метрик обычно некрасивые. Мы смотрели фрод-инциденты, обнаружение L7-атак, кейсы социнженерии, нагрузку на ручную проверку, время до обнаружения и расход токенов, потому что токены внезапно стали строкой бюджета (сюрприз для тех, кто привык считать LLM “почти бесплатным API” за 200 баксов в месяц). Precision и recall были нужны, но аналитики по фроду спрашивали проще: “эта штука тратит моё утро или экономит?”
Первый этап не был про “модель дала хорошие сводки”. Он поменял операционку: быстрее разбор, меньше бесполезных ручных проверок, лучше связка сигналов из систем, которые раньше делали вид, что не знакомы. Правда, ненадолго: преимущество прожило несколько недель.
Потом в логах появились иероглифы
Кто-то вставил фрагмент лога в чат. По-моему, это было во время L7-расследования, но за день не поручусь. Внутри были иероглифы. Без киношной сцены, где экран внезапно зелёный и все кричат “нас взломали”: просто кусок мусора в месте, где нормальный пользовательский сценарий такого мусора оставлять не должен.
Сначала думаешь про проблему с кодировкой, потому что, ну а что ещё. Потом видишь второй похожий случай. Потом отчёты оркестратора начинают менять тон: сомнение вроде есть, но оно какое-то модельное, пластиковое.
Качество классификации начало падать сразу по двум осям в L7-взаимодействиях с продуктовыми API. Precision хуже. Recall хуже. Когда оба падают одновременно, по моему опыту, паттерн переехал. Порогом это не лечится.
Атакующие поменяли форму поведения. Явные всплески стали длиннее и мягче. Пересечения порогов превратились в “почти дошли, но нет”. Вредные действия стали почти-легитимными действиями, которые всё равно грузили бэкенд и слой защиты. Много маленьких порезов. Дёшево для них, дорого для нас.
Атакующему не нужно красиво ломать вашу модель в академическом смысле. Достаточно сделать так, чтобы защита стоила дороже его цикла атаки.
На нашей стороне были комплаенс, правила обработки данных, юридическая проверка, DPIA, ограничения по логированию, внутренняя модель стоимости токенов и вычислений. На их стороне был цикл дешевле: сгенерировать поведение, посмотреть результат, поменять параметры, повторить. Завидно почти. До этого детект мог жить месяцами. Здесь преимущество прожило около шести недель.
Почему агентный ИИ ускорил обе стороны
Сама по себе LLM над логами не страшная. Она может быть полезной, но её можно держать как аналитический инструмент: спросил, получил сводку, пошёл дальше. Агентная схема меняет скорость итерации.
У защиты появляется цикл: сигнал -> гипотеза -> проверка в данных -> изменение выборки, правила или ручной проверки -> обратная связь. У атакующего появляется похожий цикл: попытка -> наблюдение реакции -> изменение параметров -> новая попытка. Если обе стороны автоматизировали этот цикл, гонка просто сжимается во времени.
Раньше у тебя была неделя на разбор новой схемы. Потом пара дней. Потом ночь, и утром ты уже смотришь на график, который выглядит как “а они тоже не спали”. У защиты при этом больше трения. Это системная разница, а не жалоба на бюрократию.
Защите надо сохранить честных пользователей, объяснить блокировку, не утащить чувствительные данные в лишний лог и не превратить SRE в бесплатных нянек для умного, но шумного слоя. Ещё надо доказать продукту, что ложные срабатывания не убивают выручку. Атакующему достаточно, чтобы экономика сходилась.
Вот почему простая фраза “добавим ИИ в обнаружение фрода” звучит слишком невинно. Добавите. Потом будете владеть маленьким продуктом с пользователями, давлением по затратам, регрессионным набором, ручной разметкой и противниками, которые читают ваши реакции через поведение системы. Весело, но это уже не эксперимент на вечер.
Стоимость была не только в токенах
Токены хотя бы видно: вызовы моделей, локальный инференс, трассировка, хранилище, усиленная выборка, более дорогие модели для сложных кейсов. Мы использовали маршрутизацию, пакетную обработку, сводки, выборку по риску, дешёвые модели для первичного triage и сильные модели там, где надо. Это помогло, но кривую не обнулило.
Менее очевидная стоимость была во внимании людей. Слишком много пограничных кейсов, и аналитики по фроду перестают верить системе. Слишком много блокировок, и продукт приходит с вилами. Слишком много эскалаций в SRE, и SRE начинает воспринимать защиту как чумного соседа. Через месяц у слоя защиты уже своя очередь задач, свои баги, свои регрессии и свои “а почему это вчера работало”.
Самое точное описание: это стало продуктом. Плохая новость в том, что продуктом надо владеть.
Что бы я сделал иначе
Раньше вложился бы в honeypots. Много разных ловушек, не один красивый капкан. Часть видимая для дешёвой автоматизации, часть измеряет скорость адаптации, часть специально помогает понять, какую модель нашей системы построил атакующий.
Если у другой стороны тоже агентный цикл, защите нужно наблюдать не только аккаунты, но и саму адаптацию. Какие параметры они меняют первыми? Сколько ждут после блока? Пытаются ли размазывать нагрузку по времени или менять форму устройства и платежей? Можно ли заставить их чуть-чуть раскрыть свою карту мира?
Ещё я бы с первого дня строил агента red team под живого противника. Цель такого агента скучная и полезная: имитировать терпеливого противника, растягивать паттерны во времени, держаться ниже порогов, делать почти-легитимную нагрузку, мутировать поведение устройств и платежей, атаковать модель затрат.
Метрики качества тоже нужны, но если атакующий бьёт по стоимости, красивый recall уже не спасает. И я бы раньше относился к проверке промптов и агентов как к продовой инженерии.
Промпты в системе контроля версий. Регрессионные кейсы из реальных инцидентов. Тесты стоимости рядом с тестами качества. Ручная проверка должна возвращаться как размеченная обратная связь; комментарий в Slack через две недели уже никто не найдёт. Релиз агента должен быть похож на релиз платежного кода сильнее, чем на редактирование текста в админке.
Минимальная схема, которая у нас начала работать
Если упростить до архитектурного скелета, он выглядел так:
События Kafka -> нормализация / обогащение -> ClickHouse + OpenSearch -> выборка по риску -> агентный разбор -> ручная проверка / автоматическое действие -> размеченная обратная связь -> проверка качества + правила + обновление выборки
На слайде проще всего продать “агентный разбор”. В проде же держит систему контур обратной связи. Без него агентный слой быстро превращается в уверенный генератор объяснений к старым паттернам. Он будет говорить красиво, только поздно. Примерно как дашборд, но дороже.
Нормальный контур требует скучных вещей: схемы событий, владелец, разметка, версионирование, откат, бюджет на токены, лимиты, алерты на деградацию, журнал решений, понятные границы автоматических действий. И ещё человека, который имеет право сказать: “стоп, эта модель сейчас уверенно решает прошлую неделю”.
Без этого вы получите красивую демонстрацию, которая в проде быстро начнёт неприятно пахнуть.
Что из этого можно забрать в другие домены
История не только про продукты с реальными денежными операциями. Просто там боль видно быстрее, потому что деньги, боты и регулятор ходят рядом. Та же логика появляется в платежах, антиабьюзе, фроде на маркетплейсах, безопасности API, доверии и безопасности пользователей, даже в некоторых видах поддержки, где пользователь или бот учится обходить правила.
Если среда с живым противником, полезный ИИ-защитник почти автоматически становится частью гонки. Он ускоряет вас, но он же ускоряет процесс обучения противника, потому что ваши реакции становятся наблюдаемыми.
Поэтому вопрос “можно ли сюда добавить LLM” я бы отложил в сторону. Можно почти везде, это несложно.
Я бы задавал другой: умеем ли мы менять защиту быстрее, чем противник меняет атаку, и не ломаем ли мы при этом приватность, операционку и доверие людей, которые должны этим пользоваться?
Если нет, агенты дадут более дорогой дашборд. Если да, они реально работают. Просто победа не стоит на месте, и в системах с живым противником любая рабочая защита очень быстро становится учебным материалом для следующей атаки.
ссылка на оригинал статьи https://habr.com/ru/articles/1053668/