Гайд · TNWS AI
Как скрыть email в трассе MLflow до её записи на сервер
Настраиваем 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 через автоматическую интеграцию, его спан потребует своего фильтра. Поэтому тестируйте всё дерево, а не только один корневой элемент.
Пошаговое выполнение
- Выберите, какие именно поля аргументов и ответов могут содержать персональные данные.
- Настройте функцию процессора Span до первых размеченных вызовов.
- Проверьте тип входного поля перед применением регулярного выражения и заменяйте адрес маркером.
- Зарегистрируйте processor через mlflow.tracing.configure(span_processors=[...]).
- Выполните синтетический запрос и осмотрите все поля сохранённой трассы.
Для локального опыта нужен 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 не приводит к аварии процессора, иначе защитная настройка сама станет причиной отказа приложения.
Критерии проверки результата
- В записи присутствует [REDACTED] на месте тестового адреса.
- Сырой demo@example.org не встречается в других полях или дочерних спанах.
- Настройка processor выполняется до первого обращения приложения.
Если критерий не выполняется, сохраните номер версии пакета, безопасный входной пример и фактический результат. Затем меняйте по одной переменной: адрес сервера, параметры вызова, конфигурацию эксперимента либо редакцию шаблона. Такой подход помогает установить причину отличия без предположений о том, что модель «обязана» отвечать строго одной строкой. После успешного теста на заглушке повторите проверку на малом наборе разрешённых рабочих данных; обучающий пример сам по себе не является нагрузочным, приватностным или качественным аудитом.
Типичные ошибки и что не делать
- Не применяйте re.sub к None без проверки типа.
- Не объявляйте regex полноценной защитой всех PII.
- Не проверяйте только корневой span при вложенной автотрассировке.
Учитывайте, что трассировка и оценка могут сохранять содержимое входа и выхода. До подключения клиентов организуйте контроль доступа и обработку персональных данных. Не помещайте секреты API в промпты, параметры функций, журналы или опубликованные скриншоты. Если пример использует детерминированную функцию, его успешная проверка подтверждает корректность механики MLflow и теста, но не качество какой-либо нейросети.
FAQ
Где происходит маскирование?
В клиенте до отправки спана в backend.
Охватывает ли пример выход модели?
Нет, здесь показано только входное поле text.
Можно ли поставить несколько процессоров?
Да, configure принимает список span_processors.
Официальные источники
Частые вопросы
Где происходит маскирование?
В клиенте до отправки спана в backend.
Охватывает ли пример выход модели?
Нет, здесь показано только входное поле text.
Можно ли поставить несколько процессоров?
Да, configure принимает список span_processors.
Читайте также
Как найти ошибочные и медленные запросы AI-приложения в MLflow Traces
Фильтруем статус ERROR и длительность через search_traces, сверяя результат с искусственными успешным и аварийным вызовами.
Как проверить формат ответа нейросети собственным scorer в MLflow
Создаём @scorer для проверяемого префикса и проводим оценку без LLM-судьи и без внешнего API.
Как разделить поиск и сборку ответа RAG на спаны MLflow Tracing
Размечаем вручную поиск фрагмента и формирование ответа; проверяем вложенные спаны без вызова платной модели.
Комментарии
Пока тихо. Скажите первое слово