0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Jevは構造化出力LLMの代わりになるか:821件で速度、費用、確率を比較した

0
Last updated at Posted at 2026-09-19
  • 実施日:2026-09-19(実行時刻は UTC で記載)
  • 比較対象:TypeSafe jev-1.13.0、OpenAI gpt-5.4-nano、OpenAI gpt-4.1-mini、Ollama qwen3.8(27.3B、Q4_K_M)
  • 評価データ:公開データセット 4 種から各 200 件、既存の難問セット 21 件

結論

Jev は、速度と費用で比較対象の汎用 LLM を大きく上回り、確率の較正と再現性でも同等以上だった。
応答時間の中央値は約 240ms で、1 問ずつ問う公開データセットでは OpenAI の 2 モデルより 2.5〜3.7 倍、ローカルの qwen3.8 より 6.2〜8.5 倍速かった。
1,000 件あたりの費用は、gpt-5.4-nano の 1/3.9〜1/8.1、gpt-4.1-mini の 1/6.3〜1/12.7 だった。
1 回の呼び出しに 5 問をまとめても応答時間はほぼ変わらず、LLM が出力トークンの増加に比例して遅くなるのと対照的だった。

正解率では、どのデータセットでも Jev が最良というわけではなかった。
77 クラスの意図分類では Jev が最高(0.790)で、gpt-5.4-nano と qwen3.8 に対して統計的に有意な差があった。
一方、英語ツイートの皮肉判定では qwen3.8(0.870)が Jev(0.805)を有意に上回った。
日本語レビューの感情分類と英語レビューの星評価では、Jev と gpt-4.1-mini と qwen3.8 の差は誤差の範囲だった。
ただし、12 組の比較に多重比較の補正(Bonferroni)をかけると、有意な差はどれも残らない。

これらの結果から、Jev は「LLM より常に賢い分類器」ではなく、「LLM と同等の判断を、数倍速く、数分の一から十数分の一の費用で、較正された確率付きで返す部品」と位置づけるのが妥当である。

検証の目的

Jev の単体検証では、用意した入力に対して期待どおりの判断を返すことを確認した。
しかし、同じ判断を汎用 LLM に JSON スキーマで構造化出力させた場合と比べて、Jev に実用上の優位があるかは確認していなかった。
TypeSafe は Jev の特長として、LLM より高速で安価であること、確率が較正されていること、型の誤りを起こさないことを挙げている。
本検証は、これらの主張を公開データセットと既存の難問セットで確かめることを目的とした。

比較の軸は次の六つである。

  • 正解率:人手ラベルとの一致率
  • 確率の較正:出力された確率や確信度が、実際の正解率とどの程度一致するか
  • 応答時間:1 回の呼び出しにかかる時間
  • 費用:実測トークン数と標準料金から求めた 1,000 件あたりの費用
  • 再現性:同じ入力を 2 回投げたときに回答が一致する割合
  • 頑健性:婉曲表現、多言語、指示注入などを含む難問セットでの挙動

Jev は型付きの判断を返す

Jev は TypeSafe AI が System One モデルと呼ぶモデルです。
入力テキストなどの state と問いを渡すと、説明文ではなく、アプリケーションがそのまま使える構造化された結果を返します。

今回使った問いは次の 3 種類です。

問いの例 返る主な値
Choice 問い合わせの担当部署はどこか 選択した候補、候補ごとの確率、confidence
Score 攻撃性はどの程度か 連続スコア、段階ごとの確率、confidence
Noul この問い合わせは緊急か 真である確率(0〜1)

たとえば、問い合わせ文を state として、担当部署、攻撃性、緊急性を同時に尋ねると、Python SDK の応答からは次のような値を取り出せます。
値は形式を示す例であり、実際の入力に対する結果ではありません。

department = result.choices["department"]
toxicity = result.scores["toxicity"]
is_urgent = result.nouls["is_urgent"]

department.choice
# "billing"

department.probabilities
# {"billing": 0.78, "technical": 0.17, "sales": 0.05}

department.confidence
# 0.78

toxicity.score
# 1.73

toxicity.probabilities
# {0: 0.01, 1: 0.25, 2: 0.74}

toxicity.confidence
# 0.74

is_urgent
# 0.94  # P(true)

ChoiceScoreconfidence は、選択肢や段階の確率分布とは別の値です。
Noul には真偽の代わりに P(true) が返るため、今回の検証では 0.5 より大きければ真として正解率を計算しました。

この形式なら、たとえば department.choice で振り分け、department.confidence が低いときだけ人手確認へ送る、といった分岐をコード側に置けます。
ただし、確信度の意味と有効な閾値は用途と入力分布に依存するため、実運用のデータで確認が必要です。

比較対象

モデル

名前 提供元 呼び出し方 指定したモデル名 備考
Jev TypeSafe AI typesafe-sdk 0.6.0 の TypeSafeClient.system_one jev-latest(既定値) 実行当日の API 応答で jev-1.13.0 を確認
gpt-5.4-nano OpenAI openai 3.16.2 の Chat Completions API gpt-5.4-nano スナップショット gpt-5.4-nano-2026-03-17 が一覧に存在。どちらに解決されたかは記録していない
gpt-4.1-mini OpenAI 同上 gpt-4.1-mini スナップショット gpt-4.1-mini-2025-04-14 が一覧に存在
qwen3.8 Ollama(ローカル) Ollama HTTP API /api/chat qwen3.8:latest 親モデル qwen3.8:27b-q4_K_M、アーキテクチャ qwen35、パラメータ数 27,320,697,856、65 層、4bit 量子化(Q4_K_M)、モデルファイル 17.4GB

gpt-5.4-nano は、利用可能な OpenAI モデルのうち最新世代の最小モデルとして選んだ。
gpt-4.1-mini は、候補ごとの確率分布(logprobs)を最大 20 候補まで返すため、確率の較正を比べる相手として選んだ。
qwen3.8 は、検証マシンの GPU(24GB)に載る汎用モデルの中で最大のものとして選んだ。

各モデルの呼び出し設定

項目 Jev gpt-5.4-nano gpt-4.1-mini qwen3.8
出力形式 Choice、Noul、Score の型付き回答 JSON スキーマ(strict: true JSON スキーマ(strict: true JSON スキーマ(Ollama の format
推論(思考)トークン なし(仕様) reasoning_effort: "none" なし(非推論モデル) think: false
温度 指定不可 指定せず(既定値) temperature: 0 temperature: 0
logprobs なし(確率は API が返す) logprobs: truetop_logprobs: 5(上限) logprobs: truetop_logprobs: 20 要求せず(後述)
タイムアウト 60 秒 60 秒 60 秒 600 秒
再試行 SDK の既定 最大 5 回(SDK) 最大 5 回(SDK) なし
同時実行数 4 8 8 1

LLM には推論トークンを使わない最速の設定を与えた。
Jev と同じく「即答する判断」の条件で比べるためである。
推論を有効にすれば LLM の正解率は上がる可能性があるが、応答時間と費用はさらに増える。
本検証はその条件を扱っていない。

検証環境

ハードウェアとソフトウェア

項目 内容
OS Ubuntu 22.04.5 LTS(カーネル 5.15.0-191-generic)
CPU Intel Xeon E5-2698 v4 @ 2.20GHz、2 ソケット、80 論理 CPU
メモリ 251GiB
GPU NVIDIA RTX A5000(24,564MiB)、ドライバ 595.91.07、CUDA 13.2
Ollama 0.33.2(qwen3.8 は全層を GPU に配置、コンテキスト長 32,768)
Python 3.14.5(uv 0.11.17 が作成した仮想環境)
主要パッケージ typesafe-sdk 0.6.0、openai 3.16.2、httpx 0.28.1、pyarrow 25.0.1、python-dotenv 1.2.3、pytest 9.1.1

Jev と OpenAI の 2 モデルはインターネット越しの API で、qwen3.8 は同じマシン上の GPU で動かした。
検証マシンから各 API までのネットワーク遅延は計測していない。
応答時間の比較には、この回線条件が含まれる。

実行の経過

時刻(UTC) 内容
08:28 頃 4 モデルの本実行を、モデルごとに別プロセスで同時に開始
08:29:37 Jev が 821 件を完了
08:29:59 gpt-5.4-nano が 821 件を完了
08:30:17 gpt-4.1-mini が 821 件を完了
08:30〜08:31 再現性確認の 2 回目(Jev、gpt-5.4-nano、gpt-4.1-mini)
08:52:52 qwen3.8 が 821 件を完了

全 3,284 回の呼び出し(4 モデル × 821 件)と、再現性確認の 1,200 回で、失敗は 0 件だった。

評価データ

公開データセット

Hugging Face Hub の parquet 変換版を取得し、テスト分割から件数を絞って使った。

名前 Hugging Face のリポジトリ 構成と分割 分割の総件数 リビジョン カードのライセンス 出典論文 本検証での形式
banking77 mteb/banking77 default / test 3,076 18072d2685ea MIT arXiv:2003.04807 Choice(77 択)
irony cardiffnlp/tweet_eval irony / test 784 b3a375baf0f4 unknown arXiv:2010.12421 Noul
ja_sentiment tyqiangz/multilingual-sentiments japanese / test 3,000 a3080a58e563 Apache-2.0 記載なし(source 列は amazon_reviews_multi Choice(3 択)
yelp Yelp/yelp_review_full yelp_review_full / test 50,000 c1f9ee939b7d other arXiv:1509.01626 Score(5 段階)

banking77 の原本(PolyAI/banking77)はデータセットスクリプト形式で、Hugging Face の変換サービスが対応していなかった。
そのため、MTEB が公開している parquet 版を使った。

ライセンスが unknown や other のデータがあるため、取得したデータは data/ に置いて Git の管理から外した。
リポジトリに記録したのは、行番号から作った項目 ID、正解ラベル、各モデルの予測だけである。

抽出方法

各データセットのテスト分割から、Python の random.Random(42).sample で 200 行を非復元抽出した。
項目 ID は b77-102 のように、データセットの接頭辞と行番号を組み合わせた。
同じ乱数シードで再実行すれば、同じ 200 件が選ばれる。

抽出したサンプルの性質は次のとおりである。

データセット 件数 ラベル分布 本文の文字数(中央値 / 平均 / 最大)
banking77 200 77 クラス中 73 クラスが出現(最多 7 件、最少 1 件) 44 / 56 / 231
irony 200 皮肉でない 120、皮肉 80 78 / 83 / 140
ja_sentiment 200 negative 70、neutral 58、positive 72 70 / 96 / 934
yelp 200 1 つ星 40、2 つ星 36、3 つ星 35、4 つ星 50、5 つ星 39 460 / 674 / 4,436

問いの定義

4 モデルに同じ問いの文言と選択肢を与えた。

データセット 問いの種類 問いの文言 選択肢または段階 正解ラベルの対応
banking77 Choice Which banking customer intent does this message express? データセットの label_text 77 種(説明なし、アルファベット順) label_text
irony Noul The tweet is ironic or sarcastic 真偽 label が 1(irony)なら真
ja_sentiment Choice Overall sentiment of this product review positive:The reviewer is satisfied、neutral:Mixed or neither satisfied nor dissatisfied、negative:The reviewer is dissatisfied label 0、1、2 をそれぞれ positive、neutral、negative に対応
yelp Score The star rating the reviewer most likely gave in this review 0:1 star: very negative experience、1:2 stars: mostly negative、2:3 stars: mixed or average、3:4 stars: mostly positive、4:5 stars: excellent, very positive label 0〜4(1〜5 つ星)

難問セット

単体検証で作った examples/diverse_cases.py の 21 件を、そのまま比較にも使った。
内訳は次の二つである。

  • 問い合わせ 16 件:皮肉、否定、婉曲、感情の混在、関西弁、絵文字のみ、タイポ、フランス語、中国語、指示注入、長文への埋没、暴言、感謝、記号のみ、ログ貼付、JSON 形式の state。感情(Choice 4 択)、担当部署(Choice 4 択)、緊急性(Noul)、皮肉(Noul)、攻撃性(Score 3 段階)の 5 問を 1 回の呼び出しでまとめて投げた。
  • 推論と事実抽出 5 件:残高比較、日付比較、医療文書の否定表現、コードの誤り、議事録の品質。ケースごとに専用の問いを投げた。

期待値は人手で付け、正解が一つに定まらない項目には付けていない。
期待値のある項目は 42 個である。

実験方法

Jev の呼び出し

問いの定義を typesafe-sdkChoiceNoulScore に変換し、system_one を呼んだ。
回答の値、確率、confidence をそのまま記録した。
Score の予測段階は、返ってきた連続値を四捨五入した整数とした。

LLM の呼び出し

LLM には次のシステムプロンプトを与えた。

You are a precise classifier embedded in software. Read the input and answer every question using only the allowed values. For each answer also give `confidence`: your probability (0 to 1) that the answer is correct. Output JSON only.

ユーザープロンプトは、入力本文と問いの定義から組み立てた。
yelp の例を示す。

## Input
<レビュー本文>

## Questions
### stars
Rate: The star rating the reviewer most likely gave in this review
Answer with the level number:
- 0: 1 star: very negative experience
- 1: 2 stars: mostly negative
- 2: 3 stars: mixed or average
- 3: 4 stars: mostly positive
- 4: 5 stars: excellent, very positive

Noul の問いは「Is this statement true? <問いの文言>」と「Answer true or false.」の 2 行で表した。
Choice の問いは、問いの文言に続けて選択肢と説明を箇条書きで並べた。

出力は JSON スキーマで制約した。
問いごとに answerconfidence を持つオブジェクトを定義し、answer の型を問いの種類に合わせた。

問いの種類 answer の型
Choice 文字列の列挙型(選択肢のラベル)
Noul 真偽値
Score 整数の列挙型(0 から段階数 − 1)

yelp で使ったスキーマは次のとおりである。

{
  "type": "object",
  "properties": {
    "stars": {
      "type": "object",
      "properties": {
        "answer": { "type": "integer", "enum": [0, 1, 2, 3, 4] },
        "confidence": { "type": "number" }
      },
      "required": ["answer", "confidence"],
      "additionalProperties": false
    }
  },
  "required": ["stars"],
  "additionalProperties": false
}

確率の取り出し方

LLM は確率を直接返さないため、確信度を二通りの方法で取り出し、別々に評価した。

  • p:出力トークンの logprobs から求めた確率。Jev では API が返す確率をそのまま使う。
  • conf:LLM が JSON の confidence 欄に書いた自己申告の値。Jev では API が返す confidence を使う。

LLM の p は、次の手順で求めた。

  1. 出力された JSON 文字列から、各問いの answer の値が占める文字範囲を特定する。
  2. その範囲に重なるトークンの logprob を合計し、指数をとって「選んだ値の確率」とする。
  3. 値の先頭トークンについて、上位候補(top_logprobs)のうち選択肢のどれか一つに対応するものを集め、正規化して候補分布とする。

Noul の P(true) は、候補分布の true と false の比から求めた。
Score の連続値は、候補分布の段階番号の期待値とした。

この方法には三つの制約がある。
第一に、OpenAI の logprobs は JSON スキーマで制約をかける前の分布であり、選択肢以外のトークンにも確率が割り振られる。
第二に、選んだ値の先頭トークンが複数の選択肢に共通する場合(banking77 の get_physical_cardget_disposable_virtual_card など)、先頭トークンからは候補分布を求められない。
banking77 で候補分布を得られたのは、gpt-5.4-nano で 82/200 件、gpt-4.1-mini で 84/200 件だった。
第三に、gpt-5.4 系は top_logprobs の上限が 5 であり、多くの場合に選んだトークンの確率がほぼ 1 になって、ほかの候補の情報がほとんど得られなかった。

qwen3.8 については p を求めていない。
Ollama 0.33.2 は、JSON スキーマの format を指定すると先頭の 1 トークン分しか logprobs を返さなかったためである。
qwen3.8 の確信度は conf(自己申告)だけで評価した。

評価指標

指標 定義
正解率 予測が正解ラベルと一致した割合。Noul は answer(Jev は P(true) > 0.5)で判定
Macro-F1 クラスごとの F1 値の単純平均(出現したクラスのみ)
完全一致、±1 以内 Score の予測段階が正解と一致した割合、差が 1 段階以内の割合
MAE Score の連続値(なければ予測段階)と正解段階の差の絶対値の平均
Spearman Score の連続値と正解段階の順位相関
AUROC Noul の P(true) で正例と負例を順位付けしたときの ROC 曲線下面積
Brier Noul の P(true) と正解(0 または 1)の二乗誤差の平均
ECE 確信度を 10 等分の区間に分け、区間ごとの平均確信度と実際の正解率の差を件数で加重平均した値。小さいほど較正が良い
上位 80% 正解率 確信度の高い順に 80% の項目だけを自動処理したときの正解率。確信度で人手確認に回す運用を想定した指標
95% 信頼区間 正解率に対する Wilson の区間
McNemar 検定 同じ項目での正誤の食い違い件数から、2 モデルの正解率の差を検定する。連続性補正付き
費用 入力と出力の実測トークン数に、100 万トークンあたりの標準料金を掛けたもの

Noul の ECE(p) は、P(true) から求めた確信度 max(p, 1 − p) と、p > 0.5 による判定の正誤で計算した。
Score の ECE(conf) は、confidence を「予測段階が完全一致する確率」とみなして計算した。
Jev の Score の confidence がその意味で設計されているかは確認していないため、この値は参考にとどめる。

料金

モデル 入力(USD / 100 万トークン) 出力(USD / 100 万トークン) 出典と確認日
Jev 0.042 無料 TypeSafe の Models ページ(2026-09-17)
gpt-5.4-nano 0.20 1.25 OpenAI の料金ページ(2026-09-19)
gpt-4.1-mini 0.40 1.60 同上
qwen3.8 ローカル実行のため API 費用なし。電力と GPU の費用は計上していない

キャッシュ入力の割引は考慮していない。

結果

データセット別の全指標

表中の ― は、その指標を求められなかったことを表す。
$/1k 件は 1,000 件あたりの費用(USD)である。

banking77(銀行の問い合わせ意図、77 クラス)

モデル 正解率 Macro-F1 ECE(p) ECE(conf) 上位80%正解率(p) 上位80%正解率(conf) p50(ms) p95(ms) $/1k 件 n 失敗
jev 0.790 0.768 0.088 0.080 0.875 0.875 244 326 0.0430 200 0
gpt-5.4-nano 0.715 0.694 0.192 0.101 0.819 0.812 611 859 0.2272 200 0
gpt-4.1-mini 0.760 0.734 0.203 0.196 0.825 0.806 891 1122 0.4252 200 0
qwen3.8 0.725 0.718 0.204 0.819 2067 2220 200 0

irony(英語ツイートの皮肉判定)

モデル 正解率 AUROC Brier ECE(p) ECE(conf) 上位80%正解率(p) 上位80%正解率(conf) p50(ms) p95(ms) $/1k 件 n 失敗
jev 0.805 0.974 0.137 0.029 0.029 0.869 0.869 238 296 0.0125 200 0
gpt-5.4-nano 0.785 0.914 0.137 0.114 0.029 0.900 0.806 617 837 0.0548 200 0
gpt-4.1-mini 0.745 0.942 0.236 0.224 0.169 0.781 0.794 805 1016 0.0823 200 0
qwen3.8 0.870 0.088 0.875 1539 1661 200 0

ja_sentiment(日本語商品レビューの感情、3 クラス)

モデル 正解率 Macro-F1 ECE(p) ECE(conf) 上位80%正解率(p) 上位80%正解率(conf) p50(ms) p95(ms) $/1k 件 n 失敗
jev 0.825 0.801 0.121 0.113 0.894 0.887 241 309 0.0180 200 0
gpt-5.4-nano 0.780 0.737 0.170 0.112 0.819 0.800 647 890 0.0701 200 0
gpt-4.1-mini 0.840 0.822 0.147 0.084 0.900 0.850 798 1017 0.1130 200 0
qwen3.8 0.805 0.764 0.152 0.819 1493 1634 200 0

yelp(英語レビューの星評価、5 段階)

モデル 完全一致 ±1以内 MAE Spearman ECE(conf) 上位80%完全一致(conf) p50(ms) p95(ms) $/1k 件 n 失敗
jev 0.610 0.975 0.408 0.921 0.267 0.662 237 295 0.0209 200 0
gpt-5.4-nano 0.520 0.935 0.567 0.905 0.300 0.556 681 914 0.0944 200 0
gpt-4.1-mini 0.610 0.980 0.436 0.904 0.306 0.637 784 1015 0.1625 200 0
qwen3.8 0.630 0.980 0.395 0.905 0.309 0.681 1723 2088 200 0

正解率の信頼区間と Jev との差

McNemar 検定の「Jev のみ正解」と「相手のみ正解」は、同じ項目で正誤が食い違った件数である。
yelp は完全一致で判定した。

データセット モデル 正解数/件数 正解率 95% 信頼区間 Jev のみ正解 相手のみ正解 p 値
banking77 jev 158/200 0.790 0.728〜0.841
banking77 gpt-5.4-nano 143/200 0.715 0.649〜0.773 24 9 0.015
banking77 gpt-4.1-mini 152/200 0.760 0.696〜0.814 17 11 0.345
banking77 qwen3.8 145/200 0.725 0.659〜0.782 19 6 0.016
irony jev 161/200 0.805 0.745〜0.854
irony gpt-5.4-nano 157/200 0.785 0.723〜0.836 28 24 0.677
irony gpt-4.1-mini 149/200 0.745 0.680〜0.800 21 9 0.045
irony qwen3.8 174/200 0.870 0.816〜0.910 9 22 0.031
ja_sentiment jev 165/200 0.825 0.766〜0.871
ja_sentiment gpt-5.4-nano 156/200 0.780 0.718〜0.832 14 5 0.066
ja_sentiment gpt-4.1-mini 168/200 0.840 0.783〜0.884 5 8 0.579
ja_sentiment qwen3.8 161/200 0.805 0.745〜0.854 8 4 0.386
yelp jev 122/200 0.610 0.541〜0.675
yelp gpt-5.4-nano 104/200 0.520 0.451〜0.588 31 13 0.010
yelp gpt-4.1-mini 122/200 0.610 0.541〜0.675 12 12 0.838
yelp qwen3.8 126/200 0.630 0.561〜0.694 11 15 0.556

有意水準 5% で差があったのは次の 5 組である。

  • Jev が上回った組:banking77 の gpt-5.4-nano(p = 0.015)と qwen3.8(p = 0.016)、irony の gpt-4.1-mini(p = 0.045)、yelp の gpt-5.4-nano(p = 0.010)
  • Jev が下回った組:irony の qwen3.8(p = 0.031)

12 組の検定に Bonferroni 補正をかけると有意水準は約 0.0042 になり、どの組も有意ではなくなる。
200 件という件数では、0.05 前後の正解率の差を確定させるには検出力が足りない。

確率の較正

ECE の最小値は次のとおりだった。

データセット ECE が最小のモデルと指標 Jev の ECE(p / conf)
banking77 Jev の conf(0.080) 0.088 / 0.080
irony Jev の p と conf、gpt-5.4-nano の conf(いずれも 0.029) 0.029 / 0.029
ja_sentiment gpt-4.1-mini の conf(0.084) 0.121 / 0.113
yelp Jev の conf(0.267) ― / 0.267

Jev は 4 データセット中 3 つで最小の ECE を示した(irony は同率)。
ja_sentiment では、gpt-4.1-mini の自己申告の確信度のほうが較正が良かった。

LLM の logprobs から求めた p は、確信度を過大に出す傾向があった。
gpt-4.1-mini の ECE(p) は banking77 で 0.203、irony で 0.224 で、Jev の 2〜8 倍だった。
自己申告の conf は p より較正が良い場合が多かったが、モデルとデータセットによってばらつきがあった。
qwen3.8 の conf の ECE は 0.088〜0.309 だった。

確信度で人手確認に回す運用を想定した「上位 80% 正解率」では、次のモデルが最も高かった。

データセット 最も高いモデルと指標 Jev
banking77 Jev(0.875、p と conf で同値) 0.875
irony gpt-5.4-nano の p(0.900) 0.869
ja_sentiment gpt-4.1-mini の p(0.900) 0.894
yelp qwen3.8 の conf(0.681) 0.662

irony の AUROC は、Jev が 0.974、gpt-4.1-mini が 0.942、gpt-5.4-nano が 0.914 だった。
皮肉の有無を確率で順位付けする能力は Jev が最も高い。
Brier スコアは Jev と gpt-5.4-nano が 0.137 で並び、gpt-4.1-mini は 0.236 だった。

応答時間

応答時間は、クライアント側で測った 1 回の呼び出しの壁時計時間である。

データセット Jev p50 / p95 gpt-5.4-nano p50 / p95 gpt-4.1-mini p50 / p95 qwen3.8 p50 / p95
banking77 244 / 326 611 / 859 891 / 1122 2067 / 2220
irony 238 / 296 617 / 837 805 / 1016 1539 / 1661
ja_sentiment 241 / 309 647 / 890 798 / 1017 1493 / 1634
yelp 237 / 295 681 / 914 784 / 1015 1723 / 2088
難問セット(5 問同時) 247 / 288 1038 / 1253 1528 / 1644 3414 / 3599

単位は ms である。
平均、最小、最大は次のとおりだった。

データセット Jev gpt-5.4-nano gpt-4.1-mini qwen3.8
banking77 256 / 198 / 592 647 / 532 / 1009 888 / 634 / 1312 2078 / 1893 / 2321
irony 241 / 187 / 373 643 / 500 / 1072 800 / 459 / 1393 1556 / 1467 / 1765
ja_sentiment 245 / 190 / 360 669 / 505 / 1192 797 / 442 / 1293 1515 / 1414 / 1960
yelp 241 / 189 / 358 683 / 511 / 1289 794 / 470 / 1567 1768 / 1448 / 2815
難問セット(5 問同時) 248 / 192 / 334 1076 / 804 / 1611 1495 / 1163 / 1689 3432 / 3302 / 3627

Jev の中央値に対する各モデルの中央値の倍率は次のとおりである。

データセット gpt-5.4-nano gpt-4.1-mini qwen3.8
banking77 2.5 倍 3.7 倍 8.5 倍
irony 2.6 倍 3.4 倍 6.5 倍
ja_sentiment 2.7 倍 3.3 倍 6.2 倍
yelp 2.9 倍 3.3 倍 7.3 倍
難問セット(5 問同時) 4.2 倍 6.2 倍 13.8 倍

Jev の応答時間は、入力の長さ(yelp の本文は中央値 460 文字)にも、問いの数にもほとんど左右されなかった。
1 問のデータセットで約 240ms、5 問をまとめた難問セットで 247ms だった。
LLM は回答を 1 トークンずつ生成するため、問いが増えて出力が長くなるほど遅くなる。
gpt-4.1-mini は 1 問で約 800ms、5 問で 1,528ms と、約 1.9 倍になった。

TypeSafe は「LLM より 40〜200 倍速い」と主張しているが、本検証の条件(推論なしの小型 LLM)では 2.5〜13.8 倍だった。
比較相手の LLM の大きさや推論の有無によって、倍率は大きく変わる。

トークン数と費用

データセット モデル 入力トークン平均 出力トークン平均 費用合計(USD)
banking77 jev 1022.9 828.3 0.00859
banking77 gpt-5.4-nano 998.8 21.9 0.04544
banking77 gpt-4.1-mini 999.8 15.8 0.08504
banking77 qwen3.8 553.9 33.8
irony jev 297.4 21.0 0.00250
irony gpt-5.4-nano 148.8 20.0 0.01095
irony gpt-4.1-mini 149.8 14.0 0.01646
irony qwen3.8 115.7 30.9
ja_sentiment jev 429.2 39.0 0.00361
ja_sentiment gpt-5.4-nano 225.5 20.0 0.01402
ja_sentiment gpt-4.1-mini 226.5 14.0 0.02260
ja_sentiment qwen3.8 165.4 32.0
yelp jev 498.0 17.0 0.00418
yelp gpt-5.4-nano 353.2 19.0 0.01888
yelp gpt-4.1-mini 354.2 13.0 0.03250
yelp qwen3.8 313.3 30.2
難問セット(問い合わせ 16 件) jev 512.2 137.0 0.00034
難問セット(問い合わせ 16 件) gpt-5.4-nano 424.1 71.0 0.00278
難問セット(問い合わせ 16 件) gpt-4.1-mini 425.1 64.9 0.00438
難問セット(問い合わせ 16 件) qwen3.8 274.0 141.1

全体の合計は次のとおりである(再現性確認の 2 回目は含まない)。

モデル 呼び出し回数 入力トークン合計 出力トークン合計 費用合計(USD)
jev 821 459,199 183,370 0.0193
gpt-5.4-nano 821 352,857 17,439 0.0924
gpt-4.1-mini 821 353,678 12,478 0.1614
qwen3.8 821 234,662 27,822

1,000 件あたりの費用で比べると、gpt-5.4-nano は Jev の 3.9〜8.1 倍、gpt-4.1-mini は 6.3〜12.7 倍だった。

トークン数には二つの特徴があった。
一つ目に、短い入力では Jev の入力トークンが LLM より多かった。
irony では Jev が 297.4、OpenAI の 2 モデルが約 149 で、1 回あたり約 150 トークン多い。
問いの定義を内部の形式に変換する分の上乗せと考えられるが、内訳は公開されていない。
二つ目に、Jev の出力トークンは選択肢の数に応じて増え、banking77 では平均 828.3 に達した。
Jev の出力は無料なので費用には影響しないが、トークン数だけで他のモデルと費用を比べると誤る。

再現性

同じ 200 件をもう一度投げ、1 回目と比べた。
qwen3.8 は時間の都合で実施していない。

データセット モデル 回答一致率 p の平均差 conf の平均差 n
irony jev 0.980 0.009 0.009 200
irony gpt-5.4-nano 0.880 0.016 0.054 200
irony gpt-4.1-mini 0.975 0.016 0.009 200
ja_sentiment jev 1.000 0.009 0.014 200
ja_sentiment gpt-5.4-nano 0.960 0.024 0.030 200
ja_sentiment gpt-4.1-mini 0.995 0.004 0.004 200

Jev も完全には決定的ではなく、irony で 200 件中 4 件の回答が変わり、確率も平均 0.009 動いた。
変わった項目は、確率が 0.5 付近の判断の境界にあるものと考えられる。
gpt-5.4-nano は温度を指定できない設定だったため、回答の揺れが最も大きかった(irony で 12%)。

難問セット

モデル 期待値との一致 p50(ms) p95(ms) 出力トークン平均 $/1k 件
jev 42/42 247 288 137.0 0.0215
gpt-5.4-nano 41/42 1038 1253 71.0 0.1736
gpt-4.1-mini 42/42 1528 1644 64.9 0.2738
qwen3.8 42/42 3414 3599 141.1

gpt-5.4-nano は、「素晴らしいですね、今月 3 回目の障害で今日も仕事になりません。本当に感謝してます。」を皮肉ではないと判定した。
ほかの 3 モデルは皮肉と判定した。

期待値を付けなかった項目では、モデルごとに次の傾向の違いがあった。
全回答は付録に載せた。

  • 攻撃性の評価:LLM 3 モデルは、暴言以外の多くの文に 0(攻撃的でない)を付けた。Jev は皮肉の文に 0.99、中国語の文に 0.51、指示注入の文に 0.50 と中間の値を付けた。LLM は整数の段階で答えるため、両端に寄りやすい。
  • 緊急性の判定:gpt-4.1-mini は、婉曲、皮肉、絵文字のみ、タイポ、暴言、指示注入の 6 件で緊急と判定し、ほかのモデルより広く緊急と捉えた。Jev は婉曲で 0.52、タイポで 0.68 と、判断が割れる値を返した。
  • 婉曲の文の感情:gpt-5.4-nano は mixed、ほかの 3 モデルは neutral と判定した。
  • 否定の文の感情:gpt-5.4-nano は positive、ほかの 3 モデルは neutral と判定した。
  • 絵文字のみの文の部署:gpt-5.4-nano は other、ほかの 3 モデルは billing と判定した。

推論と事実抽出の 5 件(6 項目)は、4 モデルとも期待値と一致した。

誤りの内訳

ja_sentiment の混同行列(行が正解、列が予測)

モデル 正解 positive neutral negative
jev positive 69 3 0
jev neutral 10 30 18
jev negative 0 4 66
gpt-5.4-nano positive 68 3 1
gpt-5.4-nano neutral 11 21 26
gpt-5.4-nano negative 2 1 67
gpt-4.1-mini positive 69 3 0
gpt-4.1-mini neutral 11 34 13
gpt-4.1-mini negative 0 5 65
qwen3.8 positive 71 1 0
qwen3.8 neutral 17 23 18
qwen3.8 negative 0 3 67

4 モデルとも、誤りの大半は neutral のレビューだった。
neutral 58 件の正解数は、Jev 30、gpt-5.4-nano 21、gpt-4.1-mini 34、qwen3.8 23 である。
positive と negative を取り違えた件数は、Jev と gpt-4.1-mini と qwen3.8 が 0、gpt-5.4-nano が 3 だった。
元データは Amazon のレビューで、neutral は星 3 つのレビューに対応すると考えられ、文面からは不満にも満足にも読める例を含む。

yelp の混同行列(行が正解の星数、列が予測の星数)

モデル 正解 1★ 2★ 3★ 4★ 5★
jev 1★ 30 7 2 1 0
jev 2★ 9 21 5 1 0
jev 3★ 0 5 15 14 1
jev 4★ 0 0 2 20 28
jev 5★ 0 0 0 3 36
gpt-5.4-nano 1★ 24 13 1 2 0
gpt-5.4-nano 2★ 6 22 7 0 1
gpt-5.4-nano 3★ 0 4 9 13 9
gpt-5.4-nano 4★ 0 0 0 10 40
gpt-5.4-nano 5★ 0 0 0 0 39
gpt-4.1-mini 1★ 34 4 0 1 1
gpt-4.1-mini 2★ 10 18 7 1 0
gpt-4.1-mini 3★ 0 2 18 14 1
gpt-4.1-mini 4★ 0 0 1 17 32
gpt-4.1-mini 5★ 0 0 0 4 35
qwen3.8 1★ 36 3 0 1 0
qwen3.8 2★ 16 13 6 1 0
qwen3.8 3★ 0 1 21 11 2
qwen3.8 4★ 0 0 1 21 28
qwen3.8 5★ 0 0 0 4 35

4 モデルとも、4 つ星のレビューを 5 つ星と予測する誤りが最も多かった(Jev 28 件、gpt-5.4-nano 40 件、gpt-4.1-mini 32 件、qwen3.8 28 件)。
gpt-5.4-nano は 4 つ星 50 件のうち 40 件を 5 つ星とし、高評価側に偏っていた。
2 段階以上ずれた予測は、Jev 5 件、gpt-5.4-nano 13 件、gpt-4.1-mini 4 件、qwen3.8 4 件だった。

banking77 の誤分類(各モデル上位 5 組、括弧内は件数)

  • jev(誤り 42 件):beneficiary_not_allowedfailed_transfer(3)、exchange_via_appexchange_rate(2)、exchange_via_appfiat_currency_support(2)、direct_debit_payment_not_recognisedcard_payment_not_recognised(2)、transfer_fee_chargedextra_charge_on_statement(2)
  • gpt-5.4-nano(誤り 57 件):getting_virtual_cardget_disposable_virtual_card(3)、supported_cards_and_currenciesfiat_currency_support(2)、card_acceptancecountry_support(2)、card_payment_not_recognisedextra_charge_on_statement(2)、unable_to_verify_identitywhy_verify_identity(2)
  • gpt-4.1-mini(誤り 48 件):supported_cards_and_currenciesfiat_currency_support(2)、direct_debit_payment_not_recognisedcompromised_card(2)、beneficiary_not_allowedfailed_transfer(2)、transfer_fee_chargedextra_charge_on_statement(2)、card_about_to_expiregetting_spare_card(2)
  • qwen3.8(誤り 55 件):card_payment_not_recognisedextra_charge_on_statement(3)、direct_debit_payment_not_recognisedextra_charge_on_statement(3)、verify_my_identitywhy_verify_identity(3)、exchange_via_appfiat_currency_support(2)、unable_to_verify_identitywhy_verify_identity(2)

誤りの多くは、意味の近いラベルどうしの取り違えだった。
今回はラベル名だけを選択肢とし、説明を付けていない。
公式ドキュメントが勧めるように選択肢に説明と境界事例を書けば、どのモデルでも改善する余地がある。

考察

Jev を選ぶ理由になる点

速度と費用の差は、すべてのデータセットで一貫して大きかった。
Jev の応答時間は入力長と問いの数にほとんど依存せず、約 240ms で安定していた。
1 件の入力に多くの観点を同時に問う設計(公式が推奨する Speculative fan-out)では、LLM との差がさらに広がる。
難問セットでは、5 問同時の条件で gpt-4.1-mini の 6.2 倍速く、12.7 倍安かった。

確率の較正と、確率による順位付けの性能も Jev が安定して良かった。
LLM の logprobs は、JSON スキーマの制約をかける前の分布であり、ほぼ 0 か 1 に張り付く傾向がある。
自己申告の確信度は logprobs よりましだが、モデルやデータセットによって較正の良し悪しが変わった。
確信度の閾値で人手確認に回す運用では、較正された確率をそのまま使える Jev の設計が有利である。

77 クラスのように選択肢が多い分類では、Jev の正解率が最も高かった。
LLM は多数の選択肢から 1 つを生成する形になるため、似た名前のラベルを取り違えやすい可能性がある。

LLM が勝る、または差がない点

正解率では、汎用 LLM が同等か上回る場面があった。
英語の皮肉判定では、qwen3.8 の正解率(0.870)が Jev(0.805)を上回った。
日本語レビューの感情と英語レビューの星評価では、gpt-4.1-mini と qwen3.8 が Jev と同等だった。
また、LLM は推論を有効にすれば正解率が上がる可能性があり、本検証はその条件を試していない。

判断の根拠を文章で得たい場合や、選択肢を事前に列挙できない場合は、LLM が必要になる。
Jev はテキストを生成しないためである。

設計への示唆

大量の入力を低遅延で振り分ける処理では、Jev を前段に置き、確信度の低いものや「該当なし」だけを LLM や人に回す構成が、速度、費用、較正の面で合理的である。
正解率が最優先で、1 件あたり 1〜2 秒と数倍の費用を許容できる処理では、LLM(推論の有無を含めて)を比較したうえで選ぶ必要がある。

制約と注意点

  • 件数:各データセット 200 件では、正解率の 95% 信頼区間の幅が約 ±0.06 ある。0.05 前後の差は確定できない。
  • 多重比較:McNemar 検定の p 値は補正していない。Bonferroni 補正をかけると有意な差は残らない。
  • 推論設定:LLM は推論トークンを使わない設定で比べた。推論を有効にした場合の正解率、速度、費用は測っていない。
  • プロンプト:LLM のプロンプトは 1 種類だけで、調整していない。Jev の問いの文言も同じものを使っており、どちらにも最適化の余地がある。
  • 選択肢の説明:banking77 はラベル名だけを選択肢とした。
  • 確率の取り出し:LLM の p は logprobs からの近似で、JSON スキーマの制約前の分布に基づく。gpt-5.4 系は top_logprobs の上限が 5 である。qwen3.8 は p を取得できず、自己申告の確信度だけで評価した。
  • 応答時間の条件:同時実行数が Jev は 4、OpenAI は 8、qwen3.8 は 1 で異なる。4 モデルは同じ時間帯に別プロセスで並行して動かした。API 側の混雑や回線の遅延は、時間帯によって変わりうる。
  • qwen3.8 の速度:RTX A5000 1 枚、4bit 量子化での値であり、GPU や量子化の条件で大きく変わる。
  • 再現性:qwen3.8 の再現性は測っていない。
  • Score の確信度:Score の ECE(conf) は、confidence を完全一致の確率とみなして計算した参考値である。
  • データのライセンス:irony と yelp はデータセットカードのライセンスが unknown と other であり、本検証ではデータ本体を配布していない。
  • モデルの更新jev-latest と OpenAI のエイリアスは指す先が変わる。再実行した結果は本レポートと一致しない場合がある。

再現手順

.envTYPESAFE_API_KEYOPENAI_API_KEY を設定し、Ollama で qwen3.8:latest を使える状態にしてから、次を実行する。

uv sync

# 本実行(モデルごとに実行できる。途中で止めても再実行で続きから処理する)
uv run python -m bench.run --backends jev,gpt-5.4-nano,gpt-4.1-mini,qwen3.8 --n 200 --seed 42

# 再現性確認の 2 回目
uv run python -m bench.run --backends jev,gpt-5.4-nano,gpt-4.1-mini \
  --tasks irony,ja_sentiment --n 200 --out results/raw_repeat

# 集計
uv run python -m bench.report    # results/summary.md、results/summary.json
uv run python -m bench.details   # results/details.md

関連するファイルは次のとおりである。

パス 内容
bench/tasks.py データセットの取得、抽出、問いの定義
bench/backends.py 4 モデルの呼び出し、プロンプトとスキーマの生成、logprobs からの確率算出、料金表
bench/run.py 実行と生の予測の保存
bench/report.py 指標の集計
bench/details.py 信頼区間、検定、混同行列、トークン数などの詳細統計
results/raw/ 本実行の生の予測(項目 ID、正解ラベル、予測、応答時間、トークン数)
results/raw_repeat/ 再現性確認の 2 回目の生の予測
results/summary.mdresults/details.md 集計結果

付録:難問セットの全回答

Jev の Noul は P(true)、LLM の Noul は answer の真偽である。
Choice は選択したラベル、Score は値(LLM は logprobs の期待値、求められない場合は整数の回答)を示す。
期待値の欄が空のものは、期待値を付けていない項目である。

婉曲

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment neutral mixed neutral neutral
category technical technical technical technical technical
urgent 0.52 false true false
sarcastic 0.08 false false false
toxicity 0.04 0.00 0.00 0.00

混合感情

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment mixed mixed mixed mixed mixed
category other other other other
urgent 0.11 false false false
sarcastic 0.17 false false false
toxicity [0.3, 1.5] 0.96 1.00 1.00 1.00

皮肉

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment negative negative negative negative negative
category technical technical technical technical technical
urgent 0.32 true true false
sarcastic True 0.97 false true true
toxicity 0.99 0.00 0.00 0.00

否定

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment neutral positive neutral neutral
category billing billing billing billing billing
urgent False 0.03 false false false
sarcastic False 0.05 false false false
toxicity 0.00 0.00 0.00 0.00

絵文字のみ

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment negative negative negative negative negative
category billing other billing billing
urgent 0.37 false true true
sarcastic 0.37 false false false
toxicity 0.34 0.56 0.10 0.00

タイポ

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment negative negative negative negative
category technical technical technical technical technical
urgent 0.68 false true false
sarcastic False 0.03 false false false
toxicity 0.01 0.00 0.00 0.00

関西弁

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment negative negative negative negative negative
category billing billing billing billing billing
urgent True 0.94 true true true
sarcastic 0.49 false false false
toxicity 1.10 1.00 1.00 1.00

フランス語

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment neutral neutral neutral neutral neutral
category sales sales sales sales sales
urgent False 0.05 false false false
sarcastic 0.02 false false false
toxicity 0.00 0.00 0.00 0.00

中国語

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment negative negative negative negative negative
category technical technical technical technical technical
urgent True 0.99 true true true
sarcastic 0.12 false false false
toxicity 0.51 0.00 0.00 0.00

長文に埋没

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment mixed mixed mixed mixed
category technical technical technical technical technical
urgent True 0.92 true true true
sarcastic 0.01 false false false
toxicity 0.00 0.00 0.00 0.00

暴言

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment negative negative negative negative negative
category billing billing billing billing billing
urgent 0.44 false true false
sarcastic 0.10 false false false
toxicity [1.5, 2.0] 1.73 2.00 2.00 2.00

指示注入

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment negative negative negative negative
category billing billing billing billing billing
urgent 0.37 false true false
sarcastic 0.24 false false false
toxicity 0.50 0.00 0.00 0.00

記号のみ

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment neutral neutral neutral neutral
category other other other other
urgent False 0.20 false false false
sarcastic 0.33 false false false
toxicity 0.00 0.00 0.00 0.00

ログ貼付

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment negative negative negative negative
category technical technical technical technical technical
urgent True 0.82 true true true
sarcastic 0.04 false false false
toxicity 0.00 0.00 0.00 0.00

感謝

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment positive positive positive positive positive
category other other other other other
urgent False 0.04 false false false
sarcastic 0.03 false false false
toxicity [0.0, 0.3] 0.00 0.00 0.00 0.00

JSON状態

問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
sentiment neutral neutral neutral neutral
category sales sales sales sales sales
urgent False 0.25 false false false
sarcastic 0.05 false false false
toxicity 0.00 0.00 0.00 0.00

推論と事実抽出

ケース.問い 期待値 jev gpt-5.4-nano gpt-4.1-mini qwen3.8
コード誤り.correct False 0.01 false false false
医療否定表現.chest_pain False 0.03 false false false
医療否定表現.dyspnea True 0.98 true true true
文書品質.quality [0.0, 0.5] 0.00 0.00 0.00 0.00
日付比較.passed False 0.04 false false false
残高比較.can_afford False 0.02 false false false

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?