Jev: решения вместо текста
Модель, которая не пишет ответы, а принимает решения - да или нет, выбор из вариантов, оценка по шкале - и возвращает вероятности
Jev: решения вместо текста
Jev (TypeSafe) - модель другого класса, чем чат-модели. Она не генерирует текст. Вы даёте ей текст и задаёте вопросы с заранее известными вариантами ответа, а она возвращает готовые значения: вероятность «да», выбранный вариант, оценку по шкале. Парсить ничего не нужно, ответ сразу ложится в if, сортировку или порог в вашем коде.
Ответ приходит примерно за секунду, сколько бы вопросов вы ни задали: они обрабатываются параллельно
Тарифицируются только входные токены. Классифицировать обращение стоит доли копейки
Ответ всегда из ваших вариантов: модель не придумает значение, которого вы не предлагали
Вместе с ответом приходят вероятности: видно, когда модель уверена, а когда решение лучше отдать человеку
Когда брать Jev, а когда чат-модель
| Задача | Что подойдёт |
|---|---|
| Определить тему, отдел, намерение, язык, тип документа | Jev |
| Проверить, есть ли в тексте признак: срочность, жалоба, персональные данные, попытка взлома промпта | Jev |
| Оценить по шкале: критичность бага, раздражение клиента, релевантность документа запросу | Jev |
| Выбрать, какой модели или обработчику отдать запрос | Jev |
| Написать ответ клиенту, пересказать, перевести, сгенерировать код | Чат-модель (Chat Completions) |
| Посчитать, сравнить даты, решить многошаговую задачу | Обычный код или модель с рассуждениями |
Хорошее правило: Jev отвечает на вопросы, на которые знающий человек ответил бы за пару секунд, взглянув на текст. Если нужен анализ из нескольких шагов, разбейте его на простые вопросы и соберите результат в коде.
Три типа вопросов
| Тип | Вопрос | Что возвращает |
|---|---|---|
noul | Да или нет? | noul: вероятность «да» от 0 до 1 |
choice | Какой вариант из списка? | choice: победивший вариант, probabilities: вероятность каждого, confidence: уверенность |
score | Где на шкале? | score: положение на вашей шкале, probabilities по уровням, confidence |
В одном запросе типы можно смешивать. Подробно: в гайде «Как задавать вопросы».
Первый запрос
- Получите API-ключ: ключ usellm создаётся в личном кабинете. Отдельный аккаунт TypeSafe не нужен.
- Отправьте текст и вопросы. В
state- текст, который нужно оценить. Вquestions- ваши вопросы: имя вопроса придумываете сами, под ним же придёт ответ.
curl -X POST "https://api.usellm.ru/v1/systemone" \
-H "Authorization: Bearer <USELLM_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "typesafe/jev",
"state": "Здравствуйте! Третий день не могу подключить оплату на сайте — платежи клиентов не проходят, мы теряем заказы. Помогите, пожалуйста, срочно.",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "Клиент сообщает о срочной проблеме?"
},
"department": {
"type": "choice",
"instructions": "Какая команда должна заняться обращением?",
"criteria": {
"billing": "Платежи, счета, возвраты, подписки",
"technical": "Ошибки, сбои, интеграции, настройка",
"sales": "Тарифы, покупка, вопросы до оплаты"
}
},
"frustration": {
"type": "score",
"instructions": "Насколько раздражён клиент?",
"criteria": [
"Спокоен, просто описывает ситуацию",
"Раздражён, но вежлив",
"Очень зол, резкие выражения"
]
}
}
}'
API совместим с официальными SDK TypeSafe: достаточно указать наш адрес (https://api.usellm.ru, без /v1) и ключ usellm. Вопросы и критерии можно писать по-русски.
- Прочитайте ответ:
{
"model": "jev-1.13.0",
"answers": {
"is_urgent": { "type": "noul", "noul": 0.98 },
"department": {
"type": "choice",
"choice": "billing",
"confidence": 0.62,
"probabilities": { "billing": 0.74, "technical": 0.26, "sales": 0.0 }
},
"frustration": {
"type": "score",
"score": 0.9,
"confidence": 0.84,
"legend": {
"0": "Спокоен, просто описывает ситуацию",
"1": "Раздражён, но вежлив",
"2": "Очень зол, резкие выражения"
},
"probabilities": { "0": 0.1, "1": 0.9, "2": 0.0 }
}
},
"usage": { "input_tokens": 633, "output_tokens": 73, "cost_rub": 0.0133 }
}
is_urgent= 0,98: почти наверняка срочно. В коде этоif (noul > 0.8).department=billing, ноtechnicalполучил 0,26: в обращении есть и оплата, и «не могу подключить». Поэтомуconfidenceвсего 0,62 - модель честно показывает, что вариантов два. Такое обращение разумно отдать в биллинг с копией техподдержке.frustration= 0,9 - между «спокоен» (0) и «раздражён, но вежлив» (1), ближе ко второму.
Уверенность: когда действовать автоматически
Вероятности - главное отличие Jev от чат-модели, которая отвечает одинаково уверенным тоном и когда знает, и когда гадает. confidence у choice и score показывает, насколько ответ однозначен: вся вероятность на одном варианте - близко к 1, размазана по нескольким - близко к 0. У noul отдельного confidence нет: сама вероятность и есть сигнал, значение около 0,5 означает «не знаю».
Удобно делить на три зоны и ставить порог по цене ошибки:
| Уверенность | Что делать |
|---|---|
| Высокая | Действовать автоматически |
| Средняя | Действовать осторожно: попросить подтверждение, пометить для проверки |
| Низкая | Не действовать: передать человеку или более сильной модели |
intent = response.answers["intent"]
if intent.confidence < 0.5:
route_to_human(message) # модель сомневается — не угадываем
elif intent.choice == "check_balance":
show_balance(account_id) # ошибка дешёвая — хватит умеренной уверенности
elif intent.choice == "approve_transfer":
if intent.confidence > 0.9:
confirm_then_execute(account_id)
else:
ask_user_to_confirm(account_id) # ошибка дорогая — переспрашиваем
Конкретные пороги зависят от ваших данных. Начните с осторожных значений, прогоните на своих примерах с известными ответами и подстройте.
Сколько это стоит
- Тарифицируются только входные токены: ваш
stateи вопросы. Выходные токены бесплатны. - К каждому запросу провайдер добавляет около 280 служебных токенов. Поэтому десять вопросов одним запросом заметно дешевле десяти запросов по одному вопросу: текст и служебная часть оплачиваются один раз.
- Русский текст занимает больше токенов, чем английский той же длины.
- Стоимость каждого запроса приходит в
usage.cost_rubи видна в истории запросов в личном кабинете. В Python SDK это поле недоступно (SDK его отбрасывает), в TypeScript SDK и при прямом HTTP-запросе - доступно.