あるいは、ChatGPTに敗北した記録。 すごいな〜という感動が新鮮なうちに書いておく。
友人が突然、自前のPCを持ってきて「Pythonを入れたい」と言ってきた。自分が普段活用しているのはRubyなので、Pythonは埒外ではあったが、HelloWorldくらいならGoogleに尋ねつつできる。とりあえず Python3 をインストールして、 print("Hello World")
の出力をやってみてもらった。それはあっさり終えたところで、ところでここから何がしたいの? と尋ねたところ「株価の予測をしたい」とのことだった。
その要望を聞いた時点で自分の脳みそが最初に出した回答は「無理では?」だった。予測の方法がわからない / 学習の元データどこから取ってくるのか / アウトプット(グラフとか)大変なのでは、などの実現の前に設置された多数のハードル を想像した。
素直に「いやっちょっとそれは難しいのでは…」と伝えてみた。すると友人は「ChatGPTでソースコード出てこないの?」と提案を出してくれた。なるほどそれは令和の解決法だ、と思い、早速聞いてみようということになった。質問文はこうだ。「Python3で動く株価を予想するコードをください」。
株価予測のためのPythonコードを提供します。以下のコードは、Yahoo Financeからデータを取得し、FacebookのProphetライブラリを使用して予測を行います。Prophetは、時間シリーズデータの予測に適したライブラリです。 まず、必要なライブラリをインストールします。これには、
yfinance
とprophet
が含まれます。…(以下略)
ChatGPTは友人の要望をほぼ完璧に叶える形で回答を提供した。自分は yfinance も prophet も知らなかったが、APIを使うという発想を持って調べてみることも出来たはずなのに、最初から出来ないと判断してしまったことが大変恥ずかしく、悔しかった。大反省だった。しかしながら、APIを使うという発想が当初からあったとしても、具体回答を提出する速度は完全に負けていただろう。この時点でChatGPTに対しては完全に敗北の白旗を挙げることにはなり、以降はプログラミング完全初学者の友人とChatGPTとのやりとりのフォローアップに努めることになった。
さすがにChatGPTが初回に出したソースコードは一発では動かなかった。エラーメッセージによると、どうやらソースコードそのものではなくライブラリ周りの問題のようだった。自分はPythonのライブラリ周りは詳しくないので、相当頑張らないと解決しないかも、と思いつつ調査を始めた。それと並行で友人には「動きませんでした。エラーメッセージはこちらです」+出力内容の全てをChatGPTに貼り付ける、という対応を試みてもらった。
十二分に詳しい説明と対応策が出てきた。敗北の底ってもう一段下があるんだ…。 (しかも、株価のコードをやり始める前に自分がチュートリアル的にNumPyの2系のインストールを友人に勧めたという経緯があり、なんならChatGPTの足を引っ張っていた可能性があるかもしれない。)
友人は初めてのプログラミングに対して興味津々で、ライブラリとは何ぞや、OSSとは何ぞや、似たようなライブラリがあったらどう選ぶのが一般的なのか、このエラーはどういう意味なのだ、等々の質問をしてくれたので、例え話を交えて説明しつつ、エラーが出てはChatGPTに全文貼り付けて修正せよと命ずることを繰り返した。ごく稀に自分のほうで調べたStackOverflowの回答を適用して進捗したシーンもわずかにあったが、ChatGPT側が「過去の回答もダメだった、ならば」ということも踏まえて少しずつ改善したソースを凄まじい速度で再提出してくれるので、自分のほうでソースを書き換える対処をすることはほとんど無かった。
やり取りすること2時間くらいで、友人の「株価の予想をしたい」という要望は、次のように実現した。
ChatGPTが出してきたサンプルコードは、2023年1月1日までのデータをもとに+1年の予想をする、という表記になっていた。その辺りの値をいじれば簡単に2024年夏〜+3年の予想のグラフも取れた。ただし、向こう3年予想が単純にナナメ右肩上がりな雰囲気で「ちょっとこれはありえなさそう」という感想になったが、それもProphetの理解をもっと深めて適切な設定を投げてやれば改善されそうだと思った。
友人の好奇心はグラフを出しただけでは止まらなかった。
「このデータをGoogle スプレッドシートに出力できないの?」
「Google スプレッドシート上のグラフ描画はできないの?」*1
マジでできた。いや〜、すごいな…本当に…。
夕方17時頃から開始して、Googleスプレッドシートにグラフの出力を完了するころには22時を回っていた。逆に言うと、わずか6時間程度で Python未インストールからこのアウトプットまで到達したことになる。しかも手段の9割は「とにかくエラー全文貼ってChatGPTに改善させ続ける」ことだった。すごい時代が来た、と思った。
自分も一応プログラマーの端くれとしてやっているなかで、時折どうしようもないバグの沼にハマるケースがある。そういった問題に出会ったとき、いかにして素早く問題を特定して回避・解決するかというのも、この職業でやっていくために必要なスキルだと思う。そのスキルを発揮する方法として、これまでは「経験則を活用しつつGoogleに尋ねる」というのを主な手段としていた。しかし、これからは経験則+「生成AIに尋ねる」が当たり前になっていくんだろうなぁ、と改めて感じたワンシーンだった。*2
また、Gitの使い方を共有する時間は無かったので、今回は 「ChatGPTが出力してきたコードを毎回全行上書き保存する」 という力強い手法で作業を進めることとなった。そのため、書き換えたい部分があった場合は、都度ChatGPTに「スプレッドシートの名前は "株価グラフ" としてください」などと指定して出力内容を作業者の環境に合わせにいく方法を取った。そのため、友人自身が 「ソースコードを編集する」という"一般的なプログラミング"をするシーンは殆ど無かった。 わずかにあったとしても、次の修正のタイミングで全行上書きされて掻き消えていった。普段はGitで変更内容をチェックしながら自力でコードを書き換える生活をしているので、「指示して意図通り書き換えさせる」という体験が新鮮だった。 通常であれば必須なはずの、if文・for文・変数などの基礎学習を完全に省略し、「やりたいこと」について具体的に考え、ツール(生成AI)に指示を与えて実現していく…という一連の流れを目撃して、ものすごい衝撃をうけた。これからの「プログラミング」ってこういうことなのかな、と思った。
ちなみに、自分がこの6時間程度でアシストできたのは次のようなシーンだった。
- ターミナルの開け方
- ChatGPTが出してくるコマンド
$ pip ...
は友人の環境では$ pip3 ...
としないと動かない点- 「以降のコマンドは pip3 で出してください」でコピぺしやすくして解決
- Ctrl+C でプログラムを終了できること
- ↑キーで直前に実行したコマンド履歴から呼び出しできること
- エラーメッセージの解説、エラー文のどのあたりをChatGPTに投げるべきなのか
- 一応解説はしたが、結局、都度判断するより全文投げたほうがわかりやすいし誤りがなさそうだった…。
- Prophet が依存するライブラリのインストールエラーの解決
- 出力されたコードの、どのあたりをいじれば期間設定などが変更できるかの解説
- Google Cloud で サービスアカウントキーの作成、権限付与の操作
- サービスアカウントにGoogleスプレッドシートの編集権を与える操作
- GoogleCloud の Credentials情報が入ったJSONファイルを .py ファイルから呼び出す方法( .py と同一階層に配置し、出力コードのファイル名を指定した )
- 書き出し先のスプレッドシートの名前の指定方法 ( "タブ名" と "スプレッドシートそのもの" の2つの変数があり、ChatGPTが指示をやや誤解したシーンがあった )
- Googleスプレッドシートにグラフを描画したいと伝えたら、Pythonで描いたものを画像としてアップロードする方法が提案されてきたので「”スプレッドシートのAPIを使って”グラフを作って」という指示が必要そうだと提案
- Googleスプレッドシートにグラフを描画するためのJSONのキーが仕様にあってなかったらしく弾かれまくったので調査
- ただし、合間に諦めずにChatGPTに聞きまくってもらっていたところ、何回目かの試行でうまくキーが合致したようで、結局自分の調査の出番は無かった…。
プログラムを「書く」仕事、マジで無くなるかも、と思った体験だった。 一方で、プログラムそのものを書かないとしても、プログラムを読むスキルを持った人間が、適切な語彙や用語で指示する/意図通りの出力を得るために創意工夫する/想定外の問題を解決する、などの出番はあるとも感じた。
「プログラムは思った通りには動かない。書いた通りに動く」という言葉があったはずだが、「指示した通りに動く」と言い換えれば、まだまだ有効な格言だと思う。生成AIと仲良くする方法、覚えよう…。
このエピソードの投稿許可をくれた友人に感謝!