見出し画像

Azure OpenAI Serviceの世界へようこそ


はじめに

賽は投げられた

2022年11月にOpenAIが公開したAIチャットボットChatGPTは、それまでのチャットボットの常識を大きく凌駕するその余りの流暢な受け答えから瞬く間に技術系コミュニティで話題沸騰となり、わずか2ヶ月でアクティブユーザー数は1億人を超え、その影響範囲はすぐさま技術系コミュニティの内側にとどまるものではなくなりました。プログラマが、大学生が、研究者が、物書きがChatGPTを試してはその自然な回答に驚愕しました。翌23年4月には、東京大学理事・副学長で教育・情報担当の太田邦史博士がChatGPTやStable Diffusion等の「生成系AI」の急速な発展とその著しい品質の向上を受けて「人類はこの数ヶ月でもうすでにルビコン川を渡ってしまったのかもしれない」とする声明を発表しました。

人類はこの数ヶ月でもうすでにルビコン川を渡ってしまったのかもしれないのです。むしろ、どのようにしたら問題を生じないようにできるのか、その方向性を見出すべく行動することが重要であると思います。

生成系AI(ChatGPT, BingAI, Bard, Midjourney, Stable Diffusion等)について

この突然訪れてしまった引き返すことの出来ない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」から。これは最も安価かつ高速で、非常に単純なタスク向けのモデルです。回答はこちら。

ルビコン川は川の一部で、人類は権威を担保していた。川の中には青森洋土地があるということで、ルビコン川を渡ってしまったということは何かを意味しますか?
ルビコン川は川の一部で、人類は権威を担保していた。川の中には青森洋土地があるということで、ルビコン川を渡ってしまったということは何かを意味しますか?
このようにルビコン川を渡ってしまったということは何かを意味しますか?
ルビコン川は川の一部で、人類は権威を担保していた。川の中には青森洋土地があるということで、ルビコン川を渡ってしまったということは何かを意味しますか?
ルビコン川は川の一部で、人類は権威を

text-ada-001, text_completion

うーんこれは厳しいですね。何を言っているのか分かりませんが、どうやらルビコン川は青森県と関わりが深そうです(誤った回答)

次に同じくGPT-3世代から「text-babbage-001」の回答です。これも高速かつ安価なモデルで、非常にストレートなタスクならこなすことができます。

人類がルビコン川を渡ってしまったということは、人類がルビコン川を渡ってしまったということです。

text-babbage-001, text_completion

いわゆる進次郎構文ですね。ジョークとしては面白いですが、これは欲しい回答ではありません。

次に同じくGPT-3世代から「text-curie-001」の回答です。これは能力が高く、後述するDavinciよりも高速で安価なモデルです。そろそろお気付きのとおり、text-ada, text-babbage, text-curie…のようにアルファベットが大きくなるほど高機能であることが分かります。回答はこちら。

人類はルビコン川を渡ってしまったという意味では、AIが人工知能を活用して、人類が過去に行った発展過程を正確に再現することによって、人類が過去に行った発展過程を「渡ってしまった」ということになるのではないでしょうか。

text-curie-001, text_completion

おお!随分まともな日本語が返ってきました!しかしよく見ると微妙に何を言ってるか分からず、回答内容も正確ではありません。

次に同じくGPT-3世代から「text-davinci-003」の回答です。これはGPT-3で最も高機能なモデルです。回答はこちら。

人類は、AIの発展によって、新しい技術や知識を得て、今までにない新しい可能性を開拓し、今までにない新しい世界へと進んでいることを意味します。ルビコン川を渡るというのは、新しい世界への旅を意味しています。

text-davinci-003, text_completion

良いですね!良い感じです!Curieより更に自然な文章になっています。かなり惜しいところまで来ましたが、ルビコン川を渡るという慣用句の意味を完全には捉えきれていません。

次はGPT-3.5世代から「gpt-3.5-turbo」の回答です。これはChatGPTでも使われているモデルであり、自然言語もコードも非常に高度に理解し生成することができます。回答はこちら。

「人類はルビコン川を渡ってしまった」というフレーズは、古代ローマの歴史に由来しており、ジュリウス・カエサルがガリア戦争のためにルビコン川を越えたことを指しています。この行為は法的には禁じられており、彼が自分の権力を行使して共和制を脅かすことを意味していました。
現代の文脈では、「人類はルビコン川を渡ってしまった」というフレーズは、人工知能(AI)の進化によって人間の能力と機能が超えられたことを指しています。具体的には、AIが人間を上回る能力や知識を持つようになり、人間の支配から逃れる可能性があることを意味しています。
このフレーズは、AIが倫理や社会的な問題を抱えることや、人間の仕事や社会システムに影響を与えることを暗示しています。AIが人間に対して支配的な存在になる可能性があるという警告や懸念が表現されています。また、AIの発展が人類の進歩や可能性をもたらす一方で、潜在的なリスクや脅威も抱えることを示唆しています。

gpt-3.5-turbo-0613, chat.completion

良いですね!相当いいです!ついに出典がカエサルの故事であったことが説明されました。内容もほとんどよく、パッと見ただけでは危うく正解をあげてしまいそうです。ところがよく見ると、「人類はルビコン川を渡ってしまった」というフレーズが現代ではもっぱらAIの文脈で使われるかのように説明されています。これは正確ではありません。もう一息ですね。

最後に、執筆時点で最新のモデルであるGPT-4世代から「gpt-4」による回答です。これはChatGPTに月額20ドルを課金することで利用できるChatGPT Plusでも使われているモデルです。

このフレーズは、「ルビコン川を渡る」という歴史的なエピソードに由来しています。古代ローマの時代、ガイウス・ユリウス・カエサルがローマへの進軍を決意する時にルビコン川を渡り、言われた「賽は投げられた」という言葉から来ています。ルビコン川を渡るという行為は、後戻りが不可能な重大な決断を下すことを象徴的に表しています。
AIの発展に関して「人類はルビコン川を渡ってしまった」と言われる時、それはAI技術の進歩とその結果起こる影響について、もはやそのプロセスを止めることが不可能、または極めて困難になったことを表しています。AIが社会や経済のあらゆる面に深く浸透し、その存在なしでは機能しないほどに我々の生活に欠かせないものになったという意味も含まれます。また、AIが自主性や自立性を持つまでに発展し、人間が完全に制御できない存在になってしまったという懸念を示すこともあります。

gpt-4-0613, chat.completion

ついに正解と言ってよい回答が得られました!「ルビコン川を渡る」という慣用句の意味を正確に引用し、かつそれが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/ が各リージョンに複数デプロイできるようなものだとイメージしてください。これにより、

  1. 地理的に近いところでAOAIを利用できる

  2. マルチリージョンに負荷分散することで特定のモデルのRate LimitをOpenAIより大幅に上げることが可能

  3. モデル毎にデプロイメントを分けて個別に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に登録リクエストを受け付けたとメールが届きます。

GPT-4のWaitlistに登録リクエスト

しばらくして登録リクエストに問題がなければWaitlistに追加されます。

GPT-4のWaitlistに登録完了

ここからはひたすら待つしかありません。人によっては2週間で利用が許可された人もいれば、ひと月半掛かったという人もいます。祈りながらひたすら待ちましょう。利用が許可されたら次のようなメールが届き、GPT-4モデルがデプロイできるようになります。

GPT-4モデルの利用が許可された

AOAIにリソースを作成

さて、AOAIの利用申請が許可されたら早速AOAIのリソースを作成してみましょう。このステップはGPT-4モデルの利用許可を待つ必要はありません。Azure portalにアクセスし、検索ボックスに「OpenAI」と入力して「Azure OpenAI」を開きます。

Azure portal

「Create」からAOAIリソースを作成します。リソースグループとリージョンと名前(これがエンドポイントのサブドメインになるのでグローバルに一意である必要がある)は適当で構いません。次のページに出てくるネットワーク設定なども一旦デフォルト(パブリック)で問題ありません。

AOAIリソースを作成

AOAIリソースを作成できたらそれを開きます。
現時点で重要なメニューは2つ。1つ目が「Keys and Endpoint」、2つ目が「Model deployments」です。

AOAIリソース

「Keys and Endpoint」では、このAOAIリソースのエンドポイントとAPIキーを確認することが出来ます。この情報を使うとすぐにでもAOAIを利用することが出来ます。これらの情報は後のステップで利用するのですぐに参照できようにしておきましょう。

Keys and Endpoint

次に「Model deployments」を押すと、「Manage Deployments」から「Azure AI Studio」ページに行くよう促されます。ここでモデルのデプロイメントを行うことができます。
「Create new deployment」からモデルをデプロイします。GPT-4の利用が許可されていればそれらもデプロイすることができます。ここではどのリージョンでも利用できる「gpt-35-turbo」をデプロイしておきましょう。「Deployment name」は特に理由がなければモデル名と合わせておくと良いでしょう。

Deploy model

モデルのデプロイはすぐに完了します。
ここでもしOpenAIのAPIをすでに使ったことがある方がいらっしゃったら、OpenAIとの違いに戸惑われるかも知れません。本家OpenAIではユーザが明示的にモデルをデプロイすることはなく、どのモデルを使うかはリクエストボディで指定します。AOAIではそうではなく、自分が使うモデルは自分でデプロイする必要があります。これはデプロイメントごとに細かくRate Limitを設定する柔軟性をAOAIが提供しているからです。AOAIではリージョン単位で各モデルにRate Limitが設定されていますが、例えば同じgpt-4モデルを開発環境と本番環境で使う場合にそれぞれを別のデプロイメントで分けておいて、開発環境のRate Limitを低く設定することで本番環境を安全に保つようなコントロールが可能です。
必要ならば次の画面のように「Advanced options」からデプロイメント単位でRate Limitを調整できます。

デプロイメントごとに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 is a cloud-based platform that allows developers and data scientists to easily access and leverage OpenAI's powerful artificial intelligence models and capabilities. It enables users to quickly integrate natural language processing (NLP) capabilities into their applications, providing AI-powered language-based interactions.
With Azure OpenAI Service, developers can use API endpoints to make requests to OpenAI's models, including the GPT-3 model. This allows them to generate text, answer questions, summarize long documents, translate languages, and even create conversational agents. The service provides a simple and scalable way to access these AI capabilities, reducing the complexity of building and deploying AI models from scratch.
Users can interact with Azure OpenAI Service through a variety of programming languages and frameworks, making it accessible to a wide range of developers. It also offers various tools and SDKs to streamline model deployment, management, and debugging.
Azure OpenAI Service is designed to be highly secure and compliant with data protection regulations. It includes features like encryption at rest and in transit, role-based access control, and private endpoints to ensure the confidentiality and integrity of data.
By utilizing Azure OpenAI Service, developers can leverage OpenAI's state-of-the-art language models and capabilities, enabling them to build more advanced and intelligent applications with ease.

gpt-35-turbo, chat.completion

お疲れ様でした。これで無事にAzure OpenAI Serviceの世界へ一歩踏み出すことができました。残念ながらこのエントリはAOAIの概要とリソースのデプロイそして一番基本的なAPI呼び出しだけで1万字を超えてしまったので、一旦ここで締めくくることにします。

このシリーズはこれにとどまらず、AOAIの様々な実践的な活用方法や構成案についていくつもの記事に分けて紹介予定です。特にセキュリティに関する考察、負荷分散の手法、冗長性の確保などの話題には存分にページを使う予定です。どうぞお楽しみに。

この記事が気に入ったらサポートをしてみませんか?