しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure OpenAI Service の GPT-4o Early Access を REST API と Azure SDK から無理やり使ってみた

昨夜の OpenAI の Spring Update で新しいフラグシップとなる GPT-4o が発表されましたね。かなり応答が高速になっているのに価格も下がっているという革新的なモデルとなっています。

GPT-4 Turbo をアプリケーションで利用する上での大きな障害はその応答の遅さだったので、応答速度が改善されているのはかなり喜ばしいので早く試したいですね。

モデルの説明は詳しい人に任せるとして、自分は Azure から利用したいのでその部分に特化して進めます。

今回は驚くことに、GPT-4o を OpenAI が公開した直後に Azure OpenAI でも GPT-4o が Early Access Playground という形で公開されました。来週の Build では更に GPT-4o の話が聞けるらしいので、今年も現地参加にして良かったという気持ちしかありません。

East US か West US 3 にデプロイした Azure OpenAI Studio を開くと Early Access Playground が増えているはずなので、ここから GPT-4o を試すことが出来ますがモデルをデプロイする事は出来ません。

既にドキュメントには GPT-4o に関する記述が追加されているので、将来的には GPT-4 Turbo と同じようにデプロイ出来るようになると思いますが、今は Azure OpenAI Studio 上でしか触れないことになっています。

とはいえ、全てをブラウザ上の Playground で試せるわけでもなく、実際に動かしているワークロードに当てはめて検証したいこともあるはずです。

検証では REST API や SDK を使って直接利用したいケースの方が多いはずなので、F12 ツールを使ってリクエストを調べたところ GPT-4 Turbo と GPT-4o はエンドポイントが異なるだけだとわかりました。

// GPT-4 Turbo のエンドポイント
https://***.openai.azure.com/openai/deployments/gpt-4/chat/completions?api-version=2024-04-01-preview

// GPT-4o Early Access のエンドポイント
https://***.openai.azure.com/openai/models/2024-05-13/chat/completions?api-version=2024-05-13-preview

エンドポイントの違いとしては deploymentsmodels になっている点と、api-version2024-04-01-preview から 2024-05-13-preview になっている点の 2 箇所だけです。API キーも既存のものがそのまま使われていましたので、REST API を直接利用する技術的な難易度は高くありません。

動作確認のために以下のような HTTP ファイルを作成して、GPT-4o を REST API 経由で利用できるか確認しました。リクエストのペイロードは完全に同一なのでエンドポイントを変更するだけです。

POST https://***.openai.azure.com/openai/models/2024-05-13/chat/completions?api-version=2024-05-13-preview
Api-Key: ********************************
Content-Type: application/json

{
    "messages": [
        {
            "role": "system",
            "content": [
                {
                    "type": "text",
                    "text": "You are an AI assistant that helps people find information."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Microsoft について説明してください"
                }
            ]
        }
    ],
    "temperature": 0.7,
    "top_p": 0.95,
    "frequency_penalty": 0,
    "presence_penalty": 0,
    "max_tokens": 4096,
    "stop": null
}

Visual Studio を使って REST API を実行してみると、問題なく動作していることが確認できます。応答に含まれている model プロパティの値が gpt-4o preview になっているため、GPT-4o が使われていますね。

REST API 経由で使うのは非常に簡単でしたが、エンドポイントが変わっているので Azure SDK から使うのは当然ながら無理です。例えば以下のようなシンプルな Chat Completions を使うコードを GPT-4o 向けに書いてみます。違いは DeploymentName ぐらいですが、API バージョンも異なるため上手く動作しません。

using Azure.AI.OpenAI;

var openAIClient = new OpenAIClient(new Uri("https://***.openai.azure.com/"), new Azure.AzureKeyCredential("********************************"));

var response = await openAIClient.GetChatCompletionsAsync(new ChatCompletionsOptions
{
    DeploymentName = "2024-05-13",
    MaxTokens = 4096,
    Messages = 
    {
        new ChatRequestSystemMessage("You are an AI assistant that helps people find information."),
        new ChatRequestUserMessage("Microsoft について説明してください")
    }
});

Console.WriteLine(response.Value.Choices[0].Message.Content);

試しに実行してみると Deployment Not Found エラーとなりました。GPT-4o についてはデプロイという概念が今のところ存在しないので当然の結果ですね。

Azure SDK から GPT-4o を使うには、エンドポイントを何とか書き換える必要があります。あまり知られていない機能ですが Azure SDK には HttpPipelinePolicy という HTTP パイプラインのフックポイントが用意されているので、これを使うことでエンドポイントを無理やり書き換えてみます。

ひとまず雑な実装ですが、以下のようなポリシーを作成してエンドポイントを GPT-4o 向けに書き換えます。

public class GPT4oPolicy : HttpPipelineSynchronousPolicy
{
    public override void OnSendingRequest(HttpMessage message)
    {
        message.Request.Uri.Path = message.Request.Uri.Path.Replace("deployments", "models");
        message.Request.Uri.Query = message.Request.Uri.Query.Replace("2024-04-01-preview", "2024-05-13-preview");
    }
}

作成したポリシーは OpenAIClientOptions に用意された AddPolicy メソッドで登録します。これで HTTP リクエストの送信前に作成したポリシーが呼び出されて GPT-4o 向けのエンドポイントに書き換えられます。

using Azure.AI.OpenAI;
using Azure.Core;
using Azure.Core.Pipeline;

var options = new OpenAIClientOptions();

options.AddPolicy(new GPT4oPolicy(), HttpPipelinePosition.PerRetry);

var openAIClient = new OpenAIClient(new Uri("https://***.openai.azure.com/"), new Azure.AzureKeyCredential("********************************"), options);

var response = await openAIClient.GetChatCompletionsAsync(new ChatCompletionsOptions
{
    DeploymentName = "2024-05-13",
    MaxTokens = 4096,
    Messages = 
    {
        new ChatRequestSystemMessage("You are an AI assistant that helps people find information."),
        new ChatRequestUserMessage("Microsoft について説明してください")
    }
});

Console.WriteLine(response.Value.Choices[0].Message.Content);

このコードを実際に動かしてみると、ポリシー適用前のように Deployment Not Found エラーになることなく応答が返ってくるため、Azure SDK 経由で GPT-4o が実行されていることが確認できます。これで既存の GPT-4 Turbo などを使っているコードの変更なく、GPT-4o を使った検証が出来るようになりました。

かなりハックした感はありますが、Early Access Playground でも REST API を叩いているので違いはないと考えています。ちょっと怒られそうな気もしますので、紹介した内容は自己責任の下で利用してください。