Почему фильтра перед отправкой в нейросеть недостаточно
Персональные данные попадают не только в поле «ФИО». Они встречаются в письмах, вложениях, OCR, истории диалога, URL, tool results и метаданных. После вызова копии могут появиться в логах, traces, кэше и очередях.
Поэтому нужен не один regex, а privacy pipeline: определить цель, минимизировать ввод, классифицировать, преобразовать, вызвать модель, проверить ответ и при необходимости контролируемо восстановить разрешённые значения.
Термины: anonymization, pseudonymization, redaction
| Метод | Что происходит | Можно восстановить |
|---|---|---|
| Redaction | Значение удаляется или заменяется типом | Нет, если mapping не хранится |
| Masking | Скрывается часть значения | Не из маски, но остаток может идентифицировать |
| Tokenization | Значение заменяется токеном | Да при обратимой схеме или mapping |
| Pseudonymization | Прямая связь заменяется псевдонимом | Возможно при дополнительной информации |
| Anonymization | Связь с человеком практически устранена в контексте риска | Не должна быть разумно восстановима |
NIST подчёркивает риск повторной идентификации некоторых de-identified наборов. Не называйте данные анонимными только потому, что удалили имя.
Шаг 1. Data minimization до любого детектора
Самая надёжная защита - не передавать ненужное поле. Опишите контракт результата и для каждого входа задайте purpose. Если задача - определить тему обращения, модели обычно не нужен номер паспорта или полный платёжный адрес.
Проведи data-minimization review для workflow [название]. Результат: [output contract]. Входные поля и источники: [список]. Для каждого поля укажи: 1. зачем оно нужно для результата; 2. можно ли удалить до LLM; 3. можно ли заменить категорией, диапазоном или токеном; 4. срок хранения и получателей; 5. риск повторной идентификации в комбинации; 6. тест, доказывающий сохранение utility. Не считай существующее поле необходимым только потому, что оно уже собирается.
Шаг 2. Классифицируйте данные и назначьте допустимое действие
Классификация связывает тип информации с политикой. Один и тот же телефон может быть нужен для доставки, но не для классификации тональности. Решение зависит от purpose и контекста.
- Публичные данные.
- Внутренние бизнес-данные.
- Прямые идентификаторы человека.
- Квазиидентификаторы и комбинации полей.
- Финансовые, медицинские и иные чувствительные категории.
- Credentials, API keys и session tokens.
- Данные детей и других специальных групп.
- Договорные и клиентские секреты.
- Технические identifiers: IP, device, account IDs.
Для каждого класса задайте allow, redact, tokenize, aggregate или block по конкретному workflow и провайдеру.
Шаг 3. Инвентаризируйте полный data flow
Проверьте не только основной prompt. Нарисуйте путь от интерфейса до провайдера и обратно, включая временные хранилища.
Ingress
Формы, файлы, email, OCR и API.
Processing
Queues, RAG, tools, gateway и model.
Copies
Logs, traces, cache, backups и analytics.
Фиксируйте controller/processor roles, region, retention, доступ и удаление. Юридические требования зависят от юрисдикции и сценария; согласуйте их с профильным специалистом.
PII detection: почему одного regex мало
Regex хорошо находит формализованные номера, но не понимает «директор из единственной школы посёлка» и может принять обычное число за документ. Для свободного текста комбинируйте несколько сигналов.
| Метод | Сильная сторона | Ограничение |
|---|---|---|
| Schema/column policy | Высокая точность известных полей | Не видит данные в комментарии |
| Regex/checksum | Телефоны, карты, документы | Контекст и false positives |
| Словари | Внутренние IDs и названия | Нужно обновление |
| NER/ML detector | Имена и адреса в тексте | Ошибки по языкам и доменам |
| LLM classifier | Контекстные случаи | Нельзя делать единственной защитой |
Detection pipeline: порядок имеет значение
Сначала применяйте доверенную схему и запрещённые поля, затем точные detectors, после - контекстные. Секреты блокируйте до внешнего вызова. Каждый finding содержит тип, span, confidence, источник правила и выбранное преобразование.
Finding contract: finding_id: UUID info_type: EMAIL | PHONE | PERSON | ACCOUNT | SECRET | CUSTOM start/end: offsets in normalized text detector_id/version: string confidence: calibrated score policy_action: block | redact | mask | tokenize | allow tenant_id: trusted scope purpose: workflow ID review_required: boolean Никогда не записывай исходное значение finding в обычный лог.
Нормализация Unicode и offsets должна быть детерминированной, иначе замена попадёт не в тот фрагмент.
Redaction: когда значение нужно удалить полностью
Если downstream не должен видеть или возвращать значение, замените его типизированным placeholder: [EMAIL_REDACTED]. Тип помогает модели понимать структуру без раскрытия содержимого.
- Не оставляйте инициалы, если они не нужны.
- Удаляйте скрытые metadata из документов и изображений.
- Проверяйте OCR и alt text отдельно.
- Не помещайте оригинал в HTML-комментарий или tool metadata.
- Сохраняйте позиционную карту только при доказанной необходимости.
- Не допускайте rehydration для необратимого режима.
Redaction снижает utility, если сущности нужно различать. Тогда полезны стабильные псевдонимы вроде [PERSON_01].
Masking и обобщение: сохранить форму, убрать точность
Masking оставляет часть значения, например последние цифры. Bucketing заменяет возраст диапазоном, а точную дату - месяцем или годом. Это полезно, если задаче нужна форма или группа, но не точный идентификатор.
| Исходный смысл | Преобразование | Оставшийся риск |
|---|---|---|
| Номер карты | Тип и последние цифры | Связь с другими полями |
| Возраст | Диапазон | Редкая комбинация |
| Дата события | Месяц/квартал | Уникальное событие |
| Адрес | Город/регион | Малый населённый пункт |
| Должность | Функциональная группа | Единственная роль |
Tokenization и pseudonymization: когда нужна связность
Tokenization заменяет значение суррогатом. Детерминированный токен позволяет узнавать повтор одной сущности и выполнять join, но повышает linkability. Случайный токен лучше разрывает связь между контекстами, но усложняет анализ.
Google Sensitive Data Protection документирует обратимые и необратимые cryptographic transformations; для re-identification нужны токен и соответствующий ключ. Конкретную криптографию реализуйте проверенной библиотекой или сервисом, а не собственным алгоритмом.
One-way
Связность без восстановления.
Reversible
Восстановление только по policy.
Mapping store и управление ключами
Если токен обратим, таблица соответствий или cryptographic key становится особо чувствительным активом. Храните её отдельно от prompt pipeline и ограничивайте доступ сервисной ролью rehydration.
- Ключ хранится в KMS/HSM или утверждённом secret manager.
- Доступ разделён по tenant и purpose.
- Приложение LLM не получает право массовой выгрузки.
- Ключи имеют версии и процедуру ротации.
- Mapping records имеют TTL и deletion workflow.
- Чтение и re-identification попадают в audit log.
- Backup защищён теми же или более строгими мерами.
- Есть план утраты, компрометации и отзыва ключа.
Placeholder design: модель не должна ломать токены
Placeholder должен быть однозначным, не совпадать с пользовательским текстом и сохраняться моделью без изменения. Используйте непрозрачный ID с подписью или сверку с server-side allowlist.
Правила placeholders: - формат создаёт только trusted tokenizer; - тип и случайный ID не раскрывают оригинал; - ID уникален в нужном scope; - модель обязана копировать placeholder дословно; - новые или изменённые placeholders отклоняются; - rehydration разрешена только для ID из текущего запроса; - tenant и purpose проверяются до восстановления; - placeholder никогда не является инструкцией.
Rehydration: восстановление только после validation
Не восстанавливайте значения в сыром тексте модели. Сначала проверьте response schema, допустимые placeholders, бизнес-правила и право получателя. Затем сервер заменяет только точные tokens из текущей mapping scope.
| Проверка | Зачем | При провале |
|---|---|---|
| Schema | Известная структура | Отклонить/безопасный repair |
| Token allowlist | Запрет выдуманных ID | Не восстанавливать |
| Tenant/purpose | Изоляция контекста | Security event |
| Recipient authorization | Право видеть оригинал | Redacted response |
| Output channel | Защита email/log/export | Block или approval |
Квазиидентификаторы и риск повторной идентификации
Запись без имени может оставаться уникальной по возрасту, району, должности и редкому событию. Оценивайте комбинации и внешний контекст, доступный получателю. NIST отдельно предупреждает, что de-identified данные иногда удаётся re-identify.
- Ищите редкие сочетания полей.
- Обобщайте или удаляйте высококардинальные атрибуты.
- Разделяйте наборы по purpose и аудитории.
- Не выдавайте длинные списки единичных записей.
- Проводите re-identification risk assessment.
- Проверяйте свободный текст после обработки структурных полей.
Порог допустимого риска и правовая квалификация требуют контекстной оценки, а не универсального процента.
RAG, tools и агенты: данные могут вернуться обходным путём
Защищайте весь цикл, а не только первый prompt. Retriever способен добавить необработанный документ, tool - вернуть карточку клиента, а агент - отправить значение в поисковый API.
- Документы классифицированы до индексации.
- Retrieval фильтрует tenant и права до генерации.
- Tool outputs проходят тот же detection policy.
- Tool allowlist учитывает data class.
- External search не получает restricted payload.
- Agent state и memory имеют retention и deletion.
- Human handoff показывает только разрешённый уровень.
- Exports и webhooks проходят output DLP.
Логи, traces и кэш - часть области персональных данных
Частая ошибка - очистить prompt, но записать raw request до фильтра. Логируйте типы findings, количество замен, версии policy, model usage и результат validation, а не исходные значения.
| Артефакт | Минимальные данные | Защита |
|---|---|---|
| Application log | IDs, counts, policy version | Без payload |
| Trace | Этапы, latency, status | Сэмплинг и redaction |
| Prompt cache | Обработанный content | Tenant key и TTL |
| Debug capture | Только одобренный пример | JIT access и короткий срок |
| Eval dataset | Разрешённые обезличенные кейсы | Provenance и deletion |
Как измерять качество обезличивания
Высокий recall уменьшает пропуски чувствительных значений, а precision снижает разрушение полезного текста. Оба показателя считайте по info type, языку, источнику и формату. Добавьте end-to-end leakage tests.
Detection
Precision, recall и span accuracy.
Utility
Качество целевой LLM-задачи.
Leakage
Пропуск, cross-tenant и rehydration abuse.
Тестовый набор и red-team сценарии
- Явные identifiers разных форматов и языков.
- Опечатки, пробелы, Unicode и OCR-ошибки.
- PII внутри JSON, таблиц, URL и filenames.
- Квазиидентификаторы и редкие комбинации.
- Secrets, keys и bearer tokens.
- Несколько людей с одинаковыми именами.
- Вложенные и перекрывающиеся findings.
- Выдуманный моделью placeholder.
- Подмена tenant или purpose при rehydration.
- PII из tool result, RAG и agent memory.
- Попытка попросить модель раскрыть скрытое значение.
- Логи, cache и error message после сбоя.
Пошаговый rollout privacy gateway
Начните в observe-only режиме на разрешённом тестовом трафике: detector сообщает findings, но не меняет production. Разметьте выборку, откалибруйте пороги и правила. Затем включите block для secrets и точных запрещённых полей, после - redaction и tokenization по отдельным workflows.
Этап 1: data map, purpose и policy matrix. Этап 2: размеченный тестовый набор по языкам/источникам. Этап 3: observe-only detector и анализ false positives/negatives. Этап 4: hard block secrets и запрещённых полей. Этап 5: canary redaction для одного низкорискового workflow. Этап 6: tokenization + закрытый mapping store. Этап 7: validated rehydration для узкого output contract. Этап 8: end-to-end leakage, load и failure tests. Этап 9: расширение по cohorts с rollback.
Итоговый production-чек-лист
- Purpose и минимальный набор полей утверждены.
- Прямые, косвенные identifiers и secrets классифицированы.
- Policy задаёт allow/redact/tokenize/block по workflow.
- Detectors версионированы и измерены по сегментам.
- Placeholder не раскрывает оригинал и защищён от подделки.
- Mapping store и ключи отделены от LLM pipeline.
- Доступ ограничен по tenant и purpose.
- Rehydration следует после schema и authorization checks.
- RAG, tools, memory и outputs проходят ту же политику.
- Raw payload отсутствует в обычных logs и traces.
- Caches изолированы, имеют TTL и deletion.
- Проверены квазиидентификаторы и re-identification risk.
- Есть leakage, cross-tenant и failure tests.
- False positives оцениваются вместе с utility.
- Rollout, rollback, audit и incident owner документированы.
Обезличивание - не обещание абсолютной анонимности. Это управляемое снижение раскрываемых данных, доказанное измерениями и усиленное организационными ограничениями.
Нужно ли обезличивать данные перед отправкой в ChatGPT или другой LLM API?
Чем anonymization отличается от pseudonymization?
Можно ли найти все персональные данные регулярными выражениями?
Когда использовать redaction, а когда tokenization?
Что такое rehydration после ответа модели?
Становятся ли данные анонимными после удаления имени?
Можно ли логировать обезличенный prompt?
Как проверить качество PII-фильтра?
- NIST - De-Identification of Personal Information (NISTIR 8053)
- NIST - Guide to Protecting the Confidentiality of PII (SP 800-122)
- ICO - Pseudonymisation guidance
- Google Cloud - De-identify and re-identify sensitive data
- Google Cloud - Pseudonymization
- Google Cloud - De-identifying sensitive data
- Microsoft Presidio - Data protection and de-identification SDK
- OWASP - LLM Prompt Injection Prevention Cheat Sheet