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

バグの深刻度、顧客の怒りの度合い、候補者の経験の深さ。
こうした「どのくらいか」を Jev(ジェヴ)に判定させたいとき、質問はどう書けばよいのでしょうか。
結論から言うと、Score は「低い順に並べた段階の説明」を渡し、段階上の位置を示す数値と各段階の確率、信頼度を受け取る質問の型です。
実務では、しきい値で分岐したり、複数の Score を重み付けして優先度を作ったりする部品になります。
TypeSafe AI の公式ドキュメント Score では、Score は「段階で説明できるスペクトラム上の位置」を答える質問の型と説明されています。
順序のない選択肢なら Choice、はい/いいえなら Noul(ヌール)を使います。
Score の質問は type を "score" にし、instructions(指示文)に何を採点するかを書き、criteria(基準)に段階の説明を低い側から高い側へ並べた配列を渡します。
公式ドキュメントでは、段階は最低2つ、最大10までとされています。
各段階の番号は配列の位置で 0 から始まり、モデルには説明文だけが渡されて各段階が state(状態)に対して個別に判定されるという説明です。
公式の助言は、degrees(程度)ではなく situations(状況)を書くことです。
数字だけの段階 ["0", "1", "2"] で「ボタンが数ピクセルずれている」報告を採点すると score 0.57、信頼度 0.35 で 0 と 1 に確率が割れ、同じ報告を説明文の段階で採点すると 0.0、信頼度 1.0 になったとされています。
モデルは段階の番号や隣の段階を見ないため、「前の段階より悪い」という書き方や説明中の数字は意味を持たないという説明です。
もう1つの原則は1次元です。
「時間を守り、賢く、経験豊富」のような説明は3つを同時に測っており、置き場のない入力で信頼度が下がり score の意味が薄れます。
1つずつ Score に分け、コードで合成します。
明らかだと思う入力で隣の段階との間に score が落ち続けるときは、各段階を文字列ではなくオブジェクトにし、説明の欄と例の欄を全段階に同じ名前で持たせます。
公式の例は段階ごとに what(説明)と examples(例の配列)を持たせる形で、Safari でだけクラッシュする報告に対する3通りの結果が載っています。
| 段階の書き方 | score | confidence |
|---|---|---|
| 文字列だけ(例なし) | 1.30 | 0.54 |
| 役立つ例を追加(ブラウザによって失敗する) | 1.07 | 0.90 |
| 無関係な例を追加(検索は失敗するが閲覧はできる) | 1.28 | 0.57 |
例は実際の入力に似ているときだけ効き、信頼度が上がっても正しさの証明にはならないという読みです。
「Safari でだけクラッシュし、Chrome では動くが Safari しか使わない顧客がいる」という報告を深刻度3段階で採点した公式の応答例です。
"bug_severity": {
"type": "score",
"score": 1.3,
"confidence": 0.54,
"legend": {
"0": "Cosmetic; no impact to functionality",
"1": "Broken or degraded feature, but workaround exists",
"2": "Blocking issue; no workaround exists"
},
"probabilities": {
"0": 0.0,
"1": 0.7,
"2": 0.3
}
}probabilities: 各段階の確率。キーは段階番号の文字列で、合計は 1。score: 段階番号に確率を掛けて足した値。0 × 0.0 + 1 × 0.70 + 2 × 0.30 = 1.30。legend: 段階番号と説明の対応。confidence(信頼度): 分布の偏りから計算した 0 から 1 の値。1.30 は「おおむね段階 1、一部は段階 2」で、報告の内容に合う分布だと説明されています。
同じ質問に対する5つの入力の結果も載っています。
| state(要約) | score | confidence |
|---|---|---|
| ボタンが数ピクセルずれている | 0.0 | 1.0 |
| PDF 出力が動かないが CSV で代用できる | 1.0 | 1.0 |
| PDF 出力が終わらず、CSV も人によって失敗する | 1.12 | 0.81 |
| Safari でだけクラッシュし、Safari しか使えない顧客がいる | 1.3 | 0.54 |
| 今朝から全員ログインできず 500 エラー | 2.0 | 1.0 |
信頼度 1.0 は確率が1つの段階に集中したことを表すだけで、正しさの保証ではないと注記されています。
score は確率で重み付けした平均なので、1.0 でも「全部が段階 1」と「0 と 2 に半分ずつ」の両方があり得るので、分布も併せて読みます。
複数の要素に依存する判断は、要素ごとに Score を立てて1回のリクエストで送り、コードで重み付けして合成するのが公式の勧めです。
公式の例では深刻度(3段階)、苛立ち(3段階)、報告の詳しさ(4段階)を TRIAGE_QUESTIONS にまとめ、応答は 1.24、1.45、3.0 だったとされています。
段階数が違うと上限が違うので、各 score を最上位の番号で割って 0 から 1 に正規化してから重みを掛けます。
def normalized(answers, question_id: str) -> float:
"""Put a score on 0 to 1 by dividing by its top level number."""
top_level = len(TRIAGE_QUESTIONS[question_id].criteria) - 1
return answers[question_id].score / top_level
def priority(ticket: str) -> float:
with TypeSafeClient() as client:
response = client.system_one(
state=ticket,
questions=TRIAGE_QUESTIONS,
)
answers = response.answers
severity = normalized(answers, "severity")
frustration = normalized(answers, "frustration")
report_quality = normalized(answers, "report_quality")
# A detailed report helps an engineer investigate, so it raises priority a little.
return 0.6 * severity + 0.3 * frustration + 0.1 * report_quality上の応答では正規化後が 0.62、0.725、1.0 で、優先度は四捨五入で 0.69 と計算されています。
Score は、低い順に並べた段階の説明を criteria に渡し、確率で重み付けした位置、各段階の確率、信頼度、凡例を受け取る質問の型です。
核心は、段階を「状況」として書き、1つの Score を1次元に保てば、結果を自分のコードでしきい値や重みに変換できることにあります。
次の一手として、いま人が付けている優先度を1つ選び、要素ごとに3段階の Score を書いて、重み付けした値と人の判断を並べて比べてみてください。