Jev и классическое машинное обучение: что нужно знать

Обновлено

Для ML-инженера Jev — знакомая сущность в новой упаковке, классификатор с вероятностями, которому не нужна обучающая выборка. Разбираем, как оценивать его качество на своих данных, какие метрики считать и когда обычная модель окажется лучше.

Jev в терминах машинного обучения

С точки зрения классического ML Jev — предобученный классификатор, который возвращает вероятности, а классы и их описания получает прямо в запросе. Обучающая выборка ему не нужна: задачу вы описываете словами в instructions и criteria.

Примитив Jev Аналог в ML Что возвращает
Noul Бинарная классификация Вероятность ответа «да», как predict_proba
Choice Многоклассовая классификация, до 255 классов Выбранный класс и распределение по всем классам
Score Порядковая шкала из 2–10 уровней Распределение по уровням и его среднее

Главное отличие от своей модели — её нельзя дообучить. По документации, Jev не дообучают и не адаптируют через LoRA на данных клиентов: одни и те же веса обслуживают все аккаунты. Под предметную область модель настраивают через запрос: данные — в state, правила и пограничные случаи — в instructions и criteria, сложные суждения раскладывают на атомарные вопросы. Обучения у вас нет, зато остаётся оценка качества, и её придётся делать самим.

Калибровка: почему вероятностям можно доверять — или нет

TypeSafe обучает Jev методом RLCD, чтобы вероятности были откалиброваны: среди ответов с вероятностью 0,8 верными должны оказаться около 80%. Для классификатора это ценно. Откалиброванную вероятность можно напрямую переводить в ожидаемую цену ошибки и по ней выбирать порог. Как устроен метод и что о нём неизвестно, рассказываем в статье о RLCD.

Но калибровка — заявление компании, а не свойство, гарантированное на ваших данных. Её нужно измерять так же, как точность.

Какие метрики считать

Тип вопроса Качество решений Качество вероятностей
Noul Precision, recall, F1 при выбранном пороге; ROC-AUC или PR-AUC без порога Brier score, log loss, диаграмма калибровки
Choice Accuracy, macro-F1, матрица ошибок, top-2 accuracy Log loss, калибровка вероятности выбранного класса
Score Средняя ошибка в уровнях (MAE), ранговая корреляция Спирмена Log loss по уровням

При дисбалансе классов accuracy обманчива. Если фишинга 2%, модель, которая всегда отвечает «нет», наберёт 98%. Смотрите на recall по редкому классу и на PR-AUC.

Как оценить Jev на своих данных

  1. Соберите выборку. Возьмите несколько сотен реальных примеров и разметьте их вручную. При 500 примерах и точности около 80% погрешность оценки — примерно ±3,5 процентного пункта (95-процентный доверительный интервал). Разница в 2 п. п. между двумя моделями на такой выборке тонет в шуме.
  2. Разделите на dev и test. Формулировки, критерии и пороги подбирайте на dev-части, а итоговую оценку считайте один раз на test. Иначе вы измерите, насколько хорошо подогнали вопросы под конкретные примеры. В одном из cookbook’ов TypeSafe, например, 1200 примеров шли на подбор, а 800 откладывались до финальной оценки.
  3. Возьмите базовые решения. Самый частый класс, простая модель на TF-IDF, ваша текущая LLM. Без сравнения цифра точности Jev ни о чём не говорит.
  4. Проверьте язык. Основной язык обучения Jev — английский, на других языках точность пока ниже. TypeSafe сама советует тестировать модель на своём контенте.
  5. Логируйте версию. Поле model в ответе показывает, какая версия ответила. При смене версии прогоните тестовую выборку заново — подробнее в статье о Jev 1.13.

Пример: собираем ответы Noul и считаем метрики через scikit-learn.

from sklearn.calibration import calibration_curve
from sklearn.metrics import brier_score_loss, f1_score, roc_auc_score
from typesafe_sdk import Noul, TypeSafeClient

# dataset — список пар (текст, метка 0/1), размеченных вручную
probs, labels = [], []
with TypeSafeClient() as client:
    for text, label in dataset:
        r = client.system_one(
            state={"message": text},
            questions={"phishing": Noul(instructions="Пытается ли `message` выманить пароль или платёжные данные?")},
        )
        probs.append(r.nouls["phishing"].noul)
        labels.append(label)

print("ROC-AUC:", roc_auc_score(labels, probs))
print("Brier:", brier_score_loss(labels, probs))
print("F1 при пороге 0.5:", f1_score(labels, [int(p >= 0.5) for p in probs]))

frac_true, mean_pred = calibration_curve(labels, probs, n_bins=10)
for m, f in zip(mean_pred, frac_true):
    print(f"предсказано {m:.2f} -> на деле {f:.2f}")

Для тысяч примеров удобнее асинхронный клиент — пример есть в статье о Python SDK. Помните о лимите в 1200 запросов в минуту.

Уверенность: меньше покрытие — выше точность

Классический приём selective prediction — автоматически решать только уверенные случаи. У Jev он встроен в ответ через поле confidence. Пример из cookbook’а TypeSafe: 60 годовых отчётов компаний из базы американского регулятора SEC, 75 отраслевых групп, один Choice на документ. Порог уверенности 0,9 разделил отчёты пополам. В уверенной половине модель угадала группу в 90% случаев, в неуверенной — в 40%.

Для неуверенных ответов код поднимался на уровень выше по иерархии отраслей и сообщал более общий раздел. Там точность выросла до 70%, и каждый документ получил полезную метку без второго запроса. Цифры получены самой TypeSafe на версии jev-1.12 и маленькой выборке, но приём переносится на любую иерархию классов.

Считайте для своей задачи кривую «покрытие — точность»: какую долю потока Jev закрывает автоматически при каждом пороге и сколько ошибок при этом допускает. Как выбирать пороги, рассказываем в статье об уверенности Jev.

Jev как генератор признаков

Второй способ соединить Jev с классическим ML — использовать ответы как признаки для своей модели. TypeSafe предлагает именно это: вероятности Jev подаются в обычную модель, которая учится их комбинировать. Если меток нет, их можно получить у ансамбля дорогих рассуждающих моделей.

В одном из cookbook’ов компании так предсказывали оценку критика по тексту винного обзора: 2000 обзоров, 800 из них отложены для проверки. Ответ Score превращался в два признака — средний уровень и разброс, ответ Noul — в один. Вопросы предлагала LLM, отвечала на них Jev, а обучался CatBoost. Ошибка RMSE на отложенных данных, в баллах:

Подход RMSE
Всегда предсказывать среднюю оценку 3,09
CatBoost на подсчёте слов 2,47
Спросить у Jev оценку напрямую 2,15
18 вопросов Jev + CatBoost 1,87
38 вопросов Jev после пяти итераций + CatBoost 1,77

Это одна выборка и один прогон, цифры получены TypeSafe на jev-1.12. Но вывод полезный: много узких вопросов и обученные веса дали меньшую ошибку, чем один прямой вопрос. Число запросов при этом растёт с числом строк, а не вопросов: все вопросы к одной строке уходят одним запросом.

Когда своя модель лучше

Jev выигрывает, когда размеченных данных нет или задача часто меняется: классы можно поправить прямо в запросе. Но у обученного классификатора свои сильные стороны. На Хабре описан эксперимент на датасете Banking77. Без дообучения модель GLiNER 2.5 уступала Jev около 9 п. п. После 51 минуты обучения примерно на 10 тысячах примеров она обошла Jev примерно на 9 п. п. и работала локально в 8 раз быстрее. Код и логи автор не опубликовал, так что это единичный опыт, а не бенчмарк.

Своя модель предпочтительнее, если:

  • домен стабильный, а размеченных данных достаточно;
  • данные нельзя отправлять во внешнее облако;
  • нужны полная воспроизводимость и контроль над версией.

И ещё одна деталь из того же разбора: соглашение TypeSafe для прямых аккаунтов ограничивает публикацию бенчмарков и данных о производительности сервиса. Если собираетесь публиковать свои замеры, сначала проверьте условия.

Частые вопросы

Можно ли дообучить Jev на своих данных?

Нет. TypeSafe не дообучает модель на данных клиентов, одни и те же веса обслуживают все аккаунты. Подстраивать Jev нужно через state, формулировки вопросов и критерии, а при необходимости — обучать свою модель поверх ответов Jev.

Какие метрики использовать для оценки Jev?

Для Noul — precision, recall и F1 при выбранном пороге, а также ROC-AUC и Brier score. Для Choice — accuracy, macro-F1 и матрицу ошибок. Дополнительно постройте кривую «покрытие — точность» по уверенности.

Сколько примеров нужно, чтобы проверить Jev?

Несколько сотен размеченных примеров дают оценку точности с погрешностью в несколько процентных пунктов. При 500 примерах и точности около 80% это примерно ±3,5 п. п. Для редких классов примеров нужно больше.

Что выбрать — Jev или обученный классификатор?

Если данных для обучения нет или классы часто меняются, начните с Jev. Если домен стабильный и разметки много, дообученная модель может оказаться точнее и быстрее. Сравните оба варианта на одной отложенной выборке.

Источники