Azure OpenAI Serviceの世界へようこそ
はじめに
賽は投げられた
2022年11月にOpenAIが公開したAIチャットボットChatGPTは、それまでのチャットボットの常識を大きく凌駕するその余りの流暢な受け答えから瞬く間に技術系コミュニティで話題沸騰となり、わずか2ヶ月でアクティブユーザー数は1億人を超え、その影響範囲はすぐさま技術系コミュニティの内側にとどまるものではなくなりました。プログラマが、大学生が、研究者が、物書きがChatGPTを試してはその自然な回答に驚愕しました。翌23年4月には、東京大学理事・副学長で教育・情報担当の太田邦史博士がChatGPTやStable Diffusion等の「生成系AI」の急速な発展とその著しい品質の向上を受けて「人類はこの数ヶ月でもうすでにルビコン川を渡ってしまったのかもしれない」とする声明を発表しました。
この突然訪れてしまった引き返すことの出来ないAIの発展を目の当たりにし、わたしたちはそれを単に畏れ利用を禁止するのではなく、どのように対峙すべきなのか考えねばならぬと説いています。
OpenAIのAPI
さて、このChatGPTなるAIアシスタントはサインアップすることで誰もが簡単にあなたの個人オフィスに迎え入れることができますが、真に恐るべきはOpenAIがこのチャットボットの背景技術をAPIとして公開していることです。ChatGPTの「GPT」はGenerative Pre-trained Transformerの頭字語で、これは事前に大量のテキストデータのコーパスで訓練された生成系言語モデルを意味します。これをAPI経由で利用することで、例えば少ないキーワードを元に大きな文章を生成してもらったり、反対に大きな文章をかいつまんで要約してもらったり、コードスニペットを書いてもらったりといったGPTが持つ素晴らしい機能を簡単に自分たちのアプリケーションに組み込むことができます。
GPTには世代があり、GPT-1、GPT-2、GPT-3、GPT-3.5、GPT-4と世代が下るにつれて基本的には大量のパラメータ数と訓練データを使って作られており高価かつ高機能です(※ 3.5と4のデータは非公開なので推測)
試しに「生成AIの発展によって「人類はルビコン川を渡ってしまった」とは何を意味しますか?」という質問を各世代のモデルに回答してもらいましょうか。
まずはGPT-3世代の「text-ada-001」から。これは最も安価かつ高速で、非常に単純なタスク向けのモデルです。回答はこちら。
うーんこれは厳しいですね。何を言っているのか分かりませんが、どうやらルビコン川は青森県と関わりが深そうです(誤った回答)
次に同じくGPT-3世代から「text-babbage-001」の回答です。これも高速かつ安価なモデルで、非常にストレートなタスクならこなすことができます。
いわゆる進次郎構文ですね。ジョークとしては面白いですが、これは欲しい回答ではありません。
次に同じくGPT-3世代から「text-curie-001」の回答です。これは能力が高く、後述するDavinciよりも高速で安価なモデルです。そろそろお気付きのとおり、text-ada, text-babbage, text-curie…のようにアルファベットが大きくなるほど高機能であることが分かります。回答はこちら。
おお!随分まともな日本語が返ってきました!しかしよく見ると微妙に何を言ってるか分からず、回答内容も正確ではありません。
次に同じくGPT-3世代から「text-davinci-003」の回答です。これはGPT-3で最も高機能なモデルです。回答はこちら。
良いですね!良い感じです!Curieより更に自然な文章になっています。かなり惜しいところまで来ましたが、ルビコン川を渡るという慣用句の意味を完全には捉えきれていません。
次はGPT-3.5世代から「gpt-3.5-turbo」の回答です。これはChatGPTでも使われているモデルであり、自然言語もコードも非常に高度に理解し生成することができます。回答はこちら。
良いですね!相当いいです!ついに出典がカエサルの故事であったことが説明されました。内容もほとんどよく、パッと見ただけでは危うく正解をあげてしまいそうです。ところがよく見ると、「人類はルビコン川を渡ってしまった」というフレーズが現代ではもっぱらAIの文脈で使われるかのように説明されています。これは正確ではありません。もう一息ですね。
最後に、執筆時点で最新のモデルであるGPT-4世代から「gpt-4」による回答です。これはChatGPTに月額20ドルを課金することで利用できるChatGPT Plusでも使われているモデルです。
ついに正解と言ってよい回答が得られました!「ルビコン川を渡る」という慣用句の意味を正確に引用し、かつそれがAIの文脈で使われた場合にはこういう意味であろうという解説が正しく説明されています。また、AIの発展とそれによる社会の変化が不可逆なものであるという重要な含意を正しく汲み取っています。
これがAIによって生成されていることを、僕はにわかに信じることができません。ここには知的生命体による知的生産活動を感じずにはおられない。我々が夢見ていたAIによるシンギュラリティの一部は、何の前触れもなく今年突然に訪れてしまったとすら感じます。そしてそれがわずかな課金で我々の利用できる場所にある。乗るしかねえ、このビッグウェーブに!
Azure OpenAI Service
Azure OpenAI Serviceの概要
MicrosoftはOpenAIに対して2019年から3度に渡って数十億ドル規模の投資を行い、両者は長期的なパートナーシップで結ばれています。詳しくは「マイクロソフトと OpenAI がパートナーシップを拡大」や「OpenAI and Microsoft extend partnership」をご参照いただきたいですが、結果的にOpenAIのAPIプラットフォームはMicrosoftのクラウドプラットフォームであるAzure上で動いています。次に、AzureはAzure OpenAI Service(以後、AOAIと略します)という、誤解を恐れずに申し上げるならいわばOpenAIのOEMのようなサービスを提供しています。両者で利用できるモデルの種類やAPIはほとんど違いがありません。そしてどちらもAzure上で動いているので初めて使う人にはこれらの違いがピンと来づらいかも知れませんが、これを理解することはAOAIを使うメリットを理解することに他ならないので少し説明したいと思います。
まず、OpenAIは「Azure上で動いている」と言ってもユーザがその事実を認識することはありません。OpenAIのAPIエンドポイントは基本的に https://api.openai.com/ ただ一つであり、全世界に対して公開されています。ある日突然何らかの理由でOpenAIのバックエンドがそっくり別の何かに入れ替わってもユーザにとって直接的な影響はほとんど何も考えられません。一方、AOAIはOpenAIの機能をAzure Cognitive Services内のいちサービスとして提供しています。結果的にAzureが持つ認証基盤やプライベートネットワークとの統合といったエンタープライズレベルのセキュリティベストプラクティスの恩恵を受けやすくなっています。この違いは例えばAPI利用時の認証などで顕著です。OpenAIではAPI Keyを発行してそれを直接ヘッダにセットすることでAPIを呼び出します。このキー情報は非常にクリティカルで、もしこれが漏れたら上限まで不正利用者に搾り取られることはまず避けられませんし、同じキーを共有しているアプリケーションでは誰がどのくらい呼び出しているといった監査情報も見ることができません。AOAIの場合でもOpenAI同様API Keyを使ったAPI呼び出しは当然可能なのですが、その他にもManaged IDを使ったAzure AD認証によってAPIキーを直接持ち歩かない安全なAPI利用が可能である他、誰がどのぐらいAPIを使っているか簡単に把握することが出来ます。また、AOAIをプライベートネットワーク内にのみに閉じ込めた構成も可能で、同じプライベートネットワーク内のアプリケーションやVPN越しにしかAPIを使わせないような制限も容易です。これらについては後々のエントリでたっぷり具体例を紹介するので安心してください。
OpenAIとAzure OpenAIの違い
他にもOpenAIとAOAIの違いはたくさんありますが、そのうちでも顕著なものをいくつかご紹介します。
まず、AOAIはリソースをマルチリージョンにデプロイすることが出来ます。ここで言うリソースとはOpenAIでいう https://api.openai.com/ が各リージョンに複数デプロイできるようなものだとイメージしてください。これにより、
地理的に近いところでAOAIを利用できる
マルチリージョンに負荷分散することで特定のモデルのRate LimitをOpenAIより大幅に上げることが可能
モデル毎にデプロイメントを分けて個別にRate Limitを設定できるので、特定のテナントの利用が他のテナントの利用に影響を与えないような細かい設計が可能
などのメリットを享受できます。例えば執筆時点で最新のモデルであるGPT-4は需要過多により分あたりのRate Limitsは低めに設定されています(最新情報はWhat are the GPT-4 rate limits?からご確認ください)が、AOAIで複数のリージョン(執筆時点で6リージョン)にGPT-4をデプロイして負荷分散することでこれを大幅に緩和することが可能です。OpenAIですでにサービスを提供していてRate Limitに困っていた人たちにはこれは大変な朗報です。
もうひとつが可用性です。OpenAIにはSLA (Service Level Agreement) はありませんが、AOAIはAzure Cognitive Servicesの一部として99.9%以上の稼働率がSLAで保証されています。これは商売としてOpenAIのAPIを使ったサービスを提供する側からしてみれば心強いでしょう。
他にも、AOAIはAzureの強力なサポートを母国語で受けられる点や、契約時に日本の法律を準拠法とし東京地裁裁判所を管轄裁判所に定めることができるため日本の法令に則った個人情報保護をMicrosoftに要求できるなど、いくつか特筆すべきメリットがあります。
僕は敢えて申し上げたい。AOAIを単なるOpenAI代替としてAPIキーとパブリックエンドポイントで使っている内はAOAIの真価を味わっているとは言い難いと。AOAIはその名が示す通りAzureのエコシステムに乗っかってこそ真の実力を発揮します。その辺りはシリーズでたっぷりと紹介予定です。
ところで、OpenAIとAOAIの違いは「CTOの視点から見たAzure OpenAI ServiceとOpenAIのChatGPT APIの深堀り比較」という記事に大変よくまとまっています。著者の執筆時点での両者のパフォーマンス測定などもあって非常に興味深いのでぜひご一読ください。
Azure OpenAI Serviceを使い始める
長々とお待たせしました!ここからはそんなAOAIを実際に使ってみることにします。
Subscription
AOAIを使うためには、Azureの無料アカウントを作成してAzureのサブスクリプション(管理単位)を従量課金に設定する必要があります。これは非常に重要なステップで、サブスクリプションを従量課金にしない限り後述するAOAIの利用申請が許可されません。従量課金にしても利用しない限り費用は発生しないので安心してください。
Azure OpenAI Service利用申請
次に、Request Access to Azure OpenAI ServiceページからAOAIへの利用申請を行います。執筆時点ではAOAIはAzureのサブスクリプションを持っていれば誰でも利用できるサービスではなく、利用申請を行ってそれが許可される必要があります。
申請にはAzureサブスクリプションのSubscription IDの他、会社のメールアドレスやウェブサイトの情報などが求められます。個人のユーザがフリーメールアドレスを使って申請することはできないので、個人事業主の方は事業用のメールアドレスなどを使って申請することになると思います。
申請が完了すると次のようなメールを受信します。
10営業日以内には申請をレビューするとありますが、運が良ければ1日で許可されます。許可されると次のようなメールを受信します。
いつまで経っても申請が許可されない場合は前述の通りサブスクリプションが従量課金にアップグレードされているかチェックしましょう。
GPT-4モデル利用申請
AOAIの利用申請が許可されるとGPT-3.5世代のモデルをデプロイして使うことが出来るようになりますが、執筆時点で最新のGPT-4モデルは超過需要のため別途利用申請が必要です。こちらは時間が掛かるので、折角なのでAzure OpenAI GPT-4 Waitlistページから前もって申請しておきましょう。このWaitlistに並ぶにはAOAIの利用申請がすでに許可されている必要があるので注意してください。
申請すると、まずはWaitlistに登録リクエストを受け付けたとメールが届きます。
しばらくして登録リクエストに問題がなければWaitlistに追加されます。
ここからはひたすら待つしかありません。人によっては2週間で利用が許可された人もいれば、ひと月半掛かったという人もいます。祈りながらひたすら待ちましょう。利用が許可されたら次のようなメールが届き、GPT-4モデルがデプロイできるようになります。
AOAIにリソースを作成
さて、AOAIの利用申請が許可されたら早速AOAIのリソースを作成してみましょう。このステップはGPT-4モデルの利用許可を待つ必要はありません。Azure portalにアクセスし、検索ボックスに「OpenAI」と入力して「Azure OpenAI」を開きます。
「Create」からAOAIリソースを作成します。リソースグループとリージョンと名前(これがエンドポイントのサブドメインになるのでグローバルに一意である必要がある)は適当で構いません。次のページに出てくるネットワーク設定なども一旦デフォルト(パブリック)で問題ありません。
AOAIリソースを作成できたらそれを開きます。
現時点で重要なメニューは2つ。1つ目が「Keys and Endpoint」、2つ目が「Model deployments」です。
「Keys and Endpoint」では、このAOAIリソースのエンドポイントとAPIキーを確認することが出来ます。この情報を使うとすぐにでもAOAIを利用することが出来ます。これらの情報は後のステップで利用するのですぐに参照できようにしておきましょう。
次に「Model deployments」を押すと、「Manage Deployments」から「Azure AI Studio」ページに行くよう促されます。ここでモデルのデプロイメントを行うことができます。
「Create new deployment」からモデルをデプロイします。GPT-4の利用が許可されていればそれらもデプロイすることができます。ここではどのリージョンでも利用できる「gpt-35-turbo」をデプロイしておきましょう。「Deployment name」は特に理由がなければモデル名と合わせておくと良いでしょう。
モデルのデプロイはすぐに完了します。
ここでもしOpenAIのAPIをすでに使ったことがある方がいらっしゃったら、OpenAIとの違いに戸惑われるかも知れません。本家OpenAIではユーザが明示的にモデルをデプロイすることはなく、どのモデルを使うかはリクエストボディで指定します。AOAIではそうではなく、自分が使うモデルは自分でデプロイする必要があります。これはデプロイメントごとに細かくRate Limitを設定する柔軟性をAOAIが提供しているからです。AOAIではリージョン単位で各モデルにRate Limitが設定されていますが、例えば同じgpt-4モデルを開発環境と本番環境で使う場合にそれぞれを別のデプロイメントで分けておいて、開発環境のRate Limitを低く設定することで本番環境を安全に保つようなコントロールが可能です。
必要ならば次の画面のように「Advanced options」からデプロイメント単位でRate Limitを調整できます。
AOAIのAPIを利用する
全ての準備が整いました!AOAIのAPIを利用してみましょう。
「Azure OpenAI Service の REST API リファレンス」にアクセスすると現在AOAIで利用可能なAPIが確認できます。基本的にOpenAIと利用できるAPIや使い方は全く同じです。今回は「Chat completions」を使ってみましょう。これはレガシーなAPIである「Completions」に対して一部の人が俗に"ChatGPT API"と呼んでいるものです。
AOAIではエンドポイントは次のようなフォーマットになります。
${YOUR_RESOURCE_NAME}の部分は作成したAOAIのリソースを、${DEPLOYMENT_ID}の部分は先程作成したデプロイメント名を、${API_VERSION}はAPIのバージョン(現状"2023-05-15"でよい)を指定します。見ての通り、AOAIではURLにモデル名が含まれることがOpenAIとの顕著な違いです。
https://${YOUR_RESOURCE_NAME}.openai.azure.com/openai/deployments/${DEPLOYMENT_ID}/chat/completions?api-version=${API_VERSION}
API呼び出しには公式が用意した各種プログラミング言語のライブラリを使う方法の他、Postmanなど任意のHTTPクライアントを利用できますが、ここでは最も原始的なcurlコマンドを使う例を記載します。ターミナルを立ち上げて次のコマンドを実行してみましょう。
YOUR_RESOURCE_NAMEの部分には先程確認したAOAIリソースを、API_KEYの部分にはAPIキーをそれぞれ入力して実行してください。
YOUR_RESOURCE_NAME=xxxxx
DEPLOYMENT_ID=gpt-35-turbo
API_VERSION=2023-05-15
API_KEY=xxxxx
curl "https://${YOUR_RESOURCE_NAME}.openai.azure.com/openai/deployments/${DEPLOYMENT_ID}/chat/completions?api-version=${API_VERSION}" \
-H "Content-Type: application/json" \
-H "api-key: ${API_KEY}" \
-d '{
"messages": [{"role": "user", "content": "Tell me about Azure OpenAI Service."}]
}'
このような結果が返ってきたら成功です!(※これはjqコマンドで整形してあります)
{
"id": "chatcmpl-7vE2Ql47wYhjtOyntgx0NbdgZsbEV",
"object": "chat.completion",
"created": 1693873014,
"model": "gpt-35-turbo",
"choices": [
{
"index": 0,
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "Azure OpenAI Service is a cloud-based service provided by Microsoft Azure that allows users to access OpenAI models and technologies to enhance the capabilities of their applications. With this service, developers can integrate powerful AI capabilities such as text generation, language translation, natural language understanding, and more into their own software systems.\n\nAzure OpenAI Service primarily leverages OpenAI's GPT-3 (Generative Pre-trained Transformer 3) model, which is one of the most advanced and versatile language models available. This model has been trained on a large corpus of text from the internet to understand and generate human-like text responses.\n\nBy using Azure OpenAI Service, developers can easily build applications that can generate coherent and contextually relevant text, enable multilingual translations, create conversational agents, assist with writing code and documenting software, enhance chatbots, provide content summaries, and more. The service provides an API-based interface, allowing developers to make requests and receive responses from the OpenAI models.\n\nAzure OpenAI Service is designed to be scalable and reliable, utilizing the infrastructure and resources of Microsoft Azure. It offers flexible pricing options based on the number of tokens consumed during API calls, with different plans available to accommodate various usage scenarios. This enables developers to control costs while benefiting from the power and versatility of OpenAI models.\n\nOverall, Azure OpenAI Service empowers developers to easily leverage state-of-the-art AI models in their applications, opening up possibilities for enhanced natural language processing and generation capabilities to deliver richer and more advanced user experiences."
}
}
],
"usage": {
"completion_tokens": 302,
"prompt_tokens": 15,
"total_tokens": 317
}
}
レスポンスの ".choices[0].message.content" を確認すると、次のような回答が取得できており、見事AOAIのAPIを使うことができました!
お疲れ様でした。これで無事にAzure OpenAI Serviceの世界へ一歩踏み出すことができました。残念ながらこのエントリはAOAIの概要とリソースのデプロイそして一番基本的なAPI呼び出しだけで1万字を超えてしまったので、一旦ここで締めくくることにします。
このシリーズはこれにとどまらず、AOAIの様々な実践的な活用方法や構成案についていくつもの記事に分けて紹介予定です。特にセキュリティに関する考察、負荷分散の手法、冗長性の確保などの話題には存分にページを使う予定です。どうぞお楽しみに。
この記事が気に入ったらサポートをしてみませんか?