OpenAIのAPI入門

# OpenAIのAPI入門

:::note info
2023年7月19日時点の内容です。
:::

OpenAIのAPI移行については下記の記事をご参照ください。

https://qiita.com/motoJinC25/items/f4056200b6407dc35113

## APIの重要な概念

### プロンプト (Prompts)

APIへの入力テキスト

### コンプレッション (Completions)

APIがプロンプトに対して生成する回答(出力)テキスト

### トークン (Tokens)

文章で意味を持つ最小単位の要素

## OpenAIの自然言語モデル

OpenAIの自然言語モデルには、現在、三つありますが、GPT-3は7月6日にレガシーとなった[アナウンス](https://openai.com/blog/gpt-4-api-general-availability)がありました。もう、GPT-4とGPT-3.5のみ考えればいいことです。

- GPT-4
- GPT-3.5
- ~~GPT-3~~

GPT-4, GPT-3.5は、ファミリーモデルとなっているので、実際に我々が使う際にはモデルを指定して使います。性能と料金も異なるので、要注意です。7月6日の[アナウンス](https://openai.com/blog/gpt-4-api-general-availability)でレガシーとなったモデルは除外します。

| ファミリーモデル  | モデル | 最大トークン | 学習データ | 料金(Input, 入力) | 料金(Output, 出力) |
| --- | --- | --- | --- | --- | --- |
| GPT-4 | gpt-4 | 8,192 | 2021年9月まで | $0.03 / 1K tokens | $0.06 / 1K tokens |
|  | gpt-4-32k | 32,768 | 2021年9月まで | $0.06 / 1K tokens | $0.12 / 1K tokens |
| GPT-3.5 | gpt-3.5-turbo | 4,096 | 2021年9月まで | $0.0015 / 1K tokens | $0.002 / 1K tokens |
|  | gpt-3.5-turbo-16k | 16,384 | 2021年9月まで | $0.003 / 1K tokens | $0.004 / 1K tokens |

OpenAIの自然言語モデルは進化していて定期的に更新されています。更新時には新スナップショットモデルが作られて旧スナップショットモデルは新モデルがリリースしてから3か月後には非推奨となります。

| モデル | 最大トークン | 概要 |
| --- | --- | --- |
| gpt-4-0314 | 8,192 | 2023年3月14日のスナップショット、gpt-4-0613モデルがリリースされたため、2023年9月13日以降は非推奨となる。 |
| gpt-4-0613 | 8,192 | 2023年6月13日のスナップショット、現在の最新モデル |
| gpt-4-32k-0314 | 32,768 | 2023年3月14日のスナップショット、gpt-4-32k-0613モデルがリリースされたため、2023年9月13日以降は非推奨となる。 |
| gpt-4-32k-0613 | 32,768 | 2023年6月13日のスナップショット、現在の最新モデル |
| gpt-3.5-turbo-0301 | 4,096 | 2023年3月1日のスナップショット、gpt-3.5-turbo-0613モデルがリリースされたため、2023年9月13日以降は非推奨となる。 |
| gpt-3.5-turbo-0613 | 4,096 | 2023年6月13日のスナップショット、現在の最新モデル |
| gpt-3.5-turbo-16k-0613 | 16,384 | 2023年6月13日のスナップショット、現在の最新モデル |

最初に掲示したモデルは新しいモデルがリリースされたら、（新スナップショットモデルが作られる）2週間後に自動で更新されます。それぞれのモデルはバージョンで管理されます。

「gpt-3.5-turbo-16k」モデルは6月13日が初リリースとなります。

| モデル | 更新前モデル | 更新後モデル | 現在バージョン |
| --- | --- | --- | --- |
| gpt-4 | gpt-4-0314 | gpt-4-0613 | 0613 |
| gpt-4-32k | gpt-4-32k-0314 | gpt-4-32k-0613 | 0613 |
| gpt-3.5-turbo | gpt-3.5-turbo-0301 | gpt-3.5-turbo-0613 | 0613 |
| gpt-3.5-turbo-16k | ― | gpt-3.5-turbo-16k-0613 | 0613 |

最終的なOpenAIの自然言語モデルリストです。

| ファミリーモデル  | モデル | バージョン | 最大トークン | 学習データ | 料金(Input, 入力) | 料金(Output, 出力) |
| --- | --- | --- | --- | --- | --- | --- |
| GPT-4 | gpt-4 | 0613 | 8,192 | 2021年9月まで | $0.03 / 1K tokens | $0.06 / 1K tokens |
|  | gpt-4-0613 | 0613 | 8,192 | 2021年9月まで | $0.03 / 1K tokens | $0.06 / 1K tokens |
|  | gpt-4-32k | 0613 | 32,768 | 2021年9月まで | $0.06 / 1K tokens | $0.12 / 1K tokens |
|  | gpt-4-32k-0613 | 0613 | 32,768 | 2021年9月まで | $0.06 / 1K tokens | $0.12 / 1K tokens |
| GPT-3.5 | gpt-3.5-turbo | 0613 | 4,096 | 2021年9月まで | $0.0015 / 1K tokens | $0.002 / 1K tokens |
|  | gpt-3.5-turbo-0613 | 0613 | 4,096 | 2021年9月まで | $0.0015 / 1K tokens | $0.002 / 1K tokens |
|  | gpt-3.5-turbo-16k | 0613 | 16,384 | 2021年9月まで | $0.003 / 1K tokens | $0.004 / 1K tokens |
|  | gpt-3.5-turbo-16k-0613 | 0613 | 16,384 | 2021年9月まで | $0.003 / 1K tokens | $0.004 / 1K tokens |

## APIエンドポイント

APIのエンドポイントは二つありますが、7月6日にGPT-3系モデルがレガシーとなったアナウンスがありましたので、レガシーモデルのエンドポイントは非推奨となり、使わなくてもいいでしょう。

| APIエンドポイント | API名 | 主なモデル | 備考 |
| --- | --- | --- | --- |
| /v1/chat/completions | Chat Completions API | gpt-4, gpt-3.5-turbo | 2023年以降モデル |
| /v1/completions | Completions API | text-davinci-003, text-davinci-002, davinci, curie, babbage, ada | 2020~2022年モデル |

Chat Completions APIとCompletions APIの違いはプロンプトの内容が構造化されているかどうかです。

2020年6月にリリースされたCompletions APIはLLMとやり取りするためのフリーフォームのテキストプロンプトを提供していました。

構造は理解しやすいので、概念整理などの入門時は使われるでしょうか。

```python
import openai

response = openai.Completion.create(
  model="text-davinci-003",
  prompt="OpenAI社について説明してください。"
)
```

Chat Completions APIはより良い結果を引き起こせるための構造化され、一連の会話、複数ターンの会話をメッセージのリストとして入力できます。リストにはロールとして設定して入力します。

```python
import openai

openai.ChatCompletion.create(
  model="gpt-4",
  messages=[
        {"role": "system", "content": "日本語で文章が提供されるので英語に翻訳してください。"},
        {"role": "user", "content": "私は今日とても幸せです。"}
    ]
)
```

### Chat Completions APIのロール

| ロール | 説明 |
| --- | --- |
| system | 会話を始める際に初期設定、会話のルールやアシスタントの性格などを定義 |
| user | 質問または要求や指示などのメッセージ定義 |
| assistant | モデルが生成した回答を定義（これまでの会話をトークン制限を考慮して全て送ることで、その文脈を踏まえて回答可能） |