Гайд · TNWS AI
Как найти ошибочные и медленные запросы AI-приложения в MLflow Traces
Фильтруем статус ERROR и длительность через search_traces, сверяя результат с искусственными успешным и аварийным вызовами.
Задача и применимость
Поисковый запрос: «как отфильтровать ERROR и долгие трассы в MLflow search_traces». Извлечь проблемные вызовы конкретного эксперимента, не выгружая все пользовательские трассы для ручного чтения. Инструкция применима к Python-клиенту и Tracking Server актуальной ветки MLflow GenAI, проверенной по официальной документации 20 сентября 2026 года. Для конкретной установки сначала посмотрите mlflow.__version__: при отличии интерфейса от приведённого руководства закрепите совместимую версию и проверьте её документацию. Учебные данные вымышлены; ни один описанный пример не является запросом к реальному магазину.
Что происходит в системе
Официальный синтаксис поиска разделяет trace.status и trace.execution_time_ms. Фильтр статуса обнаруживает аварийное завершение функции, а длительность выражается миллисекундами; число 1000 здесь — выбранный автором тестовый порог, а не универсальный норматив качества. search_traces по умолчанию возвращает DataFrame, но return_type="list" даёт список Trace-объектов в поддерживаемых версиях. Ключевое различие: пустая выдача по длительности не доказывает отсутствие проблем с точностью ответа.
Пошаговое выполнение
- Подготовьте два безопасных контрольных вызова: успешный и выбрасывающий исключение.
- Привяжите их к тестовому эксперименту и запустите один раз.
- Выполните search_traces с фильтром trace.status = ERROR; изучите возвращённые Trace-объекты.
- Отдельно найдите запросы с trace.execution_time_ms > заданного порога.
- Перед выводом на экран удалите пользовательские данные и ограничьте доступ к анализу.
Для локального опыта нужен Python 3.10+, установленный пакет mlflow и запущенный отдельно командой mlflow server локальный сервер. Адрес http://localhost:5000 из примеров справедлив при стандартном локальном запуске; в контейнере и удалённом окружении задайте настоящий доступный URI. Вызовы реальной модели выполняйте только с подходящими ключами и подтверждённой доступностью модели. Фрагмент ниже — готовый шаблон контроля конкретной операции:
import mlflow
mlflow.set_tracking_uri("http://localhost:5000")
mlflow.set_experiment("Поиск сбоев AI")
@mlflow.trace
def answer(question: str) -> str:
if question == "Сломать тест":
raise ValueError("Демо-сбой")
return "Контрольный ответ"
print(answer("Проверка"))
try:
answer("Сломать тест")
except ValueError:
pass
errors = mlflow.search_traces(filter_string="trace.status = 'ERROR'", return_type="list")
slow = mlflow.search_traces(filter_string="trace.execution_time_ms > 1000", return_type="list")
print("Ошибки:", len(errors), "Медленные:", len(slow))
Пример входа и ожидаемого результата
Вход: «Проверка» и «Сломать тест». Ожидается один новый ERROR-вызов и один успешный; число в списке errors может быть больше одного, если в эксперименте были предыдущие ошибки. Значение slow не предопределено: ни один учебный вызов не обязан длиться более секунды. Для точного счёта начинайте с нового эксперимента и проверяйте временной интервал.
Как интерпретировать измерение
Для реальной диагностики важна область эксперимента и период: запросы разных приложений не должны превращаться в общую статистику ошибок. Сравните идентичный синтетический случай до и после изменения кода; классифицируйте ошибки отдельно по retrieval, LLM-вызову и постобработке, если они размечены спанами. Исключение перехватывается в вызывающем коде, чтобы демонстрация продолжила выполнять поиск; внутри размеченной функции оно всё равно возникло. В зависимости от конфигурации экспорт может быть асинхронным, поэтому учитывайте задержку появления трассы и проверяйте UI.
Границы решения и особые случаи
Если медленный ответ помечен OK, это не ложная тревога: статус показывает завершение, а не скорость. Если ответ фактически неправильный, но код не выбросил исключение, он также может оказаться OK; для оценки содержания нужны тестовый набор и scorer. Не выводите полный объект трассы в общедоступную консоль: аргументы функции могут содержать содержание пользовательского запроса. Скрипт печатает только размеры списков; для расследования конкретного случая используйте защищённый доступ к эксперименту.
Дополнительный контрольный случай
Практический отчёт об ошибках удобнее дополнять контрольным числителем и знаменателем: число ERROR за интервал и число всех запросов за тот же интервал. Без знаменателя десять ошибок могут означать совершенно разные уровни проблемы. Для задержки сравнивайте похожие типы вопросов и одинаковую конфигурацию модели; смешение коротких FAQ и длинных аналитических ответов искажает интерпретацию порога. Порог в статье предназначен только для иллюстрации фильтра.
Критерии проверки результата
- ERROR-запрос находится фильтром статуса после выполнения.
- Успешный контрольный вызов не принимается за исключение.
- Результат порога по миллисекундам интерпретируется отдельно от качества.
Если критерий не выполняется, сохраните номер версии пакета, безопасный входной пример и фактический результат. Затем меняйте по одной переменной: адрес сервера, параметры вызова, конфигурацию эксперимента либо редакцию шаблона. Такой подход помогает установить причину отличия без предположений о том, что модель «обязана» отвечать строго одной строкой. После успешного теста на заглушке повторите проверку на малом наборе разрешённых рабочих данных; обучающий пример сам по себе не является нагрузочным, приватностным или качественным аудитом.
Типичные ошибки и что не делать
- Не путайте ERROR с неточным, но успешно завершённым ответом.
- Не обещайте фиксированное количество старых трасс в общем эксперименте.
- Не экспортируйте сырые входы пользователей в открытые журналы.
Учитывайте, что трассировка и оценка могут сохранять содержимое входа и выхода. До подключения клиентов организуйте контроль доступа и обработку персональных данных. Не помещайте секреты API в промпты, параметры функций, журналы или опубликованные скриншоты. Если пример использует детерминированную функцию, его успешная проверка подтверждает корректность механики MLflow и теста, но не качество какой-либо нейросети.
FAQ
Что возвращает search_traces по умолчанию?
DataFrame; return_type="list" запрашивает Trace-объекты.
Какая единица у execution_time_ms?
Миллисекунды.
Найдёт ли ERROR неверный по фактам ответ?
Не обязательно: функция могла завершиться успешно.
Официальные источники
Частые вопросы
Что возвращает search_traces по умолчанию?
DataFrame; return_type="list" запрашивает Trace-объекты.
Какая единица у execution_time_ms?
Миллисекунды.
Найдёт ли ERROR неверный по фактам ответ?
Не обязательно: функция могла завершиться успешно.
Читайте также
Как проверить формат ответа нейросети собственным scorer в MLflow
Создаём @scorer для проверяемого префикса и проводим оценку без LLM-судьи и без внешнего API.
Как разделить поиск и сборку ответа RAG на спаны MLflow Tracing
Размечаем вручную поиск фрагмента и формирование ответа; проверяем вложенные спаны без вызова платной модели.
Как скрыть email в трассе MLflow до её записи на сервер
Настраиваем span_processors для удаления email из входов спана и проверяем, что исходный текст не ушёл в backend.
Комментарии
Пока тихо. Скажите первое слово