Гайд · TNWS AI
Как сравнить две редакции ответчика на одном наборе в MLflow Evaluate
Запускаем два predict_fn на одинаковых вопросах и отдельно сравниваем воспроизводимый тест обязательного ответа.
Задача и применимость
Поисковый запрос: «как сравнить два варианта AI помощника на одном evaluation dataset MLflow». Понять, ухудшилась ли новая редакция ответчика на контрольных вопросах, удерживая входные данные и правило оценки неизменными. Инструкция применима к Python-клиенту и Tracking Server актуальной ветки MLflow GenAI, проверенной по официальной документации 20 сентября 2026 года. Для конкретной установки сначала посмотрите mlflow.__version__: при отличии интерфейса от приведённого руководства закрепите совместимую версию и проверьте её документацию. Учебные данные вымышлены; ни один описанный пример не является запросом к реальному магазину.
Что происходит в системе
Общий принцип MLflow evaluation состоит в передаче data, predict_fn и scorers. Если меняется сразу набор вопросов, критерий и функция, нельзя объяснить, откуда разница в оценках. В коде меняется только функция; два контрольных вопроса и критерий идентичны. Раздельные эксперименты делают результаты разборчивыми при обзоре. Это модельная заглушка, показывающая методику; когда вы подставите настоящие нейросети, фиксируйте ещё конфигурацию модели и промпта, поскольку ответы могут быть недетерминированными.
Пошаговое выполнение
- Утвердите один неизменный набор двух контрольных вопросов.
- Определите старую и новую реализации с одинаковым аргументом question.
- Создайте единый @scorer на конкретное проверяемое требование.
- Запустите evaluate два раза с теми же data и scorers, сохраните результаты под различимыми названиями экспериментов.
- Сравните оценки по каждому кейсу и не объявляйте победителя лишь по одному общему числу.
Для локального опыта нужен Python 3.10+, установленный пакет mlflow и запущенный отдельно командой mlflow server локальный сервер. Адрес http://localhost:5000 из примеров справедлив при стандартном локальном запуске; в контейнере и удалённом окружении задайте настоящий доступный URI. Вызовы реальной модели выполняйте только с подходящими ключами и подтверждённой доступностью модели. Фрагмент ниже — готовый шаблон контроля конкретной операции:
import mlflow
from mlflow.genai import scorer
mlflow.set_tracking_uri("http://localhost:5000")
data = [{"inputs": {"question": "Как оформить возврат?"}},
{"inputs": {"question": "Как оформить отказ?"}}]
def old(question: str) -> str:
return "Откройте заявку." if "возврат" in question else "Не знаю."
def new(question: str) -> str:
return "Откройте заявку." if "возврат" in question else "Откройте заявку."
@scorer
def honest_refusal(inputs: dict, outputs: str) -> bool:
if "отказ" in inputs["question"]:
return outputs == "Не знаю."
return outputs == "Откройте заявку."
for label, function in [("Старая", old), ("Новая", new)]:
mlflow.set_experiment("Сравнение ответчика " + label)
result = mlflow.genai.evaluate(data=data, predict_fn=function,
scorers=[honest_refusal])
print(label, result)
Пример входа и ожидаемого результата
Вход: вопрос про возврат и намеренно похожий вопрос про отказ, для которого нет правила. Старая функция выдаёт «Не знаю.» во втором случае; новая по ошибке расширяет правило и отвечает про заявку. Ожидается одна регрессия нового варианта на негативном кейсе; фактическая структура result зависит от установленной версии MLflow, поэтому смотрите оценки по строкам в интерфейсе.
Как интерпретировать измерение
Вторая фраза отличается от первой всего одним словом. Такой минимальный контраст полезен для выявления неверного поиска по ключевым словам. В реальном наборе добавьте ещё перефразировки, несколько документов и вопрос, где правильный ответ известен; один негативный тест не доказывает общей безопасности ответчика. Scorer сравнивает строки с заранее согласованной учебной политикой, но не в состоянии проверить новые факты, которых в policy нет. После нахождения регрессии просмотрите ответы и трассы обоих вариантов, а затем исправляйте именно причину.
Границы решения и особые случаи
Если ваша программа делает реальные вызовы модели, две оценки могут включать разные внешние ответы даже при неизменном коде. Повторяйте опыт на контрольной выборке, записывайте версии prompt и модели, разделяйте вариативность от изменения логики. Не подменяйте критерий после просмотра неудачного результата ради красивого отчёта: это разрушит сопоставимость. Для немодельного кода примера оба предсказателя детерминированы, поэтому он помогает сначала проверить пайплайн оценивания, а затем переносить метод в рабочее приложение.
Критерии проверки результата
- Оба запуска получают строго одинаковые data и scorer.
- Регрессия нового варианта видна на вопросе про отказ.
- Результат не выдаётся за доказательство качества произвольной модели.
Если критерий не выполняется, сохраните номер версии пакета, безопасный входной пример и фактический результат. Затем меняйте по одной переменной: адрес сервера, параметры вызова, конфигурацию эксперимента либо редакцию шаблона. Такой подход помогает установить причину отличия без предположений о том, что модель «обязана» отвечать строго одной строкой. После успешного теста на заглушке повторите проверку на малом наборе разрешённых рабочих данных; обучающий пример сам по себе не является нагрузочным, приватностным или качественным аудитом.
Типичные ошибки и что не делать
- Не меняйте одновременно тесты и предсказатель.
- Не объявляйте универсального победителя по двум кейсам.
- Не замалчивайте случай без подтверждённого ответа.
Учитывайте, что трассировка и оценка могут сохранять содержимое входа и выхода. До подключения клиентов организуйте контроль доступа и обработку персональных данных. Не помещайте секреты API в промпты, параметры функций, журналы или опубликованные скриншоты. Если пример использует детерминированную функцию, его успешная проверка подтверждает корректность механики MLflow и теста, но не качество какой-либо нейросети.
FAQ
Нужна ли модель для учебного примера?
Нет, показаны детерминированные функции.
Какой параметр функции связывает вход?
Ключ question внутри inputs.
Можно ли сравнить реальные LLM?
Да, при одинаковых кейсах и учёте вариативности.
Официальные источники
Частые вопросы
Нужна ли модель для учебного примера?
Нет, показаны детерминированные функции.
Какой параметр функции связывает вход?
Ключ question внутри inputs.
Можно ли сравнить реальные LLM?
Да, при одинаковых кейсах и учёте вариативности.
Читайте также
Как найти ошибочные и медленные запросы AI-приложения в MLflow Traces
Фильтруем статус ERROR и длительность через search_traces, сверяя результат с искусственными успешным и аварийным вызовами.
Как проверить формат ответа нейросети собственным scorer в MLflow
Создаём @scorer для проверяемого префикса и проводим оценку без LLM-судьи и без внешнего API.
Как разделить поиск и сборку ответа RAG на спаны MLflow Tracing
Размечаем вручную поиск фрагмента и формирование ответа; проверяем вложенные спаны без вызова платной модели.
Комментарии
Пока тихо. Скажите первое слово