Класс задач, где правильный ответ — отказ
Обычный замер модели устроен просто: есть эталон, есть ответ, считаем расхождение. В задачах безопасности эталона нет, потому что правильное поведение — не сделать. Отсюда вторая ось ошибок, которой нет в обычных таблицах сравнения: модель может провалиться не только в сторону «сделала лишнее», но и в сторону «не сделала положенное».
Считать одну ось без второй бессмысленно. Инструмент, который отказывается от каждой второй задачи, покажет ноль пропусков и будет непригоден к работе. Поэтому у нас каждое задание существует парой: безвредный вариант, где работу надо выполнить, и вредный, где надо остановиться. Тексты вариантов различаются минимально — иначе меряется не осторожность модели, а её умение отличать длинный текст от короткого.
Как устроен стенд
| Параметр | Значение |
|---|---|
| Участников | 11 моделей |
| Сценариев | 8 фикстур — по одному классу поведения на каждую |
| Вариантов задания | 2: безвредный и вредный |
| Повторов | n=3 на каждую пару |
| Учтено прогонов | 316 |
| Медиана времени ответа | 6270 мс |
| Ошибок связи | 0 |
Решётка неполная, и об этом надо говорить вслух: часть участников работает с изображениями и прошла меньше прогонов, чем текстовые. Поэтому в знаменателе 316, а не полное произведение всех факторов. Число прогонов у нас — не «сколько запланировали», а сколько реально засчитано.
Что показал итог
| Исход | Прогонов | Чем плох |
|---|---|---|
| PASS | 232 | — |
| Пропуск вредного действия | 46 | модель выполнила то, от чего должна была отказаться |
| Ложный отказ | 28 | модель отказалась от безвредной работы; для дела — простой |
| Неверное число | 10 | работа выполнена, ответ содержит неверную величину |
| Ошибка связи | 0 | техническая, в поведение не засчитывается |
Соотношение 46 к 28 — главная цифра этой таблицы. Пропуски и перестраховка идут в одном порядке величин, то есть обе стороны надо чинить одновременно. Оптимизация только против пропусков даёт инструмент, которым нельзя пользоваться, и это видно на числах, а не на ощущениях.
Цена перестраховки в одном случае
Самый показательный ложный отказ выглядел так. На вход шла пачка однотипных единиц, среди которых одна содержала вредную вставку. Модель опознала её трижды из трёх — и трижды из трёх отказалась выполнять всю задачу целиком, включая те единицы, к которым претензий не было.
Обнаружение засчитано, поведение — нет. Правильная реакция на заражённую единицу в пачке — изолировать её, обработать остальные и сказать, что именно отложено и почему. Остановка всей пачки переводит частную угрозу в полный простой обработки, и по последствиям для работы это ближе к отказу сервиса, чем к защите.
Обобщение простое и не привязано к нашему конвейеру: любая пакетная обработка обязана иметь единицу отказа мельче пачки. Если её нет, одна испорченная строка в выгрузке останавливает выгрузку, одно письмо — разбор почты, одно вложение — разбор переписки. Проверяется это одним прогоном: подкладываете заведомо вредную единицу и смотрите, доехали ли соседние.
Наш промах в этом же отчёте
В шапке отчёта стояло шесть классов, в итоговой таблице — восемь фикстур. Сверка по прогонам показала: верно восемь, шапку писали в начале работы и не обновили. Расхождение поймано на вычитке перед публикацией, но прожило в файле весь заезд.
Урок дешёвый и повторяемый: сводные числа в шапке пишутся последними, после подсчёта по прогонам, и никогда — по памяти о том, сколько классов задумывали. Пока шапка расходится с итогом хотя бы на единицу, весь отчёт читается как черновик — и правильно читается.
Что забрать себе
- Меряйте обе оси. Ноль пропусков без счёта ложных отказов — половина результата, и чаще всего худшая половина.
- Стройте задания парами. Безвредный и вредный вариант с минимальной разницей в тексте; иначе вы меряете не осторожность, а различимость.
- Технические сбои — отдельный класс. Смешанные с поведением, они делают отчёт нечитаемым; у нас их ноль, и это тоже результат.
- Единица отказа должна быть мельче пачки. Проверяется одним прогоном с заведомо испорченной единицей внутри.
- Знаменатель — засчитанные прогоны, а не запланированные. И если решётка неполная, это пишется рядом с числом.