AI・機械学習
Jeeves。推論によりJevライクな意思決定モデルが改善
Jeeves. Reasoning improves Jev-like decision models (github.com)
要約
Jeevesは、SFT(教師ありファインチューニング)とCISPO(Contrastive Instruction-following Preference Optimization)でトレーニングされた、推論機能を備えたJevスタイルの分類器です。Qwen3.5-9Bモデルをベースに、推論を行うことで決定を下す前に「考える」能力を持ち、Kev-9BやJevといった既存モデルをベンチマークテストで上回る性能を示しました。このモデルは、yes/no、多肢選択、評価などの質問を単一のリクエストで処理でき、Jev互換APIを提供します。
全文翻訳
Jeeves – 推論によりJevライクな意思決定モデルが改善
SFTとCISPOでトレーニングされた、推論機能を備えたJevライクな分類器。
謝辞
Kevに触発されました。
ハイライト
推論してから決定する9B(Qwen3.5-9B、LoRA、ポインターヘッド)のJevライクモデル。ブロック-4のディフュージョンドラフターと、完全なトレーニングコード、およびトレーニング/開発/テストデータ付き。
テストデータ(学習に使用していないもの)でKev-9BとJevを上回る(それぞれ0.889 vs 0.822および0.857)。JevBenchの公開ティアでも(Jevの0.935 vs 0.866)。
Jev互換APIを介して、単一のリクエストでyes/no(noul)、多肢選択(choice)、評価(score)の質問をサポート。
H100 GPUで、思考なしで約0.3秒/リクエスト、思考ありで中央値3.3秒。
チェーン長を切り捨てることで高速化可能。
bf16でCUDA上で実行可能、またはコンピュート能力8.9以上のGPUでFP8線形レイヤー(--precision fp8)を使用可能。
推論はApple Silicon(MPS)でもbf16またはFP8で実行可能。
問題
Jevライクなモデルは、キャリブレーションされた決定確率を提供しますが、精度は低いです。そのため、多くのパイプラインはフォールバックとして推論モデルに依存しています。
Jeevesは、決定を下す前に推論するために、CISPOを使用してJevライクなQwen3.5-9B(LoRAとポインターヘッド)をトレーニングします。これにより、ドメイン外のタスクでのパフォーマンスが向上し、JevBenchハード(公開)でJevを上回ります。
結果
思考あり、貪欲法、2,560トークンキャップでの精度。
Kev-9BとJevの列はKevが公開している数値です。
ベンチマーク | Kev-9B | Jev | Jeeves
---|---|---|---
テスト全体(ドメイン外およびホールドアウト、項目重み付け) | 0.822 | 0.857 | 0.889
転移全体(MMLU-Proおよび埋め込み状態) | 0.579 | 0.800 | 0.746
JevBench全体(公開231項目) | 0.715* | 0.866 | 0.935
QNLI | 0.925 | 0.925 | 0.913
SciQ | 0.963 | 0.988 | 0.991
TweetEval offensive | 0.775 | 0.813 | 0.813
PAWS | 0.763 | 0.788 | 0.875
MMLU | 0.738 | 0.900 | 0.793
Emotion | 0.600 | 0.588 | 0.647
ホールドアウトルール構造 | 0.896 | 0.885 | 1.000
対照ポリシー | 0.900 | 0.963 | 1.000
MMLU-Pro(10ウェイ) | 0.515 | 0.840 | 0.739
埋め込み状態 | 0.740 | 0.700 | 0.759
不明な回答(p ≥ 0.9、低い方が良い) | 0.000 | 0.090 | 0.055
JevBenchハード(公開111項目) | 0.451* | 0.730 | 0.865
JevBench ECE(公開項目) | 0.049 | 0.037 |
* Kev-9BのJevBench結果は公開されていません。これらはKev-8B(Qwen3)の数値です。すべてのJevBench数値は、公開のイージー、スタンダード、ハードティア(231項目)に基づいています。シールドジャッジティアは含まれていません。JevとKevの数値は、同じ公開項目に限定されています。
思考なしの場合、同じチェックポイントはテストスプリット(2,962項目)で0.804ですが、思考ありの場合は0.840です。
クイックスタート
要件:Python 3.12およびCUDA GPU。
推論は48GB以上のApple Silicon Macでも実行可能です。
pip install -r requirements.txt
リリースされたウェイトをダウンロードして提供します。
hf download PostHog/jeeves --local-dir jeeves-weights
python -m inference.serve --model jeeves-weights --drafter jeeves-weights/drafter_k4.safetensors --port 8009
Macでは、エンジンはMPSで実行されます。ウェイトはbf16で21GBを使用します。デフォルトのキャッシュ(--max-rows 8 --max-len 8192)はさらに28GBを使用するため、48GBのMacではスワップが発生し始めます。より小さいキャッシュを使用します。
python -m inference.serve --model jeeves-weights --drafter jeeves-weights/drafter_k4.safetensors --max-rows 4 --max-len 4096 --port 8009
M4 Proでは、1つの質問の思考は約20トークン/秒、思考なしのリクエストは0.3〜0.5秒かかります。
--precision fp8は、CUDAと同様に線形レイヤーを量子化し、Metal w8a16カーネルで実行します。アクティベーションは、CUDAと同様に、すべてのサイズでbf16のままです。ウェイトは11.5GBを使用し、1つの質問の思考は約38トークン/秒になります。出力はわずかに変化します。開発質問では、精度とNLLは測定可能な変化はありませんでした。FP8ウェイトはPostHog/jeeves-fp8からダウンロードできます。これらは、bf16ウェイトでの--precision fp8と同じ出力を提供します。
hf download PostHog/jeeves-fp8 --local-dir jeeves-fp8
python -m inference.serve --model jeeves-fp8 --drafter jeeves-fp8/drafter_k4.safetensors --precision fp8 --max-rows 4 --max-len 4096 --port 8009
python -m model.metal_test は、Metalカーネルをfloat64およびeager参照に対してチェックします。CUDAでは、python -m model.triton_kernels_test は、Tritonロータリー、デルタ状態アドバンス、デルタゲート、convステップ、およびキャッシュ書き込みをeagerおよびflaパスに対してビット単位で、デコードアテンションをfloat32に対してチェックします。python -m inference.cuda_test は、マージされた射影、アテンションマスク、およびFP8 GEMMをチェックします。python -m inference.engine_test は、answer_batchがリクエストをグループにパックする方法を、任意のデバイスでチェックします。
python speed.py --model jeeves-weights --data data/dev.jsonl は、固定セットの開発リクエストの時間を計測します。python -m prep.prep は data/. をビルドします。または、独自のトレーニング済みチェックポイントをスタンドアロンモデルに融合して、drafterで提供します。
python export.py runs/cispo/final --out runs/fused
python -m inference.serve --model runs/fused --drafter runs/drafter_k4/drafter.safetensors --port 8009
python export_fp8.py runs/fused --drafter runs/drafter_k4/drafter.safetensors --out runs/fused-fp8 は、エクスポートとそのdrafterのFP8ウェイトをPostHog/jeeves-fp8の形式で書き込みます。
次に、Jevの形式でリクエストを送信します。
curl -s localhost:8009/v1/systemone -H 'content-type: application/json' -d '{ "state": "Shoes arrived two weeks late and in the wrong size. Also I see two charges on my card.", "questions": { "department": {"type": "choice", "instructions": "Which team should handle this?", "criteria": {"returns": "Exchanges, refunds, wrong or damaged items", "shipping": "Delivery status, delays, lost packages", "billing": "Charges, invoices, payment problems"}}, "escalate": {"type": "noul", "instructions": "Does this need urgent human attention?"}, "frustration": {"type": "score", "instructions": "How frustrated is the customer?", "criteria": ["Calm", "Frustrated", "Very angry"]} }, "options": {"max_think": 512}}'
H100で--precision fp8を使用し、3つの質問が並列で思考した場合の応答:
{
"model": "jeeves-latest",
"answers": {
"department": {
"type": "choice",
"choice": "billing",
"confidence": 0.19,
"probabilities": {
"returns": 0.4,
"shipping": 0.14,
"billing": 0.46
}
},
"escalate": {
"type": "noul",
"noul": 0.72
},
"frustration": {
"type": "score",
"score": 1.5,
"legend": {
"0": "Calm",
"1": "Frustrated",
"2": "Very angry"
},
"probabilities": {
"0": 0.04,
"1": 0.43,
"2": 0.54
},
"confidence": 0.75
}
},
"usage": {
"input_tokens": 129,
"output_tokens": 160,
"reasoning_tokens": 1536
},
"latency_ms": 8141.6
}
Python SDK/ はJevのPython SDK(typesafe-sdk)のドロップイン代替品です。
pip install ./sdk
from jeeves_sdk import Choice, Noul, Score, TypeSafeClient
with TypeSafeClient() as client:
result = client.system_one(
state="I was charged twice. Please help.",
questions={
"billing": Noul(instructions="Is this about billing?"),
"tone": Choice(instructions="What is the tone?", criteria={"calm": None, "angry": None}),
"urgency": Score(instructions="How urgent is this?", criteria=["can wait", "this week", "today"]),
},
max_think=768,
return_reasoning=True,
)
print(result.nouls["billing"].noul, result.choices["tone"].choice, result.scores["urgency"].score)
print(result.reasoning["tone"].text)
クライアントはデフォルトでhttp://127.0.0.1:8009(またはJEEVES_BASE_URL)に接続し、APIキーは不要で、最大120秒待ちます。
オプション
optionsはオプションであり、送信しないJevクライアントでは無視されます。サーバー全体のデフォルトは、対応するserveフラグで設定されます。
オプション | デフォルト | 効果
---|---|---
think | true | false | プロンプトのみからの回答(約0.3秒)
max_think | 2560 | 各推論チェーンをこのトークン数で切り捨て、その後回答
nothink_threshold | null | no-thinkの信頼度がこの値以上の場合、思考なしで回答
return_reasoning | false | 各質問の推論テキストを応答に追加
325件の開発質問(H100 1台、--precision fp8使用)で:
設定 | 平均推論トークン数 | 中央値/p90レイテンシ
---|---|---
フルシンキング | 0.825 | 1,138 | 3.3秒 / 17.1秒
max_think 768, nothink_threshold 0.9 | 0.806 | 344 | 2.0秒 / 5.6秒
ノーシンキング | 0.775 | 0 | 約0.3秒
仕組み
質問、状態、回答は、Qwenチャットテンプレートに次のようにロードされます。
<state> …state… <q> instructions <opt> o