Защита персональных данных (PII)
Защита данных на уровне API-шлюза
AITUNNEL умеет автоматически находить конфиденциальные данные в ваших запросах — номера паспортов, ИНН, телефоны, ФИО и другие — и либо заменять их правдоподобными синтетическими значениями перед отправкой в модель, либо полностью блокировать такой запрос. Никаких изменений в коде вашего приложения не требуется.
Функция работает прозрачно: включается и настраивается в панели управления для каждого API-ключа отдельно.
Зачем это нужно
Современные AI-модели — это внешние сервисы. Если ваши пользователи отправляют в промпты реальные персональные данные, эти данные потенциально:
- уходят к провайдеру модели (OpenAI, Google, Anthropic и т.д.);
- могут попасть в логи или обучающую выборку;
- создают юридические риски при работе с данными граждан РФ (ФЗ-152).
AITUNNEL решает это на уровне API-шлюза, не требуя изменений в клиентском коде.
Режимы работы
Режим «Маскировка» (mask)
Это основной режим. Когда в тексте запроса найдено персональные данные:
- AITUNNEL заменяет каждое найденное значение синтетическим заменителем того же формата — например, реальный ИНН
7707083893→ синтетический5012348760(тоже математически корректный). - Запрос с синтетическими данными отправляется в языковую модель.
- Когда модель возвращает ответ, AITUNNEL находит в нём все синтетические заменители и восстанавливает исходные значения.
В итоге ваш клиент получает ответ модели с оригинальными данными, а сама модель их никогда не видела.
Клиент AITUNNEL Модель
│ │ │
│── запрос ──────────► │ заменить ИНН, ФИО... │
│ │── замаскированный ──────► │
│ │◄── ответ с синтетикой ── │
│◄── ответ с оригиналом│ восстановить │Синтетические значения
Заменители математически корректны — синтетические ИНН проходят проверку контрольной суммы, СНИЛС тоже, номера карт — алгоритм Луна и т.д. Это важно, потому что модель может использовать формат в своём ответе (например, упоминать ИНН в составленном документе), и восстановление работает корректно.
Режим «Блокировка» (block)
Если в тексте запроса обнаружены персональные данные, AITUNNEL немедленно возвращает ошибку HTTP 400 и не отправляет запрос в модель. Подходит для ситуаций, когда персональные данные в промптах вообще не должны появляться — например, во внутренних инструментах с жёсткими требованиями к безопасности.
Ответ при блокировке:
{
"error": {
"message": "Request blocked: PII detected — passport, phone",
"type": "pii_blocked",
"code": "pii_blocked",
"param": null
}
}Какие данные обнаруживаются
| Тип | Примеры | Особенности |
|---|---|---|
user@example.com | — | |
| Телефон | +7 (900) 123-45-67, 8-900-123-45-67 | С контекстом или в международном формате |
| Паспорт РФ / загран | 4509 123456, 75 1234567 | Требует контекстного слова |
| СНИЛС | 112-233-445 95 | С проверкой контрольной суммы |
| ИНН | 7707083893, 500100732259 | 10 и 12 цифр, с проверкой КС |
| ОГРН | 1027700132195 | 13 цифр, с проверкой КС |
| ОГРНИП | 316784700047159 | 15 цифр, с проверкой КС |
| Банковская карта | 4111 1111 1111 1111 | Алгоритм Луна, все платёжные системы |
| JWT-токен | eyJhbGci... | Трёхсегментный Base64url |
| API-ключ / секрет | sk-..., ghp_..., AKIA... | Популярные форматы |
| Адрес | ул. Ленина, д. 5, кв. 12 | Российские форматы улиц, почтовый индекс |
| ФИО | Иванов Иван Иванович, Иванов И.И. | С отчеством или инициалами |
Об обнаружении ФИО
Поддерживаются форматы: «Фамилия Имя Отчество», «Имя Отчество», «Имя Отчество Фамилия», «Фамилия И.О.», «И.О. Фамилия». Одиночные имена без отчества и без инициалов не считаются ФИО — это намеренное ограничение для исключения ложных срабатываний.
Настройка в панели управления
Функция настраивается индивидуально для каждого API-ключа:
- Откройте панель управления → API ключи.
- Выберите нужный ключ и нажмите кнопку редактирования.
- В разделе «Защита данных (PII)» включите переключатель.
- Выберите режим: Маскировка или Блокировка.
- Выберите, какие типы данных нужно обнаруживать (по умолчанию — все).
- При желании добавьте свой словарь — до 50 пар «оригинал → замена» для специфичных значений вашего проекта (например, внутренние коды клиентов).
- Сохраните настройки.
Применить к нескольким ключам
Если вы хотите распространить настройки текущего ключа на другие — нажмите «Применить к другим ключам». Откроется список ваших ключей с флажками. Можно выбрать любое подмножество — изменятся только они.
Заголовки ответа
Когда маскировка сработала, AITUNNEL добавляет к ответу два HTTP-заголовка:
| Заголовок | Значение | Описание |
|---|---|---|
X-AITunnel-Masked | true | Маскировка была применена |
X-AITunnel-Masked-Types | inn,phone,passport | Типы обнаруженных данных (через запятую) |
Если ничего не обнаружено, заголовки не добавляются.
Эти заголовки удобно использовать для аудита или отладки:
import requests
response = requests.post(
"https://api.aitunnel.ru/v1/chat/completions",
headers={
"Authorization": "Bearer sk-aitunnel-xxx",
"Content-Type": "application/json",
},
json={
"model": "gpt-4o",
"messages": [
{
"role": "user",
# ИНН Сбербанка для примера
"content": "Проверь реквизиты: ИНН 7707083893, телефон +7 (900) 123-45-67",
}
],
},
)
# Проверяем, сработала ли маскировка
masked = response.headers.get("X-AITunnel-Masked")
types = response.headers.get("X-AITunnel-Masked-Types")
if masked == "true":
print(f"Обнаружены данные: {types}") # inn,phone
data = response.json()
print(data["choices"][0]["message"]["content"])
# Ответ модели содержит оригинальные значения (уже восстановлены)const response = await fetch("https://api.aitunnel.ru/v1/chat/completions", {
method: "POST",
headers: {
Authorization: "Bearer sk-aitunnel-xxx",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gpt-4o",
messages: [
{
role: "user",
// ИНН Сбербанка для примера
content: "Проверь реквизиты: ИНН 7707083893, телефон +7 (900) 123-45-67",
},
],
}),
});
// Проверяем, сработала ли маскировка
const masked = response.headers.get("X-AITunnel-Masked");
const types = response.headers.get("X-AITunnel-Masked-Types");
if (masked === "true") {
console.log(`Обнаружены данные: ${types}`); // inn,phone
}
const data = await response.json();
console.log(data.choices[0].message.content);
// Ответ модели содержит оригинальные значения (уже восстановлены)Пользовательский словарь
Словарь позволяет задать произвольные замены для данных, которые не попадают под стандартные детекторы. Например, внутренние идентификаторы клиентов или кодовые имена проектов.
Каждая запись — это пара:
- Слово / фраза — то, что нужно найти и заменить.
- Замена — то, чем заменить. Если оставить пустым, слово просто удаляется.
Замены из словаря применяются дополнительно к стандартным детекторам. В маске они тоже восстанавливаются в ответе.
Максимум 50 записей в словаре.
Стриминг
Функция полностью поддерживает стриминг (stream: true). AITUNNEL буферизует входящий поток, находит и восстанавливает синтетические значения прямо в потоке чанков. Для параллельных вариантов (n > 1) каждый поток обрабатывается независимо.
Ограничения
WARNING
- Одиночные имена без отчества не обнаруживаются («Иван Петров» без отчества — не ФИО для детектора). Если вам нужно перехватывать и такие имена, добавьте их в пользовательский словарь.
- Нестандартные форматы могут не распознаваться. Например, ИНН без пробелов внутри JSON-числа, паспортные данные в произвольном порядке слов.
- Иностранные имена и зарубежные персональные данные не покрыты — детекторы сфокусированы на российских форматах.
- Данные в изображениях, аудио или PDF не обрабатываются — только текстовые поля сообщений.
- Маскировка работает на уровне текстового содержимого. Функции (tool calls) и структурированные выходные данные (JSON mode) обрабатываются корректно, но схема может повлиять на результат.
Часто задаваемые вопросы
Будет ли деградировать качество ответа модели из-за замены данных? Для большинства задач — нет. Синтетические значения того же формата: модель будет работать с «другим, но корректным» ИНН или именем. Если задача требует точного знания именно этого значения (например, поиск компании по ИНН), данные будут маскированы и логика нарушится — в этом случае выберите нужные типы данных вручную.
Данные хранятся где-то на стороне AITUNNEL? Маппинг «синтетика → оригинал» существует только в памяти на время обработки одного запроса и немедленно уничтожается после отправки ответа клиенту. Данные не сохраняются.
Как выбрать режим — маскировка или блокировка? Блокировку имеет смысл выбирать, если персональные данные в промптах — это признак ошибки в вашем приложении и вы хотите получать явный HTTP 400 для отладки или алертов. Маскировка — для случаев, когда данные появляются в потоке от пользователя органично (например, пользователь вводит свои реквизиты в чате-помощнике) и вы хотите, чтобы всё работало прозрачно.
Можно ли включить только часть типов данных? Да. В панели управления в разделе «Защита данных» можно снять флажки с ненужных типов. Например, включить только «ИНН» и «Паспорт», если остальные типы в вашем контексте не критичны.