追記
大方の予想通り、Microsoft Build 2024でGPT-4oのモデルがGAがしてデプロイが作れるので、以降の内容はあまり意味がない。
あわせてタイトル更新。
もしOpenAI互換の特別なエンドポイントがあったとして、それをOpenAI Python API Libraryから使いたい時にはこの方法が使えるかも。
まずは注意
このエントリーは、2024/05/18時点の動作をベースに書いたもの。
Azure OpenAIのAPIは割と頻繁に&破壊的に変更されるので、ここに書いた方法もいつ使えなくなってもおかしくない。
このエントリー公開から数日後にはMicrosoft Build 2024も控えているので、そこでの発表次第でもあっさり使えなくなりそう。
なのでタイトルにもつけた通り、「期間限定」。
あくまで2024/05/18時点のプレビュー段階で(自己責任で)アプリに組み込んで動きを見てみたい人向けのエントリーなのでご留意を。
あと公式ドキュメントの注意事項にも目を通しておいた方がいいです。 learn.microsoft.com
GPT-4oを試してみた
本題。
下記Qiitaの記事を参考にして、Azure OpenAIのGPT-4o用Playground(Early Access Playground)でを試してみた時に少し引っかかった。
「デプロイを作ってないのでは?🤔」
普通、Azure OpenAIを使う時、Azure上にリソースを作った後、リソース内にモデルのデプロイを作る。
でもこのEarly Access Playgroundを試すにあたって、デプロイを作らなくてもチャットができている。
「デプロイ作らずにどうやって動いているんだろう???」とPlaygroundからのAPIコールを覗いてみると、
エンドポイントの書式が違った。
通常Azure OpenAIのChatCompletions APIを使う時は、エンドポイントが
https://{your_resource_name}.openai.azure.com/openai/deployments/{deployment_id}/chat/completions?api-version=2024-02-01
という書式になる*1。
エンドポイントのドメイン名にリソース名(your_resource_name
)を使う。
あと/openai/deployments/
に続いてデプロイ名(deployment_id
)が必要になる。
けど、GPT-4oのEarly Access PlaygroundがAPIコールに使っているエンドポイントはこっち。
https://{your-resource-name}.openai.azure.com/openai/models/2024-05-13/chat/completions?api-version=2024-05-13-preview
エンドポイントの中にデプロイ名が入る場所がない。
ドメイン名にリソース名が必要なのは一緒だけど、/openai/deployments/
の代わりに/openai/models/
が入る。
それに続くモデル名っぽいものは2024-05-13
というGPT-4oの発表日の文字列で固定されてて、APIバージョンも新しいバージョン、2024-05-13-preview
が使われてる。
プレビュー期間中だけだろうけど*2、こんな感じでエンドポイントの書式が大きく違う。
一方でリクエストボディは、あまり深く見てないけど大して違いはないっぽい。
なので、このエンドポイントさえ組み立てられれば、OpenAI Python API libraryからも実行できそう。
OpenAI Python API libraryでエンドポイントをカスタマイズする
まずは普通のOpenAI Python API libraryの使い方。
OpenAI Python API libraryからAzure OpenAIを使うと、クライアント(AzureOpenAI
)の作成時にリソース名、API実行時にデプロイ名を使う*3。
from openai import AzureOpenAI : # クライアント作成時 aoai_client = AzureOpenAI( azure_endpoint=your_resource_name, # <- ここにリソース名 api_key="6d3fe83306b44b22...", api_version="2024-02-01" ) : # API実行時 completion = aoai_client.chat.completions.create( model=deployment_id, # <- ここにデプロイ名 messages=[ {"role": "system", "content": ...}, {"role": "user", "content": ...} ], )
この二つのパラメータからOpenAI Python API libraryが内部で下記エンドポイント、
https://{your_resource_name}.openai.azure.com/openai/deployments/{deployment_id}/chat/completions?api-version=2024-02-01
を構築する。
あとはそのエンドポイントに対してREST APIを実行する、というのが普通の使い方。
GPT-4oの場合は、前述の通りこのOpenAI Python API libraryが構築したエンドポイントだと動かない。
なので、エンドポイントをカスタマイズするためにクライアント作成時に使ってたパラメータ azure_endpoint
を使わない。
その代わりに base_url
を使う。
ここに自前で構築したhttps://
から始まるエンドポイントを直接指定する。
aoai_client = AzureOpenAI( base_url = f"https://{your_resource_name}.openai.azure.com/openai/models/2024-05-13", # <- ココ! api_key="6d3fe83306b44b22...", api_version="2024-05-13-preview" # <- ココも! )
base_url
にはEarly Access Playgroundで確認したエンドポイントを指定し、APIバージョンは2024-05-13-preview
にしておく。
次にAPI実行時は、デプロイ名を指定するパラメータ model
をNone
にする。
aoai_client.chat.completions.create( model=None, # <- ココ! messages=[ {"role": "system", "content": ...}, {"role": "user", "content": ...} ] )
ここで None
を指定せずに適当なデプロイ名とかモデル名を入れてしまうと、OpenAI Python API libraryが気を利かせて/deployments/
と指定されたデプロイ名/モデル名を追加してしまい、APIが404とかを返すので注意。
この方法でOpenAI Python API libraryからもGPT-4oが実行できる。
いつまでできるかわからんけどね。
余談
このbase_url
を使った方法は、2024-02-15-preview
より前のAPIバージョンでOn-your-dataでも公式に使われていた。
当時の On-your-dataでは、APIのパスが/chat/completions/
ではなく/extensions/chat/completions
だったので、base_url
でカスタマイズする必要があった。
当時のドキュメントをGitHubから発掘したので備忘録的に貼っておく。
ここからもわかるように、Azure OpenAIはサクッとAPIの仕様を破壊的に変えてくるので注意が必要。
*1:https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#chat-completions
*2:DALL-E2みたいに、後継が出ても未だにプレビュー、て前例もあるけど。
*3:本家OpenAIのI/Fの都合とはいえ、"model"というパラメータにデプロイ名を入れるのはいまだに気持ち悪い