はじめに
初めまして、K.S.ロジャースの大澤と申します。
「ローカルでLLMを動かしてみたい」——そう思って調べてみると、意外と簡単にできることがわかりました。
この記事では、Mac(Apple Silicon)にOllamaと日本語特化モデルELYZAをインストールして、ターミナル・API・ブラウザUIの3通りで使えるようにするまでの手順を紹介します。
これからローカルLLMを試してみたい方の参考になれば幸いです。
この記事でやること
- Ollamaのインストール
- 日本語モデル(ELYZA 8B)のダウンロードと動作確認
- curl / Python(OpenAI SDK)でAPI経由の利用
- Open WebUIでChatGPT風UIを追加
環境
| 項目 | 内容 |
|---|---|
| マシン | MacBook Air 13インチ(M4, 2025) |
| メモリ | 24GB |
| OS | macOS Sequoia |
| 前提 | Homebrew, Dockerインストール済み |
なぜDockerではなくネイティブインストールなのか
執筆時点(2026年5月)では、macOSのDocker DesktopはApple SiliconのGPUパススルーに対応しておらず、コンテナ内ではCPU推論にフォールバックして大幅に遅くなります。
そのため、Macではネイティブ実行が現状の定石です。
セットアップ
1. Ollamaインストール
brew install --cask ollama
Homebrewのcaskでインストールされ、/Applications/Ollama.appとして配置されます。
2. 自動起動を無効化(任意)
学習用途で常駐させたくない場合は、以下を確認します。
システム設定 → 一般 → ログイン項目と機能拡張を開き、「ログイン時に開く」リストにOllamaがあれば削除します。
補足: 自分の環境ではインストール直後・起動後ともにログイン項目には登録されていませんでした。バージョンによっては自動登録されない場合もあるようなので、なければスキップで問題ありません。
3. Ollamaを起動
open -a Ollama
メニューバーにOllamaアイコンが表示されればOKです。内部でhttp://localhost:11434にAPIサーバが立ち上がります。
4. ELYZAモデルをダウンロード
ollama pull hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF:Q4_K_M
約5GBのダウンロードです。
今回ELYZAを選んだ理由は以下の通りです:
- 日本語特化: 日本語の理解・生成に最適化されている
- 8Bパラメータ: 24GBメモリのMacで快適に動くサイズ感
-
Ollamaで簡単に取得できる:
ollama pull一発でダウンロード可能 - 情報が多い: 日本語での解説記事やコミュニティが充実している
注意: ライセンスや利用条件は変更される可能性があります。商用利用などを検討する場合は、必ず公式の最新情報を確認してください。
量子化レベルの選択肢:
| レベル | サイズ | 特徴 |
|---|---|---|
Q4_K_M |
約5GB | 推奨。速度と精度のバランス良 |
Q5_K_M |
約6GB | 精度をもう少し上げたい時 |
Q8_0 |
約8.5GB | ほぼフル精度。24GB Macなら問題なし |
5. 動作確認
ollama run hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF:Q4_K_M
対話モードに入るので、何か聞いてみます。
>>> 日本の首都はどこですか?
日本の首都は東京です。
日本語で正しく回答が返ってきました。/byeで対話モードを終了できます。
ここまでで基本セットアップは完了です。
API経由で利用する
OllamaはOpenAI互換APIを提供しているため、既存のOpenAI向けコードのbase_urlを差し替えるだけで使えます。
curlで叩く
curl -X POST http://localhost:11434/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF:Q4_K_M","messages":[{"role":"user","content":"日本の最高峰である富士山の高さは何メートルですか?"}]}'
実行すると、以下のようにOpenAI互換のJSONレスポンスが綺麗に返ってきます。
{
"id": "chatcmpl-236",
"object": "chat.completion",
"created": 1779359490,
"model": "hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF:Q4_K_M",
"system_fingerprint": "fp_ollama",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "日本の最高峰である富士山の高さは、3,776メートルです。ちなみに、富士山は活火山であり、現在も噴火の可能性がありますが、1980年に、ユネスコの世界文化遺産に登録されました。また、2007年には、万国博覧会(マナOS)で、自然を対象とした初の世界文化遺産として認定されています。日本人にとって特別な意味を持つ富士山は、国内外から大勢の登山者が訪れる、日本を代表する有名な山です。"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 41,
"completion_tokens": 135,
"total_tokens": 176
}
}
実行結果を見ての考察(ローカルLLMの面白さ)
富士山の高さ「3,776メートル」は見事に一発正解していますが、後半の補足に注目してください。
実際の登録年(2013年)と異なっていたり、「万国博覧会(マナOS)」という謎のパワーワードが飛び出したりしています。
これはLLMがもっともらしい嘘をつく「ハルシネーション」という現象です。
8Bクラスの軽量モデルならではの限界と愛嬌が見られますが、外部にデータを一切送信しない完全ローカル環境で、これだけの長文の日本語を爆速で生成できているAPIの挙動そのものは完璧です。
Python(OpenAI SDK)で叩く
pip3 install openai
※ macOSではpipではなくpip3を使います。
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama" # ダミー値でOK
)
response = client.chat.completions.create(
model="hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF:Q4_K_M",
messages=[
{"role": "system", "content": "あなたは日本語の分析アシスタントです。"},
{"role": "user", "content": "次のテキストを要約してキーワードを抽出してください: 人工知能は近年急速に発展しており、医療、教育、製造業など様々な分野で活用されています。"}
]
)
print(response.choices[0].message.content)
作成したコードを sample.py という名前で保存し、ターミナルから実行します。
python3 sample.py
実行結果:
要約:
人工知能が急速に進化し、医療、教育、製造業など多くの分野で使われています。
キーワード:
* 人工知能(AI)
* 発展
* 医療
* 教育
* 製造業
curlの時とは違い、Pythonコード側でresponse.choices[0].message.contentと指定して中身のテキストだけをピンポイントで取り出しているため、JSONではなく上記のような純粋なテキストだけがターミナルに表示されます。
ポイントはbase_urlをhttp://localhost:11434/v1に変えるだけという点。api_keyはダミー値で動きます。OpenAI SDKをそのまま使えるので、将来クラウドのAPIに切り替える際もコードの変更が最小限で済みます。
Open WebUIでChatGPT風UIを追加
ターミナルやAPIだけでなく、ブラウザでもChatGPTのように対話したい場合はOpen WebUIを使います。
docker-compose.yml
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "3000:8080"
environment:
- OLLAMA_BASE_URL=http://host.docker.internal:11434
volumes:
- open_webui_data:/app/backend/data
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
open_webui_data:
docker compose up -d
ブラウザでhttp://localhost:3000にアクセスすると、ChatGPT風のUIが表示されます。
仕組み
Open WebUIは裏側でOllamaのAPIを叩いているだけです。curlやPythonでやったことと同じことをブラウザUI上で実現しています。
ブラウザ (localhost:3000)
↓
Open WebUI (Dockerコンテナ内)
↓
Ollama API (Mac上、localhost:11434)
docker-compose.ymlのhost.docker.internalは、Dockerコンテナ内からMac本体のlocalhostにアクセスするための特殊なホスト名です。
初回アクセス時のアカウント登録
初回アクセス時にアカウント登録(名前・メールアドレス・パスワード)を求められます。執筆時点ではDockerボリューム内のSQLiteに保存される仕組みになっています。ローカル用途であれば適当な値で問題ありません。初回登録したユーザーがAdmin権限を持ちます。
実際に対話してみる
Open WebUIは裏側で先ほど確認したOllamaのAPIを叩いているだけですが、このようにブラウザUIを被せるだけで、使い心地は一気にChatGPTに近づきます。完全ローカルなので、自分だけの秘密のアイデア出しにも安心して使えます。
停止
docker compose down
補足:
ollama runの対話モードを/byeで終了しても、Ollama本体のAPIサーバ(メニューバー常駐)は動き続けるので、Open WebUIには影響ありません。Open WebUIが使えなくなるのはOllama本体を終了した場合(メニューバーからQuit Ollamaやkillall ollama)です。
トラブルシューティング
ollama pullでエラーが出る場合
Ollamaのバージョンによっては、Hugging Faceからの直接ダウンロードでタグ指定(:Q4_K_M)がうまく解釈されない場合があります。
その場合は末尾のタグを外して以下を試してください。デフォルトの量子化モデルがダウンロードされます。
ollama pull hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF
Open WebUIで「Connection Refused」になる場合
DockerコンテナからMac側のOllamaへの接続が拒否される場合、Ollamaがlocalhostのみで待ち受けている可能性があります。
以下のコマンドで全インターフェースからの接続を許可し、メニューバーからOllamaを一度Quitして再起動してください。
launchctl setenv OLLAMA_HOST "0.0.0.0:11434"
※ この設定はLAN内の他のマシンからもアクセス可能になります。共有ネットワーク上で使う場合はファイアウォール設定を確認してください。
まとめ
Mac(Apple Silicon)でOllama + ELYZAを使ったローカルLLM環境を構築しました。
- セットアップはコマンド数行で完了
- OpenAI互換APIのおかげで、既存のOpenAI SDKコードがそのまま使える
- Open WebUIを追加すればChatGPT風のブラウザUIも使える
- すべて完全ローカルで動くため、データが外部に出ない
モデルのダウンロード(約5GB)が一番時間のかかる工程で、それ以外は特にハマることなくスムーズに構築できました。ローカルLLMに興味がある方は、まずはOllama + ELYZAから試してみることをおすすめします。

