ZuBrIQ

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, …"