PII фильтрация (Personally Identifiable Information) — это процесс обнаружения и маскирования персональных данных пользователей перед отправкой запросов в AI модели. Когда вы передаёте текст в GPT-4o, Claude или Gemini, облачный провайдер технически получает доступ к содержимому запроса. Если в нём содержатся имена, паспортные данные, номера телефонов или адреса электронной почты, вы рискуете нарушить законодательство о персональных данных.
Зачем фильтровать PII перед отправкой в LLM
Отправка персональных данных в облачные AI модели создаёт несколько серьёзных рисков:
- Юридические риски — нарушение 152-ФЗ «О персональных данных» и GDPR может привести к штрафам до 18 млн рублей (или 4% от мирового оборота по GDPR)
- Утечка данных — провайдер может использовать данные для обучения моделей, если вы не отключили эту опцию
- Репутационные риски — утечка данных клиентов подрывает доверие к вашему продукту
- Compliance — для компаний в финансовом, медицинском и государственном секторах передача PII третьим лицам может быть запрещена
Типы PII, которые нужно фильтровать
Персональные данные делятся на несколько категорий. Вот основные типы, которые встречаются в текстовых запросах к AI:
- Идентификаторы личности — ФИО, дата рождения, ИНН, СНИЛС, номер паспорта
- Контактные данные — телефон, email, почтовый адрес
- Финансовые данные — номера банковских карт, расчётных счетов
- Медицинские данные — диагнозы, результаты анализов, полис ОМС
- Учётные данные — логины, пароли, токены доступа
Методы PII фильтрации
Regex-фильтрация
Самый простой и быстрый способ — использовать регулярные выражения для обнаружения типовых паттернов:
import re
PII_PATTERNS = {
"email": r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}",
"phone_ru": r"(?:+7|8)[s-]?(?d{3})?[s-]?d{3}[s-]?d{2}[s-]?d{2}",
"card_number": r"d{4}[s-]?d{4}[s-]?d{4}[s-]?d{4}",
"inn_individual": r"d{12}",
"inn_company": r"d{10}",
"snils": r"d{3}[s-]?d{3}[s-]?d{3}[s-]?d{2}",
"passport_ru": r"d{2}[s-]?d{2}[s-]?d{6}",
}
def mask_pii(text: str) -> str:
for pii_type, pattern in PII_PATTERNS.items():
text = re.sub(pattern, f"[{pii_type.upper()}_MASKED]", text)
return text
# Пример использования
user_input = "Свяжитесь с Иваном по телефону +7 (999) 123-45-67"
safe_input = mask_pii(user_input)
# Результат: "Свяжитесь с Иваном по телефону [PHONE_RU_MASKED]"
NER-модели для обнаружения имён и адресов
Регулярные выражения не обнаруживают имена и произвольные адреса. Для этого используют NER (Named Entity Recognition) модели:
from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine
analyzer = AnalyzerEngine()
anonymizer = AnonymizerEngine()
text = "Пациент Сергей Петров, дата рождения 15.03.1985, диагноз: гипертония"
results = analyzer.analyze(text=text, language="ru", entities=[
"PERSON", "DATE_TIME", "PHONE_NUMBER", "EMAIL_ADDRESS"
])
anonymized = anonymizer.anonymize(text=text, analyzer_results=results)
print(anonymized.text)
# "Пациент , дата рождения , диагноз: гипертония"
Архитектура PII фильтрации в production
В production-системе PII фильтрация должна быть встроена как middleware между вашим приложением и AI API:
import OpenAI from "openai";
// PII-фильтр как middleware
function filterPII(messages: Array<{ role: string; content: string }>) {
return messages.map((msg) => ({
...msg,
content: msg.content
.replace(/[w.-]+@[w.-]+.w{2,}/g, "[EMAIL]")
.replace(/(?:+7|8)s?(?d{3})?s?d{3}[s-]?d{2}[s-]?d{2}/g, "[PHONE]")
.replace(/d{4}[s-]?d{4}[s-]?d{4}[s-]?d{4}/g, "[CARD]"),
}));
}
const client = new OpenAI({
baseURL: "https://api.modelswitch.ru/v1",
apiKey: "msk_ваш_ключ",
});
const response = await client.chat.completions.create({
model: "gpt-4o",
messages: filterPII([
{ role: "user", content: "Отправьте счёт на user@example.com, карта 4111-1111-1111-1111" },
]),
});
Такой подход гарантирует, что ни один запрос к внешнему API не содержит персональных данных. ModelSwitch как AI Gateway добавляет дополнительный слой контроля, позволяя настроить фильтрацию на уровне proxy.
Заключение
PII фильтрация — обязательный элемент любого AI-приложения, работающего с данными пользователей. Комбинируйте regex-паттерны для структурированных данных (телефоны, email, карты) с NER-моделями для произвольных имён и адресов. Встраивайте фильтрацию как middleware, чтобы ни один запрос не мог обойти проверку. А для централизованного контроля используйте AI Gateway с логированием и аудитом.