ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

【期限切れ】Azure OpenAIのGPT-4oをOpenAI Python API libraryから試す

追記

大方の予想通り、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)でを試してみた時に少し引っかかった。

qiita.com

「デプロイを作ってないのでは?🤔」

普通、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実行時は、デプロイ名を指定するパラメータ modelNoneにする。

aoai_client.chat.completions.create(
    model=None,  # <- ココ!
    messages=[
        {"role": "system", "content": ...},
        {"role": "user", "content": ...}
    ]
)

ここで None を指定せずに適当なデプロイ名とかモデル名を入れてしまうと、OpenAI Python API libraryが気を利かせて/deployments/と指定されたデプロイ名/モデル名を追加してしまい、APIが404とかを返すので注意。

github.com

この方法で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でカスタマイズする必要があった。

learn.microsoft.com

当時のドキュメントをGitHubから発掘したので備忘録的に貼っておく。

github.com

ここからもわかるように、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"というパラメータにデプロイ名を入れるのはいまだに気持ち悪い