ドキュメント

しきい値はコードが持ち、モデルは確率だけを返す

数百の実プロジェクトを並べて見たとき、最も安定して共通しているのはこの一点です。

モデルが答えるのは「どれくらいありそうか」。コードが答えるのは「それで足りるか」。

これは好みの問題ではありません。自己申告の信頼度が信じられないという事実から 導かれる、唯一安全な結論です。この点には独立した実測の裏付けがあります (確率はどこまで信じられるか)。

具体的にどういう形になるか

Choice と Score は答えと一緒に confidence を返し、Noul は 0〜1 の確率を そのまま返します。インターフェース自体は何も判定してくれません —— しきい値はあなたのものです。 実プロジェクトでは、これが非常に具体的な形になります。

  • Cloudflare Worker 上で動く罵倒語フィルタは、しきい値も max() の集約方針も 公開 OpenAPI schema も、すべて Worker 自身のコードに持っています。モデルは それが呼ぶ一つの関数にすぎません。
  • コメントを隠すかどうかを判断するブラウザ拡張は、0.85 / 0.7 / 0.5 の三段を 拡張側に固定し、検査が失敗したときは隠したままにします。 これも しきい値方針の一部です。
  • インシデントのトリアージツールは「人を呼ぶ」を P(SEV1) + P(SEV2) ≥ 0.80 と 定義し、その 0.80 は設定ファイルにあります。モデルの中ではありません。

三つに共通するのは同じことです。モデルを替えてもしきい値は動かず、 しきい値を変えてもモデルは動かない。 しきい値をモデルに「決めさせ」ると、 この二つが結びつきます —— そしてしきい値を調整する作業が、プロンプトを書き換える 作業に変わります。

なぜこの原則が重要なのか

二種類の失敗を分けられるからです。

  • モデルの答えが悪い —— 質問や state を変える、モデルを替える。
  • しきい値の設定が悪い —— コードの中の数を変える。

混ざると、「精度が足りない」という一つの症状がどちらなのか分からなくなります。 先のトリアージツールが 0.80 を設定に直接書けるのは、その数を単独で 振り返り、単独で調整できるからです。

必ず知っておくべき反例

この原則は一つの前提に乗っています。受け取った数が校正された確率であること。

独立した再計算によれば、Score の質問で返る confidence はしばしば スコアの小数部分そのもので、そうした出力は密集しています(121 件)。 これは「モデルが自信を持っている」ではなく、スコアから導かれた値のように見えます。

違いは大きいです。

  • 校正された確率なら、0.85 は「こういう場合は 85% 程度正しい」という推論を支えます。
  • スコアの関数なら、0.85 は「この問題は高得点だった」以上の意味を持たず、 それにしきい値を設けるのは、確率の意味を持たない数に基準を置くことです。

別に、独立した測定報告がモデルの自己申告フィールドを真値と突き合わせ、 説明に書かれているほど細かい値ではないと報告しています (公開の批判を参照)。

ではどうするか

手順は三つで、順序が重要です。

  1. しきい値は意味ではなく運用で使う。 0.8 が「80% 正しい」を意味するかは 重要ではありません。重要なのは、あなたのデータで 0.8 以上のものが 明らかに精度が高いかどうかです。これはホールドアウトで確認できます。
  2. 自分のラベルでしきい値をフィットさせる。 まさにそのためのツールがあります。 自分のラベル付きデータで「目標精度に必要な質問ごとのしきい値」をフィットし、 ホールドアウトで検証し、モデル更新が固定済みのしきい値を壊したら CI を失敗させる。
  3. しきい値をコードに固定し、見直し日を決める。 しきい値は価格と同じで モデルのバージョンとともに古くなります。一度決めて終わりではありません。

一文で

モデルの信頼性は、あなたのしきい値に現れるべきで、モデルの自己申告値に現れるべき ではありません。 前者は自分のデータで測れます。後者は測れません。