Гайд · TNWS AI
Как создать набор регрессионных вопросов для AI-бота в MLflow
Сохраняем вопросы и ожидаемые ответы в MLflow GenAI Dataset, проверяем схему и не смешиваем тесты с реальными клиентскими данными.
Задача и применимость
Поисковый запрос: «как создать evaluation dataset для русского чат-бота в MLflow». Хранить контрольные вопросы чат-бота как воспроизводимый набор вместо разрозненных списков в заметках. Инструкция применима к Python-клиенту и Tracking Server актуальной ветки MLflow GenAI, проверенной по официальной документации 20 сентября 2026 года. Для конкретной установки сначала посмотрите mlflow.__version__: при отличии интерфейса от приведённого руководства закрепите совместимую версию и проверьте её документацию. Учебные данные вымышлены; ни один описанный пример не является запросом к реальному магазину.
Что происходит в системе
Руководство MLflow описывает create_dataset и merge_records как способ сохранять вручную подготовленные случаи. Здесь ожидаемый ответ не генерируется моделью: его формулирует владелец контрольной политики, поэтому тест остаётся независимым от поведения проверяемого чат-бота. Лучше включать не только простые вопросы, но и отрицательные случаи: отсутствующая цена, неполное описание услуги, противоречивые фрагменты. Если справочная база действительно не содержит цены, модель должна признать отсутствие источника, а не подставить число.
Пошаговое выполнение
- Сформулируйте два искусственных вопроса с однозначными ожидаемыми фактами и один случай отсутствующей информации.
- Создайте именованный dataset и привяжите его к текущему эксперименту.
- Передайте записи с ключами inputs и expectations через merge_records.
- Проверьте количество строк и структуру через to_df; вручную сравните ожидаемые ответы с политикой вашего тестового корпуса.
- Перед следующим изменением бота зафиксируйте редакцию данных и не переписывайте исторические результаты измерения.
Для локального опыта нужен Python 3.10+, установленный пакет mlflow и запущенный отдельно командой mlflow server локальный сервер. Адрес http://localhost:5000 из примеров справедлив при стандартном локальном запуске; в контейнере и удалённом окружении задайте настоящий доступный URI. Вызовы реальной модели выполняйте только с подходящими ключами и подтверждённой доступностью модели. Фрагмент ниже — готовый шаблон контроля конкретной операции:
import mlflow
from mlflow.genai.datasets import create_dataset
mlflow.set_tracking_uri("http://localhost:5000")
experiment = mlflow.set_experiment("Регрессия справочного бота")
dataset = create_dataset(name="ru-faq-demo", experiment_id=[experiment.experiment_id],
tags={"language": "ru", "source": "synthetic"})
records = [
{"inputs": {"question": "Как оформить возврат?"},
"expectations": {"expected_response": "Создайте заявку на возврат."}},
{"inputs": {"question": "Какова цена доставки?"},
"expectations": {"expected_response": "В тестовой базе цены нет."}},
]
dataset.merge_records(records)
print(dataset.to_df()[["inputs", "expectations"]])
Пример входа и ожидаемого результата
Вход: два заранее утверждённых демонстрационных вопроса и два ожидаемых ответа. После merge_records в просмотре dataset должны быть строки с question и expected_response, без персональных данных. Если вы выполните код повторно в существующем наборе, проверьте итоговый состав самостоятельно; не объявляйте автоматически отсутствие дублей.
Как интерпретировать измерение
Поля inputs должны совпадать по именам с аргументами будущей predict_fn, например question; expectations хранит эталон для оценщика. Для постоянного evaluation dataset сервер должен использовать SQL backend, а не FileStore; это прямо оговорено в SDK Guide. Два почти одинаковых вопроса с разными политиками возврата не являются качественным набором: снабжайте данные редакцией политики и доменным контекстом, иначе неясно, какая версия правильна. В учебном примере сказано только «создайте заявку», потому что это вымышленное правило; не переносите его в реальный магазин. Перед использованием реальных тикетов получите основание для обработки и очистите личные данные.
Границы решения и особые случаи
Не приписывайте этой операции оценку модели: create_dataset только записывает случаи. Запуск evaluation с predict_fn и scorer — следующий самостоятельный шаг. merge_records сопоставляет записи по хешу inputs и при повторной записи с тем же входом объединяет expectations и tags: ручная проверка состава всё равно обязательна. При курации полезно отдельно считать покрытие негативных случаев и редких формулировок, но количество строк само по себе ничего не говорит о качестве. Проверка to_df позволяет поймать ситуацию, когда вместо словаря inputs сохранена строка или параметр question случайно назван query. Изменив контракт функции, обновляйте записи осознанно и сохраняйте сравнимость результатов.
Критерии проверки результата
- В наборе присутствуют оба вопроса с корректными expectation.
- Ни один эталон не придуман как факт о настоящем магазине.
- Структура inputs подходит планируемой функции predict_fn.
Если критерий не выполняется, сохраните номер версии пакета, безопасный входной пример и фактический результат. Затем меняйте по одной переменной: адрес сервера, параметры вызова, конфигурацию эксперимента либо редакцию шаблона. Такой подход помогает установить причину отличия без предположений о том, что модель «обязана» отвечать строго одной строкой. После успешного теста на заглушке повторите проверку на малом наборе разрешённых рабочих данных; обучающий пример сам по себе не является нагрузочным, приватностным или качественным аудитом.
Типичные ошибки и что не делать
- Не используйте ответы модели как независимый эталон без проверки.
- Не складывайте реальные клиентские email в тесты.
- Не трактуйте создание dataset как успешную оценку модели.
Учитывайте, что трассировка и оценка могут сохранять содержимое входа и выхода. До подключения клиентов организуйте контроль доступа и обработку персональных данных. Не помещайте секреты API в промпты, параметры функций, журналы или опубликованные скриншоты. Если пример использует детерминированную функцию, его успешная проверка подтверждает корректность механики MLflow и теста, но не качество какой-либо нейросети.
FAQ
Запускает ли merge_records нейросеть?
Нет, он добавляет записи в набор.
Обязательно ли поле expectations?
Для оценки с эталоном оно необходимо в этом сценарии.
Можно ли просмотреть строки?
Да, метод to_df возвращает представление набора.
Официальные источники
Частые вопросы
Запускает ли merge_records нейросеть?
Нет, он добавляет записи в набор.
Обязательно ли поле expectations?
Для оценки с эталоном оно необходимо в этом сценарии.
Можно ли просмотреть строки?
Да, метод to_df возвращает представление набора.
Читайте также
Как найти ошибочные и медленные запросы AI-приложения в MLflow Traces
Фильтруем статус ERROR и длительность через search_traces, сверяя результат с искусственными успешным и аварийным вызовами.
Как проверить формат ответа нейросети собственным scorer в MLflow
Создаём @scorer для проверяемого префикса и проводим оценку без LLM-судьи и без внешнего API.
Как разделить поиск и сборку ответа RAG на спаны MLflow Tracing
Размечаем вручную поиск фрагмента и формирование ответа; проверяем вложенные спаны без вызова платной модели.
Комментарии
Пока тихо. Скажите первое слово