Choice、Score、Noul

リクエストを書く前に、Choice、Score、Noulを比較する。

各 Jev 呼び出しは、1つのstateに対する型付き質問のマップとなる。Choiceは、最大255個まで定義できる選択肢から1つを選ぶ。Scoreはstateを2~10段階の順序付きレベル上に配置し、2つのレベル間にも着地できる。NoulはP(yes)を[0, 1]内のnoulとして返し、独立したconfidenceフィールドは持たない。判断に合うプリミティブを選び、算術、日付、生成処理は別のツールに任せる。

プリミティブの選び方

回答がキュー、スキル、クラスラベル、次のリンクなど、名前付きの選択肢1つである場合はChoiceを使います。TypeSafeに表示される質問は「どの選択肢ですか?」です。返されるのは選択結果、確率、confidenceです。基準には最大255件の選択肢をマップで指定できます。Wikipediaリンクが数百件ある場合、1つのChoiceに詰め込むことはできません。Wikiracingデモでは先にスコアを付け、絞り込んだ候補から選択します。

回答が、平静 / 不満 / 非常に不満、または1-5の深刻度など、短い順序付き凡例上の程度ならScoreを使う。戻り値はscore、legend、確率、confidence。Criteriaは2~10段階の順序付き配列となる。scoreを補間して正確な量に換算してはならない。Jev 1.13のレベルでは、2つの段階間にある数値の復元精度が低い。期待値はしきい値判定にのみ使う。

質問がはい/いいえで答えられる場合、つまり「これは正しいか?」にはNoulを使います。0から1のnoulを返します。基準には任意で真と偽の説明を指定できます。confidenceフィールドはありません。0.5に近いNoulは不確実性を示し、中程度の強度ではありません。Noulが2択のChoiceと等価だと仮定したり、一方で調整したしきい値を他方へ流用したりしないでください。TypeSafeのjaggednessページでは、同じチケットについて、返金のNoulが0.22、はいのChoiceが0.01だった例を示しています。

Choice, Score, and Noul primitives with return fields and limits
Choice、Score、Noulの戻り値フィールドと制限。

Choice

typeField
choice
question
この中のどの選択肢ですか?
returns
choice、確率、confidence
criteria
最大255個の選択肢を持つマップ
maxOptions
255

Score

typeField
score
question
どのレベルですか?
returns
score、legend、確率、confidence
criteria
2~10段階の順序付き配列
minLevels
2
maxLevels
10

Noul

typeField
noul
question
これは正しいですか?
returns
noul(0~1)
hasConfidence
false
criteria
任意のtrue/false説明

共通の戻りフィールド

requestId
呼び出しの識別子。ログ内でトレースと再試行を突合するために使う。
timestamp
応答エンベロープに付加されるサーバー時刻。質問を再送する理由にはならない。
latency
この評価で計測された所要時間。TypeSafeはJevのエンドツーエンド時間を70ms-500msとしている。
metadata
型付き回答に添付できる任意の追加ペイロード。製品に関する事実はここではなくstateに入れる。

並列質問とID

1つのリクエスト内の質問はstateを共有し、互いに独立して並列実行される。質問を追加してもレイテンシはほとんど変わらない。同じマップ内にChoice、Score、Noulを混在させられる。キーはurgency、department、frustrationなど自由に決められ、対応する回答が同じキーで返る。キーは基盤モデルには送られず、推論にも使われない。

ループ内でキーを生成する場合、このID規則が重要です。jaggednessページの数え上げ例では、リストの各項目につき1つのNoul(item_0, item_1, …)を問い、Pythonで回答を合計します。Jevがこれらの名前をトークンとして認識することはありません。再試行を元のマップと対応付けられるよう、ログ内の名前は固定してください。

すべてのプリミティブ応答に共通する返却メタデータには、requestId、タイムスタンプ、レイテンシ、メタデータが含まれます。トレースの関連付けにはrequestIdを使用します。タイムスタンプとレイテンシは通信上の事実として扱い、再質問の理由にはしないでください。メタデータは中核ペイロードに添付できる任意情報です。まず3つのプリミティブを比較し、その後で型付き回答を包む共通フィールドを確認してください。

実運用上の制限

Choiceの選択肢は255件が厳格な上限で、目安ではありません。WikiracingではScoreで候補を絞り、その後にChoiceを使って上限を回避します。分類体系に400件のラベルがある場合、同じ2段階構成かChoiceの階層化が必要です。APIが256件を受け付けるとは期待しないでください。

Scoreの2~10段階は、人が声に出して読める短い凡例向けだ。100点満点の品質尺度には不適切なので、個別のScoreに分けてコードで加算する。1.4のような段階間のscoreは想定内だが、その小数値から金額を復元する用途には使えない。

Noulにはconfidenceフィールドがないため、ゲートにはnoul値と、追加した別の質問を使います。よくある組み合わせは、「対象範囲内か」を判定するNoulと、noulが高い場合に限り「どの区分か」を選ぶChoiceです。jaggednessの不変条件記録は、この2つの数値を同じ統計量として扱わないよう警告しています。

1つのチケットに対して3種類すべてのプリミティブを混在させるリクエストは、上級テクニックではなく標準的な構成だ。緊急性をNoul、担当部署をChoice、不満度をScoreで判定し、その後をコードで処理する。クイックスタートのcurlにも同じマップが示されている。このページの比較は、JSONを書く前に型を選ぶためのものだ。

共通の外枠フィールドは第4のプリミティブではありません。requestId、タイムスタンプ、レイテンシ、メタデータは呼び出しを追跡できるよう、すべての回答に付随します。製品に関する情報はstateに入れます。ポリシーをメタデータへ詰め込んでいる場合は、Jevが実際に読み取るオブジェクトへ移してください。

Criteriaは、新しく加わったチームメンバーが明日読むつもりで書く。Choiceの選択肢名とScoreのレベル名も質問の一部だ。曖昧なラベルは、字面どおりの解釈が本番環境に現れる原因になる。

Noulは固有名詞である。リクエストの残りが英語の文章でも、表記を変えないこと。

出典