前回まで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(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の生成が走るようにします。起動するとこんな画面です。

工夫した点は2つです。
- 生成は別スレッド(QThread)で動かす:そうしないと生成中にアプリの画面が固まってしまいます。
- 1文字ずつ画面に流す:
stream=Trueで受け取った文字を、出力欄に順次追記。AIが“考えながら書いている”様子が見えます。
※ 当初はGUIに「tkinter」を使おうとしましたが、環境にtkinterが入っておらず動きませんでした(後述)。そこでtkinter不要のPySide6に切り替えています。画面の見た目を作るコードは少し長いので、要点だけ:「モデル読み込み→入力欄→実行ボタン→(別スレッドで生成)→出力欄に1文字ずつ追記」という流れです。
動かす:生成・要約・速度・オフライン確認
実際に使ってみます。モードは「文章を作る」と「要約」の2つ。まずは文章生成(先ほどの画像)、続いて要約です。長い文章を貼って実行すると、1文にまとめてくれました。

| 項目 | 結果(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ほど賢くはなくても、ちょっとした文章づくりや要約なら十分。プライバシーが気になる用途には特に向いています。
それでは、今回はここまで。最後までありがとうございました😊