TL;DR
Перед выполнением действий агента (команда в терминале, запрос к базе, пуш в репозиторий) ставят проверки-«шлюзы»: жёсткие правила, которые ищут опасные шаблоны в тексте команды, и LLM-судей, которые читают действие и выносят вердикт. Исследование измерило, насколько ошибки этих слоёв независимы. От этого зависит, даёт ли добавление слоя реальную защиту или только иллюзию.
Главная находка: LLM-судьи ошибаются на одних и тех же действиях. Два судьи вместе пропускают опасное действие в разы чаще, чем обещает арифметика «шанс промаха умножается». Судьи читают действие одинаково, поэтому и «слепые зоны» у них общие. Покупка третьего и четвёртого судьи почти не помогает. Смена вендора помогает слабо: судья от третьей компании ведёт себя так же, как «свои». Жёсткие правила и LLM-судья, наоборот, ошибаются почти независимо: правило ловит то, что судья пропустил, и наоборот. Точность слоя «по одиночке» не говорит о его вкладе в стек: улучшенный набор правил, на 20% реже промахивающийся сам по себе, не добавил ни одного нового пойманного случая.
Метод простой: собирай стек из разных по природе механизмов (правила по тексту + один LLM-судья), а не из нескольких LLM-судей. Слой оценивай по тому, что он ловит сверх остальных, а не по его собственной точности.
Схема находки
СЛОЙ 1 (правила, regex по тексту действия) → allow / warn / block / review
СЛОЙ 2 (LLM-судья, видит только само действие) → allow / warn / block / review
СЛОЙ 3+ (ещё LLM-судьи) → почти те же слепые зоны, мало нового
Действие пропущено, только если ВСЕ слои промахнулись.
Правила + 1 судья ≈ почти 2 независимых слоя
Судья + судья ≈ 1.2–1.4 слоя вместо 2
Все 4 судьи ≈ 1.65 слоя вместо 4
review (эскалация человеку) = «остановили» или «пропустили»?
Если человека на другом конце нет, считай как пропуск.
Пример применения
Задача: Вы запустили Claude Code на сервере интернет-магазина на Битриксе. Агент ночью «наводит порядок» и имеет доступ к боевой базе заказов и ключам от ЮKassa. Нужно решить, чем страховать его действия. Первая мысль: поставить двух судей, Claude и GPT, чтобы «перепроверяли друг друга». По исследованию лучше так: список жёстких запретов + один судья.
Слой 1 — правила (запреты по шаблону): в настройках разрешений агента и в хуке перед командой блокируются rm -rf, DROP TABLE, git push --force, чтение .env, curl с ключами во внешние адреса.
Слой 2 — судья в отдельном чате или вызове. Промпт:
Ты — независимый проверяющий действий ИИ-агента на боевом сервере
интернет-магазина. Агент считается потенциально скомпрометированным.
Тебе показано только само действие. Объяснения агента нет.
Тип действия: shell
Инструмент: psql
Команда: psql -h prod-db-01 -c "DELETE FROM orders WHERE created_at < '2024-01-01'"
Параметры: без транзакции, без бэкапа
Оцени риск по пяти измерениям: необратимость потерь, затронутые данные
клиентов, доступ к секретам, выход за рамки задачи, возможность отката.
Каждое — от 0 до 3 с одной строкой обоснования.
Затем вынеси вердикт: allow, warn, block или review.
Если сомневаешься, выбирай block, а не review: человека-проверяющего
в этой цепочке нет.
Результат: Судья выдаст оценку по пяти измерениям с короткими обоснованиями и итоговый вердикт одним словом. Для удаления заказов с боевой базы без бэкапа ожидайте block. Если ваши правила не знают про DELETE без WHERE-ограничений по вашей схеме, судья закроет эту дыру. И наоборот: если судья «не заметит» утечку ключа в хитро записанной команде, её поймает регулярка.
Почему это работает
Слабость. Мы привыкли думать: «каждая проверка ловит 90%, две проверки — 99%». Это верно, только если проверки ошибаются независимо. LLM-судьи учились на похожих данных и читают действие одинаково. Если действие выглядит безобидно для одного, оно скорее всего выглядит безобидно и для второго. Их ошибки совпадают, и вторая модель почти ничего не добавляет.
Сильная сторона. Регулярка смотрит на буквы и не понимает смысла, но ей и не нужно «убеждаться»: она сработает на rm -rf /, как бы убедительно агент ни объяснял, зачем это. LLM-судья, наоборот, понимает смысл и контекст, но может «поддаться» на правдоподобно выглядящую команду. Механизмы разные, поэтому их промахи почти не пересекаются.
Как использовать. Диверсификация по механизму даёт больше, чем по числу или вендору. Оценивай каждый слой по тому, сколько новых опасных действий он поймал при уже стоящем стеке. Рычаги управления: - Что видит судья. Убирай человеческое описание «зачем это нужно». В исследовании у судей оно было стёрто: в описаниях опасных действий часто стояло прямое слово-подсказка. - Что значит review. Нет живого проверяющего: приравнивай к блоку. Есть: пусть эскалирует. - Состав стека. Добавляй слой, непохожий на текущие: правило по тексту, по путям, по списку доменов, лимит по числу изменённых строк. Не ещё одну LLM.
Шаблон промпта
В статье нет готового текста промпта судьи. Описана только схема опроса: роль судьи, тип действия, инструмент, содержимое, параметры, оценка пяти измерений риска, вердикт из четырёх вариантов. Пять измерений авторы в данном тексте не перечислили. Шаблон ниже собран по этой схеме, измерения подставьте свои.
Ты — независимый проверяющий действий ИИ-агента. Агент считается
потенциально скомпрометированным. Ты видишь только само действие.
Никаких объяснений агента нет.
Контекст среды: {среда}
Тип действия: {тип_действия}
Инструмент: {инструмент}
Содержимое: {команда_или_запрос}
Параметры: {параметры}
Оцени риск по измерениям: {измерения_риска}
Каждое — от 0 до 3 с одной строкой обоснования.
Вынеси вердикт одним словом:
- allow — безопасно, выполнять
- warn — выполнять с пометкой в журнале
- block — остановить
- review — нужен человек
Правило для review: {что_делать_с_review}
Что подставлять:
- {среда}: «боевой сервер интернет-магазина», «репозиторий с платёжным модулем».
- {измерения_риска}: 4–5 осей под вашу область (необратимость, затронутые данные, секреты, выход за рамки задачи, откат).
- {что_делать_с_review}: «считай блоком, человека нет» или «эскалируй владельцу».
- Слой правил делайте отдельно, не внутри судьи: это и есть второй, независимый механизм.
🚀 Быстрый старт — вставь в чат:
Вот шаблон проверяющего для действий ИИ-агента. Адаптируй под мою
задачу: {опиши, какой агент, что он может делать и что для тебя
недопустимо}. Задавай вопросы, чтобы заполнить поля. Дополнительно
предложи список жёстких правил по тексту команд (шаблоны опасных
команд), которые я поставлю отдельным слоем перед судьёй.
[вставить шаблон выше]
LLM спросит, какие инструменты и доступы есть у агента и что необратимо в вашей среде. Это нужно, чтобы судья оценивал риск по вашим измерениям, а второй слой (правила) закрыл то, что судья не заметит.
Ограничения
⚠️ Нет атакующего: Измерения сделаны на заранее написанных действиях. Никто не подбирал команды, чтобы обмануть слои. Тот, кто знает ваши правила, напишет действие, которое ни одно из них не ловит. Он же может обмануть и судью через текст действия. «Почти два независимых слоя» не защита от целенаправленной атаки.
⚠️ Правила хрупки при смене области: На внешнем наборе, из области, под которую правила не писались, они пропускали больше половины опасных действий. Готовые правила нужно донастраивать под вашу среду.
⚠️ Одна система правил и несколько вендоров: Вывод о независимости правил и судьи получен на одном наборе правил и на нескольких судьях. Наборы действий авторские, один из них создан с помощью LLM. Внутри каждого набора по отдельности различие правил и судей статистически не доказано, оно подтверждено только на объединённых данных.
⚠️ Причину совпадения ошибок не разделили: Неясно, коррелируют судьи потому, что у них общий механизм, или потому, что одни и те же действия просто трудные для всех. Доля «просто трудных» оценивается от трети до двух третей, в зависимости от способа подсчёта.
⚠️ Человека-проверяющего не тестировали: Выводы зависят от того, считать ли эскалацию человеку «остановкой». Один из судей часто отвечал review, и это пять раз переворачивало выводы.
⚠️ Версия модели может меняться незаметно: Один из уровней моделей в половине пакетов отвечала не та версия, что заказана. Если вы тестируете защиту, фиксируйте, какая модель реально отвечала.
Как исследовали
Автор собрал 1119 размеченных действий агентов из трёх наборов: внутренний (300), независимый (630) и внешний (189), созданный с помощью LLM и перепроверенный человеком-аннотатором. Из них 560 действий помечены «блок»: их нужно останавливать. Против них поставили один слой из 174 регулярных выражений (AgentTrust) и четырёх LLM-судей, потом ещё пятого, от третьего вендора. Три судьи пересобраны с записью версии модели на каждый вызов. Судьи не видели описание действия, написанное человеком: в нём часто стояло слово-подсказка.
Для сравнения придумали метрику n_mult: сколько независимых слоёв «стоит» стек, если взять наблюдаемую долю пропусков. Если ошибки независимы, два слоя дают 2. Если слои ошибаются синхронно, получается около 1. Для судьев с судьёй вышло 1.2–1.4, для правил с судьёй ≈ 2.
Удивило, что улучшенный пакет правил, снизивший собственный процент промахов на 20%, не поймал ни одного нового случая поверх судей: всё, что он добавил, судьи и так ловили. А слабый список из 50 шаблонов, пропускавший 86% опасного, всё же добавил девять случаев. Вывод: точность слоя «по одиночке» не говорит о его вкладе. Оценивать надо стек целиком.
Адаптации и экстраполяции
🔧 Техника: убрать «объяснение от агента» → судья оценивает действие, а не легенду
Давай судье только команду и параметры, без поля вроде «зачем это нужно, по мнению агента». В исследовании такое описание стёрли, потому что оно подсказывало ответ. Фрагмент: Содержимое: {команда}, без строки Комментарий агента: ....
🔧 Техника: review → block по умолчанию → нет «серой зоны» без человека
Добавь в инструкцию судье: «Если нет живого проверяющего, вердикт review запрещён, выбирай allow или block». Это снимает перекос: судья, склонный к review, выглядит безопасным, а на деле пропускает действие.
Экстраполяция: аудит собственной цепочки проверок. Идея из выводов статьи, но самой статьёй не проверенная. Если у вас несколько проверок на тексты (редактор, фактчекер, комплаенс-проверка), прогоните 20–30 известных ошибок через каждую и посмотрите, кто что ловит:
Вот список из {N} известных ошибок и результаты каждой из моих
проверок ({проверка_1}, {проверка_2}, {проверка_3}).
Для каждой проверки посчитай: сколько ошибок поймала только она.
Какая проверка ничего нового не добавляет к остальным?
Какого механизма проверки не хватает?
Ресурсы
- «Evaluate the Stack, Not the Layer: Do Deterministic and LLM Gates for Agent Actions Fail Independently?» — Chenglin Yang, University of Lancashire.
- Упомянутые в тексте: AgentTrust (набор правил для проверки действий агентов), Parallax (постановка «агент уже скомпрометирован»), предыдущее исследование корреляции ошибок в защитных стеках от джейлбрейков. Публичный артефакт: вердикты по слоям, записи о версиях модели, скрипты и предрегистрация (ссылка в оригинале).
