とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

OpenCodeを使って小型LLM(SLM)でAIコーディングできるか試してみた

Qwen3.5 9Bを使ってOpenCodeを使ってみたところ、ローカルLLMでコーディングができることは分かりました。 ただ、もう少し小さいモデル(SLM)でもコーディングできないかなと思って、今回試してみることにしました。

Qwen3.5 4Bを試す

一つ目は「Qwen3.5 4B」です。 使うモデルはこれです。

Macの場合はMLXモデルがあります。今回はこれを使ってみます。

LinuxやWindowsではGGUFフォーマットのモデルが使えるでしょうか。OSに合わせてお試しください。

モデルIDは次のコマンドで確認できます。Windowsの場合はWSLシェルからだったら実行できるのでしょうか?

curl http://localhost:1234/v1/models|jq

上記コマンドで、LM Studioにダウンロードしたすべてのモデルが表示されると思います。 OpenCodeではそのすべてが使えると言う訳ではないですが、OpenCode CLI自身はいくら使っても無料なので、トライアンドエラーして自分に一番最適なモデルを探るのも、また楽しいです。

以前「Qwen3.5 9B」は一通り動くのを確認していたので、今回は「4B」モデルを試して見ようと思いました。

次のような設定を書き加えました。

        "qwen3.5-4b-mlx": {
          "name": "Qwen3.5 4B",
          "tools": true,
          "limit": {
            "context": 16384,
            "output": 4096
          }
        },

OpenCode CLIを起動して、/modelsコマンドでモデルを切り替えて試してみます。 お題はいつもの「じゃんけんゲームの実装」にしましょうか。

プロンプト: 「Pythonで動くじゃんけんゲームのコードを作ってください。出す手はグー、チョキ、パーで、日本語入力が大変なので、数字で出す手を選べるように実装してください。」

問題なくコードを生成できました。実際にはOpenCodeがファイルを作成し、じゃんけんゲームの実装まで完了しています。生成されたコードもそのまま実行できました。 9Bと比べても、コード品質はそこまで劣化していなさそうです。

Gemma 4 E4B QATを試す

Gemma 4 E4BもLM Studioで使った感じは良かったので、追加してみましょう。 使うモデルはオフィシャルのこれです。

Gemma 4 E4Bのベースモデルは結構メモリーをもっていかれるので、最近オフィシャルでリリースされていたQATモデルを使ってみます。こういう設定を書き加えて同じように

        "gemma-4-e4b-it-qat": {
          "name": "Gemma4 E4B",
          "tools": true,
          "limit": {
            "context": 16384,
            "output": 4096
          }
        },

OpenCode CLIを起動して、/modelsコマンドでモデルを切り替えて試してみます。 プロンプトを投げて実行すると、次のようなエラーが出ました。

モデルのテンプレートのエラーのようです。

"Error rendering prompt with jinja template: \"Cannot call something that is not a function: got UndefinedValue\".\n\nThis is usually an issue with the model's prompt template. If you are using a popular model, you can try to search the model under lmstudio-community, which will have fixed prompt templates. If you cannot find one, you are welcome to post this issue to our discord or issue tracker on GitHub. Alternatively, if you know how to write jinja templates, you can override the prompt template in My Models > model settings > Prompt Template."

エラーで調べると、次のようなIssue報告が見つかりました。

ここに、次のような記述を追加したら動いたと言う報告があります。

{%- macro format_type_argument(type_arg) -%}
{{- type_arg if type_arg is string else format_argument(type_arg) -}}
{%- endmacro -%}

そこで、LM Studioのモデル一覧を表示してサイドバーを展開、Gemma 4 E4Bの設定の中から「プロンプトテンプレート」を開き、先ほどの3行をペーストしました。

設定を書き込んだあとはOpenCode CLIを読み込み直しが必要です。

起動し直してプロンプトを投げると、次のような質問が現れました。

What is the desired file name for the Python game?

OpenCodeはコードを返すだけではなく、どのファイル名で保存するかも確認してきました。 これはOpenCodeが「チャットAIではなくエージェントとして動いている」ある意味で証拠ですね。

そこで、jyanken.pyと入力しReternを押すと、コードが実装されました。もちろん、実装されたコードは一発で動作するものができました。

まとめ

使い始めてからそんなに経っていないのもあって理解できていませんでしたが、少なくとも4BクラスのSLMでもOpenCodeを利用したAIコーディングは可能であることがわかりました。メモリーの少ないPCでも試せる構成として有力な選択肢になりそうですね。

モデル 結果
Qwen3.5 9B 問題なく動作
Qwen3.5 4B 問題なく動作
Gemma4 E4B QAT テンプレート修正後に動作
Gemma4 12B QAT Issue情報では同様に動作可能

「32B以上ないとAIコーディングは無理」という記事をよく見かけますが、少なくとも私の環境では4Bモデルでも問題なくAIコーディングが体験できることが分かりました。

付け加えるともう少しメモリーに余裕がある環境が用意できれば、同時期にQAT量子化モデルが公開された「Gemma4 12B QAT」も良い選択肢だと思います。先ほどのIssueによると同じパッチだけで動くようです。このモデルを社内のGPUサーバーでllama.cppで動かしていますが、コード生成は爆速ですごいです。

書き忘れましたが、少なくとも同じことをするには、モデルのコンテキスト長を「16384以上」に設定する必要があります。 作業規模によってはもっと大きい設定にする必要がありますが、大きいコンテキスト長を設定すればするほどメモリーを消費するので、作業に応じて設定すると良いと思います。