
2026/09/29 20:13
ジーブス。論理的思考がジープライクな意思決定モデルを強化する
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Jeeves は、Qwen3.5 をベースとして構築された特化型の 9B パラメータモデルであり、LoRA アダプター、ポインターヘッド、およびブロック -4 拡散ドラフターを追加することで、応答生成前での意思決定の精度を向上させています。訓練時に保持アウト(hold-out)されたドメイン外のテストデータにおいて、Jeeves は全体的な精度 0.889 を達成し、Kev-9B(0.822)および Jev(0.857)を上回っており、JevBench の公開ティアでは Jev の 0.866 に比べ 0.935 というスコアを獲得しました。本モデルは Jev の typesafe-sdk と互換性の高いドロップイン式の Python SDK を備え、Yes/No、選択式、および評価質問に対応しています。推論遅延は思考なしで約 0.3 秒、H100 GPU 上で思考を含む場合の中位値は 3.3 秒です。思考チェーンをトリミングすることでさらに高速化が可能です。ブロック -4 拡散ドラフターは単純なグリディーデコーディングと比較して 1.6 倍の速度向上を提供し、コストと速度の最良のバランスを実現しています。訓練では SFT(2 エポック)の後に合成データおよび公開のポリシーデータに対して CISPO スケジュールを採用しており、トークナイザー内で State、Question、Option、Decide という別々のレアなトークンが必要であり、これらを置き換えるか、思考後に質問を省略すると性能が低下します。Jeeves は保持アウトのルール構造(1.000)および対比的政策(1.000)において Kev-9B を大幅に上回っています。ただし、ユーザーは FP8 カーネルの使用のために Hopper アーキテクチャの GPU 上で展開する必要があり、完全な思考チェーンを使用すると高い尾部遅延(p90 で 17 秒)を管理する必要があり、MMLU-Pro における trailing knowledge スコアでは Jev に比べて低い値を受け入れる必要があります。再現には PostHog/jeeves リポジトリから重みファイルをダウンロードし、prep/、trainer.py、および export.py の特定のスクリプトに従う必要があります。
本文
Jeeves: CISPO で微調整された拡散ドラフター搭載推論型分類器
Kev に着想をいただきました。CISPO(Chain of Thought with Decision Point Optimization)を用いてトレーニングされた、「思考する前に意思決定を行う」9B パラメータのモデルです。
概要と特徴
- 構成: Qwen3.5-9B (LoRA + ポインターヘッド) を採用し、ブロック 4 の拡散ドラフターを搭載しています。
- トレーニングデータ: 完全なトレーニングコード、開発用・テスト用データを公開しています。
- パフォーマンス: テストデータおよび JevBench(公開ティア)において、既存の Kev-9B を凌駕する性能を発揮しました。
- Jev: 0.822 → Jeeves: 0.889 (テスト全体)
- Jev: 0.866 → Jeeves: 0.935 (JevBench)
- マルチタスク対応: ユーザーの要望を1 つのリクエストで同時処理可能。Yes/No(noul)、択一選択(choice)、評価スコア(score)など多様な形式をサポートします(Jev 互換 API)。
- 推論速度 (H100 GPU):
- 思考プロセスなし: 平均約 0.3 秒
- 思考プロセスあり: メディアン 3.3 秒(連鎖制限によりさらに高速化可能)
- 動作環境: CUDA (FP8 カーネルは Hopper アーキテクチャ対応)
課題と解決策
- 既存の課題: Jev 風モデルは確定的な意思決定を提供しますが、精度が低く、多くのパイプラインで推論モデルをフォールバックとして採用する必要がありました。
- Jeeves のアプローチ: CISPO を用いて、「思考する前に意思決定を行う」ようにトレーニングしました。
- ドメイン外タスクにおいて優れた性能を示します。
- JevBench ハードセットにおいても Jev を上回ります。
ベンチマーク結果
思考プロセスを適用し、greedy デコード (2,560 トークン制限) での精度です。Kev-9B と Jev の数値は Kev が公表したものです。
| ベンチマーク | Kev-9B | Jev | Jeeves |
|---|---|---|---|
| テスト全体(ドメイン外および保持済み) | 0.822 | 0.857 | 0.889 |
| QNLI | 0.925 | 0.925 | 0.913 |
| SciQ | 0.963 | 0.988 | 0.991 |
| PAWS | 0.763 | 0.788 | 0.875 |
| 感情分類 (Emotion) | 0.600 | 0.588 | 0.647 |
| 保持済みルール構造 | 0.896 | 0.885 | 1.000 |
| 対照的ポリシー (Contrastive policies) | 0.900 | 0.963 | 1.000 |
| MMLU-Pro (10 クラス) | 0.515 | 0.840 | 0.739 |
| 未知の事柄確率 p ≥ 0.9 で答えた割合 (小さいほど良い) | 0.000 | 0.090 | 0.055 |
| JevBench hard(111 件公開) | 0.451* | 0.730 | 0.865 |
* Kev-9B の JevBench 公式結果は公表されていません。Kev-8B (Qwen3) の数値を使用しています。
思考プロセスをスキップした場合のチェックポイント(テスト分割 2,962 アイテム): 0.804。思考プロセス適用時: 0.840。
クイックスタート
要件: Python 3.12 および CUDA GPU
1. 公式重みファイルのダウンロードと起動
# 重みのダウンロード hf download PostHog/jeeves --local-dir jeeves-weights # サーバー起動 (ポート:8009) python -m inference.serve \ --model jeeves-weights \ --drafter jeeves-weights/drafter_k4.safetensors \ --port 8009
2. 独自トレーニングモデルの結合と起動
独自にトレーニングしたチェックポイントをスタンドアローンモデルとして結合する場合:
# チェックポイントの結合 python export.py runs/cispo/final --out runs/fused # サーバー起動 python -m inference.serve \ --model runs/fused \ --drafter runs/drafter_k4/drafter.safetensors \ --port 8009
3. リクエストの送信 (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...", "shipping": "Delivery status...", "billing": "Charges, invoices..."}}, "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 (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 (sdk/
)
sdk/Jev の
typesafe-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) # billing: noul print(result.choices["tone"].choice) # tone: choice print(result.scores["urgency"].score) # urgency: score print(result.reasoning["tone"].text) # 思考プロセス
- デフォルト接続先:
(環境変数http://127.0.0.1:8009
で変更可能)JEEVES_BASE_URL - 認証: API キー不要
- タイムアウト: 最大 120 秒
オプション設定
options は任意引数です。送らない場合はサーバーのデフォルト値が適用されます。
| オプション | デフォルト | 効果 |
|---|---|---|
| think | | プロンプトからの回答(約 0.3 秒) |
| max_think | | 思考連鎖をこのトークン数で切り捨て、その後回答 |
| noughtink_threshold | | ノーシンク自信度がこれ以上であれば思考せず回答 |
| return_reasoning | | 回答に各質問の思考テキストを追加 |
設定ごとの性能比較(325 の開発用質問)
| 設定 | 精度 | 平均思考トークン数 | メディアンレイテンシ / p90 レイテンシ |
|---|---|---|---|
| フル思考モード | 0.825 | 1,138 | 3.3 秒 / 17.1 秒 |
| max_think 768, nothink_threshold 0.9 | 0.806 | 344 | 2.0 秒 / 5.6 秒 |
| 思考なし (No Thinking) | 0.775 | 0 | 約 0.3 秒 |
動作原理
質問、状態、および回答は Qwen チャットテンプレート内以下の構造でロードされます:
<state> …状態の内容… <q> 指示文 <opt> オプション 1 </opt> <opt> オプション 2 </opt> …