ChatGPTはプログラミング言語マスター(語弊ありまくり)
皆さんおはようございます。見ている人は見ていたかもしれませんが、昨夜はかなり遅くまで巷で話題沸騰のChatGPTによくわからんクエリを投げて、その結果をみてげらげら笑っていました。特に存在しないプログラミング言語であり「ScalaにHaskellと同じ型推論を加えた」言語Scalayがあることにしたら、ChatGPTが本当にHaskellぽい(単なるHMでなく、Haskellぽいというのは型クラスまで推論される辺り)型推論を持つ架空のScalayコードを解釈実行してくれたりしたところは、控えめに言っても予想外の結果で深夜なのに部屋で忍び笑いをしていました。
Scalaに引数の型推論を追加したようなパチもんのプログラミング言語Scalay(仮)ができてしまった(ChatGPTと対話してる間だけの短い命)。
— kmizu (@kmizu) 2022年12月2日
一応、add: (Int, Int) => Int が推論されてるのすばらですね。 pic.twitter.com/ye1g4qdkH2
ちなみに、Javaの文法にHaskellぽい型推論と関数を加えた架空言語Jaskellも無理やり主張してみたのですが、こちらはあくまで「架空言語Jaskellが存在したとして」型推論してくれただけで、存在を認めてもらうには至りませんでした。たぶんちょっとした語尾とかで相手のクエリをそのまま受け入れるかそうじゃないかが変わりそうですが、それはともかくこちらも大変楽しい結果でした。
Javaの文法にHaskellぽい型推論と標準関数をくっつけてみたらこんな感じになりました。 pic.twitter.com/gLwfUlkuTO
— kmizu (@kmizu) 2022年12月2日
こちらは型クラスを推論してくれなかったのですが、たぶんadd()
の返り値型がint
なので型クラスとして推論しちゃうのを躊躇ってしまったのだろうと思います。
さて、こんな「何やってるんだ」的な無茶振りをChatGPTにやり続けていたのは理由があります。それより数時間前にとあるScalaコードの実行結果を説明させたところ、Scalaをメイン言語として使っている自分が驚く程、正確に解釈結果を説明していたからでした。
GPTChatに詳しい方に質問。
— kmizu (@kmizu) 2022年12月2日
以下のスクショは何を意味していると思います?
①実はネットワークのどこかにあるScalaのREPLに処理を投げている
②学習過程で結果的にScalaの処理系と同じ(極めて似た)挙動を学んだ
③Scalaのバイナリが丸ごと(たまたま)混入した
④その他何か。 pic.twitter.com/gDwd8Hd0YQ
結果に度肝を抜かれている様子がそのまま文面に出ていますが、私からするとそれも無理がない話なのです。元々、ChatGPTがプログラミング絡みのタスクにかなり長けているらしいというのは先行して試した人のおかげでわかっていました。しかし、最初私はこう思ったのです。
「なんか一応結果はそれっぽいけど、学習元にいい感じのコードスニペットがあって、たまたまそれを貼り付ける能力に優れているだけなのではないか」と。
そのときの本音はというと「ChatGPTはまだまだ汎用人口知能に程遠いとはいえ、言語の解釈力とか、対話を通して文脈を保持し続けられるのは大したものだ。でも、個別の知識問題、たとえば歴史問題は間違えまくるし、一般的な知識問題については確かに文脈を読んでいるように見えるけど、具体的なワードが全然出てこない。なんか「誰でも言える一般論」を書いているだけじゃない?ChatGPTは博識だと言えても、全般的な理解度は案外低いのでは?」というものでした。
しかし、implicit classを使ったScalaコードを解釈させてみた結果はそんな本音を覆す代物で「え?これって実はScalaのREPL内蔵だったりする?」と(普通ならあまりなさそうな)可能性を疑ってしまう程だったわけです。
ともあれ、色々試している内に「そういえば例が少なめだけど、プログラミング言語も言語だし、一応実行結果を説明するみたいなことができるんじゃない」となんとなく思って試してみたところ「プログラミング言語への理解度」は明らかに高いじゃないかと驚愕する羽目になったのでした。
ちなみに、Twitterでの昨夜辺りのつぶやきを振り返った限り、
なんかはかなり高い精度で「理解」しているような感じがします。
何故、高い精度で「理解」しているという表現になるかというと、学習元には「そのまんま」のが無さそうなコード片を与えても、 かなり(言語マニアの自分から見ても)正確にコードを解釈していたし、型チェックの正確さも高めだったためです(こちらは実行に比べるとミスってる確率がちょっと高いぽいですが)。表現を変えるとChatGPTは言語処理系を獲得しちゃったのでは少しの間勘違いしてしまうくらい、プログラムのソースコードを割とそのまま解釈してくれたのです。
ちなみに、プログラミング言語理解の精度がずば抜けて高いということは、プログラミング言語間での変換(コンパイル/トランスレート)も得意だろうと思ってやってみたら思った通りの結果が得られました。
プログラミング言語の理解度が高いということは、別言語への変換(トランスレータ)も精度高いのではと思ってやってみたら案の定だった。 pic.twitter.com/tbOqDXB5sz
— kmizu (@kmizu) 2022年12月2日
実験していく内に理解が間違っている箇所が時折見つかるようになりましたが、一般的な自然言語理解タスクとは比較にならない程(試した人が実感しているように、案外誤解釈をする)、プログラミング言語においては深い理解を持っていることは間違いないと言えそうです。
考えてみれば、ChatGPTは「大規模言語モデル」であり、プログラミング言語だって言語でありかつ曖昧性がなく言語としてもサイズは小さめなので(自然言語と比較して)、理解精度が高くなるのは当然と言えるのかもしれません。それにしてもこれほど多くのプログラミング言語についてちゃんとした理解をしているのはプログラミング言語マニアである私にとっては驚くべきことでした。
より広い意味でのChatGPTの可能性は既に多くの人が言及しておられるのであえて言うまでもないですが、プログラミング言語で遊ぶのが好きな人は是非ChatGPTを弄くり倒してみませんか?が結論なのでした。