前回までUnity/Unrealの3D制作が続きましたが、今回はAIの回です。テーマは「ネット接続なしで動くAIアプリをMacで自作する」p911で触れたローカルLLM(自分のパソコンの中で動くAI)を、今回は1つのデスクトップアプリに組み込んで、オフラインで文章生成や要約ができるようにします。

🤖 この記事でわかること
・AIをアプリの中に組み込んで、ネットなしで動かす方法
・軽量LLM(Qwen2.5-3B)を llama-cpp-python でアプリに直接読み込む書き方
PySide6 で文章生成・要約のGUIアプリを作る流れ
・Apple SiliconのGPU(Metal)で約38トークン/秒。インストール・モデル・コードまで再現できるよう解説

作るもの:ネットなしで動くAIアプリ

スポンサーリンク

完成したのがこちら。「ローカルAIメモ」という小さなデスクトップアプリです。入力欄に質問や文章を入れて実行すると、ネットに繋がっていなくてもAIが文章を作ったり要約したりします。

ローカルAIメモ アプリの動作画面(文章生成)
自作アプリ「ローカルAIメモ」。完全オフラインで文章生成(約38 tok/s)

ポイントは「AIモデルをアプリの中に組み込んでいる」こと。クラウドのAI(ChatGPT等)と違い、文章はすべて手元のMacの中だけで生成されます。だから――

  • プライバシーが安心:入力した内容が外部に送られない
  • 無料・無制限:APIの利用料がかからない
  • ネット不要:機内モードでも動く

仕組み:LLMを“アプリに組み込む”とは

ローカルでAIを動かす方法はいくつかありますが、今回は「アプリ自体にAIモデルを読み込ませる」方式にしました。全体はとてもシンプルです。

部品役割
AIモデル(gguf形式)頭脳。今回は軽量で日本語が得意な Qwen2.5-3B(約1.8GB)
llama-cpp-pythonモデルをアプリに直接読み込んで動かすライブラリ
PySide6ウィンドウ・ボタンなどの画面(GUI)を作る

※ 似たツールに「Ollama」がありますが(p911で使用)、あれは裏でAIサーバーを動かす方式。今回はアプリ単体にモデルを抱える“組み込み”方式で、「端末の中で動くAI」というテーマにより近い形にしています。

用意するもの(インストール・モデル)

必要なのは2つのライブラリと、AIモデル1つです。Apple Silicon(M1〜)のMacを想定しています。

# 1) ライブラリ(llama-cpp-pythonはApple SiliconのGPU=Metalに自動対応)
pip install llama-cpp-python PySide6

# 2) AIモデル(Qwen2.5-3B Instruct, Q4_K_M 約1.8GB)をダウンロード
curl -L -o qwen2.5-3b-instruct-q4_k_m.gguf \
  "https://huggingface.co/bartowski/Qwen2.5-3B-Instruct-GGUF/resolve/main/Qwen2.5-3B-Instruct-Q4_K_M.gguf"

モデルは「gguf」という、ローカル実行用に圧縮された形式のファイルです。3B(30億パラメータ)クラスは軽くて、メモリ16GBくらいのMacでも動きます(今回は32GBで余裕でした)。

STEP1:LLMをアプリに組み込む(数行で動く)

まず“頭脳”の部分。たった数行で、ダウンロードしたモデルを読み込んで文章を生成できます。

from llama_cpp import Llama

# モデルを読み込む(n_gpu_layers=-1 で全部をGPU=Metalに載せる=速い)
llm = Llama(
    model_path="qwen2.5-3b-instruct-q4_k_m.gguf",
    n_ctx=4096,        # 一度に扱える文章の長さ
    n_gpu_layers=-1,   # Apple SiliconのGPU(Metal)をフル活用
)

# 文章を生成(stream=True で1文字ずつ返ってくる=画面に流せる)
for out in llm.create_chat_completion(
        messages=[{"role": "user", "content": "ローカルLLMの良いところを3つ教えて"}],
        max_tokens=512, stream=True):
    print(out["choices"][0]["delta"].get("content", ""), end="")
💡 速さのカギは n_gpu_layers=-1
この1行で、AIの計算をApple SiliconのGPU(Metal)に任せます。これがあると無いとで速度が大きく変わり、今回は 約38トーク/秒(人が読むより速いくらい)で文章が出てきました。stream=True にすると文字が少しずつ返るので、画面に“タイピングするように”表示できます。

STEP2:GUIを作る(PySide6)

頭脳ができたら、画面(GUI)を付けてアプリにします。PySide6でウィンドウ・入力欄・ボタン・出力欄を並べ、ボタンを押すとSTEP1の生成が走るようにします。起動するとこんな画面です。

アプリ起動画面(準備OK)
起動してモデルを読み込むと「準備OK・完全オフライン」に。あとは入力して実行するだけ

工夫した点は2つです。

  • 生成は別スレッド(QThread)で動かす:そうしないと生成中にアプリの画面が固まってしまいます。
  • 1文字ずつ画面に流すstream=True で受け取った文字を、出力欄に順次追記。AIが“考えながら書いている”様子が見えます。

※ 当初はGUIに「tkinter」を使おうとしましたが、環境にtkinterが入っておらず動きませんでした(後述)。そこでtkinter不要のPySide6に切り替えています。画面の見た目を作るコードは少し長いので、要点だけ:「モデル読み込み→入力欄→実行ボタン→(別スレッドで生成)→出力欄に1文字ずつ追記」という流れです。

動かす:生成・要約・速度・オフライン確認

実際に使ってみます。モードは「文章を作る」「要約」の2つ。まずは文章生成(先ほどの画像)、続いて要約です。長い文章を貼って実行すると、1文にまとめてくれました。

要約モードの動作画面
要約モード。長文を貼って実行→1文に要約(こちらもオフライン・約38 tok/s)
項目結果(Mac・Apple Silicon・32GB)
生成速度約37〜39 トークン/秒(読むより速い体感)
モデル読み込み初回 約8秒(2回目以降はOSキャッシュで速い)
モデルサイズ/メモリ約1.8GB/動作中の使用メモリも数GB程度で余裕
ネット接続不要(機内モードでも同じように動く)
日本語の品質3Bクラスでも自然。要約・箇条書きも実用的

本当にオフラインかは、Wi-Fiを切って実行すれば確認できます。クラウドAIなら止まりますが、このアプリは変わらず動きます。文章が手元から一切出ていかない、という安心感があります。

つまずきポイントと対処

  • GUIの「tkinter」が使えなかった:環境のPythonにtkinterが含まれておらずエラー。→ tkinter不要の PySide6 に変更して解決。pip だけで入るので再現も簡単です。
  • モデルが遅い/GPUを使わないn_gpu_layers=-1 を付け忘れるとCPUだけで動いて遅くなります。Apple Siliconなら必ず付けるのがコツ。
  • モデル選び:大きすぎるモデルは重い/メモリ不足に。まずは3Bクラスの軽量ggufから。日本語重視なら今回の Qwen2.5 系が扱いやすいです。
  • 初回だけ読み込みが遅い:モデルをメモリに載せるため初回は数秒。アプリは「読み込み中→準備OK」を表示して、固まって見えないようにしました。

まとめ:完全ローカルAIの良さ

軽量LLMをアプリに直接組み込むことで、ネットなし・無料・プライバシー安心のAIアプリがMacでちゃんとできることがわかりました。しかもApple SiliconのGPUのおかげで、3Bクラスなら体感サクサク(約38 tok/s)です。

  • llama-cpp-python で gguf モデルを数行で読み込み(n_gpu_layers=-1でMetal活用)
  • PySide6 で画面を付けて、生成は別スレッド+1文字ずつ表示
  • クラウドに送らないので機密メモ・下書き・要約に安心して使える

「自分のパソコンの中だけで動くAI」は、使ってみると思った以上に実用的でした。クラウドのAIほど賢くはなくても、ちょっとした文章づくりや要約なら十分。プライバシーが気になる用途には特に向いています。

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