Анонимизация персональных данных перед отправкой в LLM: Python-скрипт и API TokenMaster

· безопасность анонимизация персональные-данные ai

Прежде чем отправлять текст в большую языковую модель, стоит заменить персональные данные на плейсхолдеры — это снижает риск утечки и упрощает соответствие требованиям 152-ФЗ. Заодно вы получаете аккуратный способ вернуть реальные значения обратно после обработки. В этой статье разберём, как сделать это на Python через OpenAI-совместимый API TokenMaster.

Что понадобится

  • Python 3.8+ — регулярные выражения входят в стандартную библиотеку re, ничего дополнительно ставить не нужно.
  • Библиотека openai для обращения к LLM:
pip install openai
  • API-ключ TokenMaster вида sk-… (создаётся в разделе «Ключи» после регистрации на tokenmaster.ru).

Пошаговая анонимизация

Идея простая: прогоняем текст через несколько регулярных выражений, каждое совпадение заменяем плейсхолдером вида [ИМЯ1], [ТЕЛЕФОН1], а оригинал сохраняем в словарь mapping. Так мы одновременно прячем данные и сохраняем возможность вернуть их обратно.

Самые частые поля — имена, телефоны, email и паспортные данные. Для имён точного regex не существует, поэтому используем эвристику «два подряд слова с заглавной буквы»; для телефонов и email регулярки работают надёжно.

import re

text = "Обратился Иван Иванов, тел. +7 (900) 123-45-67, email ivanov@example.com. Паспорт 4510 123456."

mapping = {}
counter = {"ИМЯ": 0, "ТЕЛЕФОН": 0, "EMAIL": 0, "ПАСПОРТ": 0}

def replace(text, pattern, label):
    def repl(m):
        counter[label] += 1
        token = f"[{label}{counter[label]}]"
        mapping[token] = m.group(0)
        return token
    return re.sub(pattern, repl, text)

# Имена: два слова с заглавной буквы подряд (Иван Иванов)
text = replace(text, r"\b[А-ЯЁ][а-яё]+\s+[А-ЯЁ][а-яё]+\b", "ИМЯ")
# Телефоны в форматах +7, 8, с пробелами и скобками
text = replace(text, r"(?:\+7|8)[\s(]*\d{3}[)\s]*\d{3}[\s-]*\d{2}[\s-]*\d{2}", "ТЕЛЕФОН")
# Email-адреса
text = replace(text, r"\b[\w.+-]+@[\w-]+\.[\w.]+\b", "EMAIL")
# Паспорт: серия из 4 цифр и номер из 6 цифр
text = replace(text, r"\b\d{4}\s*\d{6}\b", "ПАСПОРТ")

print(text)
# Обратился [ИМЯ1], тел. [ТЕЛЕФОН1], email [EMAIL1]. Паспорт [ПАСПОРТ1].

Теперь в LLM уходит обезличенный текст, а реальные значения лежат только у вас. После того как модель вернула результат, выполните обратную подстановку по сохранённому маппингу:

for token, original in mapping.items():
    text = text.replace(token, original)
print(text)

Порядок подстановки не важен, потому что каждый плейсхолдер уникален и не пересекается с реальными данными. Для продакшена вынесите словарь mapping в отдельное хранилище и удаляйте его после обработки — тогда персональные данные вообще не пересекаются с запросом.

Подключение TokenMaster

TokenMaster — это AI-шлюз с OpenAI-совместимым API, поэтому обращение к модели делается стандартной библиотекой openai без изменений. Подключение сводится к двум параметрам:

  1. Base URL: https://tokenmaster.ru/v1
  2. API Key: ваш ключ вида sk-…
from openai import OpenAI

client = OpenAI(
    base_url="https://tokenmaster.ru/v1",
    api_key="sk-...",
)

response = client.chat.completions.create(
    model="deepseek-flash",
    messages=[
        {"role": "system", "content": "Ты — ассистент. Отвечай по тексту клиента."},
        {"role": "user", "content": text},
    ],
)

print(response.choices[0].message.content)

Почему TokenMaster? Один ключ и один баланс для моделей DeepSeek, GLM (Zhipu) и Qwen, оплата из России без привязки к зарубежной карте. Base URL единый — https://tokenmaster.ru/v1.

Модель выбирается под задачу: deepseek-flash подойдёт для быстрой обработки типовых текстов, а deepseek-v4-pro или модели GLM и Qwen — для сложного анализа. Актуальный каталог и цены — на tokenmaster.ru/pricing, документация по API — на tokenmaster.ru/docs.

Проверка работы

Запустите скрипт — если в терминале появился обезличенный текст, а после обратной подстановки значения восстановились, всё настроено верно. Если возникла ошибка:

  • 401 / invalid api key — ключ неверный или скопирован не целиком; он должен начинаться с sk-.
  • connection error — проверьте Base URL: ровно https://tokenmaster.ru/v1, без лишнего /chat/completions в конце.
  • insufficient quota — на балансе недостаточно средств; пополните его в личном кабинете.

Частые вопросы

Почему имена заменяются не всегда? Regex для имён — это эвристика: она ловит только пары слов с заглавной буквы. Одиночные имена, фамилии с инициалами или редкие написания стоит добавлять отдельными правилами либо использовать NER-библиотеки вроде natasha.

Обязательно ли хранить маппинг отдельно? Да, в продакшене это лучшая практика: словарь с оригиналами не должен уходить вместе с запросом. Храните его в защищённом месте и удаляйте, как только подстановка выполнена.

Подходит ли метод для больших объёмов текста? Да, регулярные выражения обрабатывают текст быстро. Для очень длинных документов дополнительно разбивайте текст на части, чтобы не превысить лимит контекста модели.

Итог

Анонимизация перед отправкой в LLM — это десяток строк на Python: регулярные выражения заменяют имена, телефоны, email и паспорта на плейсхолдеры, а словарь маппинга возвращает данные обратно. Подключите OpenAI-совместимый API TokenMaster по Base URL https://tokenmaster.ru/v1, укажите ключ sk-… — и обрабатывайте тексты с персональными данными безопасно.

Подключите модели через TokenMaster

Один ключ sk-… и base URL https://tokenmaster.ru/v1 — доступ к DeepSeek, GLM, Qwen и другим моделям. Зарегистрироваться →