OllamaをcurlとAPIで操作する|モデル切り替えの実践手順

OllamaをcurlとAPIで操作する|モデル切り替えの実践手順

※本記事にはプロモーション(広告・アフィリエイトリンク)を含みます。

Ollama でローカル LLM を動かしていると、用途によってモデルを使い分けたい場面が出てきます。会話には llama3.2、コード補完には deepseek-coder、日本語処理には qwen2.5 —— そのたびにターミナルを開き直すのは非効率です。REST API と curl を組み合わせれば、スクリプトや外部ツールからモデルを直接操作できます。この記事では Ollama API の基本構造から、モデル一覧の取得・生成リクエスト・削除まで、curl で再現できる手順を説明します。

Ollama API の基本構造

Ollama はデフォルトで http://localhost:11434 に REST API を公開します。認証なしで使えるためローカル環境ではすぐに叩けますが、外部に公開する場合は別途アクセス制御が必要です。

執筆時点の公式ドキュメントに記載されている主なエンドポイントは以下の通りです。バージョンアップで変わる可能性があるため、手元の ollama --version と公式ドキュメントを合わせて確認してください。

エンドポイント メソッド 役割
/api/tags GET インストール済みモデル一覧
/api/ps GET 現在メモリに乗っているモデル
/api/generate POST テキスト生成(補完形式)
/api/chat POST チャット形式の生成
/api/pull POST モデルのダウンロード
/api/delete DELETE モデルの削除
/api/show POST モデル詳細情報の取得

インストール済みのモデルを確認するには GET /api/tags を叩きます。

curl http://localhost:11434/api/tags

jq が入っていればモデル名だけ抜き出せます。

curl -s http://localhost:11434/api/tags | jq -r '.models[].name'

現在メモリに乗っているモデルを確認するには /api/ps を使います。

curl http://localhost:11434/api/ps

モデルを指定してテキストを生成する

Ollama API に「モデルを切り替えるコマンド」は存在しません。リクエストごとに model フィールドで使うモデルを指定する設計で、model の値を変えるだけで切り替えられます。

curl -X POST http://localhost:11434/api/generate \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.2",
    "prompt": "Rustの借用規則を200字で説明してください",
    "stream": false
  }'

"stream": false を指定すると、生成が完了してから一括でレスポンスが返ります。省略するとトークンごとにストリーミングされるため、curl で扱うと行が分断されて読みにくくなります。スクリプトから呼ぶ場合は false を付けるのが無難です。

別のモデルを使うには model を変えるだけです。

curl -X POST http://localhost:11434/api/generate \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-coder:6.7b",
    "prompt": "Pythonでバブルソートを実装してください",
    "stream": false
  }'

生成パラメータを調整したい場合は options フィールドを追加します。

curl -X POST http://localhost:11434/api/generate \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.2",
    "prompt": "短い挨拶文を書いてください",
    "stream": false,
    "options": {
      "temperature": 0.7,
      "top_p": 0.9,
      "num_predict": 100
    }
  }'

temperature は出力の多様性(0.0 が決定論的、高いほどランダム)、num_predict は最大トークン数です。

チャット形式で使う

会話の文脈を引き継ぎたいときは /api/chat を使います。messages 配列にロールと内容を渡します。

curl -X POST http://localhost:11434/api/chat \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen2.5:7b",
    "messages": [
      {"role": "user", "content": "日本の首都はどこですか?"}
    ],
    "stream": false
  }'

複数ターンの会話をするには、messages 配列に前のやりとりを追加して再送します。Ollama 側でセッションを保持する仕組みはないため、毎回フル履歴を渡す設計です。

VRAM の挙動と keep_alive

モデルを切り替えたタイミングで旧モデルが即アンロードされるわけではありません。Ollama は使用後のモデルをしばらくメモリに保持します。

保持時間は OLLAMA_KEEP_ALIVE 環境変数で制御します。公式ドキュメントによるとデフォルトは 5m(5分)です。

# 保持時間を2分に設定して起動する例
OLLAMA_KEEP_ALIVE=2m ollama serve

VRAM が限られた環境で大きいモデルを複数切り替えると、旧モデルが残っていて新しいモデルをロードできないことがあります(環境によって異なります)。OLLAMA_KEEP_ALIVE を短くするか、リクエスト単位で keep_alive を指定すると制御できます。

# このリクエスト終了後すぐにアンロードする
curl -X POST http://localhost:11434/api/generate \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.2",
    "prompt": "こんにちは",
    "stream": false,
    "keep_alive": "0"
  }'

"keep_alive": "0" にすると、レスポンスを返した直後にモデルをメモリから解放します。逆に "-1" を指定すると無期限に保持します。VRAM に余裕があるなら、ある程度保持させておくほうが2回目以降のレスポンスが速くなります。

モデルの追加と削除

追加(pull)

curl -X POST http://localhost:11434/api/pull \
  -H "Content-Type: application/json" \
  -d '{"name": "gemma2:9b"}'

ダウンロードの進捗はストリーミングで返ってきます。大型モデルは数GB あるため、curl がタイムアウトしないよう --max-time に余裕を持った値を設定してください。

削除

curl -X DELETE http://localhost:11434/api/delete \
  -H "Content-Type: application/json" \
  -d '{"name": "gemma2:9b"}'

成功すると 200 OK で空のレスポンスが返ります。モデル名が見つからない場合はエラーになります。削除前に /api/tags で正確な名前を確認してください(:latest などタグの付き方に注意)。

Python から組み込む場合

curl で動作確認が取れたら、Python や Node.js からも同じエンドポイントを直接呼べます。

import requests

def generate(model: str, prompt: str) -> str:
    res = requests.post(
        "http://localhost:11434/api/generate",
        json={"model": model, "prompt": prompt, "stream": False},
        timeout=120,
    )
    res.raise_for_status()
    return res.json()["response"]

MODELS = {
    "chat": "llama3.2",
    "code": "deepseek-coder:6.7b",
    "ja":   "qwen2.5:7b",
}

print(generate(MODELS["code"], "Pythonのジェネレーターを一言で説明して"))

model を引数にするだけで切り替えられます。用途ごとにモデル名を定数にまとめておくと、変更が一カ所で済みます。

Ollama を Linux サーバーで systemd サービスとして常駐させる場合は、systemdサービスを自動起動させる設定手順 が参考になります。

まとめ

Ollama のモデル切り替えは、各リクエストの model フィールドを変えるだけで完結します。切り替え専用のエンドポイントは存在せず、シンプルな設計です。ポイントをまとめます。

  • /api/tags でインストール済みモデルを確認してからリクエストを組む
  • "stream": false を付けると一括レスポンスになりスクリプトで扱いやすい
  • VRAM が逼迫する場合は keep_alive でモデルのアンロードタイミングを制御する

まずは curl http://localhost:11434/api/tags で手元のモデル一覧を確認し、/api/generate に "stream": false を付けて実際に叩いてみてください。

よくある質問

Ollama が起動していないとき curl でどんなエラーが出ますか?

curl: (7) Failed to connect to localhost port 11434: Connection refused が返ります。ollama serve が動いているかどうかは ps aux | grep ollama で確認できます。ポートを変更している場合は OLLAMA_HOST の設定も確認してください。

stream を省略したまま curl を叩くと出力が読みにくいのはなぜですか?

Ollama はデフォルトでトークンをリアルタイムにストリーミングします。1トークンごとに JSON 行が出力されるため、curl の生出力では行が分断されて見えます。stream: false を指定すると生成完了後に1行でまとめて返ってきます。

モデル名を間違えたときの挙動はどうなりますか?

指定したモデルがインストールされていない場合、Ollama のバージョンや設定によっては自動ダウンロードを試みることがあります。意図しないダウンロードを避けたい場合は事前に /api/tags で名前を確認してください。