Choice, Score и Noul

Сравните Choice, Score и Noul, прежде чем составлять запрос.

Каждый вызов Jev представляет собой набор типизированных вопросов к одному состоянию. Choice выбирает из заданного набора максимум из 255 вариантов. Score помещает состояние на шкалу из 2–10 упорядоченных уровней, включая промежуточные значения. Noul возвращает P(да) как noul в диапазоне [0, 1] и не имеет отдельного поля уверенности. Выберите примитив, соответствующий решению, а арифметику, даты и генерацию оставьте другим инструментам.

Как выбрать примитив

Используйте Choice, когда ответом должен быть один именованный вариант: очередь, навык, метка класса или следующая ссылка. TypeSafe выводит вопрос «Какой из этих вариантов?». Возвращаются выбранный вариант, вероятности и уверенность. Критерии представляют собой карту размером до 255 вариантов. Сотни ссылок Wikipedia нельзя поместить в один Choice: демо Wikiracing сначала выставляет оценки, а затем выбирает из сокращённого списка.

Используйте Score, когда ответом служит степень на короткой упорядоченной шкале: спокоен / раздражён / очень раздражён или серьёзность 1-5. Возвращаются оценка, шкала, вероятности и уверенность. Критерии задаются упорядоченным массивом из 2–10 уровней. Не интерпретируйте оценку как точную величину. Уровни Jev 1.13 плохо подходят для восстановления числа между двумя ступенями; используйте математическое ожидание только для проверки порога.

Используйте Noul для вопросов с ответом «да» или «нет»: «Это правда?» Результат — noul от 0 до 1. В критериях при необходимости можно описать, что считать истиной и ложью. Поля уверенности нет. Значение Noul около 0.5 означает неопределённость, а не среднюю интенсивность. Не считайте Noul эквивалентом Choice с двумя вариантами и не переносите порог, настроенный для одного, на другой. На странице jaggedness от TypeSafe для одной и той же заявки рядом показаны Noul возврата средств со значением 0.22 и утвердительный Choice со значением 0.01.

Choice, Score, and Noul primitives with return fields and limits
Choice, Score и Noul с возвращаемыми полями и ограничениями.

Choice

Поле типа
choice
question
Какой из этих вариантов?
returns
выбор, вероятности, уверенность
criteria
набор максимум из 255 вариантов
Макс. вариантов
255

Score

Поле типа
score
question
Какой уровень?
returns
оценка, шкала, вероятности, уверенность
criteria
упорядоченный массив из 2–10 уровней
минимальные уровни
2
Максимальное число уровней
10

Noul

Поле типа
noul
question
Это верно?
returns
noul (от 0 до 1)
Наличие уверенности
false
criteria
необязательные описания истинного и ложного значений

Общие поля ответа

идентификатор запроса
Идентификатор вызова для связывания трассировок и повторных попыток в журналах.
timestamp
Время сервера в оболочке ответа, а не повод повторно отправлять вопрос.
latency
Измеренная длительность этой оценки. TypeSafe указывает сквозную задержку 70ms-500ms для Jev.
metadata
Необязательная дополнительная нагрузка рядом с типизированными ответами. Данные продукта храните в состоянии, а не здесь.

Параллельные вопросы и идентификаторы

Вопросы одного запроса используют общее состояние, независимо выполняются параллельно и при добавлении почти не влияют на задержку. В одной карте можно смешивать Choice, Score и Noul. Ключи задаёте вы: urgency, department, frustration. Соответствующий ответ возвращается под тем же ключом. Ключ не передаётся базовой модели и не участвует в выводе.

Это правило для ID важно при создании ключей в цикле. В примере подсчёта на странице jaggedness для каждого элемента списка задаётся по одному Noul (item_0, item_1, …), после чего ответы суммируются в Python. Jev никогда не получает эти имена как токены. Не меняйте имена в журналах, чтобы при повторных попытках можно было сопоставить их с исходной картой.

Общие метаданные каждого ответа примитива включают requestId, timestamp, latency и metadata. Используйте requestId для связывания трассировок. Считайте timestamp и latency характеристиками передачи, а не поводом задать вопрос снова. Metadata — необязательные данные, приложенные к основной полезной нагрузке. Сначала сравните три примитива, а затем рассматривайте общие поля как оболочку типизированного ответа.

Ограничения на практике

Лимит в 255 вариантов Choice жёсткий, а не рекомендательный. Wikiracing обходит его с помощью сокращённого списка Score и последующего Choice. Если в вашей таксономии 400 меток, нужна та же двухэтапная схема или иерархия Choices. Не рассчитывайте, что API примет 256.

Диапазон Score от 2 до 10 уровней предназначен для коротких шкал, которые человек может прочитать вслух. 100-балльная шкала качества требует другого примитива: разбейте её на элементарные Scores и сложите их в коде. Промежуточные оценки вроде 1.4 допустимы. Восстанавливать по этим дробям денежную сумму нельзя.

У Noul нет поля уверенности, поэтому условием допуска служит значение noul вместе с любым добавленным вторым вопросом. Распространённая связка: Noul определяет, «входит ли это в область задачи», а Choice отвечает, «к какой категории это относится», только при высоком noul. Запись об инвариантах jaggedness предупреждает, что эти два числа нельзя считать одной и той же статистикой.

Запрос, объединяющий все три примитива для одной заявки, — обычная схема, а не продвинутый приём. Срочность как Noul, отдел как Choice, раздражение как Score, а затем код. Та же карта показана в кратком руководстве для curl. Сравнение на этой странице помогает выбрать тип до написания JSON.

Общие поля оболочки — не четвёртый примитив. requestId, timestamp, latency и metadata сопровождают каждый ответ, чтобы вызов можно было отследить. Данные продукта должны находиться в состоянии. Если вы помещаете правила в metadata, перенесите их в объект, который фактически читает Jev.

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

Noul — имя собственное. Сохраняйте это написание, даже если остальная часть запроса составлена на английском.

Источники