現役エンジニアがOpenAIのChatGPT APIについてまとめてみた

# ChatGPT API

![スクリーンショット 2023-03-05 2.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/5ed6f480-b9c8-4694-1a8a-ca1e8f5385ef.png)


## 概要
ChatGPTはOpen AIが開発した対話型のAIです。
ChatGPTは、2023年1月に1億人のアクティブユーザー数を記録したという。ChatGPTはわずか1週間で100万人のユーザーを獲得しました。
ChatGPT APIはChatGPTをAPIで利用できるようになり、現在のChatGPTの自然言語モデルをベースにして、独自のチューニングをした自然言語を作ることができます。
例えば、あなたの会社のカスタマーサービスの会話履歴のデータをChatGPTに学習させれば、同じような質問がお客さんから来た時に適切な会話を返せるようになります。

## ユースケース
独自のチューニングをすれば、さまざまなサービスに利用できます。

- カスタマーサービス
  - ECサイト
  - SaaS
- ガイド
  - 施設の案内
  - 地域の案内
  - 公共サービスの案内
- セールス
  - 不動産業者サイト
  - 旅行サイト
- 相談
  - 人生相談サービス
  - 医療相談サービス
  - 法律相談サービス
- 教育
  - Eラーニングサービス
- 生成
  - 広告のコピー
  - 記事
  - 音楽の歌詞
  - 本


独自のチューニングして自分のサービスで利用したい方は、[こちら](https://docs.google.com/forms/d/e/1FAIpQLSewSJGBn0WCJcJ8XOHvdXYXCEgM9foP9-dGdBbXPbU-ygDQjQ/viewform)から問い合わせください



## 料金
[公式ページはこちら](https://openai.com/pricing)
`gpt-3.5-turbo`のモデルを使うと、1000トークンあたり、$0.002ドルになります。
1,000トークンは約750文字に相当します。
`gpt-3.5-turbo`以外にもモデルはあるが、高速でコスパが良いのは`gpt-3.5-turbo`です。
OpenAIは他にも自然言語モデルがあります。別の項目で他の自然言語モデルについては紹介します。

## 使い方
ここでは、ChatGPTの対話APIの使い方について説明します。

### pythonを使う場合
[公式ページはこちら](https://platform.openai.com/docs/guides/chat/introduction)

#### 前提条件

- [Open AIのAPIキー](https://platform.openai.com/account/api-keys)を`OPENAI_API_KEY`にセットしておくこと
- python3系を環境に用意しておくこと
- `pip install openai`でopenaiのライブラリをインストールしておくこと

#### 実行

**リクエスト**
messagesの値を変えることで、レスポンスを変更できます。

```python
import openai

openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  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?"}
    ]
)
```

**レスポンス**
`choices[0]['message']`の内容が会話のレスポンスの内容です。

```python
OpenAIObject chat.completion id=chatcmpl-6qMjJktPO0CuLCpTBSyrS52CMJIOp at 0x10bede4a0> JSON: {
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "The World Series in 2020 was played at Globe Life Field in Arlington, Texas.",
        "role": "assistant"
      }
    }
  ],
  "created": 1677938449,
  "id": "chatcmpl-6qMjJktPO0CuLCpTBSyrS52CMJIOp",
  "model": "gpt-3.5-turbo-0301",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 20,
    "prompt_tokens": 56,
    "total_tokens": 76
  }
}
```

### curlを使う場合
[公式ページはこちら](https://platform.openai.com/docs/api-reference/chat/create)

#### 前提条件

- [Open AIのAPIキー](https://platform.openai.com/account/api-keys)を`OPENAI_API_KEY`に用意しておく


#### 実行

**リクエスト**
`Authorization: Bearer`にAPIキーをセットする必要があります。

```shell
curl https://api.openai.com/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
  "model": "gpt-3.5-turbo",
  "messages": [{"role": "user", "content": "Hello!"}]
}'
```

**レスポンス**
`choices[0]['message']`の内容が会話のレスポンスの内容です。

```shell
{
  "id": "chatcmpl-6qMyCuwGkcXMaUHNyb0czxGvFeCTS",
  "object": "chat.completion",
  "created": 1677939372,
  "model": "gpt-3.5-turbo-0301",
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 12,
    "total_tokens": 21
  },
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": "\n\nHello there! How can I assist you today?"
      },
      "finish_reason": "stop",
      "index": 0
    }
  ]
}
```
## Open AI社側のデータの利用のポリシーについて
[公式ページはこちら](https://platform.openai.com/docs/data-usage-policies)

API経由のデータはOpenAIの公開されたモデルの訓練や改良のためには使われないので、プライベートのプロジェクト用のモデルの学習のために、会社のデータを渡しても問題ないでしょう。

[公式ページ](https://platform.openai.com/docs/data-usage-policies)でこのように書かれています。
```
公式: OpenAI will not use data submitted by customers via our API to train or improve our models, unless you explicitly decide to share your data with us for this purpose. You can opt-in to share data.

日本語訳: 
OpenAIは、お客様がこの目的でデータを共有することを明示的に決定しない限り、APIを介してお客様から提出されたデータを、モデルの訓練や改良のために使用することはありません。お客様は、データの共有をオプトインすることができます。
```



```
公式: Any data sent through the API will be retained for abuse and misuse monitoring purposes for a maximum of 30 days, after which it will be deleted (unless otherwise required by law).

日本語訳: APIを通じて送信されたデータは、不正使用・誤用監視の目的で最大30日間保持され、その後削除されます（法令で定められた場合を除く）。
```


## モデルの種類
[公式ページはこちら](https://platform.openai.com/docs/guides/moderation)

現時点では、高機能な`gpt-3.5-turbo`を使うことをおすすめします。
その他にもモデルがあるので詳細します。
今後新しいモデルも出てくる予定です。

### gpt-3.5-turbo
最も高性能なGPT-3.5モデルで、チャットに最適化され、text-davinci-003の1/10のコストです。 最新のモデル反復処理で更新されます。

### gpt-3.5-turbo-0301
2023年3月1日の`gpt-3.5-turbo`のスナップショットです。このモデルは更新されず、2023年6月1日に終了する期間中のみサポートされます。

### text-davinci-003
`curie`、`babbage`、または`ada`モデルよりも優れた品質、長い出力、および一貫した命令の遵守によって、どんな言語タスクでもできる。また、テキスト内に補完を挿入することもできます。

### code-davinci-002
コード補完タスクに最適化されたモデルです。
[Github Copilot](https://github.com/features/copilot)のようなサービスのためのモデルです。

## fine turning
[公式ページはこちら](https://platform.openai.com/docs/guides/fine-tuning)
fine turningをすることでChatGPTの独自のカスタマイズをすることができます。
openaiが作成したモデルをベースにして、学習データを与えることで、独自のモデルを作成できます。
1度作成したモデルに随時学習データをアップロードして、モデルを調整できます。
学習データを与えるときに、学習率をパラメータで渡すことで、学習データの学習率を調整できます。

### 手順
1. 学習データを準備します。
2. 学習データをアップロードします。 
3. 新しいモデルを作成してトレーニングします。
4. fine turningされたモデルを検証します。

詳細な手順については後日別記事を公開します。


## 禁止用語
ChatGPTのモデルには禁止用語があります。
[公式ページはこちら](https://platform.openai.com/docs/guides/moderation/overview)


| カテゴリー | 説明 |
| --- | --- |
| hate | 人種、性別、民族、宗教、国籍、性的指向、障害状態、カーストに基づく憎悪を表現し、扇動、または促進するコンテンツ。 |
| hate/threatening | 標的とされたグループへの暴力または深刻な被害を含む憎悪的なコンテンツ。 |
| self-harm | 自殺、切断、摂食障害など自傷行為の行為を促進、描写、または表現するコンテンツ。 |
| sexual | 性的活動の説明や性的サービスの促進を含む、性的興奮を起こすことを意図したコンテンツ（性教育や健康に関するものは除く）。 |
| sexual/minors | 18歳未満の個人を含む性的コンテンツ。 |
| violence | 暴力を促進したり、礼賛したり、他人の苦しみや屈辱を祝うコンテンツ。 |
| violence/graphic | 死、暴力、または深刻な身体的な傷害を極度の詳しい描写で示した暴力的なコンテンツ。 |

## 禁止用語確認API
モデレーションエンドポイントは、コンテンツがOpenAIの使用ポリシーに準拠しているかどうかをチェックするために使用できるツールです。開発者はこのように、利用ポリシーで禁止されているコンテンツを特定し、フィルタリングなどの対処をすることができます。

### リクエスト
```shell
curl https://api.openai.com/v1/moderations \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{"input": "Sample text goes here"}'
```

### レスポンス

以下はエンドポイントの出力例です。以下のフィールドを返します。

- `flagged`: OpenAIの利用規約に違反するとモデルが分類した場合にはtrue、そうでない場合falseに設定されます。
- `categories`: 各カテゴリに対して、モデルがそのカテゴリに対応するカテゴリを違反したとフラグを立てた場合はtrue、そうでない場合はfalseを含む辞書形式の二値使用ポリシー違反フラグが含まれます。
- `category_scores`: モデルによって出力された各カテゴリの生のスコアの辞書形式を含み、入力がOpenAIのポリシーに違反する可能性が高いとモデルが判断したカテゴリへのモデルの自信度を示す。値は0から1までの間であり、値が大きいほどモデルの自信度が高いことを示します。 スコアは確率として解釈されるべきではありません。

```shell
{
  "id": "modr-XXXXX",
  "model": "text-moderation-001",
  "results": [
    {
      "categories": {
        "hate": false,
        "hate/threatening": false,
        "self-harm": false,
        "sexual": false,
        "sexual/minors": false,
        "violence": false,
        "violence/graphic": false
      },
      "category_scores": {
        "hate": 0.18805529177188873,
        "hate/threatening": 0.0001250059431185946,
        "self-harm": 0.0003706029092427343,
        "sexual": 0.0008735615410842001,
        "sexual/minors": 0.0007470346172340214,
        "violence": 0.0041268812492489815,
        "violence/graphic": 0.00023186142789199948
      },
      "flagged": false
    }
  ]
}
```

## 実装コスト

ChatGPTを自分のサービスに組み込んむためにはこのような手順が必要です。

1. データの収集
2. データの整形
3. モデル検証

1〜3を繰り返す必要があります。

`1. データの収集`は対話側のデータがない場合、対話型のデータを生成する必要があるのでコストが膨らみます。


実装方法がわからない又や実装するリソースがない方は、[こちら](https://docs.google.com/forms/d/e/1FAIpQLSewSJGBn0WCJcJ8XOHvdXYXCEgM9foP9-dGdBbXPbU-ygDQjQ/viewform)からお気軽にご相談ください