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