祝 Azure OpenAI Service GA! ② GPT-3 & ChatGPT を Rest API から使ってみる

1/16 に GA (General Availability: 一般提供) になった Azure OpenAI Service は、Azure 上で OpenAI が稼働するサービスです。Cognitive Services の一員として & Web API として利用できる、Studio と呼ばれる GUI が用意されており、テストや調整などが可能です。

[Azure OpenAI Studio からお試し](https://qiita.com/annie/items/ce7214c6d683b9442382) してみたので、今度は Rest API で利用してみます。

> 3/10 現在、GA したとはいえ、Azure OpenAI Service を利用するには Web から利用申請が必要です。Text and Code Model (GPT-3) と Dall-E 2 の申し込みができますが、とりあえず Text and Code Model だけ申請するのがおススメ！ChatGPT は Text Model の権限があれば利用できます。また、申請時には有効な Azure サブスクリプション (のID) が必要です。

> Azure OpenAI Service 自体は GA ですが、3/10~ 利用可能になった ChatGPT は現在プレビュー中です。

# 準備
- [Azure OpenAI Studio からお試し](https://qiita.com/annie/items/ce7214c6d683b9442382) の記事を参考に、
    - Azure OpenAI Service のプレビュー申込 & Azure Portal からのサービス作成を行い、キーとエンドポイントをローカルに保存しておきます。
    - GTP-3 モデルの **text-davinch-003**、ChatGPT モデルの **gpt-35-turbo** をデプロイしておきます。
- Rest API を POST 送信できるツール (こちらでは [Postman](https://www.postman.com/) を使います)

# Azure OpenAI Service の GPT-3 ベースのモデルを Rest API から使ってみる

## Abstractive Summarization (趣旨要約)

### GPT-3 モデルへの Rest API Call に必要な情報を確認

[Azure OpenAI Studio: Abstraction Summarization](https://qiita.com/annie/items/ce7214c6d683b9442382#abstractive-summarization-%E8%B6%A3%E6%97%A8%E8%A6%81%E7%B4%84) の手順の通り、GPT-3 プレイグラウンドで **AIモデルへの投入データ (AIモデルへの指示と分析したい文章) を入力した状態**で、**[コードの表示]** をクリックします。

![スクリーンショット 2023-03-13 104122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/ea702b3c-762c-17a0-598d-8d84d4906ad0.png)

python | curl | json のサンプルコードが表示できます。ここでは curl で Rest API からコールするのに必要な内容を確認します。URL 部分を選択してコピーし、ローカルに保存しておきます。

- URL: 
    - **https://XXXXXXX.openai.azure.com/openai/deployments/text-davinci-003_202303/completions?api-version=2022-12-01** 
- Header
    - **Content-type: application/json**
    - **api-key:** Azure Portal で取得したキーを入れます
- Body
    - **Prompt**: 分析したい文章を入れます
    - ほかのパラメーターはとりあえずそのままでOKです 

![スクリーンショット 2023-03-13 104211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/99d18757-3566-3bb0-40ed-9ba4771aaf2f.png)

Rest API コールの Body 部分は **JSON** のサンプルコードを見たほうがわかりやすいです。
画面下の **[コピー]** をクリックして、json の中身をそのままコピー、こちらもローカルに保存しておきます。

![スクリーンショット 2023-03-13 104212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/1bc83a0d-d2f8-3e3f-0f2f-6c80e846ac4a.png)


### GPT-3 モデルへ Rest API で Post してみる

Rest API ツール (ここでは Postman) を開き、情報をセットします。

- Type: **POST**
- URL: **上記の手順でコピーしたURL** (https://XXXXXXX.openai.azure.com/openai/....)
- Header:
    - Content-Type: **application/json**
    - api-key: **Azure Portal からコピーしておいた Azure OpenAI サービスのキー**
- Body: **上記の手順でコピーしたjson**

![スクリーンショット 2023-03-13 104213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/b9f49ecb-996b-f0a1-2daf-ec536a5e71bb.png)
![スクリーンショット 2023-03-13 104214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/82833fe1-5815-a8ad-b0a2-41500b326275.png)

入力できたら、**[Send]** をクリックして POST してみます。
返答が戻り、Body部分に **text** に要約文が表示されます。

![スクリーンショット 2023-03-13 104215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/1d66e3da-24c4-8118-f547-02b61da5775a.png)

> 返答 Text が途中で切れているようですが、返答 Body の json に含まれる **"finish_reason"** が **"length"** となっているので、もう少し返答トークンの上限値 ("max_token") を増やす必要がありそうです。 


# Azure OpenAI Service の ChatGPT ベースのモデル を Rest API から使ってみる

[Azure OpenAI Studio: ChatGPT モデルをお試し](https://qiita.com/annie/items/ce7214c6d683b9442382#chatgpt-%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E3%81%8A%E8%A9%A6%E3%81%97) の手順で、ChatGPT プレイグラウンドを開き、**チャットセッション** のエリア下部にある入力欄に質問を入力します。すると回答が生成されて表示されます。

![スクリーンショット 2023-04-23 132825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/522249fd-3cd8-34e0-16dd-0003a989b21d.png)

回答が表示された状態で、**チャットセッション** のエリアにある **Show raw JSON** を ON にします。

![スクリーンショット 2023-04-23 132829.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/ab271b9d-504e-0fcc-109c-fbd964e6e531.png)

下図の赤枠の部分が ChatGTP のモデルで生成された回答なので、Web API で利用するときはこの部分を削除して (＝この部分の回答を作成するように) POSTすることになります。

![スクリーンショット 2023-04-23 132843.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/b04fc5dd-6bfc-2df2-a44a-dc2fe5243eb3.png)

**チャットセッション** のエリアにある **コードの表示** をクリックします

![スクリーンショット 2023-04-23 132845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/ce20124f-c8f7-7add-448f-00664495fd64.png)

GPT-3 モデルと同様に、python | C# | curl | json のサンプルコードが表示されます。
curl で Rest API からコールするのに必要な内容を確認します。

- URL: 
    - **https://(作成した Azure OpenAI Service 名).openai.azure.com/openai/deployments/(作成した gtp-35-turbo のデプロイ名)/completions?api-version=2023-03-15-preview**
- Header
    - **Content-type: application/json**
    - **api-key**: (Azure Portal で取得したキー)
- Body
    - messages: 前の手順で確認した JSON 
    - ほかのパラメーターはとりあえずそのままでOKです

URL 部分を選択してコピーし、ローカルに保存しておきます。

![スクリーンショット 2023-04-23 132920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/d052e2ff-25b9-6a08-c604-774941515e83.png)

Rest API コールの Body 部分は **JSON** のサンプルコードを確認します。
画面下の **[コピー]** をクリックしてローカルに保存しておきます。 

> やはり ChatGPT が生成した回答も入ってしまっているので、実際に POST するときは、この部分を削除 (＝この部分の回答を作成するように) して使います。
 
![スクリーンショット 2023-04-23 135603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/8115ed8e-376a-9ef7-8850-468266f207d4.png)


### ChatGPT モデルへ Rest API で Post してみる

Rest API ツール (ここでは Postman) を開き、情報をセットします。

- Type: **POST**
- URL: **上記の手順でコピーしたURL** (https://XXXXXXX.openai.azure.com/openai/....)
- Header:
    - Content-Type: **application/json**
    - api-key: **Azure Portal からコピーしておいた Azure OpenAI サービスのキー**

![スクリーンショット 2023-04-23 141034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/a387f1d6-6445-e6a7-d36f-fcf749a0d054.png)

- Body: 上記の手順でコピーした JSON を一旦そのまま貼り付け、**content** の項目を加工します。

>**gtp-35-turbo** モデルによるチャット生成は、ユーザーまたはボットの会話が 
```{"role":"ユーザー名", "content":"会話の内容"}``` のフォーマットで示され、
```{"role":"ユーザー名", "content":""}``` のように **content が空になっている** ユーザーの会話を生成する仕組みになっています。

変更前(例)
```json
{
      "role": "assistant",
      "content": "ChatGPTは、情報検索に役立つ機能を持つAIアシスタントです。以下のようなことができます。\n\n1. 質問に答える：ChatGPTは、あらゆるトピックに関する質問に答えることができます。例えば、歴史、地理、科学、テクノロジー、エンターテインメントなど。\n\n2. 検索結果の提供：ChatGPTは、特定のトピックに関する情報を検索して、それに関する検索結果を提供することができます。\n\n3. 翻訳：ChatGPTは、多言語に対応しており、テキストを他の言語に翻訳することができます。\n\n4. カレンダーの管理：ChatGPTは、予定を管理するためのカレンダーアプリケーションと連携して、予定の追加や削除などの操作を行うことができます。\n\n5. その他のタスク：ChatGPTは、他にも多くのタスクを実行することができます。例えば、音楽の再生、天気情報の提供、ニュースの配信、ユーザーの健康状態を追跡するなど。"
    }
```

↓ ChatGTPが作成した回答を削除します。
変更後(例)
```json
{
      "role": "assistant",
      "content": ""
    }
```

![スクリーンショット 2023-04-23 141124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/f6a53851-1248-347d-87ad-6d2fd19ef21f.png)

入力できたら、**[Send]** をクリックして POST してみます。
返答が戻り、Body部分の **content** に返答文が表示されます。

![スクリーンショット 2023-04-23 141804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/6a83a5b9-464e-470a-eafc-35697d5ad7a0.png)

さらに同じコンテキストで会話を続けたい場合は、生成された回答と質問を追加して POST します。

> ```...{ "role":"assistant", "content":"(ChatGPTが生成した回答)" },{ "role":"user", "content": "(追加の質問)", "role": "assistant", "content":""} ``` となるように Body の JSON を修正します。

![スクリーンショット 2023-04-23 142007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/46af9e58-aab2-866f-05a2-c7636bdade92.png)

初めの質問と回答を加味した、追加質問に対する回答が生成されます。

![スクリーンショット 2023-04-23 142043.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/c7756d18-3bd0-dddc-60f4-74cbf80ae69d.png)