CONFIDE-Bench — Какой слой окупает свои вычисления?

Двуязычный бенчмарк деидентификации для транскриптов психотерапии.

CONFIDE · github.com/glebis/confide · автор Gleb Kalinin и контрибьюторы CONFIDE · опубликовано для исследований и обучения под лицензией репозитория. Транскрипты терапии синтетические/вымышленные — никаких реальных данных пациентов; единственный реальнотекстовый срез (RU-real / JayGuard) — это внешние, анонимизированные, неклинические публичные данные.

Сайт проекта, объяснение простым языком и как поучаствовать: confide.salient.community.

TAB · i2b2/n2c2 · Presidio-F2 · Datasheets for Datasets

Слой-детектор на базе LLM (ollama) & локальный атакующий: Qwen2.5-3B-Instruct (qwen2.5:3b) через Ollama, температура 0. Детерминированные слои: Natasha (NER для русского), двуязычный regex-слой и OpenAI Privacy Filter (английский).

TL;DR — мы проверяем, насколько хорошо автоматические инструменты приватности скрывают личные данные в транскриптах психотерапевтических сессий (на русском и английском) и какая комбинация инструментов оправдывает свои вычисления.

Что мы измеряем
Действительно ли маска редактирования покрыла каждый фрагмент личных данных? — приоритет полноты, ведь пропуск означает утечку данных.
Почему это важно
Текст терапии крайне чувствителен; одно нескрытое имя, телефон или название препарата может реидентифицировать клиента.
Чем это НЕ является
Это не сертификат соответствия HIPAA/GDPR. Транскрипты терапии синтетические/вымышленные, а выборки малы — относитесь к результатам как к ориентировочным. Единственное исключение из реального текста — внешний срез RU-real (JayGuard): анонимизированные, неклинические публичные данные.
Для кого это
Для всех, кто выбирает или создаёт конвейер деидентификации для клинического или терапевтического текста.

Как это читать: ★ отмечает рекомендуемый дефолтный стек · столбцы показывают покрытие (больше — лучше) · пустой столбец означает, что эта комбинация не запускалась для данного языка · у каждой таблицы есть ключ с расшифровкой сокращений.

датасеты
4
RU · RU-adv · EN · RU-real
комбинации × датасет
8
абляция, составленная объединением
Полнота дефолтного стека RU
88%
natasha+regex+ollama ★
выживаемость квази-ID
31%
оба клиента · поверхность реид.

Деидентификация — это не один инструмент, а стек детекторов, и честный вопрос в том, какой слой окупает сжигаемый им CPU. Этот бенчмарк составляет слои-детекторы через объединение спанов на транскриптах психотерапии на русском и английском, оценивает каждую комбинацию так, как это делают опубликованные работы по деидентификации — с приоритетом полноты, на уровне сущностей, прямые против квази — и ставит более острый вопрос, чем “насколько хорош инструмент”: что способна отловить только LLM и что всё ещё утекает после маскирования?

главное

Три типа PII — age 0%, medication 4%, profession 2% — близки к нулю при детерминированных слоях (Natasha NER + regex). Добавление локального слоя qwen поднимает их полноту на уровне упоминаний, но у медикаментов и профессии полнота на уровне сущностей по-прежнему очень низка, потому что должно быть замаскировано каждое упоминание. При этом 31% квази-идентификаторов всё ещё выживают в дефолтном стеке. Маскирование прямых идентификаторов необходимо, но недостаточно.

1. Какой слой что отлавливает

Именно слой LLM поднимает возраст, медикамент и профессию выше детерминированного базового уровня.

Полнота на уровне упоминаний по категориям для RU (нестрогое перекрытие), 1076 эталонных (gold) упоминаний: детерминированный (natasha+regex) против +qwen.

как читать

Структурированные прямые идентификаторы (email, телефон, ID полиса) и имена/организации/локации достигают 0.9–1.0 за счёт regex + Natasha. Даты теперь тоже отлавливаются — правило regex для числовых дат было добавлено после того, как бенчмарк выявил этот пробел.

Квази-идентификаторы, требующие знаний о мире — название препарата, род занятий, прописанный словами возраст — невидимы для паттерн- и NER-слоёв; LLM — единственный слой, который поднимает их полноту на уровне упоминаний.

Оговорка: это полнота на уровне упоминаний. На уровне сущностей (замаскированы все упоминания) медикаменты и профессия остаются на 0 даже с qwen — это более высокая планка.

:::

2. Лучшая последовательность по языкам

Столбцы показывают полноту покрытия; ★ — это предлагаемый дефолтный стек, который жертвует небольшой полнотой ради значительного выигрыша в скорости/точности — не всегда самый высокий столбец.

Полнота покрытия по комбинациям на отображённых датасетах. Отсутствующий столбец означает, что комбинация не запускалась на этом языке (см. примечание), а не нулевую оценку. ★ = предлагаемый дефолтный стек; см. таблицу для F2/точности.

почему некоторые столбцы пусты для RU

Русский язык использует только стек с приоритетом локального исполнения — Natasha + regex + qwen2.5:3b. Три детектора по замыслу работают только с английским, поэтому у любой комбинации с ними нет столбца RU: Presidio (его RU зависит от spaCy-NER и слаб — оставлен без оценки, а не искажён), Philter (набор правил для английских клинических записей) и OpenAI Privacy Filter (английский классификатор токенов). Это решение о границах охвата, а не измеренный сбой на RU.

почему они различаются

RU: предлагаемый дефолтный стек natasha+regex+ollama ★ достигает полноты покрытия 88%. Строка OPF-на-RU опущена, пока кэш её детектора не будет перегенерирован для текущего корпуса из 30 документов.

EN-synth: OPF — это основа для имён/адресов (English’s Natasha, англоязычный аналог). Дефолтный opf+regex+ollama ★; opf+regex чуть опережает его по F2.

RU-real (JayGuard): на внешнем реальном русском тексте локальный стек достигает высокого покрытия — реальнотекстовый якорь для в остальном синтетического RU-корпуса (только PERSON/LOCATION).

combocov Rcov F2ent Rdirectquasipreds
regex0.0710.0860.3980.4070.39085
natasha0.7750.7520.3010.3700.2371151
ollama·qwen2.5:3b0.2930.3290.2300.1850.271421
natasha+regex0.8460.8070.6990.7780.6271236
natasha+ollama·qwen2.5:3b0.8250.7740.4870.5370.4411333
regex+ollama·qwen2.5:3b0.3420.3790.4690.4630.475480
natasha+regex+ollama·qwen2.5:3b ★0.8750.8110.7260.8150.6441392
natasha+regex+gemma3 ◇0.9540.3660.8500.9070.7979093
natasha+regex+gliner ◇0.9800.4120.8850.8890.8817927

◇ — экспериментальная замена в ★-стеке (LLM Gemma или NER-слой GLiNER): отдельный кэш детектора, не продвинутый дефолт (проверки дисперсии и продвижения не пройдены; см. раздел «Сравнение моделей»).

пояснение к колонкам — что означает каждое сокращение и какое направление лучше

RU-real (срез JayGuard) — 60 док., 77 эталонных упоминаний (внешний, анонимизированный, реальный, но неклинический русский текст — Apache-2.0; только PERSON/LOCATION, эталон получен машинно, без человеческой адъюдикации)

combocov Rcov F2ent Rdirectquasipreds
regex0.0000.0000.0000.0000.00013
natasha0.4030.4180.4030.3580.70063
ollama·qwen2.5:3b0.6100.5470.6100.6570.300160
natasha+regex0.4030.4040.4030.3580.70076
natasha+ollama·qwen2.5:3b0.7920.6740.7920.7910.800180
regex+ollama·qwen2.5:3b0.6100.5470.6100.6570.300160
natasha+regex+ollama·qwen2.5:3b ★0.7920.6740.7920.7910.800180
natasha+regex+gemma3 ◇0.9610.7720.9610.9700.900201
natasha+regex+gemma4-12b-mlx ◇1.0000.8301.0001.0001.000172

◇ — экспериментальная замена в ★-стеке (LLM Gemma или NER-слой GLiNER): отдельный кэш детектора, не продвинутый дефолт (проверки дисперсии и продвижения не пройдены; см. раздел «Сравнение моделей»).

пояснение к колонкам — что означает каждое сокращение и какое направление лучше

EN-synth — 32 док., 46 эталонных (gold) упоминаний (нет уровня сущностей / деления на прямые-квази: англоязычные наборы не содержат поэлементной аннотации entity_id, поэтому оценивается только покрытие на уровне упоминаний)

combocov Rcov F2preds
regex0.3700.41919
opf0.7830.81838
ollama·qwen2.5:3b0.5000.52549
opf+regex0.9130.92146
opf+ollama·qwen2.5:3b0.8480.81558
regex+ollama·qwen2.5:3b0.7610.74359
opf+regex+ollama·qwen2.5:3b ★0.9780.91066
natasha+regex+ollama·qwen2.5:3b0.7830.75861
presidio0.9130.90751
philter0.7830.79947
presidio+regex+ollama·qwen2.5:3b0.9350.88066
opf+regex+gemma3 ◇1.0000.94562
opf+regex+gemma4-12b-mlx ◇1.0000.97654
opf+regex+gemma4-26b·cloud ◇1.0000.98452
opf+regex+gliner ◇0.9570.80091

◇ — экспериментальная замена в ★-стеке (LLM Gemma или NER-слой GLiNER): отдельный кэш детектора, не продвинутый дефолт (проверки дисперсии и продвижения не пройдены; см. раздел «Сравнение моделей»).

пояснение к колонкам — что означает каждое сокращение и какое направление лучше
:::

2b. Устойчивость к состязательным примерам (RU)

На проверке сложных форм полный стек отлавливает 19/20 состязательных идентификаторов — единственная утечка — это русское имя в латинской транслитерации.

combocov Rcov F2ent Rdirectquasipreds
regex0.4000.4550.4000.4710.0008
natasha0.3500.3890.3500.3530.33310
ollama·qwen2.5:3b0.6500.6630.6500.5881.00025
natasha+regex0.7500.7650.7500.8240.33318
natasha+regex+ollama·qwen2.5:3b ★0.9500.8870.9500.9411.00030
natasha+regex+gemma3 ◇1.0000.9171.0001.0001.00032
natasha+regex+gemma4-12b-mlx ◇1.0000.9481.0001.0001.00028
natasha+regex+gemma4-26b·cloud ◇1.0000.9431.0001.0001.00026
natasha+regex+gliner ◇1.0000.8261.0001.0001.00041

◇ — экспериментальная замена в ★-стеке (LLM Gemma или NER-слой GLiNER): отдельный кэш детектора, не продвинутый дефолт (проверки дисперсии и продвижения не пройдены; см. раздел «Сравнение моделей»).

пояснение к колонкам — что означает каждое сокращение и какое направление лучше
  • cov R (больше — лучше) — Полнота покрытия маской (нестрогая, перекрытие ≥1 символа): доля эталонных (gold) спанов PII, которых маска маскирования вообще коснулась. Промах = утёкшие PII.
  • cov F2 (больше — лучше) — F2 покрытия маской (с весом полноты, β=2): полнота весит в 2× больше точности, потому что пропущенная сущность приводит к утечке PII, тогда как ложное срабатывание лишь избыточно маскирует.
  • ent R (больше — лучше) — Полнота на уровне сущностей (TAB): сущность считается защищённой, только если замаскированы ВСЕ её упоминания — одно незамаскированное повторение является утечкой.
  • direct (больше — лучше) — Полнота на уровне сущностей для прямых идентификаторов (имя, телефон, email, полис/ID).
  • quasi (больше — лучше) — Полнота на уровне сущностей для квази-идентификаторов (возраст, профессия, город, работодатель, медикамент, дата) — комбинируемая поверхность реидентификации.
  • preds · (контекст) — Количество предсказанных спанов, выданных стеком (объём маскирования). Это контекст, а не оценка: больше маскирования — это размен точности на полноту.
что содержит проверка

16 фрагментов, 20 эталонных (gold) форм: отчества, транслитерация, уменьшительные формы, никнеймы VK/Telegram, СНИЛС/ИНН/паспортные идентификаторы, сокращённые адреса и переключение кодов (code-switching).

Regex отлавливает структурированные идентификаторы и никнеймы; Natasha + qwen2.5:3b восстанавливают отчества, уменьшительные формы и переключение кодов (code-switching). Единственная остаточная утечка — это “Sergey Volkov”, русское имя в латинской транслитерации: Natasha работает только с кириллицей, у regex нет правила для имён, а qwen его пропустил. Это аргумент в пользу добавления английского/латинского NER (OPF), когда ожидается транслитерация.

:::

2c. Сравнение моделей

Экспериментальная замена модели показывает, что Gemma превосходит базовую Qwen на каждом полном коротком срезе; локальная Gemma4 сильнее всего на русских наборах, а облачная HF Gemma4 лидирует на английском стеке и стабильна на 5 репликах. GLiNER-multi — локальный zero-shot NER-слой — представлен на тех же условиях. ★-дефолты не меняются, пока не пройдены проверки дисперсии и продвижения.

datasetmodelcov Rcov F2ent Rpreds
RU-synth longQwen2.5-3B0.8750.8020.7261392
RU-synth longGemma30.9540.3620.8509093
RU-synth longGLiNER-multi PII (zero-shot NER)0.9800.4070.8857927
RU-advQwen2.5-3B0.9500.8870.95030
RU-advGemma31.0000.9171.00032
RU-advGemma4 12B-MLX1.0000.9481.00028
RU-advGemma4 26B-A4B (HF cloud)1.0000.9431.00026
RU-advGLiNER-multi PII (zero-shot NER)1.0000.8261.00041
RU-realQwen2.5-3B0.7920.6140.792180
RU-realGemma30.9610.7300.961201
RU-realGemma4 12B-MLX1.0000.8201.000172
EN-synthQwen2.5-3B0.9780.87066
EN-synthGemma31.0000.90462
EN-synthGemma4 12B-MLX1.0000.95554
EN-synthGemma4 26B-A4B (HF cloud)1.0000.96252
EN-synthGLiNER-multi PII (zero-shot NER)0.9570.78291

Строки — оценки стеков из отдельных кэшей детекторов, сгенерированные score_llm_experiment.py. Облачные строки использовали только синтетический текст. Chunking Gemma3 на длинном RU-срезе включён как компромисс полноты и шума, а не как продвинутый дефолт; отсутствующие строки опущены, а не засчитаны как ноль.

:::

3. Прямые против квази-идентификаторов (TAB)

Прямые идентификаторы достигают полноты на уровне сущностей 0.81; квази-идентификаторы остаются ниже — 0.64.

Полнота на уровне сущностей для RU (сущность защищена, только если замаскированы все упоминания) по классам идентификаторов.

асимметрия

Прямые (имя, телефон, email, полис): замаскированы с полнотой на уровне сущностей 0.81 в дефолтном стеке.

Квази (возраст, профессия, город, работодатель, медикамент, дата): LLM помогает, но потолок остаётся низким — именно эти атрибуты в совокупности реидентифицируют человека.

:::

4. Что выживает — реконструкция & реидентификация

31% квази-идентификаторов выживают в дефолтном стеке (оба клиента); избыточное маскирование стоит 20% от объёма маскирования.

выживаемость квази (A)
27%
клиент A · поверхность реид.
выживаемость квази (B)
33%
клиент B
избыточное маскирование (C)
20%
цена читаемости
атакующий
qwen2.5:3b
Qwen2.5-3B · восстанавливает атрибуты из замаскированного текста

Метод — по образцу литературы о реидентификации / атаках вывода (inference) (Staab et al.; RAT-Bench; Tau-Eval). Сущность выживает, если хотя бы одно из её упоминаний осталось незамаскированным.

интерпретация

Локальный атакующий на базе 3B qwen восстановил 2 of 10 проверенных атрибутов из замаскированного текста (например, медикамент, поскольку его полнота на уровне сущностей равна 0). Слабый атакующий — это нижняя оценка: литература об атаках вывода (inference) (Staab et al.) сообщает о гораздо более высоких показателях реидентификации для передовых моделей.

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

:::

5. Приватность против полезности — можно ли деидентифицировать и всё же анализировать?

Слабый локальный атакующий восстанавливает 1/10 атрибутов (top-3); при этом 91% клинического сигнала переживает маскирование.

Сигнал КПТ сохранён
91%
типы искажений, замаскированный vs ориг.
сохранён не-PII текст
99.5%
нижний порог полезности на уровне символов
атака top-3
1/10
qwen2.5:3b, нижняя оценка
остаточный риск
MEDIUM / MEDIUM
клиент A / B

Метод — атака вывода (inference) top-k с фиксированным, заявленным бюджетом (qwen2.5:3b, temp 0.4, top-3 догадки на атрибут, только замаскированный текст) + сохранение нижестоящей задачи (повторный запуск извлечения когнитивных искажений на замаскированном vs. оригинальном тексте). Согласовано со Staab et al. / RAT-Bench (приватность) и Tau-Eval (полезность с учётом задачи).

противоречие, разрешённое

То же маскирование, что снижает успех атакующего, может стереть клиническое содержание. Здесь это не так: дефолтный стек сохраняет ~91% сигнала искажений и 99.5% не-PII текста, в то время как слабый атакующий не восстанавливает ничего в top-3.

Оговорка: этот атакующий — нижняя оценка: квази-идентификаторы по-прежнему выживают в тексте (полнота на уровне сущностей для медикаментов равна 0), поэтому передовой атакующий показал бы более высокий результат. Остаточный риск для клиента B остаётся СРЕДНИМ.

:::

6. Стек CONFIDE против устоявшихся базовых решений (Presidio, Philter)

Готовые деидентификаторы могут не уступать стеку по покрытию, но сильно отстают по типозависимому micro-F1.

EN-synth: полнота F2 (с весом полноты, главное) против micro-F1 с учётом типа для стека CONFIDE ★ и устоявшихся базовых решений.

как читать

Полнота F2 (оранжевый) спрашивает лишь “замаскировали ли мы спан вообще”. Тип. micro-F1 (зелёный) требует ещё и правильную метку — то, что на самом деле нужно политике маскирования.

На EN-synth Presidio чуть опережает стек по полноте F2 (за счёт широкого распознавателя DATE_TIME), но его F1 по типам гораздо ниже; Philter даёт высокое покрытие, но почти всё помечает как нетипизированное OTHER, поэтому его F1 по типам непригодна к использованию.

Главное: типовая система — это не система, настроенная под терапию; единственное покрытие, которое добавляет базовая модель, — это относительные/разговорные даты.

:::

7. Регуляторный остаточный риск (RU · EN)

Метрики обнаружения измеряют то, что мы ловим; регуляторов же волнует то, что выживает. В проекции на названные риски дефолтный RU-стек оказывается на уровне RED — это обусловлено наличием 9 релевантных остаточных сущности прямых идентификаторов (ключ реидентификации, оставленный в тексте). Ещё 1 — это прописанные словами цифровые идентификаторы, по замыслу выходящие за рамки regex-слоя и описанные отдельно.

Все датасеты, бок о бок

датасетtierdirect resspecial resHIPAAworst docinf ratelink AUC
RURED964/670%20%0.46
EN-synthAMBER006/70%20%0.46

Уровень остаточного риска по каждому языку под ★-дефолтным стеком этого языка. RU получает RED (прямые идентификаторы утекают по строгому критерию сущностей TAB); EN получает AMBER (утечки прямых ID нет, но ненулевой вывод / неполное покрытие HIPAA). Полнота на худшем документе для EN — 0%, потому что при крошечном эталоне один документ с PII может быть полностью пропущен — это шум малой выборки, а не системный сбой EN. Подробности по RU — ниже.

уровень остаточного риска (tier)
RED
порядковый R/A/G · RU ★ стек
Покрытие, вдохновлённое HIPAA
4/6
категории полностью удалены
полнота на худшем документе
70%
удержание · 1.424 утечек / 10k символов
выделен (singling out)
0/6
клиенты · остаточная квази-поверхность

Триада реидентификации WP29 (Art-29 WP 05/2014) — идентифицируемость раскладывается на выделение (singling out) (остаточная квази-поверхность через оценку по доле популяции с оговорками — НЕ k-анонимность корпуса, N крошечный), связываемость (linkability) (попарная связываемость сессий, ROC AUC 0.46 — площадь под ROC-кривой: 1.0 = идеально связываемо, 0.50 = не лучше случайного угадывания, что и есть безопасное направление), и вывод (inference) (атака восстановления атрибутов извлекает 20%). Покрытие HIPAA — это контрольный список «в духе» Safe-Harbor, а не юридическое заключение (AGE — н/п; структурные ID схлопнуты).

как читать уровень (tier)

RED = любой релевантный прямой идентификатор утекает на уровне сущностей (одно незамаскированное упоминание — это ключ). AMBER = остаток особой категории, ненулевой вывод (inference) или связываемость (linkability) выше случайной. GREEN = всё чисто.

Что утекает: не имена целиком, а конкретные варианты — словоизменённые/притяжательные/отчественные формы (Артёмом, Натальин, Денису), фамилии со строчной буквы, звательные формы, латинская транслитерация (Timur) и коллизии имени с обычным словом (Вера, Роман). Полнота на уровне упоминаний это скрывает; строгая планка сущностей TAB (один промах ⇒ не защищено) выявляет это.

Оценка выделения (singling out) иллюстративна (метод на основе доли популяции с оговорками, а не k-анонимность корпуса) — это не гарантия невозможности идентификации.

методология

Каждый детектор запускается один раз на датасет; комбинации — это объединения спанов из кэша, слитые по интервалам в развёрнутую маску редактирования перед оценкой. В заголовке отчёта — полнота покрытия (нестрогое перекрытие), приватностно-критичный показатель; полнота-взвешенный F2 и точность приведены в таблице лидеров. Также сообщаются типозависимый micro/macro-F1 (i2b2) и полнота на уровне сущностей (TAB; замаскированы все упоминания). Числа даны на уровне упоминаний, если не указано иное. Эталон для RU локализован из двух PII-инвентарей «ключа ответов» и проверен вручную (восстановление заложенного сигнала, не независимо размеченный эталон); набор EN — это курируемый синтетический срез, а единственный реальнотекстовый якорь — внешний срез RU-real (JayGuard). Преимущественно синтетические данные — никаких реальных пациентов. Малое N: считайте показатели по типам ориентировочными.

Источники & благодарности

CONFIDE-Bench опирается на перечисленную ниже литературу по деидентификации, реидентификации и документированию. Каждая работа, упомянутая или использованная в этом отчёте, указана здесь со ссылкой на её каноническую страницу (DOI / arXiv / HuggingFace / GitHub). Мы указываем только то, что отчёт действительно использует; включение не означает одобрения со стороны их авторов.

Бенчмарки & метрики

Реидентификация & атаки на приватность

Детекторы & инструменты

Датасеты

Документирование & нормативный контекст