Гайд · TNWS AI

Как найти ошибочные и медленные запросы AI-приложения в MLflow Traces

4 мин—

Фильтруем статус 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-объектов в поддерживаемых версиях. Ключевое различие: пустая выдача по длительности не доказывает отсутствие проблем с точностью ответа.

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

  1. Подготовьте два безопасных контрольных вызова: успешный и выбрасывающий исключение.
  2. Привяжите их к тестовому эксперименту и запустите один раз.
  3. Выполните search_traces с фильтром trace.status = ERROR; изучите возвращённые Trace-объекты.
  4. Отдельно найдите запросы с trace.execution_time_ms > заданного порога.
  5. Перед выводом на экран удалите пользовательские данные и ограничьте доступ к анализу.

Для локального опыта нужен 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 и длинных аналитических ответов искажает интерпретацию порога. Порог в статье предназначен только для иллюстрации фильтра.

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

  1. ERROR-запрос находится фильтром статуса после выполнения.
  2. Успешный контрольный вызов не принимается за исключение.
  3. Результат порога по миллисекундам интерпретируется отдельно от качества.

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

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

  • Не путайте 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 неверный по фактам ответ?

Не обязательно: функция могла завершиться успешно.

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

Комментарии

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