「コードを手伝ってくれるAIは便利だけど、ネットにつながっていないと使えない」——出先やオフライン環境だと、それが地味に困ります。そこで今回は、ネット接続ゼロで動く“オフラインのコーディング相棒”を作ってみました😊 しかも一から新しいアプリを作るのではなく、以前作ったローカルAIエージェントへの「機能追加」として仕立てます。

💻 この記事でわかること
コード特化のローカルLLM(Qwen2.5-Coder)をエージェントに積む方法
GUIで使うモデルを切り替える仕組み(汎用 ⇔ コード特化)
CLIから呼ぶ薄い入口(将来VS Codeからも叩ける設計)
・クラウドAIとの違い、そして「14Bは12GBのGPUには重く、7Bが最適」という実測のつまずき
Mac / Windows 同じコードで動いた話

土台:p935 ローカルAIエージェント(Ministral 3・完全ローカル・道具=ファイル/コマンド/検索)。今回はここに“コード脳”と“入口”を足します。実装はMac、動作確認はMacとWindows(RTX3060)の両方で行いました。

作るもの:ネットなしで動く“コード相棒”

スポンサーリンク

ゴールはシンプルです。ローカルのLLMに、コードの生成・修正・説明をやってもらう。全部手元のパソコンの中で完結するので、ネットは不要・無料・コードが外に出ないのが持ち味です。下が完成形。エージェントの画面で「2つのリストを結合して重複を除く関数を書いて」と頼むと、そのままコードが返ってきます。

ローカルAIエージェントのコーディングモードで、Qwen2.5-Coderがコードを生成した画面
コーディングモードでコードを生成。上部の「モデル」を Qwen2.5-Coder に切り替えると、ステータスに「切替」と出て、以降はコード特化モデルが答える。すべてローカル=ネット不要

なぜ“エージェントに足す”のか

ローカルLLMのネタは毎回ゼロから作ってもいいのですが、それだと似た仕組みを何度も作り直すことになります。p935で作ったエージェントは、すでに「ファイルを読む・書く」「コマンドを実行する」「記憶する」といった“道具”を持っています。コード相棒に必要な部品は、実はほとんどそこに揃っているんですよね😳

そこで今回は独立アプリを作らず、そのエージェントに「コード脳(モデル)」と「使い方(モード・入口)」を追加する方針にしました。エージェントが“集大成”として育っていくイメージです。足したのは主に次の3つです。

  • コード特化モデルを積めるようにした(Qwen2.5-Coder)
  • GUIで使うモデルを切り替えられるようにした(汎用のMinistral 3 ⇔ コード特化)
  • CLIの入口を用意した(コマンドから・将来はエディタから呼べる)

コード特化モデルを積む+GUIでモデル切替

ふだん使いのエージェントは、汎用モデルMinistral 3(文章も画像もいける)で動いています。でもコードとなると、コード特化で訓練されたモデルのほうが得意です。今回はQwen2.5-Coderを追加しました。

ポイントは、用途に応じてGUIから切り替えられるようにしたこと。画面上部に「モデル」のプルダウンを付け、汎用(Ministral 3)とコード特化(Qwen2.5-Coder)をワンタッチで行き来できます。

エージェント画面上部に追加したモデル切替プルダウンとコーディングモードのチェック
上部に追加した「モデル」プルダウンと「コーディングモード」チェック。汎用 ⇔ コード特化を切り替えられる。コード特化を選ぶとコーディングモードは自動でON
⚙ メモリの都合=“1つずつ”読み込む切替式
14B級のモデルは1つで8〜9GBあり、2つ同時にメモリへ載せるのは厳しいです。そこで切り替えるときは「先に今のモデルを解放してから、次を読み込む」方式にしました。これで手元のマシンでも破綻せずに行き来できます。

コーディングモードで使う

「コーディングモード」をONにすると、エージェントの振る舞いがコード寄りになります。まずコードを提示し、説明は簡潔に。既存ファイルを直すときはread_file で中身を見てから write_file で書き出す——といった“相棒らしい”動きです。

面白いのが、同じ依頼を汎用モデルとコード特化モデルで比べられること。下は同じ「重複を除く関数」を、汎用のMinistral 3に頼んだ結果です。

同じ依頼を汎用モデルMinistral 3で生成した結果
同じ依頼を汎用モデル(Ministral 3)で。list(set(a + b))と解説・注意点まで。コード特化モデルはlist(set(a) | set(b))で、どちらも正解。簡単な課題では差は出にくい

今回のような小さな課題では、汎用でもコード特化でもどちらも正しく答えられました。差が出てくるのは、もっと難しい・長いコードのときです。

CLIからも呼ぶ(将来VS Codeからも)

GUIだけでなく、コマンド(CLI)からも呼べる入口を用意しました。ターミナルでこんな風に使えます。

# ファイルを渡して「型ヒントを付けて」と頼む
python cli.py code "この関数に型ヒントを付けて" --file util.py

# 標準入力からでもOK(長い依頼を渡しやすい)
echo "二分探索をPythonで" | python cli.py code --stdin

この入口は「答え(コード)だけを標準出力に出す」ように作ってあります。進捗ログはすべて別の出口(標準エラー)へ。だから出力をそのまま受け取って貼り付け・自動処理ができます。これはつまり——将来、VS Codeのタスクや拡張から python cli.py code --file (開いているファイル) と呼べば、そのまま使えるということ。今回はVS Code拡張までは作りませんが、“後からつなげられる”薄い入口にしておきました✍️

WindowsのPowerShellでCLIからコード生成し、答えのコードだけが標準出力に出ている画面
CLIでファイルに型ヒントを付けさせた例(Windowsでの実行)。答えのコードだけが標準出力に出て、終了コードは0。この“素直な出口”がエディタ連携の土台になる

クラウドAIとの違い

正直なところ、難しい設計や長い実装は、クラウドの強いAI(Claudeなど)のほうが上です。そこは割り切ります。ローカルの相棒が輝くのは、次のような場面です。

観点 ローカル相棒(今回) クラウドAI
ネット不要(オフライン)必要
料金無料(電気代のみ)従量課金が多い
プライバシーコードが外に出ない送信が必要
賢さ(難問)そこそこ強い
速さGPU次第(後述)安定して速い

「関数にテストや型ヒントを付ける」「短い関数を書く」「エラーの意味を聞く」——こういう日常の細かい相談は、オフラインの相棒で十分こなせます。機密コードを外に出さずに済むのも大きな安心感です。

つまずき:14Bは12GB GPUに重い→7Bが最適

ここが今回いちばんの学びです😳 最初、コード特化モデルにQwen2.5-Coder の14B(約9GB)を選びました。Mac(メモリ共有型)では問題なく動いたのですが、Windows(RTX3060/VRAM 12GB)で動かすと極端に遅いのです。原因を追うと——

⚠ 14Bが遅い理由=VRAM(GPUメモリ)の溢れ
CPUで動いていたわけではありません(GPUには載っていた)。問題は12GBのVRAMに14Bモデルがギリギリで、デスクトップやブラウザとGPUメモリを取り合うと溢れること。溢れると一部が遅いシステムメモリに退避し、生成が1.4トークン/秒まで落ちました(体感で数分待ち)。

そこで7B(約4.5GB)に切り替えたところ、同じRTX3060で22トークン/秒=約15倍速く、読み込みも3秒。VRAMに余裕で収まり、溢れが起きません。しかも今回の課題では7Bでも14Bと同じ正解でした。

モデル サイズ 読込 生成速度
Qwen2.5-Coder 14B約9GB26〜45秒1.4 tok/s(溢れ時)
Qwen2.5-Coder 7B約4.5GB3.3秒22 tok/s

結論:NVIDIAの8〜12GBクラスのGPUなら、コード特化は7Bが“ちょうどいい”。14Bは賢さの上限は高いものの、VRAMに余裕がないと実用速度が出ません。今回のエージェントは7B・14Bの両方をGUIから選べるようにして、既定は軽い7Bにしました。下は3モデルが選べる状態(汎用+コード特化7B/14B)です。

cli.py models で3モデル(Ministral 3・Qwen2.5-Coder 7B・14B)がダウンロード済みと表示される画面
使えるモデル一覧(Windows)。汎用のMinistral 3、コード特化のQwen2.5-Coder 7B/14Bを用途とマシンに合わせて選べる

Mac/Windows 両方で動いた

このエージェントはMac と Windows で同じコードで動かしています。今回追加した機能(モデル切替・コード特化モデル・CLI)も、Windowsへコピーしただけ・コードの書き換えゼロで動きました。前章のWindowsでの速度計測やCLIの画面が、その証拠です。

ひとつだけWindows特有の勘どころがあります。llama.cpp(LLMを動かす土台)はGPUを使う版(CUDA対応ビルド)を入れておくこと。これが揃っていれば、「Macで作って、Windowsでも同じように使える」オフライン相棒になります👍

再現に必要なもの

  • 土台p935 のローカルAIエージェント(Python / llama-cpp-python / PySide6)。Mac・Windows共通
  • 汎用モデル:Ministral 3 14B(文章・画像・道具)。コード特化モデル:Qwen2.5-Coder(7B推奨/14Bも可)。GGUF形式をローカルに配置
  • モデル切替:GUIのプルダウンで選択。切替時は“今のモデルを解放→次を読み込む”(メモリ節約)
  • コーディングモード:コード寄りの振る舞い+既存のファイル/コマンド道具でファイルを直せる
  • CLI入口python cli.py code "..." --file ...。答えだけを標準出力に出す=将来VS Codeなどから呼べる
  • GPU:WindowsはCUDA対応のllama.cpp。VRAM 8〜12GBなら7Bが最適(14Bは溢れて激遅になりやすい)

まとめ

ネット接続なしで動くオフラインのコーディング相棒を、ローカルAIエージェントへの機能追加として作れました。ポイントを整理します。

  • 独立アプリを作らず既存エージェントに“コード脳”と“入口”を追加(ファイル/コマンドの道具は流用)
  • GUIでモデル切替(汎用 ⇔ コード特化)。メモリ節約のため1つずつ読み込む切替式
  • CLIは答えだけを標準出力に=将来VS Codeなどから呼べる薄い入口
  • クラウドAIより難問は弱いが、オフライン・無料・コードが外に出ないのが強み
  • 実測の学び:12GB GPUでは14Bは溢れて激遅。7Bが最適(約22 tok/s)。両方をGUIで選べるように
  • Mac / Windows 同じコードで動く(Windowsはllama.cppのCUDA版が必要)

「AIのコード支援はクラウドがないと…」と思っていたなら、手元のGPUで動く相棒は一度試す価値があります。7Bクラスなら想像よりずっとサクサク動いて、しかもコードは1行も外に出ません。オフラインでも、隣に相談相手がいる感覚になります😊

それでは、今回はここまで。最後までありがとうございました😊