概要
Jeeves は、 Qwen3.5-9B ベースのJevスタイル推論分類器。 CISPO と SFT で訓練し、 diffusion drafter 搭載。 JevやKevを超える精度を JevBench 等で実証。 yes/no・選択肢・スコア 質問を一括処理、API互換。 CUDA対応・高速化設定 も可能。
Jeeves: Reasoning Improves Jev-like Decisions
- Jeeves は、 Qwen3.5-9B (LoRA・pointer head付き)をベースにした 推論型分類モデル。
- block-4 diffusion drafter を内蔵し、 全訓練コード・データ も公開。
- JevBench や テストデータ で、 Kev-9B や Jev より高精度(例: JevBench公開ティアで0.935 vs 0.866)。
- yes/no(noul)・選択肢(choice)・スコア(score) 形式の質問を 同時リクエスト処理。
- Jev互換API で運用可能。
- 思考なし で約0.3秒、 思考あり で中央値3.3秒(H100使用時)。
- チェーン長を短縮 することで更なる高速化が可能。
- CUDA(HopperのFP8カーネル) に対応。
Jev系モデルの課題とJeevesの解決策
- Jev系モデル は 確率校正 は優れるが、 精度が低い。
- 多くのパイプラインは 推論モデルをフォールバック で利用。
- Jeeves は CISPO を活用し、「 考えてから決定」する訓練を実施。
- これにより 未知領域タスク でも高いパフォーマンスを実現。
主な精度比較(抜粋)
- Test overall (未知・保持アウト):Jeeves 0.889(Kev-9B 0.822、Jev 0.857)
- JevBench overall (231公開):Jeeves 0.935(Kev-9B 0.715、Jev 0.866)
- MMLU :Jeeves 0.793、Jev 0.900
- JevBench hard :Jeeves 0.865、Jev 0.730
- 思考なし :Jeeves 0.804、 思考あり :0.840(テスト分割)
クイックスタート
- 要件 :Python 3.12、CUDA GPU
- インストール :
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
- 推論リクエスト例 (curl):
- Jev形式JSONで 複数質問 を同時送信
- レスポンス例 :
- 各質問の 推論結果・信頼度・確率 等を返却
- 使用トークン数・レイテンシ も出力
Python SDK
- Jev SDK互換 のPythonクライアント(
jeeves_sdk) - 型安全 なAPIで、 思考プロセスのテキストも取得可能
- デフォルトで
http://127.0.0.1:8009に接続、APIキー不要
サーバーオプション・設定
- think :思考を有効化(高速化にはfalse)
- max_think :推論チェーンの最大トークン数
- nothink_threshold :信頼度が閾値以上なら思考省略
- return_reasoning :推論テキストをレスポンスに追加
推論プロセスの仕組み
- 質問・状態・回答 をQwenチャットテンプレートにロード
<state>…<q>…<opt>…</opt>…<think>で 推論チェーン生成<decide>で pointer head が各選択肢をスコアリング- 温度付きsoftmax で最終確率算出
- プロンプト内の特殊トークン利用が性能向上に寄与
学習方法
- SFT (2エポック、8GPU、19,126問)
- LoRA r=16 (全プロジェクション+pointer head)
- CISPO (624ステップ中402で停止、9,992 RL質問、各8ロールアウト)
- 校正 :devセットで温度最適化
- 思考チェーンの半分 はベースモデルからサンプリング
Diffusion Drafter
- Orthrus 着想の diffusion drafter 搭載
- Gated DeltaNet層 にも対応
- block 4 設定で複数質問を効率的にバッチ処理
- 高速化 :block 4で1問176トークン/秒、8問バッチで約960トークン/秒
再現・データ構築
- prepスクリプト でHugging Faceからデータセット自動取得
- 各データセットは独自ライセンス下で利用
学習パイプライン
- 8GPU で全プロセス自動実行(
run.sh)- SFT→CISPO→テスト→JevBench→エクスポート→drafter訓練
リポジトリ構成
- model/ :Qwen3.5本体+LoRA+pointer head
- loader/ :プロンプト形式・トークナイズ・バッチ処理
- prep/ :データセット構築・合成データ生成
- trainer.py, train.py :SFT・CISPO・drafter訓練
- test.py, jevbench.py, calibrate.py :評価・温度最適化
- export.py :LoRA統合モデル出力
- drafter/ :drafter本体・チェーンサンプリング
- inference/ :FP8カーネル・推論サーバー
- sdk/ :Jev SDK互換クライアント
制限事項
- 知識系質問 はJevに劣後(MMLU等)
- 思考チェーン が長い場合、最大17秒程度かかる
- JevBench外 の比較は同一ソースだがアイテムが異なる
- 言語一貫性報酬 なしのため、思考チェーンの可読性は限定的
謝辞・参考文献
- Kev や Jev の設計に着想
- Qwen3.5-9B、 Gated DeltaNet、 LoRA、 CISPO、 Orthrus 等を活用
- 論文・実装は GitHub(https://github.com/PostHog/jeeves) で公開
引用推奨:
@software{waltz2026jeeves,
author = {Waltz, Nicholas P.},
title = {Jeeves: Reasoning Improves Jev-like Decisions},
year = {2026},
url = {https://github.com/PostHog/jeeves},
note = {Qwen3.5-9B decision model trained with SFT and CISPO, with a block-4 diffusion drafter}
}
ちょっと気になったんだけど、「noul」っていう言葉はどこから来たの?/ もう少し掘り下げてみたら…Noulはベルヌーイ試行を行うんだって。つまり、結果が2つ(はいかいいえ)だけの実験なんだけど、どちらかを選ぶんじゃなくて、その文が真である確率(0.0から1.0の範囲)を返すんだ。嫌いだわ :)