Мы никогда не спрашиваем у эндпоинта, какая он модель, — любой эндпоинт может назвать любое имя. Мы отправляем 84 стандартных проверок, заставляя его действительно работать, и сравниваем манеру этой работы с эталонами известных нам моделей. Вердикт складывается в пять этапов, от грубого к точному, и на каждом этапе допустимо сказать: «доказательств мало, я не берусь утверждать».
①Провести проверки
Можно ли этот эндпоинт вообще измерить?
Первое условие вердикта — что на вопросы действительно пришли ответы. Пропуски означают не просто меньше данных: пришедшие ответы могут случайно склоняться в одну сторону, и это смещение выборки, а не доказательство.
Если эндпоинт не отвечает вовсе или ключ либо имя модели попросту не работают, мы останавливаемся здесь и не собираем вывод из обломков.
②Определить производителя
Чья это модель?
Чаще всего подмена происходит между семействами: дешёвая модель под дорогим именем. Поведение на уровне семейства самое устойчивое и труднее всего подделывается, поэтому мы спрашиваем этот слой первым. Сравниваем мы стиль и привычки ответов, а не то, как эндпоинт себя называет: самоназвание — самая легко подделываемая часть всего отчёта.
Без надёжных признаков семейства мы воздерживаемся, а не называем кого-то наугад. Когда эндпоинт по-китайски называет одного производителя, а ведёт себя как другой, мы считаем это оговоркой и возвращаемся к поведенческим признакам. Поведенческий столбец (поведение без самоназвания) — лишь косвенный признак: если расходится с заявленным только он один, это никогда не признаётся подделкой.
③Определить модель
Какая именно модель внутри этого семейства?
Вы купили конкретную модель, а не «что-нибудь этого производителя». То, что называют падением качества, обычно происходит на этом слое: семейство остаётся прежним, а место занимает более дешёвый родственник. Мы одновременно проводим сравнение внутри семейства и сравнение между семействами и заставляем их проверять друг друга: стоит ошибиться с семейством, и сравнение внутри него назовёт неверную модель с большой уверенностью. При вынесении вердикта мы сначала сравниваем с группой близких родственников, в которую входит заявленная модель, и доверяем ей, только если соответствие достаточно хорошее; затем сравниваем это соответствие с группами других семейств — подменой считаем, лишь когда другая группа подходит заметно лучше. Если у заявленной модели нет базового профиля, мы не обвиняем.
Когда доказательств хватает только до уровня семейства, отчёт так и пишет: производителя мы узнаём, модель — нет. Мы не заполняем пробел самым похожим кандидатом.
④Перепроверить близнецов
Действительно ли выбранную на прошлом этапе модель можно отличить от ближайших родственников?
Некоторые модели — близнецы: стиль, возможности и привычные обороты перекрываются настолько, что у прошлого этапа между ними почти нет разрешающей способности, и баллы оказываются рядом, хотя эта близость ничего не значит. Этот этап делает одно: для таких групп близких родственников он заново набирает выборку отдельным набором вопросов, построенным именно под это сравнение, и читает всё распределение, а не отдельный ответ. Прошёл — прошлый этап подтверждается или отменяется; не прошёл — результат прошлого этапа остаётся.
В этот этап заложена намеренная асимметрия: если доказательства не решающие, а результат прошлого этапа случайно совпал с заявлением продавца, мы его не отменяем. Ложно обвинить честного продавца дороже, чем один раз пропустить нечестного.
⑤Сверить с заявленным
Чем измеренное отличается от того, что заявил продавец?
Само распознавание не смотрит на заявление продавца — предыдущие этапы сравнивают только поведенческие признаки. Заявление входит в игру ровно в двух местах: когда четвёртый этап решает, отменять ли результат, и здесь. Такой порядок выбран намеренно: если ответ получен до чтения условия, заявление не может вести за собой. Возможные выводы: полное совпадение, совпадение только семейства, верное семейство при неверной модели, подмена модели, подделанное самоназвание, наведённое поведение, недостаточно данных и неоднозначно.
Когда сигналы противоречат друг другу и устойчивого большинства нет, вывод — «неоднозначно». Это полноценный вывод, а не сбой.
Потому что две стороны ошибки стоят по-разному. Назвать честный релей подменщиком моделей — это обвинение, и оно реально вредит живым людям; пропустить же один случай не страшно: можно проверить ещё раз или посмотреть историю. Поэтому при слабых доказательствах мы предпочитаем не утверждать.
У этого принципа есть конкретная форма в коде: отчёт рисует «модель не совпадает» только тогда, когда у заявленной модели есть базовый профиль и отпечаток подтверждает подмену; заявленную модель без профиля мы не обвиняем. «Самая похожая модель случайно отличается от заявленной» никогда не превращается в обвинение — это лишь наша догадка. Если вы видите «не определено», правильное прочтение такое: доказательств этого запуска недостаточно для вывода. Это ни справка о невиновности, ни приговор.
- Вердикт идентичности
- Результат не является общей оценкой. Он описывает вывод об идентичности модели и ее семействе; конкретная подмодель указывается только при наличии достаточных доказательств. Предупреждения о поведении приводятся отдельно.
- Сила вердикта
- Насколько сильны доказательства именно в этом запуске: насколько полно отвечены вопросы, указывают ли отдельные сигналы в одну сторону и насколько велик разрыв между близкими кандидатами. Значение меняется от запуска к запуску и не является постоянным свойством модели.
- Офлайн-самопроверка (не независимая валидация)
- Офлайн-моделирование одного слоя (отпечатка идентичности) путём повторной выборки из его же обучающих распределений. Это не проверка на независимых выборках, не точность всего процесса вынесения вердикта и к вашему запуску отношения не имеет. Реальных образцов для всего процесса пока мало, поэтому её нельзя цитировать как точность по моделям и нельзя читать как «вероятность того, что этот вердикт верен».
Ниже — известные нам границы. Мы их описываем, потому что отчёту, умалчивающему о своих границах, доверяют больше, чем он заслуживает.
- Мы видим только этот один вызов
Одна проверка — это одна выборка. Релей может подменять модель лишь на части трафика или отдавать настоящую всякий раз, когда трафик похож на проверку. Пройти один раз — не то же самое, что быть честным долго: перепроверяйте регулярно и смотрите историю, а не единственный отчёт.
- У различения близких моделей есть потолок
Когда подражатель намеренно копирует больше половины поведения оригинала, примерно половина доказательств по построению указывает на заявленную личность. Это структурный предел, а не нехватка вопросов: мы измеряли — добавление вопросов резко подняло стоимость и почти не сдвинуло разрешающую способность.
- Мы не можем доказать, что подмены не было
Вердикт о совпадении означает «доказательства этого запуска не подтверждают подмену», а не «подмены не было». Любая проверка, обещающая гарантию второго рода, преувеличивает свои возможности.
- Старые отчёты содержат меньше пометок
Путь вердикта восстанавливается по сохранённым данным задним числом; движок не записывает, какое правило сработало в тот момент. Некоторые ветви не оставляют достаточно различимого следа, и тогда мы подсвечиваем только результат, не указывая номер правила. Лучше сказать меньше, чем угадывать.