CTOの視点から見たAzure OpenAI ServiceとOpenAIのChatGPT APIの深堀り比較

※ この記事の内容は先日のQiita Nightでお話ししたことと一部重複します。
Qiita NightではLTの制限時間(10分)に収めるため、結構端折りました。

https://increments.connpass.com/event/279009/

# はじめに

ChatGPTが登場してから数ヶ月が経ちました。
ChatGPTをはじめとしたGenerative AIは完全に現在のIT業界のトレンドとなっています。
今や多くの企業でChatGPT APIをサービスに組み込んで顧客提供を開始したり、自社の社内システムに組み込んだりと積極的に利用するようになりました。
私もGenerative AIが無くなると業務に支障が出るレベルで利用しています。

そして、2023年5月時点ではChatGPTのAPIを利用する方法として、本家OpenAI社が提供しているAPIを利用する方法とMicrosoft社が提供しているAzure OpenAI ServiceのAPIを利用する方法の2つがあります。

これらの2つを単純比較している記事は多く存在しますが、アーキテクチャを選定し、最終決定を行う側(CTO/ITアーキテクト)の視点から比較した記事はほぼありません。

この記事では、現役CTOの視点でどう比較し、最終的に弊社でどのような意思決定と使い分けをしているかを深堀りしていきます。

以下、私がOpenAI関連でアーキテクチャ選定時に重視した要素に優先順位をつけて比較していきます。
比較の優先順位は以下の通りです。

1. 基本性能(安定性/可用性/動作速度/モデル精度)
2. セキュリティ/プライバシー
3. 料金
4. リリース速度/利用開始方法
5. 組み込み方法/サポート体制



# 1.基本性能(安定性/可用性/動作速度/モデル精度)

総合的に見て<b>記事執筆時点では基本性能はAzure OpenAI ServiceのChatGPT APIの方が優れています。</b>

## 安定性

OpenAI社のAPIのほうが圧倒的多数のトラフィックをさばいていることもあって、OpanAI社のChatGPT APIは日本時間夜〜深夜など、ヨーロッパ、アメリカでのトラフィックが増える時間帯のレイテンシが安定しません。
1500msecでレスポンスが返ってくることもあれば10000msecでも返ってこないこともあります。
そのため、組み込み元サービス側でのtimeoutの設定が難しいです。
10000msecでtimeoutを設定した場合、時間帯によってはtimeoutが多発することがありました。

Azure OpenAI ServiceのChatGPT APIは、時間帯を問わずレイテンシは600msec~3000msec程度で安定しています。
組み込み元サービス側で5000msec程度のtimeoutを設定すれば問題なく利用できました。


## 可用性

OpenAI社のAPIは、サービス規約上SLAはありません。
APIの可用性はステータスページで確認できます。

https://status.openai.com/

ChatGPT API単体の可用性は見ることができませんが、OpenAI社のAPI全体の可用性として、記事執筆時点では99.55%となっています。
チャットウィンドウ側のchat.openai.comの可用性も99.48%なので、2023年5月時点のChatGPT APIの可用性は大体99.5%前後と考えていいと思います。
2023年3月時点だと98%台だった時期もあったので、ここ数ヶ月でだいぶ可用性は向上してきました。

他方、Azure OpenAI ServiceのSLAは記事執筆時点では99.9%となっています。
実稼働率はそれよりも高いので、可用性という側面からもAzure OpenAI Serviceのほうが優れています。

https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1&assetType=285&year=2023


## 動作速度

動作速度もAzure OpenAI Serviceのほうが優れています。
参考までに以下のようにAzure OpenAI ServiceとOpenAIで100回同じリクエストを送って平均/最大/最小レイテンシを取得するプログラムを書いて実行しました。
Azure OpenAI Serviceの方はパラメータ関連で若干実行コードが異なりますが、利用ライブラリや基本ロジックは同じなので、コードは省略しています。相違点はコメントで記載してます。

```python
import openai
import os
import time

from dotenv import load_dotenv
load_dotenv()


def init():
    # .envからAPIキーを読み込んでます。
    # Azure OpenAI Serviceの場合、api_type, api_version, api_baseの指定が追加で必要となります。
    openai.api_key = os.getenv('OPEN_AI_ACCESS_KEY')


def measure_latency():
    start_time = time.time()

    response = openai.ChatCompletion.create(
        # Azure OpenAI Serviceの場合、ユーザー単位で利用モデルが異なるため、
        # modelではなくengineパラメータに自分で作成したモデルを指定します。
        # https://learn.microsoft.com/en-us/azure/cognitive-services/openai/how-to/chatgpt?pivots=programming-language-chat-completions
        model="gpt-3.5-turbo-0301",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "Who won the world series in 2020?"},
        ]
    )

    end_time = time.time()
    latency = end_time - start_time
    return latency


init()
latencies = [measure_latency() for _ in range(100)]
average_latency = sum(latencies) / len(latencies)
max_latency = max(latencies)
min_latency = min(latencies)

print(f"Average Latency: {average_latency} seconds")
print(f"Maximum Latency: {max_latency} seconds")
print(f"Minimum Latency: {min_latency} seconds")
```

その結果がこちらです。平均/最大/最小レイテンシの全てでAzure OpenAI Serviceのほうが高速でした。

OpenAI
```bash
Average Latency: 1.7284630155563354 seconds
Maximum Latency: 5.712356805801392 seconds
Minimum Latency: 1.262077808380127 seconds
```

Azure OpenAI Service
```bash
Average Latency: 0.9831653022766114 seconds
Maximum Latency: 2.729429006576538 seconds
Minimum Latency: 0.5985040664672852 seconds
```

## モデル精度

記事執筆時点ではまだどちらも同じモデルなので、性能の差は感じません。
ただ、後述するようにモデル精度はOpenAI社のほうが先に上昇します。
 * OpenAI社のChatGPTモデル : gpt-3.5-turbo-0301
 * Azure OpenAI ServiceのChatGPTモデル : gpt-35-turbo (version 0301)


# 2.セキュリティ/プライバシー

<b>セキュリティ/プライバシーは完全にAzure OpenAI ServiceのChatGPT APIの方が優れています。</b>

## セキュリティ
セキュリティは考慮すべき点が多岐に渡るので、情報セキュリティ/ネットワークセキュリティ/プロンプトインジェクション対策の3つの観点に分けて比較していきます。

### (1). 情報セキュリティ
Azure OpenAI ServiceはAzureのサービスなので、Azure ADを軸としたMicrosoft社のゼロトラストアーキテクチャと高い親和性があります。
そのため、Azure ADを利用したIAMベースでのアクセス制御や不正アクセスの監視対応がしやすいです。

OpenAI社のAPIはサービスとして情報セキュリティ面での対策を取る導線がまだ存在しません。

そのため、SAMLによるSSO（シングルサインオン）を利用してIAMベースでのアクセス制御を行ったり不正アクセスを監視するといったことができません。
OpenAI社側のGoogleアカウントなどを利用したOAuth2によるSSOは情報セキュリティ対策をする側としてはキツイですね…。

なお、OpenAI社でもこのあたりは問題視されていて、ChatGPT Businessという新しいサービスで今後対応していく方針のようです。

https://techcrunch.com/2023/04/25/openai-previews-business-plan-for-chatgpt-launches-new-privacy-controls/

### (2). ネットワークセキュリティ
Azure OpenAI ServiceはChatGPT APIのEndpointをPrivate Endpointとして設定し、VNet内部での利用に限定することができます。
つまりは<b>インターネットを経由せずにChatGPT APIを利用することができます。</b>
これが結構大きいです。

OpenAI社のChatGPT APIは記事執筆時点では https://api.openai.com/v1 というインターネット上に公開されているエンドポイントを経由する必要があります。

そして、APIキーを利用して認証しているので、自身のAPIキーが外部に漏洩した場合は誰でもAPIを利用することができます。
そのため、基本OpenAIのChatGPT APIを利用していた場合に、APIキーが漏れたら予算上限までAPIを利用されてしまうことを覚悟しなければなりません。
（ほぼ毎年どこかの組織でエンジニアがGitHubのパブリックリポジトリにAPIキーを上げちゃう事件が発生してますし…）

Azure OpenAI Serviceの場合にはEndpointをPrivate Endpointにしておけば、APIキーやEndpointのURLといったパラメーターが外部に漏れた場合でも、VNetに侵入されなければ不正利用はできません。
さらにAzure Private Linkでの接続まで対応しておけば、VNetに侵入されたとしても特定のサービスからしかEndpointにつなげないように設定できます。

これを組み合わせると、管理者のIAMを乗っ取って設定変更をするか、Azureインフラに対するゼロデイ脆弱性での突破をしない限り不正利用はできなくなります。
加えて、ゼロトラストアーキテクチャなどによる情報セキュリティ対策も合わせて行っておけば、そうそう突破はできないはずです。

### (3). プロンプトインジェクション対策
AI固有のセキュリティ対策として、プロンプトインジェクション対策が必要になります。
まだプロンプトインジェクションに対するベストプラクティスと呼べるレベルの対策が存在しないので、対策は結構骨が折れます。
他社の方と話をしている感じChatGPT APIを利用してサービスを提供している企業様でもプロンプトインジェクション対策を怠っているところはそこそこある印象です。

Microsoft社はプロンプトインジェクション攻撃で何度も痛い目を見ていることもあって、<b>Azure OpenAI Serviceではコンテンツフィルタを初期実装してくれています。</b>
これによって悪意のある会話を学習やチャットの対象から除外することができます。

動作イメージとしては緩めのルールセットを使ったWAFが初期設定されている感じですね。
プロンプトを上書きするような会話や罵詈雑言を検出して自動ブロックしてくれます。

https://arstechnica.com/information-technology/2023/02/ai-powered-bing-chat-spills-its-secrets-via-prompt-injection-attack/

https://learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/content-filter


無論、このコンテンツフィルタも完璧ではないので、利用者側でのプロンプトインジェクション対策は別途必要になりますが、基本的な対策をしてもらえるだけでだいぶ助かります。

OpenAI社のChatGPT APIではすべて自前でプロンプトインジェクション対策を行う必要があります。

## プライバシー
API経由のデータが学習に使われないという点ではどちらも同じです。
余談にはなりますが、OpenAI社のAPI経由のデータの学習利用は3月1日にオプトイン(原則モデルの学習での利用なし)に変更されてはいるものの、チャットウィンドウ(https://chat.openai.com/ )経由のデータの学習利用はオプトアウトのままなのでその点に留意してください。

OpenAI社のチャットウィンドウ経由のチャットデータは基本学習に使われるので、使われないようにするためにはOpenAI社への申請が別途必要になります。

Azure OpenAI Serviceの方は学習利用のオプトインもなく、すべてのデータがモデルの学習に使われない仕様になっています。
https://openai.com/policies/api-data-usage-policies

https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy

また、OpenAI社のAPIは準拠法がカリフォルニア州法になるのでその点も注意が必要です。
日本の法令がカリフォルニア州法よりもプライバシー保護に関して厳しくなったときや保護対象の情報が異なった場合に、OpenAI社側に法的な対応を要求することが難しいです。
(OpenAI社 の Sam Altman CEOが割と日本にベットしてくれてるので、対応してくれる可能性はあります。)

https://japan.cnet.com/article/35202408/

個人情報保護の歴史的に日本の個人情報保護法がカリフォルニア州消費者プライバシー法(CCPA)よりプライバシー保護の観点で厳しくなるということはそうそうなさそうですが、保護対象とする情報の範囲が変わる可能性はあります。

Azure OpenAI Serviceの方はMicrosoft社との契約時に準拠法を日本の法令にしつつ、所轄裁判所を東京地方裁にすることが可能なので、契約上日本の法令に従った個人情報保護の対応をMicrosoft社に要求することができます。
まあ、過去の実績的に要求しなくても法令の施行前に対応してくれると思います。

https://openai.com/policies/privacy-policy

https://www.microsoft.com/ja-jp/servicesagreement/

# 3.料金

料金面はどちらも課金体系/金額ともに同じです。
したがってどちらがコストパフォーマンスに優れているとかもありません。
利用時にPrivate Endpointなどのセキュリティ系の機能をAzure OpenAI Serviceで利用したらその分高くなるぐらいですね。

https://openai.com/pricing

https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/openai-service/


# 4.リリース速度/利用開始方法
<b>リリース速度/利用開始方法はOpenAI社のChatGPT APIのほうが優れています。</b>

## リリース速度
さすがに新モデルや新サービスは常にOpenAI社のほうが先にリリースされます。
Azure OpenAI ServiceはOpenAI社でリリースされたサービスをAzure側に持ってくるかたちになるので、常にOpenAI社のリリースから1~2週間程度遅れます。
ChatGPT PluginsのようにAzure OpenAI Service側では全くリリースされる気配がないものもあります。

## 利用開始方法

OpenAI社のChatGPT APIはアカウントを作りさえすればすぐに利用できます。

他方、Azure OpenAI ServiceはChatGPT APIの利用自体には申請不要ですが、Azure OpenAI Serviceの利用開始に申請が必要となります。
ウェイティングリスト方式ではなく許可方式なので申請しても利用が許可されないこともあります。
数ヶ月前はかなり厳しくて弊社も4回ぐらい利用申請に落ちました。
今はだいぶ申請も通りやすくなったらしいです。

OpenAI社のサービスもAzure OpenAI Serviceも同じAzureインフラ上で動作しています。
それにも関わらずAPIの動作速度や安定性に差がでるのは、この申請/許可の厳しさによって、Azure OpenAI Serviceの利用者が制限されている結果、ある程度OpenAI社側のAPIよりもインフラ上のキャパシティに余裕を持ってAPIを使えていることに起因してそうな気はします。

なお、GPT-4のAPIの利用に申請が必要な点はどちらも同じです。

# 5.組み込み方法/サポート体制

<b>組み込み方法/サポート体制は組織によって判断が分かれそうです。</b>
実装の容易さとサポート体制の充実のどちらに重きを置くか次第ですね。
「サポートはいらない、コードを読めばわかる」という手練れのエンジニアが多くいる組織だと実装が容易なOpenAIのほうが優れているという判断になりそうです。
弊社は割と若手のエンジニアが多いので、サポート体制の充実の方を重視してます。
私もCTOとして、サポート体制等のカスタマーサクセス品質はサービス品質の一つとして差別化要素になるレベルで重要な要素だと考えています。

## 組み込み方法

サービスへの組み込みはOpenAI社のChatGPT APIの方が楽です。
利用者が多いので、Google検索や各種コミュニティでの情報はOpenAI社のほうがメインになっています。
Azure OpenAI ServiceはOpenAIと同じライブラリを利用してはいるものの、若干パラメーターが異なるうえに、コンテンツフィルタ関連で動作も異なるケースがあるため、OpenAI社のChatGPT APIの記事や参考資料から実装内容を一部変更する必要があります。

## サポート体制

サポート体制はAzure OpenAI Serviceの方が優れています。
Azure OpenAI ServiceもAzureのサービスの一つなので、Azureのサポートがそのまま利用できます。
サポートプランによってはかなり充実したサポートを受けることができます。
月$100払えば電話でのサポートも受けられます。

https://azure.microsoft.com/ja-jp/support/plans/

他方、OpenAI社のChatGPT APIはサポートがありません。
DiscordやGitHubなどのコミュニティ上で有識者に質問することはできます。
ただ回答してくれる人がいるかどうかはわかりません。

# まとめ

これまでの比較結果をまとめると以下のようになります。

| 比較項目 |　OpenAI　| Azure OpenAI Service |
|:-----------|:------------:|:------------:|
| 1. 基本性能       | やや劣る  | 優れている         |
| 2. セキュリティ/プライバシー    | 明らかに劣る      | 優れている       |
| 3. 料金     |同等 |同等|
| 4. リリース速度/利用開始方法       | 優れている          | やや劣る           |
| 5. 組み込み方法/サポート体制      | 組織による       | 組織による       |

## 弊社でのChatGPTのアーキテクチャ選定時の判断

O'Reilly社の[ソフトウェアアーキテクチャの基礎](https://www.oreilly.co.jp/editors/archives/2022/02/1982_fundamentals_software_arch.html)にもあるとおり、ソフトウェアアーキテクチャに正解は無く、基本的にトレードオフの判断になります。

ChatGPT関連のアーキテクチャ選定の際には、前述の比較結果と自社組織を踏まえてのトレードオフの総合判断を行う必要があります。

弊社ではもともとベンチャー企業には珍しくAzureインフラを利用していました。

また、ChatGPTを利用する予定だったサービス(BOTCHAN AI)が対企業向けのサービスであり、大企業向けERPパッケージを開発していた経験則上、対企業で提供するサービスの場合セキュリティ/プライバシーや可用性がサービス導入時の判断要素として重要視される傾向が強い印象でした。

弊社の主要サービスである「BOTCHAN Payment」などの他のサービスにChatGPTを展開していく可能性を斟酌してもセキュリティは重要な要素の一つとなっていました。

それに加えて去年には社内の情報セキュリティ対策として、Microsoft 365 Business Premiumを利用したゼロトラストアーキテクチャの導入も別途行っていました。

それらの情報を踏まえて、私はCTOとして弊社ではAzure OpenAI Serviceの方をChatGPT APIの基盤として利用するという判断をしました。(他の仕事と並行して技術調査も自分でやったので結構大変でした。)

https://prtimes.jp/main/html/rd/p/000000137.000015648.html

OpenAI社のAPIよりもAzure OpenAI ServiceのAPIのほうが提供が遅れていたことや実装に関する資料が公式しかなかったこと、申請が中々通らなかったことはトレードオフの結果として受け入れました。

その意思決定をしてから数ヶ月経ちましたが、実際に「BOTCHAN AI」の提案時に企業様からセキュリティ対策に関しての質問を受けることは多いです。
サービスの機能 > サービス料金 > セキュリティ/プライバシー > 可用性ぐらいの順序ですね。

ありがたいことに順調に受注は取れているので今のところはそのトレードオフの判断は間違ってなかったと思っています。

## 弊社での使い分け
参考までに弊社では以下のように使い分けを行っています。

### Azure OpenAI ServiceのChatGPT APIを利用するケース
  ・ 「BOTCHAN AI」などのお客様に提供するAIサービスの本番、Staging環境、テスト環境
  ・ 他のAzure Cognitive Servicesとの接続検証/技術調査
 
### OpenAI社のChatGPT APIを利用するケース
  ・ 「ChatGPTで〇〇やってみた」系の記事を試すとき(基本 OpenAI社のAPIが前提となっているため)
  ・ ChatGPT系のツールを試すとき(ツールの仕様上、OpenAIのAPIしか使えないことが多いため)
  ・ 新しい機能やモデルがリリースされたときの先行調査

# さいごに
弊社ではAzure OpenAI ServiceのChatGPT APIをメインに利用するという判断をしましたが、皆さんの組織で同じ結論になるとは思っていません。

皆さんの組織の事業フェーズやエンジニアの習熟度、利用インフラ基盤、ChatGPTで実現したいこと等の要素によってトレードオフの判断が変わるので、アーキテクチャ選定の結果は異なるのは当然のことです。

この記事で深堀りした内容が皆さんの組織でのChatGPT関連のアーキテクチャ選定時のトレードオフに少しでも生きれば幸いです。