System Oneモデルを機能に配線する
System Oneモデルは、1回のフォワードパスで型付きの質問に回答します。テキストは生成しません。 状態を入力として、確率が調整された型付きの回答を出力します。これは、読み取り可能なif文のようなものです。
狭く、事前に指定され、繰り返される決定に使用します。説明文が必要なものには使用しないでください。それは依然としてClaudeの役割です。
何よりも先に:これは本当に適切なツールですか?
以下の3つに答えてください。1つでも「いいえ」の場合、停止し、LLM呼び出しを維持してください。
- 可能な回答が事前にわかっていますか? 選択肢は最大255です。
- 呼び出し元はラベルだけを必要とし、推論は必要ありませんか? 後続で人間が説明文を読む必要がある場合、散文が必要であり、これは適切なツールではありません。
- 大量のトラフィックがありますか、それとも誰かが待っていますか? これはレイテンシとコストの最適化であり、機能向上ではありません。Claudeが知らないことを知っているわけではありません。50レコードの夜間cronジョブでは、依存関係が増えるだけで、他にメリットはありません。
3つのジョブにわたる150件の手動ラベル付きレコードでの測定(2026年9月20日実行): JevはGPT-5.2と同等の145/150で、コストは46分の1(1,000レコードあたり$0.036 vs $1.64)ですが、エンドツーエンドではGPT-4.1-miniよりわずか1.7倍高速です。公表されている40倍~200倍は、3~329秒のマルチステップフロンティアワークフローとの比較であり、1回の呼び出しとの比較ではありません。
オープンな再現モデルはドロップインでは使用できません。 同じ実行結果:Von 1.0.1(395M)92/150 (61%)、Laya(421M)62/150 (41%)。これらは徐々に劣化するのではなく、1つのクラスに偏ります。Vonは5つのコマンドを含む50のコマンドセットでexfiltrationを25回予測しました。信頼度ゲートではそれを救えません。Vonのエラーをキャッチするには、トラフィックの92%をエスカレーションする必要があり、Layaでは100%、Jevでは8%でした。オープンモデルは、独自のラベル付きセットで測定した場合にのみ使用してください。
3つの質問タイプ
"lead_type": {"type":"choice", "instructions": "...", "criteria": {"opt_a":"desc","opt_b":"desc"}}
"is_urgent": {"type":"noul", "instructions": "..."} # -> 0.0–1.0
"priority": {"type":"score", "instructions": "...", "criteria":["ignore","low","high"]}
必要な質問はすべて1回の呼び出しで行ってください。すべて同じフォワードパスで解決されるため、4つの質問でも1つの質問とほぼ同じコストです。
応答形状(JevとVonの両方):
r["answers"]["lead_type"]["choice"] # ラベル
r["answers"]["lead_type"]["probabilities"] # 完全な分布
r["answers"]["lead_type"]["confidence"] # ゲートに使用
r["answers"]["is_urgent"]["noul"] # 0.0–1.0
r["answers"]["priority"]["score"] # スケール上の位置(例:2.41)
ワークフロー
1. ラベル付きセットを最初に構築する — 最低50レコード
交渉の余地はなく、最も価値の高いステップです。基準を書く前に、対象とするストリームから実際のレコードに手動でラベルを付けます。これなしでは、悪い質問と悪いモデルを区別できず、失敗は静かに起こります — jev-evalを参照してください。
2. 新入社員に説明するように基準を書く
同じ質問の4つの表現で、最悪から最良までの広がり(タスクあたり50レコード、2026年9月20日実行):
| タスク | Jev | Von (395M) | Laya (421M) |
|---|---|---|---|
| エージェントコマンドリスク | 44-49 (10 pt) | 9-23 (28 pt) | 18-28 (20 pt) |
| リードトリアージ | 47-49 (4 pt) | 22-34 (24 pt) | 15-24 (18 pt) |
| チケットルーティング | 41-47 (12 pt) | 23-41 (36 pt) | 22-36 (28 pt) |
同じコマンドタスクのスイープでLLMを含めた場合:Haiku 4.5 46-48 (4 pt)、GPT-4.1-mini 45-50 (10 pt)、Jev 44-49 (10 pt)、GPT-5-mini 41-49 (16 pt)。
Jevは小型LLMよりも表現の堅牢性が高いわけではありません。同じ10ポイント変動し、Haikuがテストで最も安定したモデルでした。広がりではなく**フロア(最低値)**を読んでください。すべてのホスト型モデルは82-92%で底打ちし、出荷可能な状態を維持しますが、Vonは18%、Layaは36%で底打ちします。これを「より良い基準を書けばオープンモデルが追いつく」と解釈しないでください。以前の15レコードのテストではまさにその結論に達しましたが、それは間違いでした。より豊かな基準は確実には役立ちませんでした。リードトリアージでは、Vonは簡潔な表現で34/50、注意深く書かれた表現で28/50でした。数値を動かすのは理解ではなく、表面形式への感度です。したがって、今後の基準の編集はすべて、予告なしの回帰リスクとなります。
各オプションについて記述する内容:それが何か、何でないか、そして間違った答えを誘うエッジケース。1つのオプションが支配的になるべき場合は、デフォルトを明示的に指定します。
3. ラベル付きセットに対して閾値を調整する — 0.5を決して仮定しない
noulは確率であり、ブール値ではありません。Jevのnoulにはフロアがあります。明らかにクリーンなレコードでも、Claudeが0.0を返すところを0.2~0.5返しました。測定データでは、有用なカットオフは0.5ではなく約0.85でした。閾値はモデル間で転用できません — モデルを切り替えたら再スイープしてください。
スイープを手動で書かないでください。jev-evalがキャリブレーションを担当し、ツールを提供します:
python ~/.claude/skills/jev-eval/scripts/sweep.py labelled.json configs.json \
--backend jev --question <name>
4. 信頼度ゲートを設計する
低信頼度の回答をClaudeにゲートします。同じスクリプトが、重要な両方の要素、つまりゲートがキャッチするエラーの割合と、エスカレーションするトラフィックの割合を報告し、結果にラベルを付けます。すべてのエラーをキャッチしながらトラフィックの73%をエスカレーションするゲートは、saves nothing(何も節約しない)と評価されます。これは、追加ステップのある低速パスだからです。これが見られた場合、修正方法は、より良い基準かホスト型モデルを使用することで、異なる閾値ではありません。
a = r["answers"]["lead_type"]
if a["confidence"] < GATE:
return escalate_to_claude(state) # 低速パス
return a["choice"] # 高速パス
5. フラグの背後に出荷し、両方のパスを1週間ログに記録する
System Oneの回答と、古いパスが言ったであろう内容の両方をログに記録します。切り替える前に、実際のトラフィックで比較してください。評価セットの数値だけで決して切り替えないでください。
アクセスパス
# 1. TypeSafe直接 — macOSキーチェーンにキー、サービス名 `typesafe-api-key`
export TYPESAFE_API_KEY="$(security find-generic-password -s typesafe-api-key -w)"
curl -X POST https://api.typesafe.ai/v1/systemone \
-H "Authorization: Bearer $TYPESAFE_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"jev-latest","state":"...","questions":{...}}'
// 2. Cloudflare Workers AI — ウェイトリストなし
await env.AI.run('typesafe/jev', { state, questions })
# 3. Von — ローカル、無料、Apache-2.0、395M ModernBERT
# pip install von-sdk
import von
r = von.system_one(state="...", questions={"x": von.Noul(instructions="...")})
r.answers["x"].noul
落とし穴
- Vonの
Choiceはcriteria=を受け取り、choices=ではありません。 間違って推測するとPydanticエラーが発生します。 - Vonは
.answers[k]を返します。.nouls[k]/.choices[k]ではありません。LangChainラッパーは生のSDKとここで異なります。 - Vonの34秒のコールドスタートは重みをロードします。起動時にウォームアップしてください。レイテンシで決して測定しないでください。
- noulを0.5で閾値設定しないでください。 ステップ3を参照してください。
- Jevは早期アクセス、単一ベンダー、SLAなしです。 Claudeへのフォールバックなしに、顧客向けのクリティカルパスに配置しないでください。
- 小さな評価セットは嘘をつきます。 両方のホスト型モデルが100%をスコアした15レコードは、ほとんど何も証明しません。数百を使用してください。
関連
jev-evalはラベル付きセットを構築して実行します。jev-auditは、コードベース内の変換する価値のある既存のLLM呼び出しを見つけます。