anonym.legal
Назад до блогуТехнічні

Проблема хибних спрацьовувань Presidio...

Хибні спрацьовування у Microsoft Presidio коштують організаціям тисячі годин ручної перевірки.

April 21, 20267 хв читання
Presidio precisionfalse positivesNER accuracyPII detection qualityhybrid recognizer

Масштаб проблеми хибних спрацьовувань

Microsoft Presidio — потужна відкрита платформа аналізу PII — з'явилася від Microsoft Research і стала стандартом де-факто у багатьох організаціях. Але у виробничих середовищах виникає реальна проблема: хибні спрацьовування.

Хибне спрацьовування відбувається, коли Presidio позначає невинний фрагмент тексту як PII. У юридичних і медичних документах, де точність критична, це має реальні наслідки:

  • Юрист виправляє 200+ помилкових редакцій у великому контракті
  • Медичний кодувальник витрачає 3 години на огляд «анонімізованого» запису, де заредаговано медичні терміни
  • Команда відповідності повертає документи через надмірну анонімізацію
  • Системи машинного навчання навчаються на деградованих даних

Чому Presidio дає хибні спрацьовування

1. Regex-патерни без контексту

Presidio використовує комбінацію regex та NLP. Regex-патерни за визначенням не розуміють контексту.

Приклад: Патерн для US_PHONE_NUMBER відповідає (555) 867-5309, але також спрацьовує на:

  • Коди продуктів: (MOD) 867-5309
  • Посилання на нормативні акти: CFR 867-5309
  • Порядкові номери в документах: Додаток (B) 867-5309

2. Перетин числових форматів

Числові шаблони різних сутностей перекриваються:

  • 9-значне число може бути SSN, PHONE без коду країни, або просто ідентифікатором
  • 16-значне число може бути кредитною карткою або кодом продукту
  • 6-цифровий код може бути ZIP або медичним кодом

3. Медичні терміни vs Персональні дані

У медичних документах числові значення повсюдні:

  • Дозування: 50 мг кожні 8 годин → 8 може збігатися з патернами дат
  • Показники тиску крові: 120/80 → схоже на IP-адресу або дату
  • Коди МКХ-10: J12.89 → схоже на деякі ідентифікатори
  • Ваги, зріст, лабораторні значення — все може хибно спрацювати

4. Юридичні посилання vs Персональні дані

У юридичних документах:

  • Посилання на статті законів: Стаття 17(2)(b) — може збігатися з патернами дат
  • Номери справ: 2024 WL 1234567 — схоже на SSN
  • Цитати зі свідоцтв: «Позивач, п-н X» — якщо X є реальним іменем у базі
  • Географічні юрисдикції: «округ Майамі» — «Майамі» як ім'я особи

5. Проблема порогу впевненості

Presidio дає кожній сутності оцінку впевненості від 0 до 1. Низький поріг = більше виявлень = більше хибних спрацьовувань. Високий поріг = менше хибних спрацьовувань = ризик пропустити реальну PII.

Підбір порогу — це постійний компроміс, специфічний для кожного типу документів.

Кількісне оцінювання проблеми

Дослідження в реальних юридичних і медичних контекстах показали:

Тип документаХибні спрацьовування (%)Ручна корекція (хв/сторінку)
Юридичні контракти15-25%8-15
Медичні записи20-35%12-25
Фінансова звітність10-20%5-10
Корпоративне листування8-15%3-8

При масштабуванні: 1 000 сторінок медичних записів × 20 хв/сторінку = 333 години ручної роботи тільки через хибні спрацьовування.

Стратегії зменшення хибних спрацьовувань

1. Контекстне покращення (Context Enhancement)

Presidio підтримує context words — слова, що підвищують або знижують впевненість при появі поруч з сутністю.

from presidio_analyzer import PatternRecognizer, Pattern

# Знизити впевненість для чисел, що виглядають як SSN, але поруч із медичними термінами
medical_context_words = ["мг", "мл", "mmHg", "bpm", "g/dl", "мкМ"]

ssn_recognizer = PatternRecognizer(
    supported_entity="US_SSN",
    deny_list_terms=medical_context_words,  # знижує впевненість
    patterns=[Pattern("SSN", r"\b\d{3}-\d{2}-\d{4}\b", 0.5)]
)

2. Постобробка та фільтрація

Після аналізу — фільтрація результатів за контекстом:

def filter_false_positives(results, original_text):
    filtered = []
    for result in results:
        context = original_text[max(0, result.start-50):result.end+50]
        
        # Виключити юридичні посилання
        if "CFR" in context or "USC" in context or "§" in context:
            continue
        
        # Виключити медичні дозування
        if any(term in context for term in ["мг", "мл", "мкг", "МО"]):
            continue
            
        filtered.append(result)
    
    return filtered

3. Ансамблеві підходи

Використання кількох моделей і відбір лише спільних результатів:

  • Presidio як основний детектор
  • Додаткова ML-модель (fine-tuned BERT)
  • Правило: позначати лише те, що виявили обидві системи

Це знижує хибні спрацьовування за рахунок деякого зниження recall.

4. Навчання специфічного для домену

Тонке налаштування NLP-моделей Presidio на доменно-специфічних даних:

Для юридичних документів: навчання на анотованих юридичних текстах, де юридичні терміни і посилання помічені як не-PII.

Для медичних записів: навчання на MIMIC-III або i2b2 datasets з медичними анотаціями.

5. Whitelist для доменних термінів

Списки виключень, специфічні для організації:

# Виключити внутрішні коди продуктів зі сканування PII
PRODUCT_CODE_WHITELIST = [
    r"PRD-\d{6}",
    r"SKU[A-Z]{2}\d{8}",
    r"LOT-\d{4}-[A-Z]{2}",
]

Коли керований сервіс кращий за self-hosted Presidio

Self-hosted Presidio дає максимальний контроль, але вимагає значної роботи з тонким налаштуванням.

Managed PII сервіси, такі як anonym.legal, надають попередньо налаштовані профілі для різних галузей — юридичний, медичний, фінансовий — зі зменшеним рівнем хибних спрацьовувань «з коробки».

Компроміс:

  • Self-hosted: максимальний контроль, вища точність після налаштування, вищі початкові витрати
  • Managed: швидше впровадження, регулярні оновлення моделей, нижчий бар'єр входу

Висновок

Хибні спрацьовування у Presidio — не помилка, а властивість будь-якої системи виявлення PII загального призначення. У спеціалізованих доменах (юридичний, медичний) вони є реальним операційним викликом.

Рішення: контекстне налаштування, постобробка, доменна спеціалізація — або перехід до managed сервісу з доменними профілями.

Джерела:

Готові захистити свої дані?

Почніть анонімізувати PII з 285+ типами сутностей на 48 мовах.