Azure OpenAI GPT4oと4の応答速度を比較してみる

## はじめに

GPT4 vision-preview（東日本リージョン Standardデプロイ）の応答速度が遅すぎるため、Global StandardではあるけどGPT4oと比較してみた。

https://github.com/Syonon/azure-openai-speedtest

## 計測するモデルと計測方法

### 計測するAzure OpenAI モデルたち
- GPT-4 vision-preview(japaneast, standard deploy)
- GPT-4o 2024-05-13（japaneast, global standard deploy）
- GPT-4o 2024-05-13(eastus, standar deploy)

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models

### 計測方法

1. MS Azure公式ドキュメントのPython RESTAPI呼び出し用のサンプルをベースにソースを作成
1. Azure OpenAIのエンドポイントに適当なプロンプト50個を1分ごとに`Python requests.post()`で送りつける
1. `requests.Response`の`elapsed`でレスポンスタイムを取得する
1. CSVファイルに結果を出力。平均値・中央値の計算とボックスプロットを作成する

## 計測結果

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432253/1197ace3-f035-70ef-16fb-9e7ad8854f32.png)

ChatGPTを利用する際のような比較的短めのプロンプトの場合は、たしかにGPT4oの応答速度が2倍近く速いが1，2秒の差なら体感大きな差は感じない。

ただしチャット履歴が大きくなってきたときや、RAGにGPT4を利用する際は注意が必要。2倍の速度差が顕著に表れるため、GPT4oで20秒かかるならGPT4だと40秒もかかる。

しっかりと測定していないためデータは載せていないが、プロンプトが大きくなればなるほど応答時間の差が広がり、試した限りだと7倍近く差が発生することもあった。

## 作成したプログラム

- 応答時間の計測とCSV出力
``` python: measure_response_time.py
import csv
import os
from time import sleep

import requests


# 入力プロンプトリスト
prompts_list = [
    "prompt 1",
    "prompt 2",
]

# Azure Open AI API情報
API_KEYS = {
    "4jp": os.getenv("AOAI_API_KEY"),
    "4ojp": os.getenv("AOAI_API_KEY"),
    "4ous": os.getenv("AOAI_API_KEY"),
}

ENDPOINTS = {
    "4jp": os.getenv("AOAI_ENDPOINT"),
    "4ojp": os.getenv("AOAI_ENDPOINT"),
    "4ous": os.getenv("AOAI_ENDPOINT"),
}


def send_request_to_azure_openai(api_key: str, endpoint: str, payload: dict)-> requests.Response:
    """
    Azure OpenAIにリクエストを送信し、レスポンスを返す。
    :param api_key: APIキー
    :param endpoint: エンドポイントURL
    :param payload: リクエストペイロード
    :return: requests.Responseオブジェクト
    """
    headers = {
        "Content-Type": "application/json",
        "api-key": api_key,
    }

    try:
        response = requests.post(endpoint, headers=headers, json=payload)
        response.raise_for_status()
    except requests.RequestException as e:
        print(f"Failed to make the request. Error: {e}")
        return None  # エラーが発生した場合はNoneを返す

    return response
        

if __name__ == "__main__":
    # 出力先CSVのヘッダー設定
    with open(file="output.csv", mode="w", encoding="utf-8", newline="") as f:
        csv_writer = csv.writer(f)
        csv_writer.writerow(["gpt-4-jp", "gpt-4o-jp", "gpt-4o-us"])

    for i, prompt in enumerate(prompts_list):
        response_time_4jp = -1.0  # responseがNoneの場合応答時間は-1を返す
        response_time_4ojp = -1.0
        response_time_4ous = -1.0

        payload = {
            "messages": [
                {
                    "role": "system",
                    "content": "情報を見つけるのに役立つ AI アシスタントです。",
                },
                {"role": "user", "content": prompt},
            ],
            "temperature": 0.7,
            "top_p": 0.95,
            "max_tokens": 2000,
        }

        for key in ["4jp", "4ojp", "4ous"]:
            response = send_request_to_azure_openai(
                API_KEYS[key], ENDPOINTS[key], payload
            )
            if response:
                elapsed_time = response.elapsed.total_seconds()
                if key == "4jp":
                    response_time_4jp = elapsed_time
                elif key == "4ojp":
                    response_time_4ojp = elapsed_time
                else:
                    response_time_4ous = elapsed_time

                with open(
                    file="output.csv", mode="a", encoding="utf-8", newline=""
                ) as f:
                    csv_writer = csv.writer(f)
                    csv_writer.writerow(
                        [response_time_4jp, response_time_4ojp, response_time_4ous]
                    )
```

- ボックスプロットの作成プログラム

```python:create_boxplot.py
import matplotlib.pyplot as plot
import pandas


if __name__ == "__main__":
    df = pandas.read_csv("output.csv")

    plot.boxplot(x=df, tick_labels=df.columns, showmeans=True)
    plot.title("Response time")
    plot.show()
```

## AOAIの東日本リージョンの今後

国内のAzureデータセンターで完結するChatGPTを実装するのが難しくなってきています。現状StandardデプロイできるマルチモーダルなモデルがGPT4 vision-previewしかないけど、実はMSから「previewモデルを運用利用するのは推奨しない」と言われてます。実際に長大プロンプトを入力したときの回答速度は4oより5倍以上遅いです。

後継として4oが推奨されていますが、Global Standardでしかデプロイできないため、データが海外に流れます。Microsoftの専用バックボーンネットワークを利用しているためデータはパブリックに流れないとはいえ、社内の規定とかユーザー向け利用規約に引っかかったりしますよね。
特に銀行とか官公庁みたいに要件が厳しいとGPT 3.5とかGPT4 vision-preview使い続けるんですかね？

GPT3.5 Standardなんかの利用期限はどんどん先に伸びているので今後も使えなくはないけど、速いし正確な4o使いたいよ。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/model-retirements