Гайд · TNWS AI

Как скрыть email в трассе MLflow до её записи на сервер

4 мин—

Настраиваем span_processors для удаления email из входов спана и проверяем, что исходный текст не ушёл в backend.

Задача и применимость

Поисковый запрос: «как маскировать электронную почту в MLflow tracing span_processors». Избежать записи адреса клиента в наблюдаемую трассу тестового AI-обработчика. Инструкция применима к Python-клиенту и Tracking Server актуальной ветки MLflow GenAI, проверенной по официальной документации 20 сентября 2026 года. Для конкретной установки сначала посмотрите mlflow.__version__: при отличии интерфейса от приведённого руководства закрепите совместимую версию и проверьте её документацию. Учебные данные вымышлены; ни один описанный пример не является запросом к реальному магазину.

Что происходит в системе

Согласно руководству MLflow, span_processors выполняются на клиентской стороне перед отправкой спана в backend. Это важное свойство: редактирование уже после экспорта не отменило бы факт попадания адреса на сервер. Пример защищает только ключ text во входном словаре конкретной функции; он не является универсальным удалением PII. Если вторичный LLM-вызов записывает полный prompt через автоматическую интеграцию, его спан потребует своего фильтра. Поэтому тестируйте всё дерево, а не только один корневой элемент.

Пошаговое выполнение

  1. Выберите, какие именно поля аргументов и ответов могут содержать персональные данные.
  2. Настройте функцию процессора Span до первых размеченных вызовов.
  3. Проверьте тип входного поля перед применением регулярного выражения и заменяйте адрес маркером.
  4. Зарегистрируйте processor через mlflow.tracing.configure(span_processors=[...]).
  5. Выполните синтетический запрос и осмотрите все поля сохранённой трассы.

Для локального опыта нужен Python 3.10+, установленный пакет mlflow и запущенный отдельно командой mlflow server локальный сервер. Адрес http://localhost:5000 из примеров справедлив при стандартном локальном запуске; в контейнере и удалённом окружении задайте настоящий доступный URI. Вызовы реальной модели выполняйте только с подходящими ключами и подтверждённой доступностью модели. Фрагмент ниже — готовый шаблон контроля конкретной операции:

import re
import mlflow
from mlflow.entities.span import Span
mlflow.set_tracking_uri("http://localhost:5000")
mlflow.set_experiment("Безопасные трассы")
PATTERN = re.compile(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}")

def redact(span: Span) -> None:
    if isinstance(span.inputs, dict):
        raw = span.inputs.get("text")
        if isinstance(raw, str):
            span.set_inputs({**span.inputs, "text": PATTERN.sub("[REDACTED]", raw)})

mlflow.tracing.configure(span_processors=[redact])

@mlflow.trace
def classify(text: str) -> str:
    return "Запрос принят"

print(classify("Напишите demo@example.org о возврате"))

Пример входа и ожидаемого результата

Вход: «Напишите demo@example.org о возврате». В консоли ожидается «Запрос принят». В сохранённом поле text трассы вместо адреса должен быть [REDACTED], а исходный email не должен присутствовать ни в каком другом поле. Для реальных вызовов дополнительно проверьте outputs, metadata и вложенные спаны.

Как интерпретировать измерение

Регулярное выражение находит обычные адреса из контрольного корпуса, но не гарантирует обнаружение необычных Unicode-адресов, телефонов, паспортных данных и имен. Перед внедрением соберите допустимые синтетические случаи, а для строгих требований выбирайте специализированную систему обнаружения и отдельную проверку безопасности. Возвращаемое значение процессора — None: он изменяет Span на месте. При ошибке обработки нельзя молча считать данные защищёнными; устройте тест на отсутствие неприкрытого маркера в экспортируемых результатах.

Границы решения и особые случаи

Ещё одна частая ловушка: оставлять адрес в ответе нейросети, хотя он очищен из аргумента. Условный classify возвращает безопасную константу специально, чтобы сфокусироваться на входах. В рабочих сценариях просмотр traces должен охватывать входы, выходы и атрибуты каждого span. Не заменяйте защиту трасс выводом «сервер стоит локально»: к локальному хранилищу могут иметь доступ коллеги, резервные копии и сторонние инструменты. Ограничьте доступ и срок хранения отдельно.

Дополнительный контрольный случай

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

Критерии проверки результата

  1. В записи присутствует [REDACTED] на месте тестового адреса.
  2. Сырой demo@example.org не встречается в других полях или дочерних спанах.
  3. Настройка processor выполняется до первого обращения приложения.

Если критерий не выполняется, сохраните номер версии пакета, безопасный входной пример и фактический результат. Затем меняйте по одной переменной: адрес сервера, параметры вызова, конфигурацию эксперимента либо редакцию шаблона. Такой подход помогает установить причину отличия без предположений о том, что модель «обязана» отвечать строго одной строкой. После успешного теста на заглушке повторите проверку на малом наборе разрешённых рабочих данных; обучающий пример сам по себе не является нагрузочным, приватностным или качественным аудитом.

Типичные ошибки и что не делать

  • Не применяйте re.sub к None без проверки типа.
  • Не объявляйте regex полноценной защитой всех PII.
  • Не проверяйте только корневой span при вложенной автотрассировке.

Учитывайте, что трассировка и оценка могут сохранять содержимое входа и выхода. До подключения клиентов организуйте контроль доступа и обработку персональных данных. Не помещайте секреты API в промпты, параметры функций, журналы или опубликованные скриншоты. Если пример использует детерминированную функцию, его успешная проверка подтверждает корректность механики MLflow и теста, но не качество какой-либо нейросети.

FAQ

Где происходит маскирование?

В клиенте до отправки спана в backend.

Охватывает ли пример выход модели?

Нет, здесь показано только входное поле text.

Можно ли поставить несколько процессоров?

Да, configure принимает список span_processors.

Официальные источники

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

Где происходит маскирование?

В клиенте до отправки спана в backend.

Охватывает ли пример выход модели?

Нет, здесь показано только входное поле text.

Можно ли поставить несколько процессоров?

Да, configure принимает список span_processors.

Читайте также

Комментарии

Пока тихо. Скажите первое слово