後期の授業も卒業研究も一段落したので集中できる時間が持てるようになったところです。
GitHub Copilotを一緒に研究ツールを作っています。無課金でPro相当が使える。ほんとEducation様々です。
これは技術的に作れそうだな、というものはだいたいワンショットのプロンプトで大枠を作ってくれますし、GUIとか不足する機能を付け足していけばちょっとしたツールならすぐに完成します。コードは見ていません。動かなくてもブラックボックステストして誤り部分を与えるだけです。
とりあえず基本機能が動いたところでcommitして(これもプロンプトで指示する)戻れるようにしつつ、追加のプロンプトを与えて機能追加してもらいます。
これがだいたいうまくいかない。。。結局、戻すことになり。。。
とりあえず、与えるコンテキストのサイズは変わらないのでしょうけど問題を切り分けられるように別ファイルで作り呼び出す形式にするように指示するとまあまあうまくいきました。
以下の本によると、こういう構造も含めて、最初にある程度の指示をすべし、と書かれています。それがタイトルである「プランファースト」です。
うまく行かないときに以下のような助言が書かれていました。引用します。
===(要約)引用開始===
- プロンプトの質を改善する
AIが期待通りのコードを出力しない場合、プロンプトが曖昧である可能性が高いです。
- 具体性と明確さ: 「ソート関数を書いて」ではなく、使用言語、関数名、入力データの構造、期待される出力形式、制約条件(計算量など)を具体的に指定してください。
- 思考の連鎖(Chain of Thought): いきなりコードを書かせるのではなく、「段階的に考えて」や「まずアプローチを説明して」と指示することで、複雑なロジックの正確性が向上します。
コンテキストの提供: AIはプロジェクト全体の記憶を持っていないため、関連する既存コードやAPI仕様をプロンプトに含めることが不可欠です。
「プラン・ファースト」への切り替え
場当たり的なプロンプト(プロンプト・ファースト)で修正を繰り返すと、バグがバグを呼ぶ「二歩下がる」アンチパターンに陥ります。
- 設計図を作る: コードを書かせる前に、何を構築するのか、どのような制約があるのかという軽量な「計画」を立ててください。
- 問題を分解する: 大きなタスクを一度に頼むのではなく、AIが確実に解決できる小さなサブタスクに分割して、一つずつ実行させます。
AIを「ジュニア開発者」として扱う: AIを万能の神ではなく、常に監督と修正が必要な「非常に熱心なジュニア開発者」と見なし、人間が「編集長」としてアウトプットを精査してください。
デバッグと検証のルール
修正がうまくいかない時は、AIに修正を丸投げするのではなく、以下のステップを踏んでください。
- 理解できないコードはマージしない: AIが生成したコードの内容や仕組みを完全に理解するまで、プロジェクトに統合してはいけません。
- テスト駆動のデバッグ: AIに修正させる前に、まず失敗するテストを書き、何が間違っているのかを明確にします。
- ラバーダック・デバッグ: AIに「このコードを一行ずつ辿って、どこでロジックが間違っているか説明して」と依頼し、説明のプロセスを通じてバグを特定させます。
- バイブコーディングの「黄金則」 スムーズな開発を維持するために、本書は以下の原則を提示しています。
- 意図と照らし合わせて検証する: 生成されたコードが、当初の目的やユーザニーズを満たしているか常に確認してください。
- 頻繁なコミット: AIが大きな変更を加えるたびにコミットすることで、問題が発生した際にすぐ以前の状態に戻れるようにします。
- 思考を拡張するために使う: AIは「タイピング」を速くしてくれますが、システム全体のアーキテクチャや「なぜそうするのか」を決定するのは依然として人間の役割です。
===(要約)引用終了===
確かに、コード生成でプロトタイプ構築が短縮されたのだから、ある程度できたら、もう一度、全体のあるべき姿を振り返って再度指示して再作成させるとよりよいコードになるのでしょう。。。ただ、研究ツールはとりあえず動かして検証できればいいので使い捨てになります。。。見直しまではしないかな。。。というのが正直なところです。
ただ、これ書こうと思ったのは、こういう作業をずーっとやっていると本当にコーディングという作業自体の意味が自分の中でずいぶんと変わってきているように思いますし、SEやってたときに実行リーダーくらいになると仕様を決めて構造設計して仕事を振るというようなことをやっていたのですが、まさにそれっぽい仕事になるな。。。
コードを読まないので一からコーディングするときとは明らかにアタマの違う部位を使い続けている 。。。そう感じます。
世の中、AI拡張のIDEをガンガン使っていて、さらに仕様駆動開発とかで実践も熟れた時期ですので、こういうAI初心者的な情報は無意味とは思ったのですが、この(↑↑↑)感覚を自分なりにメモしておきたくって書こうと思ったエントリーでした。
1年や半年くらい前まではまともに動かなかったコードが、今では単純なコードであれば動かないコードは生成されません。生成したコードに対する分析も論理的かつ段階的です。ただ不要なコードとかが残ってしまったりするのは普通は自分で書いたコードであれば全体がアタマに入っているので「これいらないや」とか判断しますがAIがやらないのはそういう全体の意味を統合して理解するまでは行ってないのかな。。。と想像するのです。こういう設計意図などはプロンプトで与えて常に検証させる、そういう指示もあわせてする必要があるのでしょうね。ちなみにPythonで作っているので、Rustなど固い言語だと使わないコードとかが検出されるので、そういう意味でも生成AIで作るべきコードはRustなどに以降していくという話はわからなくはない気がしました。とりあえず動けばいいやというコードだとPyhtonでもいいかなとは思いますが。上記の本にも書いていましたが、全体の構造をどうすべきか?どういう構造がいいのか?そういう知識をもっておくことこそが重要なのでしょうね。アーキテクチャ設計、コンピュータ原理や基礎、ネットワーク・セキュリティ、データ設計もろもろ。
でもね。。。面白いのはAIと対話する前にWebカメラが仕様を満たさないとか、そもそもケーブル長が足りないとかで延長ケーブルを探すとか、この辺はAIはできないので。。。現実世界の構築は人間がやらないといけないですし。3Dモデルなら作れるでしょうけど、それが人間にとってどれだけ使いやすいかはAIにはわかりようがありません。センサがないので。使いやすさとはなにか?のプロンプトも必要でしょうしね。その辺がAIには(まだ)できない。ヒューマノイドロボットが出てきたら代替え体験や被験者に相当する「使用感」を得るためのインテリジェントセンサ(これはいい、これはもっとこうした方がいいとか?😁)になるかもですけどね。それはそれでSFっぽくて面白いです。実現には途方もないお金と時間が必要そうですが。。。それは僕の仕事ではないので。。。メーカーさん頑張ってください。
■追記
コード生成に限らずで、ググるときに生成AIがインタフェースになると何がおきるか、も実感するので書いておきます。「ググる」ってのも昔の本とかで調べるのと比べるとずいぶんと簡略化された行為になったのだと思いますが、それでも「ググった」結果が所望の情報ではない可能性が多々ありました。なので、色々、自分で「試しては違う」を繰り返しながら付帯的な情報を情報ネットワーク?として脳内に知らずに蓄積できたような気がします。教科書がない現実世界の勉強の仕方だと思って生きてきました。
でも、生成AIの時代では「調べる」ための試行錯誤をすべて生成AIがバックグラウンドで実行します。苦労して調べる行為が見えません。人間ができるのはただひたすら「待つ」だけです。ふらっと立ち寄って知りたい情報ではないけど知った情報というものに出会う(セレンディピティ?)が起こりにくい時代になった、といえるのではないでしょうか?「タイパ」重視な時代です。余計なことは知りたくもないししたくもない。若者に限らずです。
自分で調べなくても調べてくれる時代 が我々がいる未来なのでしょう。調べてくれる時代では調べて知識にすることができないので、そういう付帯的なことを知る機会はなくなります。知らないことはAIに聞くことさえできないので知ることができない情報はどんどん埋もれていきます。推薦アルゴリズムと同じでしょうか? 検索できないものは存在しないのと同じ から 生成AIが教えない情報は存在しないのと同じ という時代になるのかな。。。とこれまた想像した次第です。
調べ方も変わる、知る機会も変わる、学び方も変わる、個人が必要とする情報だけ知る。どういう変化が現れるのでしょう?
■追記2
いや。。。ちょっと休憩したけど、ずーっとAIと一緒に作る作業って頭が休まらない。。。設計書を作るときにも文章や絵を書きながら別の頭を使っていたように思う。コーディングもそう。仕様を考えて実際に手を動かしたりググたりしながら別の脳を使ってプログラムにしていく、これらはそれぞれ別の脳の部位を使っていたのだと思う。AIを使うと仕様を考えて設計を与えて生成されたコードを読んだり実行する。「仕様を考えて言語化して入力する」の繰り返しになるような感覚があって左脳だけがずーっと動いている感じがする。これは大変だ。。。動いたときの喜びもそれほどないし。。。うーん。大変な仕事になっていくんだなぁ。。。生成AIとのコーディングは人に優しいのだろうか?環境には優しくないけど(電力消費)。