Перейти к содержимому

Скрытие персональных данных

Как это работает

Параметр obfuscate: true в запросе Chat Completions включает скрытие персональных данных. Перед отправкой провайдеру персональные данные во всех сообщениях диалога — user, system, assistant — заменяются на плейсхолдеры вида <<PII_0>>, а в ответе модели восстанавливаются обратно. Восстановление работает и в потоковом режиме (stream: true), и в аргументах function/tool-вызовов: провайдер и модель видят только обезличенный текст, клиент получает ответ с настоящими значениями.

Одинаковые значения в рамках запроса получают один и тот же плейсхолдер, поэтому модель сохраняет связность: «позвони <<PII_1>>» и «передай <<PII_1>>» — это один и тот же человек.

Запрос клиента: Меня зовут Иван Петров, телефон +7 916 245-33-18. Составь подпись к письму.
Видит провайдер: Меня зовут <<PII_0>>, телефон <<PII_1>>. Составь подпись к письму.
Ответ модели: С уважением, <<PII_0>>, тел. <<PII_1>>
Получает клиент: С уважением, Иван Петров, тел. +7 916 245-33-18

Что распознаётся

Детектор комбинирует правила с валидацией контрольных сумм (Луна для карт, контрольные цифры ИНН и СНИЛС, mod-97 для IBAN) и две ML-модели для именованных сущностей. Русский язык — основной, имена и названия распознаются во всех падежах и в нижнем регистре.

КатегорияПримеры
ИменаФИО в любом падеже и регистре, фамилия с инициалами, имена в разговорной форме
ОрганизацииНазвания компаний, банков, учреждений, аббревиатуры
Адреса и локацииГорода, улицы с номерами домов, полные адреса, квартиры, индексы
Документы РФПаспорт (все написания), ИНН 10/12 цифр, СНИЛС, ОГРН, ОГРНИП, КПП, кадастровый номер, полис ОМС, код подразделения, свидетельство о рождении, водительское удостоверение
ФинансыКарты 13–19 цифр (с валидацией по Луну), срок действия и CVV рядом с номером, расчётные счета, IBAN, криптокошельки BTC/ETH/LTC
КонтактыТелефоны России и международные, e-mail, @-аккаунты, ссылки
СекретыПароли (в том числе в логах и стектрейсах), API-ключи Stripe/OpenAI/Anthropic/GitHub/Google/Slack/AWS, JWT- и Bearer-токены, IP-адреса
ДатыДаты рождения в числовых и словесных форматах, год рождения по контексту
КодыОдноразовые коды подтверждения, CVV/CVC по контексту

Ссылки скрываются целиком и только тогда, когда внутри адреса есть персональные данные (e-mail, телефон, токен в параметрах) — частичная замена внутри URL ломала бы адрес. Обычные ссылки на документацию и сайты остаются как есть.

Подстановка искажённых написаний не отключает распознавание: текст нормализуется до разбора (полноширинные цифры, невидимые символы, URL-кодирование).

Свои паттерны (obfuscate_patterns)

Помимо встроенного детектора можно передать собственные regex-паттерны — для внутренних идентификаторов, номеров договоров, кодов проектов и всего, что знает только ваша система. Поле obfuscate_patterns работает вместе с obfuscate: true:

{
"model": "gpt-4.1",
"obfuscate": true,
"obfuscate_patterns": [
{ "pattern": "ДП-\\d{4}/\\d{4}", "label": "CONTRACT" },
{ "pattern": "EMP-(\\d+)", "label": "EMPLOYEE" }
],
"messages": [
{ "role": "user", "content": "Продли договор ДП-2024/0117 сотрудника EMP-88121" }
]
}

Модель увидит Продли договор <<PII0>> сотрудника EMP-<<PII1>>, в ответе значения восстановятся. Правила:

  • pattern — регулярное выражение (синтаксис Python/PCRE). Если в паттерне есть группа захвата, маскируется только она — окружение остаётся читаемым.
  • label — необязательная метка: заглавные латинские буквы, цифры и подчёркивание, до 16 символов. По умолчанию CUSTOM.
  • До 20 паттернов на запрос, длина паттерна — до 500 символов.
  • Найденное по вашим паттернам маскируется всегда, независимо от встроенных типов детектора.

Паттерн, который не компилируется, превышает лимиты или выполняется дольше секунды (защита от катастрофических выражений), отклоняет запрос с ошибкой 400 invalid_obfuscate_patterns и текстом причины — молча пропустить такой паттерн нельзя: вы считали бы текст замаскированным, а он бы им не был.

Что стоит учитывать

  • Плейсхолдеры живут в рамках одного запроса. История диалога передаётся клиентом в каждом запросе целиком и шифруется заново — сквозная нумерация между запросами не требуется.
  • Изображения не обрабатываются: персональные данные на картинках уходят провайдеру как есть.
  • Обфускация добавляет к запросу время работы детектора — от десятков миллисекунд на короткое сообщение до заметно большего на длинной истории.
  • Значение, похожее на идентификатор, но с невалидной контрольной суммой, маскируется, если рядом есть контекстное слово («ИНН», «СНИЛС», «карта»): опечатка не должна приводить к утечке.

Пример

import axios from 'axios'
const { data } = await axios.post(
'https://gptunnel.ru/v1/chat/completions',
{
model: 'gpt-4.1',
obfuscate: true,
messages: [
{
role: 'user',
content:
'Составь договор: заказчик Иванов Пётр Сергеевич, ИНН 771234567890, тел. +7 916 245-33-18',
},
],
},
{ headers: { Authorization: 'shds-....' } },
)
console.log(data.choices[0].message.content)

Ошибка при недоступности сервиса

{
"error": {
"message": "PII obfuscation is currently unavailable. Retry the request without `obfuscate`.",
"type": "obfuscation_unavailable",
"param": null,
"code": "obfuscation_unavailable"
}
}

Функция в альфа-тесте и пока предоставляется бесплатно.