OpenAI Privacy Filter: красивая архитектура в суровых условиях русского бенчмарка

22 апреля 2026 года OpenAI представила OpenAI Privacy Filter — открытую модель для поиска и маскирования персональных данных (PII) в тексте. На бумаге всё выглядит впечатляюще: компактная специализированная модель, возможность локального запуска без передачи данных на сервер, поддержка длинного контекста и чёткая таксономия чувствительных сущностей.

Ожидания против реальности

Модель отлично справляется с именами вроде «John из Iowa» или «Washington D.C.» — но как насчёт Максима Улугбековича из Нижневартовска? Или Галин Палны из Урус-Мартана?

После изучения анонса и model card возникло естественное желание: проверить не абстрактную мультиязычную эффективность, а реальную применимость в условиях, с которыми сталкиваются на практике. Я собрал небольшой бенчмарк и хочу поделиться результатами.

И они, мягко говоря, не звёздные.

Коротко про бенчмарк

Для первого прогона я взял 101 пример из реальной жизни. Все записи содержат хотя бы один чувствительный спан из восьми классов. В выборку вошли разговорные тексты, транскрипции с ASR-артефактами, сбитый регистр, отчества, короткие коды и адреса без разметки.

У каждого примера был ground truth, с которым сравнивались результаты с помощью CLIf. Также планировалось тестирование в браузере без бэкенда — но не удалось из-за отсутствия поддержки архитектуры в Transformers.js.

Как устроена модель

Privacy Filter — это не универсальный генератор, а узкоспециализированный классификатор. Она начинается как авторегрессивный чекпоинт вроде gpt-oss, но переделана в двунаправленный токен-классификатор. Вместо генерации текста модель за один проход присваивает каждому токену метку из восьми классов:

  • account_number
  • private_address
  • private_email
  • private_person
  • private_phone
  • private_url
  • private_date
  • secret

Архитектурно — это pre-norm transformer encoder на 8 слоёв. Используется grouped-query attention (14 query-голов, 2 key-value-головы), residual stream шириной 640 и sparse MoE-слои с 128 экспертами и top-4 routing. Всего — 1,5 млрд параметров, но активно задействуется лишь около 50 млн на токен. Это позволяет запускать модель даже на устройствах без GPU.

Компромиссы в архитектуре

Два ключевых нюанса определяют поведение модели.

Во-первых, длинный контекст (до 128 тыс. токенов) не означает глобального понимания. Модель использует bidirectional banded attention шириной 128 — каждый токен видит только 257 соседей (128 слева, 128 справа и себя). Это by design: ставка на скорость и локальную связность, а не на сквозной анализ документа.

Во-вторых, используется BIOES-разметка. Каждый из восьми классов распадается на метки: begin, inside, outside, end, single. Итого — 33 логита на токен. Далее применяется constrained Viterbi decoding с шестью transition-bias параметрами для точного выделения границ спанов.

Это позволяет настраивать operating point в сторону полноты или точности — но одновременно усиливает нестабильность на границах спанов.

Обещанные цифры

OpenAI заявляет 96% F1 на PII-Masking-300k и 97,43% — на исправленной версии. В model card есть стресс-тесты по секретам, мультиязычности и маскированию.

Особенно обнадёживает синтетическая русская часть: F1 около 0,895, а при подсказке класса («category clue before PII») precision достигает 0,914, recall — 0,793.

На этом фоне легко поверить, что с живым русским текстом модель справится уверенно.

Русский бенчмарк: реальность

Мой датасет сознательно не стерилизован: форумные сообщения, ASR-транскрипции, разговорный шум, опечатки, искажения распознавания.

Использовались два режима оценки:

  • strict — точное совпадение начала, конца и метки;
  • lenient — достаточно пересечения спана с тем же классом.

Результаты

На strict-матчинге общий F1 оказался низким. По классам — картина неоднородная:

  • Хорошо: url, date, phone, email, account_number (благодаря мультиязычности);
  • Плохо: secret, address, private_person.

При переходе к lenient-подсчёту F1 растёт — особенно у адресов (почти в полтора раза). Это говорит о том, что модель часто видит сущность, но неправильно определяет её границы.

По скорости — результаты приемлемые: на CPU Mac Air M1 2020 (с фоновой нагрузкой) — 1–2 примера в секунду, медианная задержка — около 0,5 секунды, заметный cold start.

Почему так вышло

1. Выход за пределы распределения претрейна. OpenAI честно предупреждает: качество может падать на non-English текстах, кириллице, нестандартных именах и вне-доменных формулировках. Мой датасет попадает точно в эти зоны: разговорный русский, отсутствие заглавных букв, ASR-шум, бытовые и банковские контексты.

Модель пропускает «парамонов сергей викторович», «алексей алексаныч», «андрей владимирович» — не потому что не видит имена, а потому что не распознаёт нестандартные паттерны обращений, характерные для русской речи.

2. Особенности span-архитектуры. BIOES и Viterbi помогают собирать целые спаны, но болезненно реагируют на малейшие сдвиги границ. Например, в private_address модель может взять только «самоеважное» без города или захватить лишний контекст.

3. Адреса. В лабораторных условиях адреса структурированы. В реальности — это «улица лермонтова 8», «краснодар проезд репина 3 подъезд 2», «пермь шоссе космонавтов 111». Много локальных шаблонов, сокращений, вложенной географии. Модель часто видит фрагмент, но не весь спан — или пропускает полностью.

4. Секреты. OpenAI предупреждает: модель может пропускать новые форматы учётных данных и project-specific токены. В тесте это проявилось ярко: одноразовые коды («482911», «914205»), PIN («0471»), строка dem0-pass-442 — всё это либо пропущено, либо перепутано с account_number. Контекст «код подтверждения» или «пин у карты» для человека очевиден, для модели — нет.

5. Формат шума. В документации упоминается, что модель слаба на нестандартных форматах. Телефон, проговоренный словами, не распознан. Сервисный номер 8 800 555 35 35 — тоже пропущен. Слабые места из model card легко воспроизводятся в реальных условиях.

Выводы

Модель не «плохая» — она честно решает задачу в рамках своей спецификации. Но она не предназначена для русского языка «из коробки».

Это не всесильный ИИ, а компактный, быстрый, локально запускаемый классификатор с определённым training distribution и компромиссами. На близких к обучающим данным текстах он может быть сильным. На живом русском в zero-shot — сбоит.

OpenAI не скрывает этого. В их материалах есть жирный намёк: на SPY-датасете дообучение на 10% данных поднимает F1 с 0,545 до 0,962. Небольшое доменное fine-tuning способно кардинально улучшить результат.

Главная ценность эксперимента не в провале на русском. Она в демонстрации нового класса моделей: небольших, узкоспециализированных, локальных. Они будут появляться всё чаще — для фильтрации, модерации, извлечения структур, OCR и других задач.

Даже неидеальный результат важен: он показывает, что путь к эффективности — не в zero-shot-чуде для всех языков, а в узком доменном дообучении, локальных бенчмарках и честной проверке на реальных данных.

Архитектура у Privacy Filter сильная. Идея локального запуска — отличная. Но верить, что раз модель от OpenAI, значит, её можно сразу в прод — опасно.

Правильный подход: измерять локально, дообучать под свой домен, калибровать границы спанов и не путать синтетическую мультиязычность с реальной эксплуатацией.

Читать оригинал