この記事はGRIPHONE Advent Calendar 2022 23日目の記事です。
サーバーサイドのエンジニアをしている斉藤です。
今回は最近トレンドのチャットAIで、プログラムを書かせようという企画です。
他の人もチャレンジはしているのですが、自分はどこまでのマイナー言語に対応できるかを試してみます。
ChatGPTとは?
OpenAIが開発した、大規模な言語モデルを組み込んだチャットアプリケーション、サービスです。
これは沢山の人がブログ等で記述しているので、多くは記述しません。
画面で試す
試しに、チャット画面で質問してみましょう。

素数って1含まれるっけ?と思いますが、一応回答してくれます。
別な言語でも試してみましょう。




どうやら、わからない言語は同じような答えを返すようです。
APIではどうでしょうか?
実行環境構築
APIを試すためには「アカウトの登録」「API KEYの発行」「実行環境の構築」を行う必要があります。
APIで利用するためのキーを発行します。ワード数により金額が発生するらしいですが、大量にアクセスしなければ問題なさそうです。
KEYを発行した際に、$18まで利用できる権利を得ますが、今回500回ぐらいのリクエストで下記のような使用量になります。

今回はPythonを利用してAPIを叩くので、openaiをインストールします。
インストール方法の詳細はこちら
サンプルライブラリ
色々用途によりサンプルプロラムがありますが「Text to command」を使用します。
サンプル実行
サンプルライブラリよりコピーし、多少修正を加えています。
API_KEY発行したコードは、取得したものをそのまま貼り付ければ動作するはずです。
答えがすぐ回答できる決まりきったものは、max_tokensを少なく抽象的な問題は多くすると期待値になるようです。
import openai
openai.api_key = "API_KEY発行したコード"
response = openai.Completion.create(
model="text-davinci-003",
prompt="日本語でOK?",
temperature=0,
max_tokens=1000,
top_p=1.0,
frequency_penalty=0.0,
presence_penalty=0.0
)
texts = ''.join([choice['text'] for choice in response.choices])
print(texts
>python3 sample.py
はい、大丈夫です。
>python3 sample.py
はい、大丈夫です。
ファイル出力
ではどの程度プログラムを理解し、作成してもらえるのでしょうか。
Wikipediaのプログラミング言語一覧から抜き出し、プログラム名だけのファイルを作成します。
今回は331種類のプログラムを生成してみます。

先ほどのサンプルプログラムに手を加え、該当言語で生成するように質問して結果をファイルにします。
import os
import openai
openai.api_key = 'OPENAI_API_KEY'
# プログラムのファイルリストを開く
f = open('program_list.txt', 'r')
datalist = f.readlines()
num = 0
for data in datalist:
prompt = "100までの素数を求めるプログラムを書け。言語は" + data + "でお願いします"
print(prompt)
response = openai.Completion.create(
model='text-davinci-003',
prompt=prompt,
temperature=0,
max_tokens=1000,
top_p=1.0,
frequency_penalty=0.0,
presence_penalty=0.0
)
texts = ''.join([choice['text'] for choice in response.choices])
num += 1
w = open('program_' + str(num) +'.txt', 'w')
w.write(texts)
w.close()
f.close()
ファイル比較
会話型ではわからない問題は同様のプログラムを返していました。
APIではどうでしょうか。同一だったファイルに対して、出力するようにプログラムを書き、スプレットシート上でプログラム名と番号を紐付けて表示させてみましょう。
単純に同一のファイルだった物に対して、結果を出力するようにしスプレットシートで加工したものが下記の結果です。

テスト実行
実際に出力されたプログラムの動作結果は、どのようなものでしょうか。
プログラムをWEB上で実行できるサイトがありますので、そこで確認してみましょう。
今回利用したのは「Coding Ground at tutorialspoint 」です。




メジャーな言語はほとんど大丈夫そうです。一部コメントだったり、不要な行を削除することにより想定の結果が返ってきます。
コードエラーになったケース


まとめ
数種類の言語しか記述できないと最初は思っていましたが、かなり沢山のプログラムを書くことができました。
結果が的確であるならば、プログラムの学習をChatGPTを利用して学ぶことはできそうです。
また、プロジェクトの仕様やソースを学習させれば、問題に対して的確な回答をくれるかもしれません。
今は一般的な学習データしかありませんが、会社独自の学習データがあれば、各会社ごとに特化したツールとしても利用できそうです。