AI・機械学習
Kev: Qwen3.5を基盤としたJev風の小型決定モデルファミリー
Kev: Tiny Jev-like family of decision models built on top of Qwen3.5 (github.com)
要約
Kevは、Qwen3.5を基盤とし、Jevのアーキテクチャに着想を得た小型決定モデルのファミリーです。0.8B、4B、9Bのモデルサイズがあり、独自の学習や実行が可能です。APIはTypeSafeのSystem Oneと互換性があり、CUDAやApple Siliconで動作します。顧客対応の自動化など、様々な質問タイプに対応し、ローカルサーバーやWebプレイグラウンドで試すことができます。
全文翻訳
Kev Small Jev-like decision models you can train and run yourself.
Kevは、Qwen3.5を基盤とし、Jev's Architecture Unmaskedで説明されているアーキテクチャに基づいた、小型決定モデルのファミリーです。事前学習済みの重みを使用することも、独自のモデルを学習することも可能です。
APIはTypeSafeのSystem Oneと互換性があるため、そのPython SDKをローカルサーバーに向けることができます。
0.8B、4B、9Bのモデルがあり、学習コードと評価データが含まれています。同じリクエストで、Yes/No(noul)、複数選択(choice)、評価(score)の質問が可能です。質問は入力テキストを共有しますが、互いに読み取ることはできません。
CUDAおよびApple Siliconで動作します。4Bおよび9Bモデルは32GBのMacにbf16で収まります。Macでのパフォーマンスについては、Serving Performanceを参照してください。
独自の入力を試したり、オプションの順序が回答にどのように影響するかを確認したりするためのWebプレイグラウンドがあります。
クイックスタート
Python 3.12+とuvが必要です。
git clone https://github.com/jaredpalmer/kev.git && cd kev
uv sync --extra serve
KEV_DTYPE=bf16 uv run --extra serve python -m kev.serve --run jaredpalmer/kev-4b --port 8009
これにより、Kev-4Bがローカルで起動します。初回実行時には、アダプターとベースモデルがダウンロードされます。
--runは、ローカルのチェックポイントディレクトリや、前の世代のjaredpalmer/kev-4b@qwen3のようなHubリビジョンも受け入れます。
別のターミナルで、チケットを送信します。
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.", "model": "kev-latest", "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"]} }}'
Apple M5上のbf16で実行されているKev-4Bからの応答例:
{
"model": "kev-latest",
"answers": {
"department": {
"type": "choice",
"choice": "returns",
"confidence": 0.21,
"probabilities": {
"returns": 0.47,
"shipping": 0.28,
"billing": 0.25
}
},
"escalate": {
"type": "noul",
"noul": 0.93
},
"frustration": {
"type": "score",
"score": 1.44,
"confidence": 0.78,
"legend": {
"0": "Calm",
"1": "Frustrated",
"2": "Very angry"
},
"probabilities": {
"0": 0.00,
"1": 0.56,
"2": 0.44
}
}
},
"usage": {
"input_tokens": 101,
"output_tokens": 161
},
"latency_ms": 495
}
チケットには返品、配送遅延、請求問題が記載されており、departmentの確率もそれを示しています。これが確率を返すことの利点であり、単一のラベルではなく、確率を得ることができます。
Python
TypeSafe SDKはuv sync --extra serveに含まれています:
from typesafe_sdk import Choice, Noul, Score, TypeSafeClient
client = TypeSafeClient(
api_key="local",
base_url="http://127.0.0.1:8009",
model="kev-latest",
)
response = client.system_one(
state="I was charged twice. Please fix this ASAP.",
questions={
"billing": Noul(instructions="Is this ticket about billing?"),
"tone": Choice(
instructions="What is the customer's tone?",
criteria={"calm": None, "frustrated": None, "angry": None},
),
"urgency": Score(
instructions="How urgent is this ticket?",
criteria=["can wait", "this week", "today"],
),
},
)
print(response.nouls["billing"].noul)
print(response.choices["tone"].choice)
print(response.scores["urgency"].score)
プレイグラウンド
サーバーが実行中のまま、別のターミナルを開きます。Node 20.9+が必要です。
cd playground
npm install
npm run dev -- -p 3001
localhost:3001を開き、プリセットをロードして、テキストと質問を編集します。⌘↵を押して実行します。
"Packed vs separate"は、すべての質問を一度に尋ねる場合と、一度に1つずつ尋ねる場合を比較します。「Permute」は、6つのオプション順序でChoice質問を実行します。質問の分離や偽の区切りトークンをテストするためのプリセットもあります。
チェスのデモもあります。盤面が入力、合法手がChoiceオプション、そしてPositionの評価がScore質問です。Kevと対戦したり、Kevに自己対戦させたりできます。ゲームはlocalStorageに保存されます。
モデル
Kev-4Bから始めます。精度とキャリブレーションがメモリよりも重要な場合はKev-9Bを使用します。最小モデルが必要な場合はKev-0.8Bを使用します。3つすべてがQwen3.5ベースで、同じ学習データと設定で構築されています。
モデル ベース 精度: 学習済みソース 精度: 新規ソース Brier: 新規ソース モデルカード
Kev-0.8B Qwen3.5-0.8B-Base 0.829 / 0.827 0.643 / 0.668 0.513 / 0.473 詳細
Kev-4B Qwen3.5-4B-Base 0.877 / 0.870 0.794 / 0.832 0.316 / 0.266 詳細
Kev-9B Qwen3.5-9B-Base 0.876 / 0.873 0.812 / 0.837 0.291 / 0.243 詳細
Jev Hosted 0.845 / – 0.857 / – 0.211 / – –
各セルは開発/テストです。「学習済みソース」は、Kevの学習に使用されたデータセットからの除外された例を意味します。「新規ソース」は、Kevが学習されていないデータセットとポリシー ルールタイプを意味します。すべてのモデルは、モデル選択後、リリースされた各チェックポイントごとに1回読み取られた同じ開発セット(decision-v7、transfer-v4)とテストセットで評価されました。Brierスコアは低いほど良いです。Kev-9Bは、新規ソース開発セットでJevに約4.5ポイント遅れをとっています。Jevがどのデータセットで学習されたかは不明なため、これは2つのアーキテクチャの管理された比較ではありません。
すべての重みはKevコレクションとGitHubリリースにあり、tarballとSHA-256チェックサムが含まれています。
前の世代(Qwen3)とプロトタイプ
最初のKevファミリーはQwen3ベースを使用し、同じデータと設定でした。それらの重みは公開されたままで、Macでの高速な選択肢ですが、開発は終了しています。
モデル ベース 精度: 学習済みソース 精度: 新規ソース Brier: 新規ソース モデルカード
Kev-0.6B (Qwen3) — jaredpalmer/kev-0.6b Qwen3-0.6B-Base 0.801 / 0.808 0.620 / 0.642 0.536 / 0.483 詳細
Kev-4B (Qwen3) — jaredpalmer/kev-4b@qwen3 Qwen3-4B-Base 0.854 / 0.856 0.790 / 0.806 0.328 / 0.294 詳細
Kev-8B (Qwen3) — jaredpalmer/kev-8b Qwen3-8B-Base 0.863 / 0.870 0.796 / 0.780 0.337 / 0.327 詳細
ベースのみが変更されたため、2つの世代は管理された比較です。開発セットでは精度向上はノイズの範囲内ですが、テストセットではKev-9BはKev-8Bよりも7.3ポイント高く(95% CI +2.8~+11.7)、Brierスコアは0.08低いです。Kev-4Bは前世代より2.9ポイント高く(-0.9~+6.4)、Kev-0.8BはKev-0.6Bより4.8ポイント高くなっています(+0.2~+9.3)。
PLAN_Qwen35.mdには、事前に設定した基準と結果がどのように測定されたかを含む、完全な実験が含まれています。
オリジナルのKev-0.5BはQwen2.5-0.5Bを使用しており、参照用に保持されています。そのモデルカードを参照してください。
API
POST /v1/systemone
stateは評価するテキストです。各質問には指示があり、必要に応じて選択肢があります。
{
"state": "…", // string | object | array — 評価するコンテンツ
"model": "kev-latest",
"questions": {
"<id>": { // IDはユーザーが選択。モデルはIDを見ない
"type": "noul" | "choice" | "score",
"instructions": "…", // string | object | array
"criteria": … // noul: {true?, false?} choice: {option: description|null} score: [level, …]
}
}
}
タイプ 基準 回答
noul trueとfalseのオプションの説明(任意) yesの確率
choice 1~255のオプション名。各オプションには説明またはnullがあります。 最も可能性の高いオプション。確率と信頼度スコア。
score 2~255の説明。低い方から高い方へ順序付けられています。 平均レベルインデックス(0から開始)。凡例、確率、信頼度。
ChoiceでK > 1のオプションがある場合、信頼度は(p_max − 1/K) / (1 − 1/K)です。単一のオプションの信頼度は1です。Scoreの信頼度は、分布が最も可能性の高いレベルにどれだけ近いかを示します。TypeSafeの公開されていない公式の近似です。どちらのフィールドも測定された精度率ではありません。
オブジェクトと配列はラベル付きテキストに変換されます。ユーザー入力の区切り文字のような文字列は、トークン化される前にエスケープされます。無効なリクエストは422を返します。
usage.output_tokensは、生成されたトークンではなく、シリアル化された回答のトークン数をカウントします。
メソッド パス 目的
GET /v1/models ロードされたモデルとチェックポイント