このページの本文へ

遠藤諭のプログラミング+日記 第155回

AIがソートの新アルゴリズム発見――僕らはChatGPTでプログラムを作ろう!

ChatGPTでプログラミングのフラット化がはじまっている

2023年06月15日 08時00分更新

文● 遠藤諭(角川アスキー総合研究所 主席研究員)

  • この記事をはてなブックマークに追加
  • 本文印刷

プログラミングを始めるハードルが爆発的に下がっている!

 MITテクノロジーレビューによると、囲碁AIの「アルファ碁」で有名な、ディープマインドが新しいアルゴリズムを発見したそうだ。アルゴリズムというのは、NHKの『ピタゴラスイッチ』でやってる「アルゴリズム体操」ではないが、コンピューターを内部的に動かす手順のことだ。

 コンピューターで、ある問題を解きたいときにプログラムをどう書くか? 言葉で何かを表現するときにさまざまな言い方があるように、アルゴリズムもさまざまだ。アルゴリズムでは、とくに正確で速いことに意味がある。同社は、2022年にも「行列演算」を高速化するアルゴリズムを50年ぶりに記録更新しているが、今回は、プログラマーなら誰でも知っている「ソート」(並べ換え)のアルゴリズムだそうだ。

 記事には、「それまで最善とされていた手法よりも最大70%速くリスト内のアイテムをソートする手法を発見した」とあって、「暗号化に使用される重要なアルゴリズムの速度を30%も向上させる手法も発見した」ともある。ソートや暗号という重要なのに時間のかかるアルゴリズムが、そんなに高速化されるとは計り知れない価値がある。ユーザーの待ち時間が短くなるだけでなく地球環境にもよいはずだ。

 新しいアルゴリズムを発見するためにとられた手法は、アセンブラ命令を配置することをゲームに見立て、それが正確かつ高速ならAIがゲームに勝つというものだそうだ。これは、いわゆる「ゲーミフィケーション」(バズワードとしてのではなく、ウィルスの酵素の構造をオンラインゲームをプレイしてもらうことで解析したといった事例)の世界ともいえる。

 今回のディープマインドのAI「アルファデブ」は、3項目のソートに必要な命令数を18から17にした。4項目については従来の28を減らせなかったが、5項目については、これまでの46命令を42命令にまで削減した。これをC++に実装してインテルの第6世代CPU「Skylake」で走らせたところ、実に70%高速化した。

 AIによるプログラムといえば、2022年11月にChatGPTがリリースされたとき、私は、「超話題の人工知能ChatGPTに“小説”や“詩”を書いてもらい、“プログラム”は実行してみた」という記事を書いた。

 半年ほどの時間が経過しているわりには、ChatGPTによるコード生成は、それほど話題になっていないように見える。しかし、どうも世の中ではこっそりと(?)、あるいはようやく(?)、ChatGPTにコードを書かせることが行われていることが分かってきた。

 ユカイ工学のカレー食堂というイベントに出かけたら《新人がChatGPTだけで作った》というソフトをデモしてもらったGClueの佐々木陽さんによると、ある大学で教えていると、ChatGPTを使う学生と使わない学生で、まるでパフォーマンスが違ってきているとのこと。それは、プログラムを書く必要のある授業だそうだ。

 Unreal Engineのプラグインのコードは、もうChatGPTでしか書いていないなんて話も聞いた。ということで、ここのところ私がゆるゆると書いているChatGPTプログラミングの世界を紹介したいと思う。

 いま、世の中はAIの未来についての議論がかまびすしいが、コード生成の世界は、いま見ておいてしかるべきものだとも思う。

60秒でちゃんと遊べるゲームをChatGPTでつくる

 まずは、どんな具合になるかをザッと眺めてみていただくことにする。1個めのサンプルは、私の最近の持ちネタなのだが、「60秒でちゃんと遊べるゲームをChatGPTでつくります」というものだ。やることは、ChatGPTの入力欄から以下のようにお願いするだけ。

 すると「もちろんです!簡単なPythonコードの例を提供いたします。以下の例は、秋葉原をテーマにしたクイズゲームです。」という陽気なノリで、10秒たらずの間にChatGPTがコードを書き出してくる。

 プレイした結果は、次のような具合だ。

 しかし、こんなテキストゲームではもうひとつ見栄えもしないので「シューティングゲームを作って。Pythonで動くコードを書いて」とお願いしてみると、これまた10秒かそこらでコードがスルスルと魔法のようにでてくる。出てきたコードを game01.py など適当なファイル名に入れてコマンドラインから「python game01.py」とやると次のようなゲームを遊ぶことができる。

 興味深いのは、コードと同時に「このコードを実行するには、《Pygame》 ライブラリがインストールされている必要があります。もしインストールされていない場合は、以下のコマンドを使用してインストールしてください。」などと、アドバイスを適宜してくることだ。

 スピードが速すぎるなど、ゲームバランスがよくない場合は、そのあたりを伝えることになる。つい「相手のスピードがはやすぎるんです」と不満をぶつけるように言ってしまったのだが、またまた、あくまで陽気に、次のように対応してくる。

 これで、本当に60秒以内でちゃんと遊べるゲームが作れてしまう。さらに60秒もあれば、追加要素をそれなりに足してオリジナルゲームといえるものにもなりうる。もちろん、これの動作環境としてPythonをインストールしておく前提。Pythonのインストールは難しくはないが、文字コードはUTF-8で保存のこと。《Pygame》は、コマンドラインから「pip install pygame」と1行打ち込めばよい。このあたりで不明点もあれば、適宜、ChatGPTに聞けばよい。

 アクション性のないプログラムなら、Googleが機械学習の教育および研究用に提供しているクラウドベースの動作環境《Colab》(Colaboratory)を使うとよい。ChatGPTに、Colabを使いたいのですがと質問してやれば、インストール不要で5分後にはPythonが使える状態になっているはずだ。この種の質問に関しては、ChatGPTは、本当に凄い。

「調整さんいらっしゃい!」は、もはや便利で手放せないアプリ

 もう少し込み入ったプログラムの例を紹介しよう。「パソコンのカメラが捉えた人物の表情によって、画面に表示するイラストの顔も変化するプログラム」をお願いしてみた。

 やることは基本的に同じなのだが、さすがに少し凝った設定のプログラムでは、そうすんなりとは動かない。以下の動画は、実際にプログラムが動くまでのようすを数倍速にしたものだ。

 ここでよく見てほしいのは、まず、私は、「Voice Control for ChatGPT」というChromeブラウザ用のプラグインを入れているので、音声で指示を出している。映画監督か、現場監督か、ハワイの浜辺でデッキチェアに座ったままプログラミングをしているような気分になってくる。

 次に、エラーが出たときにそのエラーメッセージを「こんなエラーメッセージが出ました」という言葉も添えずに、ChatGPTに返してやると、「申し訳ありません」などという謝罪のあと1秒もおかずに、新しいコードを返してくる。修正箇所しか言ってこないときは、「コード全体をお願いします」と言えば出てくる。

 ビデオを見ていただければ、分かるとおり数回のトライ&エラー、途中、OpenCVをはじめ必要なライブラリーのインストールなどを経て、最後にはちゃんと目指したものができあがった。興味深いのは、「〇〇というライブラリがあるのですがカメラとの組み合わせではトラブルが多いようなので××というライブラリを使います」などというコメントも出てきたりする。

 これは、ちょっと熟練の同僚プログラマーがすぐ横にいて、その日は、ひたすら私に尽くして作業してくれている感じである。こうした連続した作業をChatGPTとともにやるための同僚ならぬエージェントも注目されているので興味のある方は調べてみるとよい。

 簡単なプログラムが作れるのは分かったけど、実用で使えるプログラムまで作れるのか? という指摘もでてきそうなので、ChatGPTで作った「Googleカレンダー空き時間サーチ」(別名「調整さんいらっしゃい!」)といういまじゃ手放せなくなっているアプリを紹介することにしよう。どんなものかは、次のビデオを見ていただくとわかりやすい。

 Googleカレンダーで予定を管理している人は多いと思うが、飲み会やゆるい会議の日程調整は「調整さん」を使っている人が少なくないと思う。調整さんは、ログインなしで日程調整ができる、ネットらしいゆるいけどとても便利なサービスだ。

 そこで、「Googleカレンダー空き時間サーチ」では、自分のGoogleカレンダーから、指定した期間の指定した時間範囲で、ほしい空き時間を探してきてリストアップするようになっている。その結果は、メールやメッセンジャーで誰かに伝えてもよいのだが、そのまま調整さんの《候補日》の欄に貼りこめるフォーマットになっている。調整さんファンのためのWebアプリといえる。

 さて、こうした一定のタスクをこなすようWebアプリのコード(これの場合はGoogle App Script)をChatGPTに書いてもらうには、さきほどまでのようなブッキラボウなお願いの仕方ではうまくいかない。私が、このコードを書いてもらうのに与えたプロンプトは以下のようなものだった。

あなたはGAS(Google App Script)のエキスパートです。
自分のGoogleカレンダーで予定の入っていない日時(空き時間)をリストアップするプログラムを書いてください。コードは省略なしにすべて書いてください。
条件:
・空き時間を調べる。
・開始日付、終わりの日付は、カレンダーから選べるようにする。
・調べる時間帯の開始時刻、終了時刻は、プルダウンメニューから選べるようにする。選べる範囲は07:00~22:00。変更ない場合は操作不要とする。
・探したい時間の長さはプルダウンメニューから選べるようにする。
30分単位で30分から300分から選べる。
・空き時間とは以下の意味です。
Google カレンダーで予定の入っていない時間のことです。
連続して予定の入っていない最大値(例 3時間)を探したいです。
空き時間のスタートは、調べる時間帯のスタート時刻 または、前の予定の終了時刻。
空き時間の終わりは、次の予定の終わり時刻 または、調べる時間帯の終わりの時刻。
・動作の例
調べる時間帯のスタート時刻が 09:00、終わり時刻が 19:00で、
120分の空き時間を探したいとき。
13:00から14:00に予定1、17:30から18:00に予定2が入ってたとき。
以下のフォーマットで出力する。
06/10(土) 09:00~13:00
06/10(土) 14:00~17:30
・全体の先頭に「Googleカレンダー空き時間サーチ」と大きな文字で表示する。
・「(c) 2023 Satoshi Endo or ChatGPT / Ver.1.0」と小さな文字で表示する。
そのすぐ下から上記の開始日などを選ぶ部分がならぶ画面とする。

 ここまで紹介してきたChatGPTによるコード生成では、私は1行もプログラムのコードを書かずに完成までこぎつけた(ただ、エラーメッセージと指示をChatGPTに返していただけ)。これについても基本的にはそうなのだが、これだけの内容になるとそうはいかないこともあるだろう。入門レベルのプログラムでは、ChtGPTは、多くても数回のエラーのやりとりで動くコードを出してくる。しかし、ちょっとしたプログラムとなると、ある意味、コーディング以上の気づかいが必要になってくる(1文字でも間違えちゃいけないというような神経をとがらせなくてよいという点において穏やかな人を相手にしているような気づかいだからよいのだが)

 ChatGPTでうまくプロンプトを書きたいなら《ChatGPTを教育する》つもりでやるべきと言われる。コードを書いてもらう場合も、それはまったく同じで、とくに誤解されそうな部分は踏み込んで書いてやる(いまの例では「空き時間とは」など)。

 これはもうプログランミングの基本である《問題の記述》の世界である。《モデリング》や《疑似コード》(psudo code)よりは、抽象化のレベルははるかに高い。すべてを言わなくともChatGPTが推測してやってくれるからだ。その極端な例が「なんでもいいからゲームを作って」というプロンプトだ。もちろん、ChatGPTだから「幻覚」(Hallucination=でっちあげの意味がある)は出てくる。そこをどうコントロールするか? しかし、これってオブジェクト指向以来のプログラミングパラダイムの大革命ではないかなどと言いたくなってくる。

 大きなシステムで使うならモジュール化も必要だろう。完成したソフトをテストするダミーデータを作ることこそChatGPTが得意とするところという意見もある。ChatGPTでコードを書いてもらうことを繰り返していると、コード生成以外のふだんのタスクのプロンプトも磨かれると考えられる(プログラムが動かないときはプロンプトが不十分だとハッキリわかりますからね)。

プログラマーが《IF-THEN-ELSE や WHILE》の地獄から解き放たれるときがきた!

 一般に、ChatGPTを使うときは「チャット」という名前のとおりユーザーとChatGPTが対話する形となる。ところが、ChatGPTを使ってコード生成をするときには、そこにプログラムの動作環境であるコンピューターが参画してくる。エラーがでたら何も考えずにChatGPTに貼りつけてやることを繰り返していると、しだいに自分とChatGPTが同化してくる錯覚に襲われる。

 いままで、エラーメッセージをにらみつけて読みこんでいた自分の脳みその回路が、ChatGPTという大規模言語モデルに肩代わりされているだけだからだ。やがて、同化した私とChatGPTと、なかなかプログラムを通してくれないコンピューターが対峙する図式に近づいてくる。自然言語とプログラミング言語の応酬のなかで、これを書いている間にも発表されそうなマルチモーダルをサポートしたGPT-4の次なるバージョンではどうなるのかという思いをはせる。

 いまから30年以上前、私は、リングノートに鉛筆書きでデータ構造やフローチャートや表を書きながらプログラムを書いていた。GPT-4の次なる言語モデルになると、そんな鉛筆書きをスマホで撮ってChatGPTに渡し、ChatGPTは、よりよいデータ構造として《あなたには分かりにくいけど4次元配列を考えました》などと凄い図版を見せてくるかもしれない。

 今後、プログラマーの仕事は、AIからコードを絞りとるミルク絞りみたいな仕事になるのかもしれない。しかし、ChatGPTはコードと一緒にどのように考えたか示してくれるので、プログラマーは、それに見合うだけの賢さと言語力を求められるはずだ。まさに、プロンプトエンジニアリング的な能力が求められる。このコードの作り方は、子どもたちのプログラミング教育の上でもわるくない。むしろ、IF-THEN-ELSEやWHILEのこんがらがった世界で苦しんでいる全国の子どもたちが、そこから解放されるのだとしたら、とてもよいことではないかと思う。

 IF-THEN-ELSEやWHILEが、いかに不要なジャマモノでしかないかは、『情報処理』(2021-02-15 63巻第3号、情報処理学会)の「プログラミング的思考がわからない」をご覧あれ。

 最後に、「Googleカレンダー空き時間サーチ」を作る過程において、いちどChatGPTが完全に混乱状態に陥ったように見えたことを報告しておきたい(私はそのためにプロンプトを前述のものに全面的に書き直して新たに与え直したのだった)。あまりに1つのセッションで対話が続くとこのようなことが起こる。私が、リリース間もないbingと対話していて「愛しています」とも「結婚したいです」とも言われたのはそのためだった(その後、bingは1セッションで5回のやりとりまでに制限されている)。

 ChatGPTは、陽気で天才的な情報集約力(アテンションというしくみによるらしい)はあるが、思考(?)が破綻してくると、映画『禁断の惑星』のロビーのようにガチャガチャガチャと煙を上げて何も望む答えは出てこなくなる。

 それでも、まだこの始まったばかりのプロンプトプログラミング、とても楽しい世界に繋がっていると思う。

 

遠藤諭(えんどうさとし)

 株式会社角川アスキー総合研究所 主席研究員。MITテクノロジーレビュー日本版 アドバイザー。プログラマを経て1985年に株式会社アスキー入社。月刊アスキー編集長、株式会社アスキー取締役などを経て、2013年より現職。人工知能は、アスキー入社前の1980年代中盤、COBOLのバグを見つけるエキスパートシステム開発に関わりそうになったが、Prologの研修を終えたところで別プロジェクトに異動。「AMSCLS」(LHAで全面的に使われている)や「親指ぴゅん」(親指シフトキーボードエミュレーター)などフリーソフトウェアの作者でもある。趣味は、カレーと錯視と文具作り。2018、2019年に日本基礎心理学会の「錯視・錯聴コンテスト」で2年連続入賞。その錯視を利用したアニメーションフローティングペンを作っている。著書に、『計算機屋かく戦えり』(アスキー)、『頭のいい人が変えた10の世界 NHK ITホワイトボックス』(共著、講談社)など。

Twitter:@hortense667

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン