OllamaのOpenAI互換APIでローカルLLMをアプリから使う

ローカルLLMをアプリケーションから叩く場合、Ollamaの独自API(/api/generate/api/chat)を直接使う方法もあるが、実はOllamaはOpenAI互換のエンドポイントも用意している。これを使うと、OpenAI向けに書いたコードをベースURLだけ差し替えてローカルLLMで動かせる。開発中はローカルの無料モデルで検証し、本番だけOpenAIやClaudeに切り替える、という二段構えが組めるのがうれしいところだ。

OpenAI互換エンドポイントの場所

Ollamaを起動していれば、以下のURLがOpenAI互換の/v1/chat/completionsとして使える。

http://localhost:11434/v1/chat/completions

curlで直接叩くとこうなる。

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ollama" \
  -d '{
    "model": "llama3.2",
    "messages": [
      {"role": "user", "content": "さくらのVPSでnginxを設定する手順を3行で教えて"}
    ]
  }'

AuthorizationヘッダはOpenAI SDKの作法上必須になっていることが多いが、Ollama側では中身をチェックしていない。Bearer ollamaのような適当な文字列で通る。ここは地味にハマりやすいポイントで、「キーがないとエラーになるSDKなのでダミーを入れておく」程度の理解で十分。

PHPから使う(openai-php/client)

PHPでopenai-php/clientを使っている場合、ベースURIを差し替えるだけでOllamaに向けられる。

<?php

require 'vendor/autoload.php';

use OpenAI;

$client = OpenAI::factory()
    ->withBaseUri('http://localhost:11434/v1')
    ->withApiKey('ollama') // 値は何でもよい、必須項目を満たすだけ
    ->make();

$response = $client->chat()->create([
    'model' => 'llama3.2',
    'messages' => [
        ['role' => 'user', 'content' => '本番環境とステージング環境の違いを一言で'],
    ],
]);

echo $response->choices[0]->message->content;

本番用のコードではwithBaseUriwithApiKeyの値を環境変数から読むようにしておけば、.envを切り替えるだけで開発時はOllama、本番はOpenAI(またはClaudeなど別のAPI)に向けられる。実装を一本化できるのが最大のメリットだ。

他の言語でも考え方は同じで、公式のOpenAI SDKやそれ互換のクライアントライブラリであれば、大抵ベースURLを差し替えるオプションが用意されている。移行のたびにAPI呼び出し部分を書き直すのではなく、設定値だけで環境を切り替えられる構成にしておくと、後々の運用が楽になる。

互換性の限界

ただし完全互換ではない。tool calling(function calling)まわりはモデルやOllamaのバージョンによって挙動が変わることがあるし、logprobsや一部のサンプリングパラメータは無視されたり非対応だったりする。プロンプトの構造がシンプルなチャット用途なら困らないが、複雑な関数呼び出しを本番前提で作り込む場合は、最終的に本番で使うAPIでも一度動作確認しておいたほうがいい。「ローカルで動いたから本番も大丈夫」と決めつけるのは危険。

モデルによる出力品質の差も無視できない。ローカルの小型モデルは軽くて速いぶん、本番で使う大規模モデルと比べると要約の精度や指示追従性が落ちることが多い。開発中の動作確認はローカルモデルで十分だが、最終的な出力品質のチェックは本番相当のモデルで行うのが実務的な落としどころだ。

他ホストから叩けるようにする

デフォルトではOllamaはlocalhostにしかバインドしないので、別ホストやDockerコンテナから叩きたい場合はOLLAMA_HOSTを設定してから起動し直す。

export OLLAMA_HOST=0.0.0.0
ollama serve

systemdで動かしている場合は/etc/systemd/system/ollama.service.d/override.confあたりに環境変数を追加してsystemctl daemon-reload && systemctl restart ollamaとする。ただし0.0.0.0で待ち受けると外部からもアクセス可能になるので、VPSで使うならufwやnginxのリバースプロキシ側でアクセス元を絞ること。11434番ポートを全世界に開放したままにしないよう注意したい。

まとめ

OllamaのOpenAI互換APIは、既存のOpenAI向けコードをほぼそのまま流用できる点が実務的にありがたい。開発・検証はローカルの無料モデルで済ませ、本番だけ有償APIに切り替える構成にしておけば、コスト削減とオフライン開発の両方が手に入る。ただし関数呼び出しなど一部機能は完全互換ではないので、本番で使う機能は一度は本番APIでも検証しておくのが安全だ。

読んで頂いて有り難うございます!