判断特化型AI Jev互換のOSSモデル「Kev」を M4 Mac の MLX で動かし、4B の判定精度を試してみた

判断特化型AI Jev互換のOSSモデル「Kev」を M4 Mac の MLX で動かし、4B の判定精度を試してみた

判断特化型AI Jev互換のOSSモデル「Kev」を M4 Pro / macOS 27 の MLX で動かしました。M1 / Docker では重すぎた 4B が 0.26 秒で応答し、AI-DLC の scope を選ばせる判定では 0.8B より良好な結果を得られました。

はじめに

「Kev」は、判断特化型 AI の Jev 互換の API を備えた OSS モデルで、M1 以降の Apple Silicon Mac で使える MLX をサポートしています。

https://github.com/jaredpalmer/kev

前回は M1 の Mac で Docker / CPU で Kev を動かしました。Docker の Linux コンテナからは Mac の GPU を使えないため、MLX は使えず CPU 実行でした。ローエンドの 0.8B しか実用的な速度では動かすことができず、判定精度を確認するには至りませんでした。

https://dev.classmethod.jp/articles/kev-oss-jev-compatible-docker/

今回は Apple M4 Pro / macOS 27 の環境を用意して、4B モデルを MLX で試した結果を紹介します。

動かす環境を用意する

バージョン情報

  • Mac mini(M4 Pro、メモリ 24GB)
  • macOS 27.0
  • uv 0.12.19
  • Python 3.13.15
  • mlx 0.32.2 / mlx-lm 0.31.3
  • Kev jaredpalmer/kev-4b(release_date: 2026-09-24)

導入

uv で Kev を導入して起動します。uv のバイナリ、Python、venv、Hugging Face のモデルキャッシュは、いずれもユーザー領域に配置します。

# uv を導入(未導入の場合)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Kev を clone し、依存 + MLX を venv へ
git clone --depth 1 https://github.com/jaredpalmer/kev.git
cd kev
uv sync --extra serve --python 3.13
# サーバ起動(初回のみ重みをダウンロード)
uv run python -m kev.serve --run jaredpalmer/kev-4b --port 8009

起動ログに次の行が出れば、Mac の GPU(mps)で MLX バックエンドが動いています。

serving jaredpalmer/kev-4b (...) on mps via mlx (bfloat16) 127.0.0.1:8009

GET /v1/models も 200 OK で、backend は mlx、device は mps、dtype は bfloat16 と返りました。

評価

モデル別のメモリ、応答時間

--run のモデル名を変えて 0.8B・4B・9B を起動し、サーバ起動後に同じ日本語リクエスト(前回記事と同じ、サポートチケットの担当部署・エスカレーション・怒りの度合いを聞くもの)を送ったときの初回と2回目の応答時間です。メモリは vmmap --summary で読んだ Physical footprint の実測値です。

モデル Physical footprint(peak) 初回 2回目
Kev-0.8B 2.1G(3.1G) 205.7ms 45.0ms
Kev-4B 8.6G(15.6G) 1200.9ms 262.1ms
Kev-9B 17.4G(30.6G) 30244.8ms 483.0ms

9B の Physical footprint 17.4G は、Kev README の「Kev-9B needs about 17 GB」と一致します。peak の 30.6G は 24GB の Mac の搭載メモリを超えており、初回だけ 30244.8ms かかった理由と考えられます。0.8B と 4B は footprint・peak とも 24GB に収まり、初回も 1.2 秒以内でした。

choice API を試した

Kev の choice API は、候補から1つを選ぶ API です。

選択対象は AI-DLC(awslabs/aidlc-workflows v2.10.0)の scope です。scope は、仕事の種類ごとにどのステージを実行するかを決める区分で、bugfix、feature、enterprise など11個あります。AI-DLC 本体は /aidlc <自由文> の依頼からキーワードで scope を自動判定しますが、これを Kev に意味で選ばせたら、依頼文から適切な scope 名を選べるのか。これが今回の問いです。

https://github.com/awslabs/aidlc-workflows

Kiro Crew 0.7 に追加された Auto (Jev) モードは、多数のスキルからメッセージの意味を解釈して1つを選びます。「依頼文から候補を1つ選ぶ」という問題の形が同じなので、これができれば Auto (Jev) の Jev によるスキル選択の精度も期待できると考えました。

リクエストと応答

choice API は /v1/systemone に type: choice の question を1つ含めて送ります。11個の scope に「該当なし(none)」を加えた12択を criteria に並べ、依頼文を state に入れます。scope の1件分は次のようになります。

curl -s http://127.0.0.1:8009/v1/systemone -H "content-type: application/json" -d "$(cat scope-request.json)"
{
  "state": "The login page returns a 500 error for users whose email contains an apostrophe. Fix it.",
  "model": "kev-latest",
  "questions": {
    "scope": {
      "type": "choice",
      "instructions": "Which AI-DLC scope should handle this request?",
      "criteria": {
        "aidlc-bugfix": "Fix a specific bug",
        "aidlc-classic": "V1-style ceremony through Inception and Construction - the implicit default",
        "aidlc-enterprise": "Regulated enterprise feature, full audit trail",
        "aidlc-express": "Lightest run: requirements to deploy, no design pass, no reviewers",
        "aidlc-feature": "Full lifecycle for new features, practical depth",
        "aidlc-infra": "Infrastructure changes",
        "aidlc-mvp": "Skip operations, ship the core",
        "aidlc-poc": "Prove feasibility fast",
        "aidlc-refactor": "Clean up existing code",
        "aidlc-security-patch": "CVE response",
        "aidlc-workshop": "Facilitated group session with mandatory gates",
        "none": "None of these apply to this request."
      }
    }
  }
}

この依頼文に対して Kev-4B が選んだのは aidlc-bugfix でした。確率は 0.63 で、次点は none の 0.14、応答時間は 268.5ms です。筆者が付けた正解ラベルも aidlc-bugfix なので、この1件は正解です。

同じ形の依頼文を英語と日本語で用意し、正解ラベルは筆者が付けました。日本語にしたのは依頼文(state)だけで、criteria と instructions は英語のままです。criteria の説明文は、上記の短い版と、キーワードと本文冒頭1文を足した詳しい版の2種類を試しています。scope とは別に、AI-DLC の skill(knowledge、outcomes-pack、replay、session-cost の4個 + none の5択)も同じ手順で試しました。

依頼文は2組あります。

明確な依頼は、依頼文の言葉が正解 scope の説明文とほぼ一致しているものです。

  • 「依存しているログライブラリに CVE-2026-1234 が出ています。対応してください。」→ 正解 aidlc-security-patch(説明文は "CVE response")
  • 「PCI DSS の監査下で新しい決済手段を追加します。すべての判断に監査証跡が必要です。」→ 正解 aidlc-enterprise

天気を聞くなど scope に該当しない依頼も none の正解として混ぜています。scope 15件・skill 10件 × 2言語で50件です。

紛らわしい依頼は、別の scope の言葉を混ぜたものです。

  • 「新しいロードバランサに移行して、そこで出ている 502 に対処してください。」→ 正解 aidlc-infra。「502 に対処」が aidlc-bugfix に寄る
  • 「管理コンソールに多要素認証を追加します。SOC 2 の監査対象でサンプリングされます。」→ 正解 aidlc-enterprise。「追加します」が aidlc-feature に寄る

scope 8件・skill 2件 × 2言語で20件です。

結果

criteria 2版を合わせた誤り件数と、括弧内に正答率です。分母は明確な依頼が100回、紛らわしい依頼が40回です。

モデル 明確な依頼(/100) 紛らわしい依頼(/40)
Kev-0.8B 23(77%) 20(50%)
Kev-4B 0(100%) 10(75%)
Kev-9B 1(99%) 12(70%)

0.8B は 4B・9B に明らかに劣ります。明確な依頼で外した23回のうち、4B は23回とも、9B は22回を正解しています。0.8B の誤りは大半が none を選ぶ取りこぼしで、別の scope を誤って選んだのは明確な依頼では2回だけです。

4B と 9B に明確な差はありませんでした。紛らわしい依頼で 4B が外した10回のうち8回は 9B も外しており、そのうち6回は同じ誤答です。9B だけが外したのは多要素認証の依頼で、英語・日本語・criteria 2版の4回とも aidlc-feature を選んでいます。4B は4回とも正解でした。

4B・9B が共に外した依頼

依頼文にすると4種類です。同じ結果になった言語・criteria 版はまとめています。

依頼文 正解 4B 9B 0.8B
決済モジュールを綺麗に書き直してください。ついでに項目を2つ追加します。(日本語・B版) refactor feature feature refactor
新しいロードバランサに移行して、そこで出ている 502 に対処してください。(日本語・A/B版) infra none none bugfix
Tidy up the CI configuration and cut the build time while you are at it.(英語・A版) refactor infra infra infra
記録のために、何をどういう理由で決めたのかを教えてください。(日本語・英語、A/B版) replay(skill) none / outcomes-pack none / knowledge / outcomes-pack none / outcomes-pack

1件目は、筆者自身が refactor か feature か一意に決まらないと判断している依頼です。4件目は skill の replay と outcomes-pack の説明文が近く、人間でも迷います。モデルの誤りと言えるのは2件目と3件目で、どちらも別の言語や criteria 版では両モデルとも正解しています。

0.8B だけが外した依頼(4B・9B は正解、16種類)
依頼文 正解 0.8B
PCI DSS の監査下で新しい決済手段を追加します。すべての判断に監査証跡が必要です。(日本語・B版) enterprise feature
要件からデプロイまで最短で通してください。設計パスもレビュアーも省略でいいです。(日本語・B版) express none
Prove whether on-device inference can stay under 200 ms. Feasibility only, throw the code away after.(英語・A版) poc none
Run a facilitated session with the whole team on Tuesday, with a mandatory gate at each step.(英語・B版) workshop none
Make things better.(英語・A版) none bugfix
チームドライブの PDF を、エージェントが引用できるように取り込んでください。(日本語・英語、A版) knowledge none
社内の設計ドキュメントをカタログに登録して同期してください。(日本語・英語、A版) knowledge none
ワークフローが終わりました。チームが自分たちで運用できるよう引き継ぎ資料を作ってください。(日本語・A版) outcomes-pack none
所有権をプラットフォームチームに移せるよう、クロージングの引き継ぎ文書を書いてください。(日本語・英語、A/B版) outcomes-pack none
この場にいなかった関係者向けに、今回のセッションで何が起きたかをまとめてください。(日本語・英語、A/B版) replay none
このワークフローの所要時間、走ったステージ数、センサーの発火数を教えてください。数字だけで。(日本語・A版) session-cost none
現在のワークフローのコストビューを見せてください。(英語 A/B版、日本語 A版) session-cost none
ダッシュボードの初版を早く出します。監視はいったん省きます。(日本語・B版) mvp infra
新入社員向けに、ワークフローを一緒に辿る研修日を開催します。(日本語・A版) workshop none
CI の設定を整理して、ついでにビルド時間を削ってください。(日本語 A/B版、英語 B版) refactor infra
引き継ぎ用にこのワークフローをまとめてください。各ステージの所要時間も入れてください。(日本語・英語、A/B版) outcomes-pack none

まとめ

M4 Pro / 24GB の Mac で、Kev-4B を MLX で利用できました。choice API で AI-DLC の scope を選ばせたところ、4B は 0.8B より明らかに良好で、9B にしても 4B との差はありませんでした。依頼文を日本語にしても 4B の誤り件数は英語と同じで、回答品質が大きく劣化することもありませんでした。

また、4B の応答時間は、M1 / Docker / CPU では 26〜93 秒でしたが、M4 Pro / MLX では初回 1.2 秒、2回目 0.26 秒と実用的な速度で利用できたため、推論時の入力データを外部 API に送信したくない場合、判断特化型 AI の実行環境として Kev + MLX は有力な選択肢になりそうです。

今後は、Kiro Crew 0.7 でサポートされた Auto (Jev)(プロンプトに応じて使うモデルやスキルを Jev が判定して動くモード)での評価や、本家の Jev、CLM などとの違いも評価してみたいと思います。

https://dev.classmethod.jp/articles/clm-contrastive-language-model-switchyard-judge/

この記事をシェアする

DevelopersIO 2026

関連記事