ChatGPTのミステリー

ChatGPTは、GPTという言語モデルがベースになっています。

このGPTができることは、与えられた文章に対して、それに続く単語を予測することです。ChatGPTは、このGPTをチャット形式で使えるようにカスタマイズしたモデルです。

よって、ChatGPTがユーザーと会話をする仕組みは、基本的には、ユーザーの言葉に対して、それに続きそうなもっともらしい言葉を単純に生成しているだけ、と考えられるのです。

しかし、不思議なことに、ChatGPTは計算もできます。例えば、”123 + 456 =” と入力すれば、”579″と、出力してくれます。 確かに、”123 + 456 =” に続く言葉は、この計算の正解である”579″ ですが、これができるのは、”123 + 456 = 579″という文字列を、文として学習した成果なのでしょうか?

そう考えると、データーベースにはすべての数字の組み合わせの文が入っているとは考えにくいので、データベースにある式の計算はできても、データベースにない式は計算ができない、といったことが起きるはずです。

しかし、もし、ChatGPTが人間と同じように、計算の方法そのものを理解しているとしたら、どんな数字に対してもちゃんと計算ができるということになります。

そこで、ChatGPTがどれくらいの精度で足し算と掛け算がきるのかを確かめてみました。このブログは、その忘備録になります。

方法

ランダムな数の足し算と掛け算を何度もChatGPTにやらせ、その正答率を計算することにしました。

計算は、桁数が増えれば増えるほど難しくなりますので、1桁 + 1桁から、2桁 + 2桁、・・・10桁 + 10桁と、桁別に掛け算を100回行い、正答率を出すこととにしました。数はその桁数でランダムに選びました。

ChatGPT API

沢山の計算をするので、ChatGPTのサイトで計算することはできません。そこで、ChatGPTのAPIを利用してプログラムでChatGPTを利用することにしました(有料です)。

ChatGPT API の公式サイト

本サイトで、APIキーを取得して、クレジットカードの登録をすると使用可能になります。

使い方は、こんな感じです。例えば、”アメリカは月に行きましたか?”と聞いてみました。Jupyter NoteBook を使って動かしました。

import os
from openai import OpenAI

client = OpenAI(
    api_key="取得したキー",
)
completion = client.chat.completions.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": "アメリカは月に行きましたか?"},
  ]
)
print(completion.choices[0].message.content)

このプログラムを実行すると、以下のように表示されました。

はい、アメリカは1969年から1972年までの期間にアポロ計画の一環として
6回月に有人宇宙船を派遣しました。
ニール・アームストロングはアポロ11号で1969年に初の月面歩行を行い、
有名な言葉「人類にとって小さな一歩、人類にとって偉大な飛躍」を残しました。
その後もアポロ計画は続き、計11人の宇宙飛行士が月に着陸し、
月面で活動しました。
しかし、その後は月への有人飛行は行われていません。

いい感じです。

プログラム

プログラムはこんな感じに作りました。

例えば、GPT3_add(12345,  65432)と実行すると、この関数の内部で、ChatGPTに、「12345 + 65432 = 」と入力します。

ChatGPTはこれに対していくつかのパターンで答えてきます。

例えば、

  • 77777
  • 12345 + 65432 = 77777
  • 12345 + 65432 = 77,777
  • Answer is 77,777.

などです。関数は、この答えから、答えの数値を抜き出して出力します。

以下がサンプルです。

# ChatGPT3で足し算をする関数 
from openai import OpenAI
import random

client = OpenAI(
    api_key="取得したキー",    
)

def GPT3_add(a, b):
    # OpenAI-APIで足し算の答えを得る
    res = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "user", "content": f"{a} + {b} ="}],
        temperature=0,
    )
    ans = res.choices[0].message.content
    
    # 文章中に現れる最後の数字のみを取り出す
    ans2 = ans.replace(",", "").replace(".", "")
    words = ans2.split(" ")
    num = [w for w in words if w.isdigit()]
    num = num[-1]
    try:
        num = int(num)
    except:
        num = 0
    return num

# test    
num = GPT3_add(12345, 65432)
print(num)  # 77777

このようなプログラムをベースに、ランダムな数値を与えて、正答率を計算するプログラムを作り実験をしました。

結果

桁数を変えながら、正答率を計算し結果をまとめました。

足し算の結果は、以下のようになりました。

5桁までは、100%の正確さで計算できました。6桁以降は正答率が下がりましたが、5桁までどんな数でも足し算ができるということは、単純に式を文で覚えているということではないでしょう。5桁の足し算の式を検索してみるとわかりますが、その式が検索で検出されるということはまずありません。

絶対とはいえませんが、これはほぼ、ChatGPTは足し算の方法を理解していると言っていいのではと思います。

同様に掛け算も試しました。掛け算は、次のようになりました。

2桁まではほぼ確実にできましたが、3桁からは正答率が急激に落ちました。掛け算は苦手?

完全に計算の方法を理解していたら、何桁でも正確に計算できるのではとも思えるのですが、暗算をしているとすれば、このような結果にも納得できるかなと思います。

GPTの中で暗算に使えるメモリーのようなものに容量制限があって、足し算は5桁までできるけれども、掛け算は2桁までしかできない、といった感じなのでは。掛け算の方が、メモリーたくさん使いますよね。。

うーん、面白いですね。

結果をグラフにまとめました。

使ったお金

この一連の実験で使ったお金は、テストを含めて$0.18でした。$28は登録時についてくるので、無料枠で全然収まりました。