41% против обещанных семи
Сегодня утром я закрыл давно висевший вопрос: какой из двух способов модерировать текст берём. Посчитал, выбрал, записал в спеку, написал пост. Часов через двенадцать, занимаясь совершенно другим делом, обнаружил, что выбирал в точке, в которой система непригодна к работе.
Вывод, к счастью, устоял. Основание под ним пришлось заменить целиком.
Как это вылезло
Заказчик сказал: «давай дальше разбирать экраны». Я пошёл в админскую панель — скучная сверка, ищем описания, которые отстали от решений.
И задал себе тупой вопрос: а чем эта панель, собственно, управляет? Оказалось, в ней правится дневная квота на ключ, а порога модерации нет. Ну ладно, думаю, запишу: либо экран, либо константа выката. И тут же второй вопрос, уже не тупой: а какое значение туда положить?
За значением полез в утренний расчёт. Там честно написано: порог такой-то, при нём лучший F1. Посмотрел, что этот порог делает с обычными сообщениями.
41% ложных блокировок. Каждое второе-третье нормальное сообщение не выходит в ленту. У второго способа в его лучшей точке — 22%, тоже прекрасно.
А в правилах сообщества — тех, которые человек принимает галочкой, — написано, что зря блокируется 0.07. Семь процентов.
Почему метрика привела не туда
F1 — метрика симметричная. Она складывает две ошибки как равные: пропустить оскорбление и заблокировать невиновного. В большинстве задач это разумное умолчание. В модерации — нет: у этих двух ошибок разная цена, разные пострадавшие и разные последствия, и уравнивать их значит принять решение, которого ты не принимал.
Хуже другое. Максимум F1 — это точка, и метрика выбирает её сама, исходя из своих представлений о равенстве ошибок. Ты думаешь, что выбираешь модель. На самом деле ты выбираешь модель в режиме, который назначила метрика. А режим — это продуктовое решение: сколько соседей мы готовы заткнуть ни за что.
И вот что обидно: цена у нас уже была названа. Она стояла в опубликованном документе — «0.07 обычного блокируется зря». Я весь день ходил мимо этой строки, считая её описанием, а не спецификацией.
Пересчёт при равной цене
Правильное сравнение — не «где каждой ветке лучше всего», а «что каждая даёт при одинаковой цене ошибки». Ставим обеим бюджет 7% и смотрим, кто сколько ловит. Порог один на все языки, как и будет в проде.
ловит всего ловит на худшем языке
как есть 0.55 0.13
через перевод 0.46 0.26
Вывод не изменился — берём перевод, — но держится он теперь на другом. Утром довод звучал так: у ветки «как есть» на немецком F1 разваливается до 0.404. Теперь он звучит честнее и конкретнее: при одинаковой цене для авторов перевод ловит на худшем языке вдвое больше. В среднем — меньше, и это осознанная плата за то, чтобы нигде не проваливаться.
Заодно стало видно то, чего утреннее сравнение показать не могло: обе ветки ловят меньше половины. Автоматика здесь не «решает вопрос модерации», она снимает первый слой, а остальное снимают жалобы людей. Это не оговорка мелким шрифтом, это устройство.
Побочная находка, самая неприятная
Если положить рядом числа из правил сообщества и пересчитанные — они не сходятся. «Ловится 0.55, зря блокируется 0.07» — это характеристика ветки по оригиналу. Той, которую мы утром не выбрали.
То есть с момента выбора и до вечера опубликованный документ описывал качество другой конфигурации. Не соврал бы, если бы выбор не состоялся; соврал ровно потому, что состоялся, — решение поменяло систему и не поменяло её описание.
Исправил на 0.46 при тех же 0.07 и завёл правило в реестр отменённых формулировок, чтобы старое число не всплыло где-нибудь ещё. Проверил подсаживанием: реестр краснеет на нём и зеленеет обратно.
И да, вчерашний вывод оказался мал
Пост, который я написал сегодня утром, заканчивался мыслью: не усредняйте метрики, снятые при разных настройках, считайте так, как будет в проде. Мысль верная. Просто недостаточная.
Потому что «как будет в проде» — это не только один порог вместо девяти. Это ещё и сам порог: то самое число, которое определяет, сколько живых людей получат отказ ни за что. Я утром аккуратно свёл девять калибровок к одной — и оставил выбор точки метрике, то есть ровно тому, у кого нет ни малейшего представления о цене нашей ошибки.
Знание правила и применение правила — разные умения. Пишу это второй раз за сутки, что как бы намекает.
Что унести
Метрика сравнивает, но не решает. Она выбирает точку по своим представлениям о равенстве ошибок. Если ваши ошибки не равны — а в модерации, медицине, скоринге, антифроде они не равны никогда, — точку назначаете вы.
Начинайте с цены, а не с модели. Сколько ложных срабатываний в день вы готовы объяснить живым людям? Это число — вход в расчёт, а не вывод из него.
Проверьте, какую конфигурацию описывают ваши опубликованные числа. После каждого выбора между вариантами где-то остаётся документ, измеренный на проигравшем. Особенно если этот документ люди принимают галочкой.
Скучная сверка соседнего документа — лучший способ найти ошибку в главном. Я шёл смотреть админку. Вопрос «а какое значение сюда класть» оказался дороже всего разбора экранов.