GUIDES / 実践レシピ

Jev の確率と confidence の読み方、しきい値での振り分け方

probabilities は選択肢ごとの確率、confidence はその分布の尖り具合。両者の違い、計算のしかた、リスクに応じたしきい値の決め方、同じ入力でも値が少し揺れる点を実測つきで説明する。

Jevconfidencerouting

Jev の答えには2種類の数字が付きます。probabilities は「どれだと思うか」、confidence は「どのくらい迷っていないか」 です。Choice と Score にはこの両方が、Noul には確率だけが返ります。

confidence は分布の尖り具合

confidence は、probabilities の形を1つの数にまとめたものです。1つの選択肢に確率が集中していれば 1 に近く、均等に散らばっていれば 0 に近くなります。

公式ページのデモは、選択肢が3つのときの近似として次の式を使っています。

confidence ≒ (選択肢の数 × 最大の確率 − 1) / (選択肢の数 − 1)

手元の結果も、おおむねこの式どおりでした。

最大の確率式の値実際に返った confidence
0.94(3択)0.910.90〜0.91
0.95(3択)0.9250.92
0.60(3択)0.400.40
0.67(3択)0.5050.51

公式は、この confidence は「多くの用途に合う便利な既定の指標」であって、縛られる必要はないとしています。別の指標が欲しければ、probabilities から自分で計算できます。

実例: はっきりした答えと、迷った答え

「顧客は何を求めているか?」を、返金(refund)・修理や解決(fix)・情報(info)の3択で聞いた結果です。

問い合わせ文確率選んだ答えconfidence
注文した商品がまだ届きません。どうなっていますか?info 0.97 / fix 0.03 / refund 0info0.96
サイズが合いませんでした。どうすればいいですか?fix 0.60 / info 0.40 / refund 0fix0.40
先月から使っていますが、思っていたのと違いました。fix 0.67 / info 0.18 / refund 0.15fix0.51

2件目と3件目も choicefix と1つ返ってきます。choice だけを見ていると、モデルが迷っていたことに気づけません。 2件目は「交換したいのか、返品方法を知りたいのか」が文面から決まらない、もっともな迷い方です。

確信度が低いときに疑うこと(公式の説明より):

  • Choice: 選択肢のどれも決め手に欠ける。選択肢の切り方が入力に合っていない
  • Score: 段階の定義があいまい、複数の軸が混ざっている、state に判断材料が足りない

3つの帯に分ける

公式が出発点として勧めているのは、確信度を3つの帯に分け、帯ごとにシステムの動きを変えることです。

動き
高い自動で実行する
中くらい慎重に進める。利用者に確認する、レビュー待ちに回す、追加の情報を集める
低い実行しない。人に回す、聞き返す、別の仕組みにフォールバックする

「分からない」と言えることが、信頼できる仕組みの土台だ、というのが公式の立場です。

しきい値は操作ごとに変える

しきい値は1つの数ではありません。間違えたときの損害が大きい操作ほど高くします。

const a = res.answers.action; // choice: 'check_balance' | 'approve_transfer' | 'support'

if (a.confidence < 0.5) {
  routeToHuman();                 // 本当に迷っている。当てずっぽうで進めない
} else if (a.choice === 'check_balance') {
  showBalance();                  // 間違えても取り返しがつく
} else if (a.choice === 'approve_transfer') {
  if (a.confidence > 0.9) confirmThenExecute(); // 重大な操作。高い確信度でも確認を挟む
  else askUserToConfirm();
} else {
  openSupport();                  // 'support'。選択肢は必ずどれかの分岐に入れる
}

選択肢を足したら分岐も足します。どの分岐にも入らない答えが黙って捨てられるのは、確信度の設計より前に起きがちな不具合です。

数値は公式の例のもので、自分の用途の正解ではありません。 保守的な値から始め、正解の分かっているデータで測って調整します。

同じ入力でも値は少し揺れる

同じリクエストを8回続けて送った結果です(jev-1.13.0 に固定)。

項目8回の範囲
Noul(緊急か)0.95〜0.96
Choice の最大の確率0.93〜0.95
Choice の confidence0.90〜0.92

選ばれる答えは8回とも同じでしたが、数値は 0.01〜0.02 の幅で動きました。ここから言えること:

  • しきい値ぎりぎりの判定は、呼ぶたびに結果が変わり得る。 confidence > 0.9 で切っていると、上の例は通ったり通らなかったりします
  • しきい値の近くに「確認に回す」帯を設けておくと、この揺れを吸収できます
  • 値を === 0.94 のように一致で比べない(0.9299999999999999 のような値も返ってきます)

これは8回だけの観察で、揺れの大きさを保証するものではありません。

Noul の読み方

Noul は confidence を持ちません。値そのものを読みます。

  • 1 に近い → はっきり「はい」
  • 0 に近い → はっきり「いいえ」
  • 0.5 に近い → 決めかねている

0.5 を「中くらい」と読まないでください。 程度を知りたいなら Score を使います(質問タイプの書き方)。

Noul を帯に分けるなら、両端を自動処理、真ん中を確認に回します。

const p = res.answers.is_refund_request.noul;
if (p > 0.85) handleRefund();
else if (p < 0.15) skip();
else sendToReview();

しきい値を持ち回らない

  • Noul で調整したしきい値を Choice に使わない。 同じ質問でも Noul と Choice では違う数値が返ります
  • モデルのバージョンが変わったら測り直す。 jev-latest は新しいリリースで指す先が変わります。しきい値を調整した処理はバージョン ID を固定します(料金と制限
  • 日本語のデータでは、英語の例の数値をそのまま信じない。 公式は、英語以外では精度が下がるので確信度に特に注意するよう書いています

確率は「当たる割合」の目安であって、個々の正しさではない

Jev の確率は、結果に対して校正されるよう学習されている、と公式は説明しています。0.9 と答えたもののうち、おおよそ9割が当たる、という意味です。個々の答えが正しいことの保証ではありません。 だから、外れたときに何が起きるかで操作ごとのしきい値を決める、という設計になります。

苦手な種類の質問(計算、日付の比較、何段もの推論)では、確信度が高くても外れることがあります。確信度はその質問が Jev に向いていることを前提にした数字です(Jev が苦手なこと)。

よくある質問

probabilities と confidence は何が違いますか?

probabilities は選択肢(または段階)ごとの確率で、合計は 1 です。confidence はその分布がどれだけ1か所に集中しているかを 0〜1 の1つの数にまとめたものです。1つの選択肢に全部が乗れば 1、均等に散らばるほど 0 に近づきます。

Noul に confidence が無いのはなぜですか?

Noul の値そのものが「はい」である確率だからです。0 か 1 に近ければはっきりしており、0.5 に近ければ決めかねている、と読みます。

しきい値はいくつにすればよいですか?

決まった正解はありません。公式は、保守的な値から始め、自分のデータで試して調整することを勧めています。間違えたときの損害が大きい操作ほど、高いしきい値にします。

出典・参考リンク

  1. 一次情報 Confidence
  2. 一次情報 Confidence-gated routing
  3. 一次情報 Jev 1.13 jaggedness