要点(結論先出し)
- ローカルエンジンの多く(Ollama・llama-server・vLLM等)はOpenAI互換のHTTP APIを提供する(要最新確認)。
- だから既存のOpenAI SDKコードは、
base_urlをローカルのエンドポイントに差し替えるだけでローカルLLMに向く。アプリ側の改修はほぼゼロ。 - これが「クラウドからローカルへ」の移行を劇的に楽にする。APIという共通語で疎結合になっているのが肝。
概念 ── 共通インターフェースの威力
OpenAI互換APIは /v1/chat/completions や /v1/embeddings といった決まった形のリクエスト/レスポンスを定めた事実上の標準(要最新確認)。ローカルエンジンがこれを話す限り、クライアントはエンジンの中身を知らなくてよい。Ollamaでも llama-server でも vLLM でも、同じコードで叩けます。
動くコード(Python・OpenAI SDK)
# base_url をローカルへ向けるだけ。api_key はダミーで可(要最新確認)
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1", # Ollama例。llama-serverなら:8080等
api_key="local", # ローカルでは任意のダミー
)
resp = client.chat.completions.create(
model="llama3.1:8b", # モデル名は要最新確認
messages=[{"role": "user", "content": "ローカルLLMの利点を3つ"}],
)
print(resp.choices[0].message.content)
curl 版や各エンジンの起動方法は対応lab openai_compat_api.md に。
仕組み ── 接続先を差し替える
flowchart LR APP["既存アプリ(OpenAI SDK)"] --> URL["base_url を切替"] URL --> LOCAL["ローカル互換API(Ollama・llama-server・vLLM)"] LOCAL --> ENG["推論エンジン"] ENG --> RESP["同じ形のレスポンス"]
クラウド向けに書いたコードを、設定1つでローカルに付け替えられる。これにより開発はクラウド、本番はローカルのような構成も容易です。
運用の勘所
- エンドポイントとモデル名だけ環境変数化しておくと、クラウド/ローカルを切替やすい。
- 認証は不要でも、外部公開するなら必ずリバースプロキシ+認証(ローカル前提のAPIを生で晒さない)。
- 互換とはいえ未対応パラメータがある(エンジン差)。使う機能の対応を要最新確認。
なぜそうするか
APIを共通語にしておくと、エンジン・モデル・場所(クラウド/ローカル)を独立に差し替えられる。ベンダーロックインを避け、移行コストを最小化できます。ローカルLLMが「既存資産をそのまま活かせる」のは、この互換APIのおかげです。
⚠️ よくある落とし穴
- api_key を実鍵と勘違い:ローカルではダミーで可。逆に外部公開時は自前で認証を足す。
- 未対応パラメータで例外:function calling 等の対応はエンジン差。事前確認。
- 生APIをLANに晒す:認証なしのローカルAPIを外に出さない。プロキシで保護。
- ストリーミング前提のコードが詰まる:
streamの扱いはエンジンで差 → ストリーミングと並行リクエスト
対応lab
local-llm-study/labs/openai_compat_api.md… 各エンジンの起動とPython/curl接続例。
関連
- 体感と同時実行 → ストリーミングと並行リクエスト
- 埋め込みAPI → 埋め込みモデルのローカル運用
- RAGへ → ローカルRAGの構成