最初に
Ollamaを最初に入れたのは半年くらい前だった。「ローカルでLLMが動く」という話を聞いて、深く考えずにbrew install ollamaを叩いて、そのまま放置した。なにが動かせるかもよくわかってなかったし、当時はClaudeのAPIを使えば済む話だと思っていた。
でも今は毎日使っている。
BSky投稿の量産、note記事の下書き生成、ログの要約——これ全部Ollamaが担っている。APIコストが実質ゼロになった分、気兼ねなく大量処理できるようになった。MacBook Pro M5に載せてみたら思ったより速くて、正直こんなに使えるとは思っていなかった。
この記事では、Ollamaのインストールからqwen3.5:9bが動くまでの流れを、詰まりポイントも含めて書いておく。
Homebrewでのインストールとサービス起動
brew install ollama
これだけ。終わり、というわけでもない。
インストール後にすぐollama run llama3を試したら「connection refused」になった。サービスが起動していなかっただけなんだけど、最初はわからなくてターミナルを再起動したり、Ollamaのバイナリパスを確認したりで30分くらい溶かした。
正解はこれ。
brew services start ollama
これでバックグラウンドでサービスが立ち上がる。http://localhost:11434が疎通確認の基本。
curl http://localhost:11434
Ollama is runningと返ってくればOK。返ってこなければサービスが起動していない。
qwen3.5:9bを入れるまで
モデルを引っ張るのはpullコマンド。
ollama pull qwen3.5:9b
最初に入れたのはllama3だったんだけど、日本語の品質が微妙だった。英語の質問には強いけど、日本語のブログ記事を生成させると文体が崩れる。
qwen3.5:9bは日本語の精度が体感でかなり上。中国のAlibabaが作ったモデルで、アジア言語への対応が強い。9Bなので重いわけでもなく、M5のメモリ32GBに対して余裕がある。
ダウンロードには時間がかかる。5〜6GBくらいある。Wi-Fi環境で20〜30分は見ておいた方がいい。進捗はターミナルに表示されるので放置でOK。
動作確認はこれ。
ollama run qwen3.5:9b "Pythonで簡単なHello Worldを書いて"
print("Hello, World!")
が返ってくれば動いている。当たり前の結果だけど、最初にこれが動いたときは妙に嬉しかった。
Python から叩く—APIの使い方
Ollamaはローカルでのチャット以外に、REST APIとして叩ける。これが本番環境での使い方になる。
import requests
def ask_ollama(prompt: str, model: str = "qwen3.5:9b") -> str:
res = requests.post(
"http://localhost:11434/api/generate",
json={
"model": model,
"prompt": prompt,
"stream": False,
"options": {"think": False}
}
)
return res.json()["response"]
result = ask_ollama("launchdとcronの違いを100字で説明して")
print(result)
stream: Falseにしているのは、レスポンスを一括で受け取りたいから。stream処理も書けるけど、パイプラインに組み込む場合は一括の方がシンプル。
think: Falseはqwen3.5系モデル向けの設定。このフラグを省略すると推論ステップが出力に混入することがある。パイプラインに組み込む場合は必ず入れておく。
launchd でサービスを常時起動させる
brew services start ollamaだとMacが再起動したときに起動するかが不安定なことがある。確実に常駐させるならlaunchdのplistを自分で書いた方がいい。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.taito.ollama</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/ollama</string>
<string>serve</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/ollama.log</string>
<key>StandardErrorPath</key>
<string>/tmp/ollama_err.log</string>
</dict>
</plist>
これを~/Library/LaunchAgents/com.taito.ollama.plistに置いて、
launchctl load ~/Library/LaunchAgents/com.taito.ollama.plist
Mac起動後に自動でOllamaが立ち上がるようになる。KeepAlive: trueを入れているのでクラッシュしても自動再起動してくれる。
ちなみにollama serveのパスはwhich ollamaで確認すること。Apple Siliconだと/opt/homebrew/bin/ollamaになるけど、Intelだと/usr/local/bin/ollamaになる。ここを間違えるとplistが何も起動しないまま無言で失敗する。
Claude と Ollama のハイブリッド運用
今の僕の構成は、品質が必要な出力にはClaude(Haiku/Sonnet)、量産・ログ処理・下書きにはOllamaを使い分けている。
パイプライン全体をai_client.pyという薄いラッパーで統一していて、設定ファイルを変えるだけでどちらのモデルを使うかを切り替えられるようにしてある。
# ai_config.yaml
prefer_claude: true # false にすれば全Ollama
tasks:
bsky_post: haiku
note_article: sonnet
log_analysis: qwen3.5:9b
prefer_claude: falseに変えれば全タスクがOllamaに流れる。API費用が心配な月はこれで乗り切る。
Ollamaだけで回してみた週があった。体感品質は落ちるけど、量産が目的の作業なら十分だった。「完璧より継続」の精神でいえば、動いていることの方が大事。✨
詰まりポイントまとめ
実際に引っかかった場所を書いておく。
サービスが起動していない問題は、brew services listでollamaのステータスを確認すれば一発でわかる。startedになっていれば問題なし。stoppedならbrew services start ollama。
モデルのダウンロード中にnetwork timeoutになる場合は、再度ollama pullを実行すれば途中から再開してくれる。一から落とし直しにはならないので安心していい。
Pythonから叩いたときにConnectionRefusedErrorが出る場合は、まずcurl http://localhost:11434を叩いてサービスの死活を確認する。Ollamaが生きていればPython側の問題(URLミスや依存関係)。
qwen3.5:9bが日本語を返してくれない場合は、プロンプトを日本語で明示的に書くか、「日本語で答えてください」を一行追加すると大体解決する。
まとめ
Ollamaは入れてしまえば単純。詰まるのは最初のconnection refusedと、qwen3.5のthinkフラグ周りくらい。
使い始めてから、量産系の処理をClaude APIに頼ることがほぼなくなった。月のAPIコストが目に見えて下がった。その分、品質が必要なところへClaude(Haiku)を集中させられるようになった。
ローカルLLMを試していない人は、まずollama pull qwen3.5:9bの一行から始めてみるといいと思う。動いた瞬間の感覚は、試してみた人にしかわからない。