OpenAI APIのplaygroundで、GPTの各モデルについて検証し特徴をまとめてみた

## はじめに
OpenAIのAPIを用いてGPTを使う際には、モデルを指定する必要があります。そこで、現在使えるGPTの各モデルをplayground上で検証し、それぞれの特徴についてまとめてみました。なお、[OpenAIによると](https://help.openai.com/en/articles/7102672-how-can-i-access-gpt-4)、現時点ではGPT-4は1ドル分以上のAPI利用を行なった人にのみ利用可能となっているとのことです。
OpenAIのAPIを使って何かを作る際のモデル選びの一助になればと思います。

## 各モデルの概要
現時点で利用可能なモデルは以下のようになっています。

| モデル | 特徴 | 料金($/1kトークン) |
| :--: | :--: | :--: |
|GPT-3.5-turbo|その時点で最新のGPT-3.5-turboモデルが使われる。2023年8月9日現在はGPT-3.5-turbo-0613が使われる。|入力：0.0015<br>出力：0.002|
|GPT-3.5-turbo-0613|2023年6月13日版のGPT-3.5-turboモデル。|入力：0.0015<br>出力：0.002|
|GPT-3.5-turbo-0301|2023年3月1日版のGPT-3.5-turboモデル。|入力：0.0015<br>出力：0.002|
|GPT-3.5-turbo-16k|通常のGPT-3.5-turboモデルの4倍にあたる16,384トークンまで扱えるモデル。2023年8月9日現在はGPT-3.5-turbo-16k-0613が使われる。|入力：0.003<br>出力：0.004|
|GPT-3.5-turbo-16k-0613|2023年6月13日版のGPT-3.5-turbo-16kモデル。|入力：0.003<br>出力：0.004|
|GPT-4|GPT-3.5よりも複雑なタスクに対応したより高性能なモデル。2023年8月9日現在はGPT-4-0613が使われる。|入力：0.03<br>出力：0.06|
|GPT-4-0314|2023年3月14日版のGPT-4モデル。|入力：0.03<br>出力：0.06|
|GPT-4-0613|2023年6月13日版のGPT-4モデル。|入力：0.03<br>出力：0.06|


この記事では、GPT-3.5-turbo（GPT-3.5-turbo-0613）、GPT-3.5-turbo-0301、GPT-3.5-turbo-16k（GPT-3.5-turbo-16k-0613）、GPT-4（GPT-4-0314）、GPT-4-0314の5種類について比較を行なっています。

## 各モデルの検証
今回の検証では、コーディング・小説・アイデア出しの3種類のタスクで行いました。各々のタスクの各々のモデルについて5回検証を行い、出力された平均トークン数と出力にかかった平均時間を求めました。APIを用いて何かしらのサービスを開発する際にはこれは重要なポイントです。なお、途中で途切れた場合はその時点で計測を終えました。
### コーディング
コーディングの検証は、以下のシンプルなプロンプトを用いて行いました。
```
100以下の素数をカウントするプログラムのPythonコードを書いてください。
```
#### GPT-3.5-turbo（GPT-3.5-turbo-0613）
出力の平均トークン数：371.4
平均所要時間（s）：9.012
平均正解率（コードにより正しい出力が得られた割合）：100%

出力(一例)：↓

>```python
>def is_prime(n):
>    if n <= 1:
>        return False
>    for i in range(2, int(n**0.5)+1):
>        if n % i == 0:
>            return False
>    return True
>
>count = 0
>for num in range(2, 101):
>    if is_prime(num):
>        count += 1
>
>print("100以下の素数の数:", count)
>```
>
>このプログラムでは、`is_prime`という関数を定義し、与えられた数が素数かどうかを判定します。その後、2から100までの各数をチェックし、素数の場合はカウントします。最後にカウントの結果を表示します。

---

#### GPT-3.5-turbo-0301
平均トークン数：332
平均所要時間（s）：7.462
平均正解率（コードにより正しい出力が得られた割合）：100%

出力(一例)：↓

>以下がPythonコードです。
>
>```python
>def is_prime(n):
>    """
>    素数判定
>    """
>    if n < 2:
>        return False
>    for i in range(2, int(n**0.5)+1):
>        if n % i == 0:
>            return False
>    return True
>
>count = 0
>for i in range(2, 101):
>    if is_prime(i):
>        count += 1
>
>print(count)  # 結果を出力
>```
>
>実行結果は、25になります。

---

#### GPT-3.5-turbo-16k（GPT-3.5-turbo-16k-0613）
平均トークン数：352.8
平均所要時間（s）：8.012
平均正解率（コードにより正しい出力が得られた割合）：100%

出力(一例)：↓

>以下はPythonで100以下の素数をカウントするプログラムのコードです。
>
>```python
>def is_prime(num):
>    if num <= 1:
>        return False
>    for i in range(2, int(num ** 0.5) + 1):
>        if num % i == 0:
>            return False
>    return True
>
>count = 0
>for num in range(2, 101):
>    if is_prime(num):
>        count += 1
>
>print(count)
>```
>
>このプログラムでは、`is_prime`という関数を定義し、与えられた数が素数かどうかを判定します。その後、`count`を初期値0で設定し、2から100までの数を順に判定していき、素数の場合は`count`を1ずつ増やします。最後に`count`の値を表示します。

---

#### GPT-4（GPT-4-0613）
出力の平均トークン数：402.4
平均所要時間（s）：25.896
平均正解率（コードにより正しい出力が得られた割合）：100%

出力(一例)：↓

>次のPythonのコードは与えられた範囲内の素数の数をカウントします:
>
>```python
>def count_primes(n):
>    sieve = [1] * (n+1)
>    sieve[0], sieve[1] = 0, 0
>    for i in range(2, int(n**0.5) + 1):
>        if sieve[i]:
>            for j in range(i*i, n + 1, i):
>                sieve[j] = 0
>    return sum(sieve)
>
>print(count_primes(100))
>```
>
>このコードはエラトステネスの篩というアルゴリズムを使っています。最初に全ての数が素数であると仮定して、それから最小の素数（2）の倍数を全て素数でないとマークしていきます。次にマークがついていない次の数字（今回の場合は3）を探して、それも素数とし、その倍数を全て素数でないとマーク

---

#### GPT-4-0314
出力の平均トークン数：265.6
平均所要時間（s）：14.244
平均正解率（コードにより正しい出力が得られた割合）：100%

出力(一例)：↓

>以下のPythonコードは、100以下の素数をカウントします。
>
>```python
>def is_prime(num):
>    if num < 2:
>        return False
>    for i in range(2, num):
>        if num % i == 0:
>            return False
>    return True
>
>count = 0
>for i in range(2, 101):
>    if is_prime(i):
>        count += 1
>
>print(count)
>```
>このコードを実行すると、100以下の素数が25個あることが分かります。

---

### 小説
小説の検証は、以下のプロンプトを用いて行いました。
```
300文字程度の短編小説を執筆してください。
```
#### GPT-3.5-turbo（GPT-3.5-turbo-0613）
出力の平均トークン数：328.2
平均所要時間（s）：9.182

出力(一例)：↓

>ある日、町の広場で不思議な出来事が起こった。
人々が通りかかる中、一匹の小さな猫が広場の真ん中で座っていた。その猫は黒くてとてもかわいらしかったが、なぜかその周りには虹色の光が輝いていたのだ。
人々は目を疑いながらも近くに寄っていくと、ふと気付いた。この猫は何か特別な力を持っているのではないかと思ったのだ。
>
>すると、広場の真ん中に立っていた一人の少年が近づいてくると、猫はにゃーんと鳴いたかと思うと、不思議なことが起こった。
猫の体から虹色の光が飛び出し、周りの

---

#### GPT-3.5-turbo-0301
平均トークン数：335
平均所要時間（s）：9.002

出力(一例)：↓

>「夢の中で会いましょう」
>
>ある日、私は不思議な夢を見ました。そこは昔の実家の庭で、母親が笑顔で迎えてくれました。
>
>「お帰りなさい、こんなところで何をしているの？」
「ここは私たちが昔住んでいた家の庭だよ。」
「母さん！」
>
>私は母親に抱きつき、涙が止まりませんでした。母は優しく私をなでなでしてくれました。その後、父親や祖父母にも会い、夢の中で楽しい時間を過ごしました。
>
>目が覚めると、夢の内容を思い出しました。その後、私は不思議なことに気付きました。母親はすでに亡くなっていたのです。それでも、夢の

---

#### GPT-3.5-turbo-16k（GPT-3.5-turbo-16k-0613）
平均トークン数：324.4
平均所要時間（s）：8.598

出力(一例)：↓

>彼女はいつも一人でいることが好きだった。街の喧騒から逃れ、自分の世界に浸る時間が彼女には必要だった。ある日、彼女は自分の隠れ家で読書を楽しんでいる最中に、小さな音が聞こえた。驚いて周りを見渡すと、窓の外にひとりの犬が立っていた。彼女は犬が来ることを歓迎し、彼女の隠れ家に入るように勧めた。犬は素直に従い、彼女の隣に座った。彼女には、言葉で会話することができなかったが、彼女の魂を癒す存在だった。彼女は犬に名前を付け、毎日一緒に

---

#### GPT-4（GPT-4-0613）
出力の平均トークン数：334.4
平均所要時間（s）：26.232

出力(一例)：↓

>タイトル：雨の交響曲
>
>毎日のように、彼は老朽化したピアノの前に座り、両手をキーボードに載せ、指を滑らせる。だが、決して音は鳴らさない。外から聞こえてくるのは雨の音だけだ。
>
>町の外れに住む彼の名前はジャック。昔は成功したピアニストだったが、年老いてからの怪我で、細かい動きができなくなった。それでも彼はピアノを手放せなかった。
>
>そんなある日、彼の家をノックする音が響いた。開けたそこには、小さな少女が濡れた髪を振り乱し、ぼんやりと彼を見上げていた。「先生、私にピアノ

---

#### GPT-4-0314
出力の平均トークン数：328.2
平均所要時間（s）：19.182

出力(一例)：↓

>夜の街に現れた青い月。その光の下、ひとりの少女がぽつんと立っていた。その名はリナ。彼女はこの青い月が毎月一度訪れるその日だけ、歌を歌うことができた。
>
>真夜中の河口付近で開催される市で、リナは歌を披露する。地元の人々は彼女の歌声を聴くため、わざわざ遠くからやって来る。しかし、なぜかリナの顔を知る者は誰一人としていなかった。
>
>リナはみんなの前で、誰にも見られることなく歌っていた。だが、彼女はいつもその歌が人々に伝わり、愛されることを願っていた。
>
>ある夜のこと、リナがいつものよう

---

### アイデア出し
アイデア出しの検証は、以下のプロンプトを用いて行いました。
```
日本の少子高齢化問題を解決するための画期的なアイデアを5個教えてください。
```
#### GPT-3.5-turbo（GPT-3.5-turbo-0613）
出力の平均トークン数：348.2
平均所要時間（s）：7.398

出力(一例)：↓

>1. ロボット介護の促進：高齢者に対して介護・支援を行うロボット技術の研究開発を進め、家庭や施設での介護負担を軽減する。
>2. 若者支援策の充実：若者が結婚や出産に踏み切りやすくなるような支援策を充実させる。経済的な支援や助成金の拡充、働き方改革などが含まれる。
>3. 移住政策の推進：少子高齢化が進む地方地域への人口流入策として、移住を促進する。住宅支援や就職支援、地域振興策などを通じ

---

#### GPT-3.5-turbo-0301
平均トークン数：348.2
平均所要時間（s）：7.36

出力(一例)：↓

>1. 家族や友人による共同生活プロジェクトの導入：高齢者と若年層が住居や生活を共同で行い、お互いにサポートし合う形式を推進することで、高齢者の孤立や介護負担の軽減につながる。
>2. 移住支援プログラム：高齢者が都市圏から地方へ移住することを支援し、地域の活性化と高齢者の生活環境の改善を図る。
>3. 税制優遇措置の拡充：子どもを持つ世帯や育児を行う個人に対し、税金の減免や補助金の増額など、家族の増加による負担を

---

#### GPT-3.5-turbo-16k（GPT-3.5-turbo-16k-0613）
平均トークン数：341.8
平均所要時間（s）：6.948

出力(一例)：↓

>1. 子育て支援の充実: 出産率を上げるために、安価で質の高い保育施設や教育機関を提供し、子育て支援制度を強化することが重要です。また、育児休暇制度の充実や柔軟な労働時間制度の導入も必要です。
>
>2. 労働環境の改善: 働き方改革を推進し、長時間労働や過重労働を削減することで、仕事と家庭の両立を容易にする必要があります。柔軟な働き方やテレワークの導入、育児休業後の復職支援などが有効です。
>
>3. 移民政策の導入

---

#### GPT-4（GPT-4-0613）
出力の平均トークン数：346.4
平均所要時間（s）：25.138

出力(一例)：↓

>1. 若年層への労働条件改善：働きやすい環境を作ることで、より多くの若者が出産・子育てと仕事を両立できる状況を作る。具体的には、フレキシブルな勤務時間、有給休暇取得の促進、充実した産休・育休制度、企業の子育て支援策などを提案する。
>
>2. 移民・外国人労働力の活用：国外からの人材を積極的に受け入れ、国内の労働力不足を補う。また、異文化交流を通じて新たな価値観や可能性を広げるとともに、人口増加へ繋げる。
>
>3. 東京一極集中の

---

#### GPT-4-0314
出力の平均トークン数：343.8
平均所要時間（s）：18.192

出力(一例)：↓

>1. 政策的支援: 政府が出産・育児支援策を充実させることで、子供を持つ意欲を高める。例えば、出産手当金や児童手当の拡充、育児休暇制度の整備、保育施設の充実と利用料金の低減などの施策を実施。
>
>2. 仕事と家庭の両立支援: 労働環境を整えることで育児と仕事を両立しやすくし、子供を持つ不安を減らす。企業が柔軟な働き方を促進し、テレワークや時短勤務など、労働者が自分の好みに合わせた働き方が選

---

## 結果のまとめ
検証の結果を以下の表にまとめました。
### コーディング
| モデル | 平均出力トークン数 | 平均所要時間 | 平均速度（トークン/s） |
|:-:|:-:|:-:|:-:|
|GPT-3.5-turbo|371.4|9.012|41.2|
|GPT-3.5-turbo-0301|332|7.462|44.5|
|GPT-3.5-turbo-16k|352.8|8.012|44.0|
|GPT-4|402.4|25.896|9.0|
|GPT-4-0314|265.6|14.244|18.7|

### 小説
| モデル | 平均出力トークン数 | 平均所要時間 | 平均速度（トークン/s） |
|:-:|:-:|:-:|:-:|
|GPT-3.5-turbo|328.2|9.182|35.7|
|GPT-3.5-turbo-0301|335|9.002|37.2|
|GPT-3.5-turbo-16k|324.4|8.598|37.73|
|GPT-4|334.4|26.232|12.7|
|GPT-4-0314|328.2|19.182|17.1|

### アイデア出し
| モデル | 平均出力トークン数 | 平均所要時間 | 平均速度（トークン/s） |
|:-:|:-:|:-:|:-:|
|GPT-3.5-turbo|348.2|7.398|47.1|
|GPT-3.5-turbo-0301|348.2|7.36|47.3|
|GPT-3.5-turbo-16k|341.8|6.948|49.2|
|GPT-4|346.4|25.138|13.8|
|GPT-4-0314|343.8|18.192|18.9|

<br>
<br>
これらの結果から、生成速度については意外にも旧モデルの方が現行のモデルよりも生成速度が速いといえます。特に、GPT-4においてその傾向は顕著であり、旧モデルは1.5倍〜2倍程度の速度を叩き出していました。また、GPT-3.5-turbo-16kモデルは通常のGPT-3.5-turboモデルに比べて扱えるトークン数が大きくなるだけではなく、生成速度も速い可能性があります（もちろん誤差の範囲内とも思えますが）。<br>
<br>
生成される内容に関してですが、タスクが簡単なものだったこともあり、コーディングを除いて各モデルで大きな違いはありませんでした。<br>
コーディングにおいては、GPT-4シリーズのモデルの方が賢いといえました。プログラムの解説の部分で「エラトステネスの篩」というワードが出てきたのはGPT-4モデルだけでした。また、GPT-3.5シリーズのモデルでは、ある自然数が素数かどうかを判定する際にその自然数以下の自然数全てについて約数かどうかの判定を行なっていたのに対して、GPT-4では、その自然数の平方根以下の自然数のみで判定を行なうことで計算量を削減する工夫が見られた場合もありました。<br>
また、コーディングにおいて、GPT-4-0314モデルはGPT-4-0613モデルと比較して冗長な解説を省く傾向にありました。<br>
<br>
以上のように、各モデルに特徴的な点があり、目的に合ったモデルを選択すべきだといえます。


<br>
<br>
<br>
ここまでお読みいただきありがとうございました。皆さんのGPTライフのお役に立てれば幸いです。

<br>
<br>

---
NOVEL株式会社では、業務委託パートナーを募集しています。AIやLLMに興味があるエンジニアやPMの方、大歓迎です。副業としてでも問題ありませんので、ご興味を持たれた方はぜひこちらのフォームよりご応募ください。

https://docs.google.com/forms/d/e/1FAIpQLSfx7AKcU4e6ncy4UGFIX_BPKFtn8YRm7maR4Y0XHP7W9vzcSA/viewform