🗣️

Azure OpenAI Service で GPT-4 API を使う

2023/04/07に公開

はじめに

2023 年 3 月 21 日に Azrue OpenAI Service で GPT-4 の登録制プレビューが開始しましたので、情報をまとめました。

ちなみに、本家 OpenAI での GPT-4 の発表と同じタイミングで、実は 新しい Bing背後には GPT-4 がいたことが公表されました。さらにその直後、Microsoft 365 CopilotCopilot in Microsoft Power Automate などの GPT-4 を使った新機能が Microsoft から立て続けに発表されました。

一方 OpenAI や Microsoft 以外でも、Google、Adobe、Baidu なども同時期にジェネレーティブ AI に関連するサービスの発表を行っていて、世はまさに、大ジェネレーティブ AI 時代です。

[補足] Azure OpenAI Service について

Azure OpenAI Service については以前の記事で触れていますが、直近のアップデートが激しいため更新しきれていないかもしれません。そのため、OpenAI や Microsoft の公式ドキュメントも合わせてご確認ください。

GPT-4 で何が変わった?

GPT-4 と以前の GPT-3.5 の違いを端的に表現すると、性能の向上マルチモーダル化です。細かい説明は割愛します。詳細は GPT-4 の公式発表やその中にリンクが記載されている Technical Report を参照してください。

参考

性能の向上

こなせるタスクの種類 (後述する画像入力を除く) という観点では根本的に GPT-4 は GPT-3.5 と大差はないとされています。しかしその性能は大きく向上していて、まだ現実世界のシナリオでは人間には及ばないものの様々なベンチマーク上では人間レベルのパフォーマンスを示しているとされています。

For many basic tasks, the difference between GPT-4 and GPT-3.5 models is not significant. However, in more complex reasoning situations, GPT-4 is much more capable than any of our previous models.

while less capable than humans in many real-world scenarios, exhibits human-level performance on various professional and academic benchmarks.

より具体的には、GPT-4 は GPT-3.5 に比べて以下のような点で性能が向上しています。特定領域の性能だけが向上したというわけではなく満遍なく大きく性能が向上していて、後述するマルチモーダル化と合わせてより汎用人工知能 (AGI) に近づいた印象を受けます。

  • ベンチマークのスコア向上
  • 資格試験のスコア向上
  • 英語以外の言語処理性能[1]の向上
  • hallucinations (モデルが不正確な出力をしてしまうこと) の低減
    • ただし、hallucinations のリスク自体が存在するという点は以前のモデルと同じ
  • 最大トークン (入出力テキスト長) の拡張

マルチモーダル化

GPT-4 はマルチモーダルなモデルです。具体的には、テキストに加えて画像入力も受け付けることができるようになり、それに対してテキストによる出力を行えます。

GPT-4 is a large multimodal model (accepting image and text inputs, emitting text outputs)

ただし、利用者に提供されるサービスや API としては、執筆時点で画像入力機能はまだ制限されていて利用できない状態です。

accepting text inputs and emitting text outputs today, with image inputs coming in the future

GPT-4 と GPT-3.5 どちらを使うべきか?

言語処理において、GPT-4 は GPT-3.5 と比較したときに長所と短所の両方が存在します。個人的な感覚にはなりますが、結論から書くと以下のような使い分けになると思います。

  • GPT-4: クオリティ・長さを重視する場合 (gpt-35-turbo-16k の登場により両者の最大トークンの差はやや縮まりました)
  • GPT-3.5: 速さ・低コストを重視する場合

ちなみに、本家 OpenAI の ChatGPT では両者の違いが以下のように表現されています。

GPT-4

  • Reasoning (論理性): ★★★★★
  • Speed (生成速度): ★★
  • Conciseness (簡潔さ): ★★★★

Default (GPT-3.5)

  • Reasoning (論理性): ★★★
  • Speed (生成速度): ★★★★★
  • Conciseness (簡潔さ): ★★

[補足] "GPT-3.5" が指すモデルについて

実際には GPT-3.5 シリーズには複数のモデルが含まれますが、本記事では特に断りがない限り ChatGPT API である gpt-35-turbo (本家 OpenAI 版では gpt-3.5-turbo) とそのスナップショットバージョンを指すことにします。理由としては、公式ドキュメントにも記載がある通り gpt-35-turbo は GPT-3.5 シリーズの中で最も高性能で低コストのモデルに位置づけられているため、執筆時点で GPT-3.5 シリーズの中からモデルを選択する場合の第一の選択肢になると思われるためです。

Most capable GPT-3.5 model and optimized for chat at 1/10th the cost of text-davinci-003. (GPT-3.5 の中で最高性能のモデルで、チャット用に最適化さています。コストは text-davinci-003 の 1/10 です。)

参考

GPT-4 の長所

前述のとおり性能が大きく向上しているため、より高い論理性があり、より複雑な指示の理解ができて、より高いクリエイティビティを発揮するとされています。また、最大トークンも拡張されているため、モデルの仕様上は GPT-3.5 と比較して最大約 8 倍の文量を扱うことができます。

GPT-4 の短所

一方でいくつか短所も存在します。いずれもモデルの巨大化・高性能化によるトレードオフによるものと思われます。

生成速度

生成するコンテンツの内容や長さに依存するため定量的に表現するのは難しいのですが、GPT-3.5 と比べると遅いです。加えて GPT-4 では最大トークンも拡張されていますので、ユーザーから見た待ち時間はさらに長くなる可能性があります。
同じ入力を行った際の生成速度の差のイメージは以下のとおりです。ストリーミング出力ができる本家 OpenAI の ChatGPT で比較しています。なお、実際に Azure OpenAI Service の API 経由でリクエストをした際の生成速度とは異なる可能性があります。

GPT-3.5

かなりサクサク生成が進みます。

GPT-4

GPT-3.5 に比べるとゆっくり生成が進みます。

価格

例えば、GPT-3.5 の代表的なモデルである gpt-35-turbo (本家 OpenAI では gpt-3.5-turbo) と比べると入力で 15 ~ 30 倍、出力で 30 ~ 60 倍ほど高額に設定されていますので、プロジェクト予算に応じて性能と価格のバランスを取る必要が出てきます。価格の詳細は後述します。

モデル

[参考] 本家 OpenAI

Azure OpenAI Service の GPT-4 API を理解するために、参考情報として本家 OpenAI の情報を記載します。
本家 OpenAI で GPT-4 API として利用できるモデルには、大きく分けて gpt-4 (8k)gpt-4-32k の 2 つのシリーズが存在しています。テレビやモニターのようですが、ここでの 8k32k はモデルが扱える最大トークンを表しています。
モデル名末尾に何もついていないモデルは最新のバージョンに更新され続けます。一方でモデル名末尾に -0314 がついているモデルは 2023 年 3 月 14 日時点のスナップショットバージョンです。このスナップショットバージョンは 2023 年 6 月 14 日までの 3 か月の間サポートされるようです。
なお、これらの GPT-4 シリーズのモデルは、gpt-3.5-turbo などと同じくマルチターンのやり取りができる、いわゆる ChatGPT API に分類されます。

LATEST MODEL DESCRIPTION MAX TOKENS TRAINING DATA
gpt-4 More capable than any GPT-3.5 model, able to do more complex tasks, and optimized for chat. Will be updated with our latest model iteration. (GPT-3.5のどのモデルよりも高性能で、より複雑なタスクをこなし、チャットに最適化されています。 最新のモデルで更新され続けます。) 8,192 tokens Up to Sep 2021 (2021 年 9 月まで)
gpt-4-0314 Snapshot of gpt-4 from March 14th 2023. Unlike gpt-4, this model will not receive updates, and will only be supported for a three month period ending on June 14th 2023. (2023 年 3 月 14 日の gpt-4 のスナップショットバージョンです。このモデルは gpt-4 とは異なり、更新は行われず、2023 年 6 月 14 日までの 3 ヶ月間のみサポートされます。) 8,192 tokens Up to Sep 2021 (2021 年 9 月まで)
gpt-4-32k Same capabilities as the base gpt-4 mode but with 4x the context length. Will be updated with our latest model iteration. (基本 gpt-4 モデルと同じ機能ですが、コンテキスト長が 4 倍になっています。最新のモデルで更新され続けます。) 32,768 tokens Up to Sep 2021 (2021 年 9 月まで)
gpt-4-32k-0314 Snapshot of gpt-4-32 from March 14th 2023. Unlike gpt-4-32k, this model will not receive updates, and will only be supported for a three month period ending on June 14th 2023. (2023 年 3 月 14 日の gpt-4-32 のスナップショットです。gpt-4-32k とは異なり、更新は行われず、2023 年 6 月 14 日までの 3 ヶ月間のみのサポートされます。) 32,768 tokens Up to Sep 2021 (2021 年 9 月まで)

参考

Azure OpenAI Service

執筆時点で、Azure OpenAI Service では本家 OpenAI で利用可能な前述のモデルのうち gpt-4-0314gpt-4-32k-0314 に相当するモデルが利用可能です。執筆時点で gpt-4gpt-4-32k に相当する選択肢はありませんでした。

参考

Fine-tuning

執筆時点で GPT-4 モデルは Fine-tuning に対応していません。gpt-35-turbo (本家 OpenAI 版では gpt-3.5-turbo) も Fine-tuning には対応していないことから、ChatGPT API は Fine-tuing に対応しない方向性なのかもしれません。

参考

リージョン

GPT-4 が利用可能なリージョンは下記のドキュメントを参照してください。

参考

制限値

GPT-4 モデルは Azure OpenAI Service の他のモデルとは別に制限値が設定されています。

参考

価格

GPT-3.5 以前のモデルは入出力トークンの価格差はありませんでしたが、GPT-4 モデルでは入出力 (Prompt と Completion) で異なる価格設定となっています。さらに、扱える最大トークンが大きい 32k モデルは通常の 8k モデルの 2 倍の価格設定となっています。
GPT-4 は前述のとおり、gpt-35-turbo の $0.002/1k トークン と比べると最大数十倍程度高額な設定になっています。しかし、GPT-3 の約 1,750 億パラメーターに対して GPT-4 は一説によると約 100 兆パラメーター (詳細は非公表) を持つとも言われていますので、コンピューティングコストの増大のわりにはお買い得だと考えることもできるかもしれません。
なお、執筆時点で Azure OpenAI Service と本家 OpenAI は同じ価格設定でした。

GPT-4 8k モデル

  • 入力: $0.03/1k トークン
  • 出力: $0.06/1k トークン

GPT-4 32k モデル

  • 入力: $0.06/1k トークン
  • 出力: $0.12/1k トークン

参考

使い方

1. 申請

Azure OpenAI Service で GPT-4 を使うためには、前提条件として Azure OpenAI Service の利用申請が承認されている必要があります。

申請が承認されたら、GPT-4 プレビューの待ちリストに登録を行います。ApplicationID には、Azure OpenAI Service の申請時に受け取ったメールに記載されている番号を入力します。

2023 年 9 月 のアップデートにて、追加申請不要ですべてのユーザーが GPT-4 を利用可能になりました。

参考

2. リソース作成

Azure OpenAI Service の利用申請が承認されるとメールが届きます。この時点で Azure Portal から Azure OpenAI Service のリソースが作成可能になっています。以下の手順に従ってリソースを作成します。

参考

2. デプロイ

GPT-4 プレビュー申請が承認されると、Azure OpenAI Service の承認とは別のメールが届きます。 この時点で GPT-4 モデルのデプロイができるようになっています。以下の例では gpt-4-32k のバージョン 0314gpt-4-32k-0314 という名前を付けてデプロイしています。Azure OpenAI Service でモデルを使用する際はこのデプロイ名を指定します。

参考

3. Playground

Azure OpenAI Studio の Playground から、事前にデプロイした GPT-4 モデルを選択することができます。

GPT-4 シリーズのモデルの最大トークン拡張に伴い、Playground で指定できる Max response の値も大きくなっています。

参考

3. Python API

GPT-4 モデルの Python API は 本家 OpenAI の Chat Completions とほぼ同じものに統一されました。(ChatML の事は忘れましょう)
コードは以下のようになります。キーとエンドポイントは事前に取得 して環境変数に登録しておきます。コードのフォーマットは、モデルの最大トークンが拡張されていることを除けば GPT-3.5 で Chat Completions API を使う場合と全く同じです。

import os
import openai

openai.api_type = "azure"
openai.api_base = os.getenv("AOAI_API_BASE")
openai.api_version = "2023-05-15"
openai.api_key = os.getenv("AOAI_API_KEY")

response = openai.ChatCompletion.create(
    engine="gpt-4-0314",  # デプロイ名を指定
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
    ],
    max_tokens=800,
    temperature=0
)

# print(response["choices"][0]["message"]["content"])  # レスポンスのテキスト部分のみ取得する場合
print(response)

以下のようなフォーマットで結果が返ってきます。

{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "The 2020 World Series was played at the Globe Life Field in Arlington, Texas. It was the first neutral-site World Series in modern baseball history due to the COVID-19 pandemic.",
        "role": "assistant"
      }
    }
  ],
  "created": 1680842025,
  "id": "chatcmpl-72Y5Btv0cYFP7ljN0gMDqs3qlWmgg",
  "model": "gpt-4",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 39,
    "prompt_tokens": 52,
    "total_tokens": 91
  }
}

参考

最大トークン拡張の効果

GPT-4 モデルでは最大トークンが大きく拡張されて最大で 32,764 トークンを一度に扱うことができるようになりました。(gpt-35-turbo の最大トークンは 4,096) これにより、前世代のモデルでは分割する必要があった長文を一度に処理することができるようになったり、より多くの Few-shot Example や System メッセージを与える事ができるようになりました。

今回は長文を扱う例として、宮沢賢治『セロ弾きのゴーシュ』のあらすじを書かせてみました。tiktoken で事前にトークン数を確認してみたところ、本文のみで文字数は 12,263、トークン数は 12,481 (エンコーディング cl100k_base) でした。

import os
import openai

openai.api_type = "azure"
openai.api_base = os.getenv("AOAI_API_BASE")
openai.api_version = "2023-05-15"
openai.api_key = os.getenv("AOAI_API_KEY")

system_text = "あなたは出版社に勤めるプロの編集者です。本のあらすじを書くことが得意です。"
user_text = """
以下の文章を読んで、「です・ます調」であらすじを書いてください。
'''
セロ弾きのゴーシュ

ゴーシュは町の活動写真館でセロを弾く係りでした。けれどもあんまり上手でないという評判でした。上手でないどころではなく実は仲間の楽手のなかではいちばん下手でしたから、いつでも楽長にいじめられるのでした。...
'''
"""

response = openai.ChatCompletion.create(
    engine="gpt-4-32k-0314",  # デプロイ名を指定
    messages=[
        {"role": "system", "content": system_text},
        {"role": "user", "content": user_text},
    ],
    max_tokens=5000,
    temperature=0.5
)

print(response["choices"][0]["message"]["content"])
# print(response)

結果は以下のとおりです。

『セロ弾きのゴーシュ』は、ゴーシュという町の映画館でセロを弾く係の男性が主人公の物語です。彼は仲間の中で最も下手なセロ弾きで、いつも楽長にいじめられています。ある日、練習中に楽長がゴーシュに厳しく指導しますが、彼のセロの腕はなかなか上達しません。そんなある晩、ゴーシュの家に次々と動物たちが現れ、彼に音楽を教えてほしいと頼みます。猫、かっこう鳥、狸の子、野ねずみなどが次々と現れ、彼らとの交流を通じてゴーシュは少しずつ自分の音楽に自信を持ち始めます。そして、ある日の演奏会でゴーシュは見事な演奏を披露し、仲間たちから称賛されることになります。最後に彼は、かつて自分を助けてくれたかっこう鳥に感謝の気持ちを伝えるのでした。

なお、今回の対象は青空文庫で、かつ、あらすじの情報もウェブ上に多く公開されていますので、Leakage が発生して GPT-4 の正確な文章要約能力を反映できていない可能性があります。

引用・参考

[補足] ChatML API

GPT-4 モデルでは ChatML API は使えません。以前の API バージョンを指定してリクエストを送ってもエラーが返ってきます。

import os
import openai

openai.api_type = "azure"
openai.api_base = os.getenv("AOAI_API_BASE")
openai.api_version = "2022-12-01"
openai.api_key = os.getenv("AOAI_API_KEY")

prompt="""<|im_start|>system
You are a helpful assistant.
<|im_end|>
<|im_start|>user
Who won the world series in 2020?
<|im_end|>
<|im_start|>assistant
The Los Angeles Dodgers won the World Series in 2020.
<|im_end|>
<|im_start|>user
Where was it played?
<|im_end|>
<|im_start|>assistant
"""

response = openai.Completion.create(
    engine="gpt-4-0314",
    prompt=prompt,
    max_tokens=800,
    temperature=0,
    stop=["<|im_end|>"]
)

# print(response["choices"][0]["text"])
print(response)
Traceback (most recent call last):
  File "/home/xxxx/openai-lab/gpt-4-test-chatml.py", line 24, in <module>
    response = openai.Completion.create(
  File "/home/xxxx/.openai/lib/python3.10/site-packages/openai/api_resources/completion.py", line 25, in create
    return super().create(*args, **kwargs)
  File "/home/xxxx/.openai/lib/python3.10/site-packages/openai/api_resources/abstract/engine_api_resource.py", line 153, in create
    response, _, api_key = requestor.request(
  File "/home/xxxx/.openai/lib/python3.10/site-packages/openai/api_requestor.py", line 226, in request
    resp, got_stream = self._interpret_response(result, stream)
  File "/home/xxxx/.openai/lib/python3.10/site-packages/openai/api_requestor.py", line 619, in _interpret_response
    self._interpret_response_line(
  File "/home/xxxx/.openai/lib/python3.10/site-packages/openai/api_requestor.py", line 682, in _interpret_response_line
    raise self.handle_error_response(
openai.error.InvalidRequestError: The completion operation does not work with the specified model, gpt-4. Please choose different model and try again. You can learn more about which models can be used with each operation here: https://go.microsoft.com/fwlink/?linkid=2197993.

対応 API バージョンの一覧は以下のとおりです。

モデル 2023-05-15 (Chat Completions) 2022-12-01 (ChatML)
gpt-35-turbo
gpt-4 / gpt-4-32k ×

本家 OpenAI との API 比較に関しては以前の記事でまとましたので、そちらも参照してください。

参考

4. REST API

最後に REST API の例です。キーとエンドポイントは事前に取得 して値を置き換えます。また、GPT-4 モデルのデプロイ名を URL の中で指定します。

  • <AOAI_API_KEY>: キー
  • <AOAI_API_BASE>: エンドポイント
  • <DEPLOYMENT_NAME>: GPT-4 モデルのデプロイ名

リクエスト

curl <AOAI_API_BASE>/openai/deployments/<DEPLOYMENT_NAME>/chat/completions?api-version=2023-05-15 \
  -H "Content-Type: application/json" \
  -H "api-key: <AOAI_API_KEY>" \
  -d '{
    "messages":[
      {"role": "system", "content": "You are a friendly assistant."},
      {"role": "user", "content": "What''s up?"}],
    "max_tokens": 800,
    "temperature": 0
  }'

レスポンス

HTTP/1.1 200 OK
Cache-Control: no-cache, must-revalidate
Content-Length: 378
Content-Type: application/json
access-control-allow-origin: *
openai-model: gpt-4
apim-request-id: 55b59cec-c61d-4cd0-848f-8b8e6956a6e5
openai-processing-ms: 1042.7528
x-content-type-options: nosniff
x-accel-buffering: no
x-request-id: f36c09bd-e357-4f36-b9f1-6e50311522b9
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
x-ms-region: South Central US
Date: Fri, 07 Apr 2023 07:38:26 GMT
Connection: close

{
  "id": "chatcmpl-72axubUXXgMz84SLuIByLhTxmJBPt",
  "object": "chat.completion",
  "created": 1680853106,
  "model": "gpt-4",
  "choices": [
    {
      "index": 0,
      "finish_reason": "stop",
      "message": {
        "role": "assistant",
        "content": "Hello! I'm here to help you with any questions or information you need. What can I assist you with today?"
      }
    }
  ],
  "usage": {
    "completion_tokens": 25,
    "prompt_tokens": 19,
    "total_tokens": 44
  }
}

参考

おわりに

GPT-4 使い倒しましょう。

以上です。🍵

脚注
  1. 本筋ではありませんが、英語で書かれた MMLU ベンチマークの選択肢問題を Azure Translate (微妙にスペルが違う気がしますが..) で翻訳して英語以外の言語の性能を測定しているそうです。https://openai.com/research/gpt-4#appendix ↩︎

Microsoft (有志)

Discussion