ローカルLLM（Qwen3）とVS Codeを連携してみた

## ローカルLLMでコーディング支援は出来るのか
**GitHub Copilot**, **Cursor**, **Cline**, **Windsurf**などコーディング支援系AIサービスが多く登場しておりますが、セキュリティやコストの観点から業務への導入にはハードルを感じているプロジェクトもいまだ多くあるかと思われます。

ローカルLLMによるコーディング支援が可能になると、**以下のメリット**があります。
- 外部に情報を送信せずにローカルマシンで完結できる
- インターネット接続不要
- サブスクリプション費用不要
- 必要に応じて、モデルの選択やカスタマイズができる

そこで、今回は最新モデルを使用したローカルLLMとVS Codeを連携し、どれだけ使えるかを実験してみます。
## PCスペック
- OS: Windows 11 64ビット (24H2, OS ビルド 26100.3915)
- メモリ 16GB
- 専用GPUなし

## Ollama（オラマ）のインストール
https://ollama.com/

**Ollama**はローカルでLLMを利用するためのオープンソースアプリケーションです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/350140e8-34f9-499b-a7a4-9842640d6bf8.png)
上記リンクからOllamaのインストールができます。

## Qwen3モデルのダウンロード
https://ollama.com/search

↑利用可能なモデル一覧が確認できます。
今回はアリババが2025/4/29に公開した最新モデルの[Qwen3](https://ollama.com/library/qwen3)をダウンロードしてみます。
モデルのパラメータ数が選択できますが、今回は[4bのモデル](https://ollama.com/library/qwen3:4b)で実験してみます。

下記コマンドにより、モデルがダウンロードされ、ダウンロード完了次第モデルが実行可能な状態になります。
```powershell
ollama run qwen3:4b
```
[http://localhost:11434/](http://localhost:11434/)をブラウザから開くことで、Ollamaが起動しているかを確認できます。
## コマンドラインからQwen3と対話してみる
デフォルトで **Thinking Mode（推論モード）** になっているため、前置きが長く、出力に時間がかかります。
```powershell
>>> こんにちは
<think>
Okay, the user said "こんにちは" which is Japanese for "Hello". I need to respond in a friendly and welcoming manner. Since they might be a non-native speaker, I should keep the response simple and
positive. Maybe start with a greeting in Japanese, then a welcome message in English. I should also offer assistance and ask how I can help them today. Keep it conversational and open-ended to encourage
further interaction.
</think>

こんにちは！😊
ようこそ、ここに来てくれて本当にうれしいです。
どんなことをお手伝いできますか？
何か質問があれば、いつでもお気軽におねがいください！
```
30秒程度で返答されました。プロンプトの後ろに`/nothink`または`/no_think`をつけることで、推論を行わない`Non-Thinking Mode`で出力されます。
```powershell
>>> こんにちは /nothink
<think>

</think>

こんにちは！どうぞよろしくお願いします。何かお手伝いできますか？
```
こちらは5秒程度で出力されました。

今回コード補完やチャットに使用する際は推論を行わない`Non-Thinking Mode`で設定していきます。

## VS Codeとの連携
1. 拡張機能のContinueを入れる
https://www.continue.dev/
2. `.continue\config.json`に以下を記述する
```json
{
  "models": [
    {
      "title": "qwen3:4b",
      "provider": "ollama",
      "model": "qwen3:4b",
      "systemMessage": "/nothink",
      "apiBase": "http://localhost:11434"
    }
  ],
  "tabAutocompleteModel": {
    "title": "qwen3:4b",
    "provider": "ollama",
    "model": "qwen3:4b",
    "systemMessage": "/nothink",
    "apiBase": "http://localhost:11434"
  }
}
```
上記でVS Code側の設定は完了です。

## ゼロからゲームを作らせてみる
今回はじゃんけんゲームを作成してもらいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/018590d7-a8ed-4372-b099-7acff6187344.png)
2分ほどで動作するコードを出力してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/504cca46-6cf1-4003-b1e8-f689431feac4.png)
（実際にん手みたいな些細なミスあり）

## 既存のコードについて質問してみる
上記のじゃんけんゲームについて部分的に質問してみました。Continueではコードを範囲選択し、`ctrl+L`でチャットにコードを追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/e9f70f5d-4d9c-4c49-959f-c1b95102da99.png)
1分半ほどで処理の説明を出してくれました。

## 既存のコードを修正してもらう
上記のじゃんけんゲームについて部分的に修正をしてみました。Continueではコードを範囲選択し、`ctrl+I`でチャットにコードを追加し、編集を依頼できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/68bbd228-71f9-4030-ae8f-b7129f777f92.png)
要求に対して2分ほどでコードを修正してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/502189e9-0f5e-45d6-8670-77cf461df085.png)
ちゃんと動作もします

## タブ補完をさせてみる
設定やPCスペックの問題かもしれませんが、コード補完の提案までにコーディングの手を1~2分止める必要があり、あまり実用的ではなさそうです。

## 使い物になるかどうか
| ユースケース | 評価 | 使用感 |
|------|------|------|
| チャットによる対話 | 〇 | 問題なく使用できる、少し出力が遅い（軽い要求なら1～2分）、物量の多いコードは同時に読み込ませられない |
| エディットモードによるコード修正 | 〇 | 問題なく使用できる、少し出力が遅い（軽い要求なら1～2分）、コード範囲が広いと時間がかかる（100行のコードの修正に10 分かかった） |
| コードのタブ補完 | △ | 1~2分コーディングの手を止めないとコードの提案がされない、提案の精度も少し微妙 |
| エージェントモード | （現状ローカルLLMでは使用できない） | - |

## メモリを食うのがデメリット
4bのモデルだと、使用中はつねに3~4GBほどのメモリを占領するので、メモリに余裕がないPCだと動作が難しいです。

## （追加実験）Qwen3:14bモデルでも同様の実験をしてみましたが。。
上記スペックのPCで動作するおそらく限界である[14bのモデル](https://ollama.com/library/qwen3:14b)でも実験してみました。<br>（噂では、14bのモデルでGPT-4oに匹敵する性能を持っているとのこと。）
14bのモデルは、メモリを10GB程度空けないと動作しませんでした。また、コードのエディットに30分程度要したり、PCのスペック不足のためかとても実用的な動作はしませんでした。

## まとめ
GitHub CopilotやCursorで利用できる上位モデルを使用する場合と比較すると、まだまだ使い勝手が不十分なところもあります。<br>
しかしながら、軽量な要求に限定すれば、ローカルLLMによるコーディングアシスタントは十分使い物になりました。
セキュリティやコストの観点から生成AIの利用が制限されるプロジェクトで、ローカルLLMを導入するのは大いに可能性を感じました。
さらにメモリやGPUを積んであるPCであれば、もっと大きいモデルをサクサク利用できるので、高スペックのPCや自前のサーバーで大きいLLMモデルをホストするのもありかもしれません。