ZuBrIQ Gateway
Персональные данные не доходят до LLM — маскирование PII на шлюзе
Прокси перед любой моделью: УНП, карты, счета, БИК, ИНН и ФИО клиентов заменяются синтетикой до отправки к LLM и восстанавливаются в ответах — включая потоковые. Работает с любым OpenAI-совместимым провайдером.
УНП
9 цифр с контрольным числом
ИНН
10/12 цифр с контрольной суммой
Карты
Луна, МИР / Visa / Mastercard
Счета и БИК
ключ ЦБ, справочник банков
СНИЛС
11 цифр с контрольной суммой
ФИО
эвристика по обращениям
Переиспользуемые пары
Один УНП всегда превращается в одну синтетику — связность данных сохраняется внутри диалога и между диалогами пользователя.
Fail-Closed
При сбое модуля маскировки запрос отклоняется — PII не утечёт к LLM. Режим переключается переменной окружения.
Стримы
Рехидратация работает в потоковых ответах: синтетика заменяется обратно по мере прихода чанков.
SIEM-события
Каждое обнаружение PII пишет JSON-событие в аудит-лог: user_id, model, сущности, action, request_id.
Чем отличается от рынка
Универсальные маскировщики (Presidio) не решают задачу банка в СНГ
Microsoft Presidio и встроенный pii_masking LiteLLM вырезают «похожее на персональные данные» по NLP-моделям. Это общий инструмент — для банковских реквизитов СНГ и диалогов с возвратом данных его мало.
| Критерий | Универсальные NER-маскировщики (Presidio) | ZuBrIQ Gateway |
|---|---|---|
| Реквизиты СНГ | Общие шаблоны без проверки. УНП, БИК, ключ расчётного счёта — нет. | Контрольные суммы: УНП (mod 11), ИНН 10/12, Луна, ключ счёта ЦБ, IBAN mod-97. Валидный номер не пропустит мимо, невалидный не примет за PII. |
| Возврат данных клиенту | Замена навсегда (REDACTED/фейк). Восстановить оригинал в ответе нельзя. | Рехидратация в ответах и стримах: клиент видит свои данные, LLM — только синтетику. |
| Связность диалога | Одна фамилия подменяется каждый раз по-новому — модель теряет контекст. | Одна пара на весь TTL: тот же УНП — та же синтетика во всех диалогах пользователя. |
| Телефоны | Международный общий шаблон, много ложных срабатываний. | Коды операторов: BY +375 25/29/33/44, RU +7 9xx, KZ 70x/77x. |
| Инфраструктура | NLP-модели (spaCy/stanza), тяжёлый старт, для русского качества мало. | Regex + математика: миллисекунды на запрос, без GPU и внешних моделей. |
| Контроль | Нет истории подмен. | SIEM-события на каждое обнаружение, админка с парами «оригинал ↔ синтетика», Fail-Closed по умолчанию. |
Presidio остаётся полезным для не-реквизитных сущностей (адреса, e-mail, даты) — подключается вторым слоем поверх Gateway, не вместо него.
Второй слой: Presidio — где он встаёт
Что делает
NLP-распознавание не-реквизитных сущностей: адреса, e-mail, даты, номера документов без контрольных сумм. Кастомные recognizers пишутся на Python.
На каком уровне
После Gateway: реквизиты уже заменены, Presidio чистит остатки в том же запросе до отправки к LLM. На ответ и рехидратацию не влияет.
Как подключается
Контейнер presidio-analyzer рядом со шлюзом + две строки в config.yaml LiteLLM. Опция, не включена по умолчанию.
Как это работает
Запрос с УНП и картой: 17 секунд, вся цепочка
То же curl-командой — для копирования
curl -s https://api.zubriq.by/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model": "gpt-4o-mini", "user": "user-42",
"messages": [{"role": "user",
"content": "Мой УНП 192628898, пришлите счёт."}]}'
# К модели уйдёт: "Мой УНП 732432413, …"
# В ответе вернётся: "Мой УНП 192628898, …"