はじめに

最近はハイエンドモデルよりも Cursor Composer 2.5 や DeepSeek などの安くて早いモデルの話題が多い

仕事でも Cursor Composer 2.5 fast を使う割合がかなり増えており、最近は本当にほぼこれしか使っていない状況

そこで local model でもコーディングエージェントを動かして、簡単な機能実装ができるか試してみた

実行環境

自宅のPCにまあまあの VRAM の GPU があるのでそれに乗るサイズのもので試してみる

ComponentSpec
GPURadeon RX 7900 XTX
VRAM24GB
RAM64GB

VRAM 24GB に乗るサイズでコーディングに適したモデルということで Claude に相談した結果 qwen3-coder-30b-a3b がおすすめということだったのでとりあえずこれで試してみる

For an agentic workload the MoE matters: Qwen3-Coder-30B-A3B activates only ~3B params per token, so it runs fast and its ~16GB Q4 footprint leaves real VRAM for KV cache — which is exactly the tradeoff you want on 24GB. A dense 32B at Q4 (~19–20GB) is marginally smarter but starves your context window.

自宅PCは Arch Linux で動いていて AMD GPU 用のセットアップとかは済んでいるのでここでは詳細は省くが、ROCm とかいれてるだけで特に凝ったセットアップとかはしていない

llama.cpp

local model の実行環境として ollama と llama.cpp があるが、llama.cpp を選択

ollama のほうが簡単そうではあるが、llama.cpp のほうが実行時のパラメータなどの調整がいろいろできるので llama.cpp にした

ollama も llama.cpp も以前動かしたことがあるので、今回 1 からセットアップしたわけではないが、llama.cpp は基本的に source 持ってきて手元で build することになると思う

build 方法も環境によると思うのでここでは詳細は省く

build できたら build directory に binary ができているので llama-server を実行して qwen3-coder-30b-a3b を動かしてみる

./llama-server \
    -hf unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF:Q4_K_M \
    --host 0.0.0.0 --port 8080 \
    --device ROCm0 \
    -ngl 99 -c 65536 -fa on \
    --cache-type-k q8_0 --cache-type-v q8_0 \
    -b 2048 -ub 1024 --jinja --metrics

エラーとか出ずに実行されるとエンドポイントから利用できるようになっている

まず簡単に動作確認するためにブラウザからアクセスしてみる

port 8080 で起動しているのでブラウザでアクセスすると ChatGPT みたいな UI にアクセスできる

img

local model で軽いモデルなのでレスポンスが非常に速い

opencode

仕事では Claude Code と Cursor を使っているが自宅でのコーディングには Claude Code, OpenCode を使っていて最近は OpenCode を使うことが多いので今回は OpenCode での設定をしていく

~/.config/opencode/opencode.json に以下の設定を追加

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "llamacpp": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "llama-server (local)",
      "options": {
        "baseURL": "http://127.0.0.1:8080/v1"
      },
      "models": {
        "qwen3-coder": {
          "name": "Qwen3-Coder-30B-A3B (local)",
          "tools": true,
          "limit": { "context": 65536, "output": 16384 }
        }
      }
    }
  }
}

この設定で OpenCode の /model で呼び出せるモデルに qwen3-coder が追加されるので、あとはいつもどおりプロンプト実行して coding agent として local の qwen3-coder を使える

機能実装を試してみる

ちょうど良い機会なので何か機能実装を試してみる

このブログサイトを Zola で作ったが、デフォルトの画像は拡大できず、スクリーンショットが小さくて読みにくい

そこでクリックしたら拡大できるような機能を作ってみたい

Zola には shortcodes という機能があって、Hugo や WordPress にもある仕組みのようだが、自分はどちらも詳しくないのでイメージは React のコンポーネントみたいなもので html, css, js からなる機能をコンポーネントとして定義して呼び出せるようなものと理解している

この shortcodes が今回の機能にはぴったりな機能だと思うのでこの仕組みで実装してもらう

まずは基準として Opus 4.7 で実装してみて、その後 qwen3-coder で同じプロンプトで実装してみる

I'd like to add new feature for this blog. currently image is statically rendered but small image of screenshots are hard to understand what's going on with current static image size. I want to create shortcode that make image clickable and show enlarged on the screen like many blog platform provide.

まずは Opus 4.7

Opus 4.7 の場合、先ほどの雑プロンプトで実行すると superpowers のスキルを起動していくつか質問した後仕様 fix したら実装開始して、修正等なしで実装完了して正しく動作している

Opus 4.7 + superpowers の良かったところはまず仕様検討段階で、今回の機能の実装だけでなく、すでに公開しているブログの img タグはどうするかというところまで考慮して仕様に含めてくれるところ

このくらいのフロントエンド完結の小さなタスクは Opus には余裕

ちなみにこの機能の実装は Opus のものを採用してこのブログの画像が全画面表示できるようになった

qwen3-coder

では qwen3-coder はどうかというと、まず superpowers のスキルを起動せずいきなりコードを書き始める

コードの生成は早いがエラーになってしまうようなコードを生成して完了を報告してくる

一旦 superpowers 読み込めてないと話にならないので先ほどのコードは捨てて、superpowers 使ってもらうように AGENTS.md に指示を明示してやってみる

# Before Implementation

always plan first before implementation. We assume you use superpowers plugin's skills so try to use superpowers plugin. If you can't find superpowers let user know that and fallback to other options.

AGENTS.md に明示すると qwen3-coder も superpowers を使ってくれている

プロンプト入力して brainstorm skill を使っているところまで確認したが、何故か仕様の確認とか実装のためのドキュメントとかは作成されず、しばらく仕様について検討した後勝手に実装を始めた

実装の様子だが、実装前の brainstorm で探索しているときは GPU がずっと動いていて温度も 70 度くらいまで上がっているので、ハードに使うならマシンの諸々の metrics を Grafana などに送ってきちんとモニタリングしておいたほうが良い

img

superpowers を使うように指示してみると、spec が作成されなかったりいくつか想定通りに動いてくれないところがあったものの、機能としては普通にできていて驚いた

Opus 4.7 + superpowers がやってくれてた既存の img タグについての対応も入っていて、Opus 4.7 で作ったものと特に遜色はない

ただできたコードを見ると Opus が生成したコードとかなり似ていて気になった

コードは branch を分けて混在しないようにしていたが、実験メモを commit しており、そこに Opus 版のコードの PR リンクが含まれていたので、これを参照した可能性があるかもと思い、追試することにした

追試してみるとやはり Opus のコードを参照していたようだった

実験メモを除いた branch で再度試すと結構苦労して、それらしいコードは生成されるものの、ちゃんと動くようにするには 1 発ではいかず、何度かコードを確認して調整する必要があった

また context 溢れによるとみられる推論の劣化が結構あったので、実装開始時に clean な状態から始めることを徹底しないと、output の劣化とブレが激しくなりそうだった

まとめ

local model をちゃんと機能実装に使ってみたのは初めてだったのだが、まだ qwen3-coder-30B-A3B-Instruct-GGUF とかで単独での機能実装は結構無謀だとわかった

今回はとりあえず local model を動かしてコード書いてみようということでやってみたが、Opus 4.7 から Cursor Composer 2.5 fast に移行しても問題なかったので qwen3-coder をやってみたが明らかに乖離が大きすぎた

modelarchitecture / sizecontext limitbenchAPI cost (approx)
Claude Opus 4.7超巨大モデル(非公開)1,000,000SWE-bench Verified: 87.6%$5.00 / $25.00
Cursor Composer 2.5非公開非公開SWE-bench Multilingual: 79.8%$3.00 / $15.00
Qwen3-Coder-30B-A3B30B MoE160,000SWE-bench Verified: 34.5%$0.07 / $0.27

※ 各値は各モデルの公式リリース / モデルカード等に基づく概算

この表についてはあくまでざっくりとした比較なので以下2点注意

  • ベンチマークの種類が揃っていない(Opus/Qwen は Verified、Cursor は Multilingual)ため、数値を縦に並べた厳密な比較ではない
  • Qwen の SWE-bench Verified はハーネス構成によって大きく変動するため、参考値として扱うのが安全

今回わかったこととしては

  • Opus 4.7 だと何も指示がなくても勝手に superpowers を読み込んでくれる一方、 qwen3-coder は AGENTS.md とかにきちんと指定しないと superpowers を使ってくれない
  • qwen3-coder のままだと結構簡単な機能の実装もうまくできないが、 superpowers のようなハーネスが設定されてるとそれなりに改善する
    • 一方 token 消費は激しくなるので context 溢れによる劣化のリスクも高まる

そもそも qwen3-coder はコーディング特化のモデルだと思うので opencode で plan と build のモデルを分けて plan はハイエンドモデルでやって仕様検討時のモデルと実装時のモデルをわけるとかを次に試してみると良さそう

触った感じ単純なコーディングタスクはそれなりにこなせそうだし、やはり応答が早いのは体験として非常に良い

また普段強力なモデルを使っているので意識してないが prompt や token 消費のモニタリングも実験としては重要なのでやってみたい