Jevの既知の弱点とは|jev-1.13の9つの苦手と回避策、日本語の精度、データの扱い
TypeSafe AIが公開するjev-1.13の9つの弱点(文字どおりの読み取り、計算、日付、間接参照、敵対的入力など)と公式の回避策、日本語の注意点、学習不使用とZDRの方針をまとめます。

問い合わせをどの部署に回すか、商品をどのカテゴリに入れるか。
こうした「決まった選択肢から1つ選ぶ」判断を Jev(ジェヴ)に任せるとき、質問はどう書けばよいのでしょうか。
結論から言うと、Choice は「選択肢名と説明の対応表」を渡し、選ばれた1つと全選択肢の確率、信頼度を受け取る質問の型です。
実務では、コード側の if 文にそのまま接続できる分類器という位置づけになります。
TypeSafe AI の公式ドキュメント Choice では、Choice は System One モデルに「決まった選択肢の集合から1つを選ばせる」質問の型と説明されています。
例は、チケットの担当チーム、商品カテゴリ、コードの言語といった判断です。
程度なら Score、はい/いいえなら Noul(ヌール)という切り分けも同じページにあります。
リクエスト最上位には、評価対象の state(状態)、モデルを指す model、質問 ID をキーにした questions があるとされています。
Choice の各質問は次の3フィールドです。
type: 常に "choice"。instructions(指示文): モデルが答える質問そのもの。criteria(基準): 選択肢の対応表。キーが選択肢名、値が説明。公式ドキュメントの、靴の通販への問い合わせをチームに振り分ける例です(表示例では model は省略されています)。
{
"state": "My running shoes arrived in the wrong size. Can I swap them for a size 10?",
"questions": {
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"returns": "Exchanges, refunds, wrong or damaged items",
"shipping": "Delivery status, delays, lost packages",
"billing": "Charges, invoices, payment problems"
}
}
}
}質問 ID の department は自分で決める名前で、答えは同じ ID の下に返ります。
ID はモデルに送られない一方、選択肢名と説明は両方送られるため、説明は選択肢どうしを区別できる書き方にします。
説明は1行の文字列から始めるのが公式の推奨です。
選択肢名だけで伝わるなら説明は null でよく、公式の例ではトーンを聞く質問が {"calm": null, "frustrated": null, "angry": null} と書かれています。
公式ドキュメントでは1つの Choice につき最大 255 個の選択肢を受け付け、1つ増やしても数トークンしか増えないとされているので、カテゴリの一部ではなく全リストを渡します。
網羅できない可能性があるなら other や none of the above を足し、どれにも当てはまらないと言える逃げ道を作ります。
似た選択肢をモデルが混同し続けるときは、説明を文字列ではなくオブジェクトにします。
公式の例では「返品できるか(return_policy)」と「送った返品の進捗(return_status)」を、何を含むか、隣の選択肢に属するものは何か、入力例の3つで書き分けています。
"return_status": {
"what": "Progress of a return already sent",
"not_for": "Whether and how an item can be returned",
"examples": [
"Has my return arrived yet?",
"When will my refund be paid?"
]
}what、not_for、examples は API の予約語ではなく自分で決める名前で、名前も値もモデルに見えるため短いラベルにするよう説明されています。
最初のリクエストに対する公式の応答例です(usage は省略)。
"answers": {
"department": {
"type": "choice",
"choice": "returns",
"confidence": 1.0,
"probabilities": {
"shipping": 0.0,
"returns": 1.0,
"billing": 0.0
}
}
}choice: 確率が最も高い選択肢。probabilities: 全選択肢の確率分布。合計は 1。confidence(信頼度): 分布の偏りから計算した 0 から 1 の値。複数に散ると低く、1つに集中すると高い。分かりやすい問い合わせなので確率が returns に集中し、信頼度も 1.0 です。
返金の話が混ざれば billing にも確率が割れ、信頼度が下がると説明されています。
公式ドキュメントが良い習慣として強調するのは、コードが必要とするかもしれない Choice をすべて1回のリクエストに入れることです。
質問は並列に評価されるため応答時間はほとんど変わらず、不要な答えはコードが無視すればよいとされています。
公式の例では、3つのチームにまたがる曖昧なチケットに担当チーム、返品理由、配送問題、望む解決、トーンの5つを1回で聞き、department は returns(確率 0.60、billing 0.38、信頼度 0.39)だったとされています。
5つの質問を TRIAGE_QUESTIONS にまとめて送ったあと、担当チームを決める部分の Python コードです。
department = answers["department"]
if department.confidence < 0.3:
# Not clear which team to send to. Let a person decide.
send_to_manual_triage(ticket)
return
if department.choice == "returns":
# return_reason answer is only used here
assign(ticket, team="returns", issue=answers["return_reason"].choice)
elif department.choice == "shipping":
# shipping_issue answer is only used here
assign(ticket, team="shipping", issue=answers["shipping_issue"].choice)
else:
assign(ticket, team="billing")
# A second team with a real share of the probability gets a copy
for team, probability in department.probabilities.items():
if team != department.choice and probability > 0.25:
notify(ticket, team=team)信頼度 0.3 未満なら人に回し、2番目のチームの確率が 0.25 を超えたら写しを送る、という判断がふつうの if 文です。
続く部分では、望む解決の信頼度が 0.5 未満なら推測せず顧客に聞き返すと書かれています。
Choice は、選択肢名と説明の対応表を criteria に書き、選ばれた1つ、全選択肢の確率、信頼度の3つを受け取る質問の型です。
核心は、答えが必ず自分の用意した選択肢に収まり、確率と信頼度が付くので、分岐と例外処理を自分のコードで書けることにあります。
次の一手として、手作業で振り分けている業務を1つ選び、全選択肢と other を並べた Choice を書き、信頼度で人に回す分岐まで小さく試してみてください。