Почему фильтра перед отправкой в нейросеть недостаточно

Персональные данные попадают не только в поле «ФИО». Они встречаются в письмах, вложениях, OCR, истории диалога, URL, tool results и метаданных. После вызова копии могут появиться в логах, traces, кэше и очередях.

Поэтому нужен не один regex, а privacy pipeline: определить цель, минимизировать ввод, классифицировать, преобразовать, вызвать модель, проверить ответ и при необходимости контролируемо восстановить разрешённые значения.

1
purpose для каждого поля
N
копий данных по всему workflow
0
raw payload в логах по умолчанию

Термины: 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 и контекста.

Data classes
  1. Публичные данные.
  2. Внутренние бизнес-данные.
  3. Прямые идентификаторы человека.
  4. Квазиидентификаторы и комбинации полей.
  5. Финансовые, медицинские и иные чувствительные категории.
  6. Credentials, API keys и session tokens.
  7. Данные детей и других специальных групп.
  8. Договорные и клиентские секреты.
  9. Технические 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.

Key and mapping controls
  1. Ключ хранится в KMS/HSM или утверждённом secret manager.
  2. Доступ разделён по tenant и purpose.
  3. Приложение LLM не получает право массовой выгрузки.
  4. Ключи имеют версии и процедуру ротации.
  5. Mapping records имеют TTL и deletion workflow.
  6. Чтение и re-identification попадают в audit log.
  7. Backup защищён теми же или более строгими мерами.
  8. Есть план утраты, компрометации и отзыва ключа.

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/exportBlock или approval

Квазиидентификаторы и риск повторной идентификации

Запись без имени может оставаться уникальной по возрасту, району, должности и редкому событию. Оценивайте комбинации и внешний контекст, доступный получателю. NIST отдельно предупреждает, что de-identified данные иногда удаётся re-identify.

  • Ищите редкие сочетания полей.
  • Обобщайте или удаляйте высококардинальные атрибуты.
  • Разделяйте наборы по purpose и аудитории.
  • Не выдавайте длинные списки единичных записей.
  • Проводите re-identification risk assessment.
  • Проверяйте свободный текст после обработки структурных полей.

Порог допустимого риска и правовая квалификация требуют контекстной оценки, а не универсального процента.

RAG, tools и агенты: данные могут вернуться обходным путём

Защищайте весь цикл, а не только первый prompt. Retriever способен добавить необработанный документ, tool - вернуть карточку клиента, а агент - отправить значение в поисковый API.

End-to-end controls
  1. Документы классифицированы до индексации.
  2. Retrieval фильтрует tenant и права до генерации.
  3. Tool outputs проходят тот же detection policy.
  4. Tool allowlist учитывает data class.
  5. External search не получает restricted payload.
  6. Agent state и memory имеют retention и deletion.
  7. Human handoff показывает только разрешённый уровень.
  8. Exports и webhooks проходят output DLP.

Логи, traces и кэш - часть области персональных данных

Частая ошибка - очистить prompt, но записать raw request до фильтра. Логируйте типы findings, количество замен, версии policy, model usage и результат validation, а не исходные значения.

АртефактМинимальные данныеЗащита
Application logIDs, counts, policy versionБез payload
TraceЭтапы, latency, statusСэмплинг и redaction
Prompt cacheОбработанный contentTenant 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 сценарии

Privacy test suite
  1. Явные identifiers разных форматов и языков.
  2. Опечатки, пробелы, Unicode и OCR-ошибки.
  3. PII внутри JSON, таблиц, URL и filenames.
  4. Квазиидентификаторы и редкие комбинации.
  5. Secrets, keys и bearer tokens.
  6. Несколько людей с одинаковыми именами.
  7. Вложенные и перекрывающиеся findings.
  8. Выдуманный моделью placeholder.
  9. Подмена tenant или purpose при rehydration.
  10. PII из tool result, RAG и agent memory.
  11. Попытка попросить модель раскрыть скрытое значение.
  12. Логи, 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-чек-лист

Privacy gate
  1. Purpose и минимальный набор полей утверждены.
  2. Прямые, косвенные identifiers и secrets классифицированы.
  3. Policy задаёт allow/redact/tokenize/block по workflow.
  4. Detectors версионированы и измерены по сегментам.
  5. Placeholder не раскрывает оригинал и защищён от подделки.
  6. Mapping store и ключи отделены от LLM pipeline.
  7. Доступ ограничен по tenant и purpose.
  8. Rehydration следует после schema и authorization checks.
  9. RAG, tools, memory и outputs проходят ту же политику.
  10. Raw payload отсутствует в обычных logs и traces.
  11. Caches изолированы, имеют TTL и deletion.
  12. Проверены квазиидентификаторы и re-identification risk.
  13. Есть leakage, cross-tenant и failure tests.
  14. False positives оцениваются вместе с utility.
  15. Rollout, rollback, audit и incident owner документированы.

Обезличивание - не обещание абсолютной анонимности. Это управляемое снижение раскрываемых данных, доказанное измерениями и усиленное организационными ограничениями.

Нужно ли обезличивать данные перед отправкой в ChatGPT или другой LLM API?
Если персональные или конфиденциальные значения не нужны для результата, их следует удалить или преобразовать до передачи. Конкретные правовые обязанности зависят от цели, юрисдикции, договора и настроек сервиса; их нужно проверять отдельно.
Чем anonymization отличается от pseudonymization?
При pseudonymization связь можно восстановить с дополнительной информацией, например ключом или mapping table, поэтому риск и требования сохраняются. Anonymization предполагает, что разумная повторная идентификация устранена в рассматриваемом контексте.
Можно ли найти все персональные данные регулярными выражениями?
Нет. Regex полезны для формализованных номеров, но плохо распознают имена, контекст и косвенные идентификаторы. Нужна комбинация схемы, правил, checksums, словарей и контекстных detectors с измеренными precision и recall.
Когда использовать redaction, а когда tokenization?
Redaction подходит, когда исходное значение больше не нужно. Tokenization нужна, когда требуется различать повторы, связывать записи или контролируемо вернуть значение. Обратимые токены требуют отдельной защиты ключей и mapping store.
Что такое rehydration после ответа модели?
Это server-side замена разрешённых placeholders на исходные значения. Она выполняется только после проверки schema, списка токенов, tenant, purpose, прав получателя и безопасного output channel.
Становятся ли данные анонимными после удаления имени?
Не обязательно. Возраст, район, должность и редкое событие могут вместе идентифицировать человека. Нужно оценивать квазиидентификаторы, внешний контекст и риск повторной идентификации.
Можно ли логировать обезличенный prompt?
Только по утверждённой политике. Даже обработанный текст может содержать пропущенные identifiers или чувствительный смысл. По умолчанию лучше логировать IDs, версии, количества findings, usage и статусы без содержимого.
Как проверить качество PII-фильтра?
Используйте размеченный набор по типам, языкам и источникам; считайте precision, recall и span accuracy. Дополнительно измеряйте utility LLM-задачи и end-to-end leakage, включая tools, RAG, logs, cache и cross-tenant rehydration.
← Все статьи блога