多くのITエンジニアにとって転機になるかもしれないビッグウェーブが来ている。もちろんAIである。多くの人が ChatGPT や GitHub Copilot をすでに使っているのは事実だとは思うが、一方で本当にアプリケーション開発に役に立っているのかというと使い勝手の怪しい検索エンジンの域を出ないのも事実だと思う。
所謂「驚き屋」と言われている人々が簡単なプロンプトでシステムを完成させました、と一瞬で実際に動作するアプリケーションを構築する一方で、本当は知りたかった特定のフレームワークでニッチな要件を実現する方法には決して答えてくれない。
LLMはどこまで行っても入力となるプロンプトに妥当する確率が高いであろうテキストを出力しているだけで、そもそもWeb上に存在しない情報に妥当な答えを返してくれるわけではない(ハルシネーションという形で存在しないメソッドを使えと返してくることはあっても)。テトリスやオセロのプログラムはWeb上に大量に転がっているから、ほぼ完成形が出力されるが、ニッチになればなるほどまともな結果を戻すとは考えにくい。
それどころか「Is Stack Overflow Obsolete? An Empirical Study of the Characteristics of ChatGPT Answers to Stack Overflow Questions」という論文によれば、Stack Overflow の質問に対し正しい答えを返したのは 52% に過ぎず、残りの半分は誤りを含んだ回答を出している。どうも LLM は知識の習得が苦手なようだ。
このように LLM が従来コンピュータが得意だと考えられてきてた知識の習得に難がある反面、人間が常識的に行う判断のようなものにはめっぽう強い。これは、様々な文章の中に含まれる人間の行動様式がLLMの中で確率的に構築されているからに他ならない。
これを踏まえAI時代のアプリケーション開発がどのように変わるか考えてみたいと思う。
- 誰かが書いていたが「AI時代にはプログラマは不要になる」ことはないが「AIを前提としたプログラム開発の時代」になるだろう。
- 具体的に考えればわかることだが、設計もプログラムもテストコードも自動生成したならば、それがいったいどのような動作をするのか誰がわかるのだろうか。同じ要件を満たすシステムは無数に考え得るし、作ってみて初めて必要性があきらかになる仕様もある。すくなくとも、設計やテストコードは人間が指示する必要があり、プログラムを読んで意図しない動作が組み込まれてないか確認する必要がある。
- Web上に転がっているコードの中にはいわゆるサンプルコードも多く、このようなコードはエラーチェックやセキュリティが甘くなりがちである。プロダクションコードではエラーチェックやログ出力のコードが大半を占めることも多い
- 様々なプログラムの寄せ集め知識しか持たない LLM にそのプロジェクト特有の一貫した作法を教えるには、プログラミングの知識がある人がプロンプトを工夫し、さらに検証する必要もあるだろう。
- 結局のところ、生成されたものをチェックし必要があれば修正する役割は必要でどんなに自動化が進んでもプログラマの仕事の半分は変わりそうにない。
- このことを踏まえると、必要なのは次のことだろう。
- 人間の指示を的確にLLMに伝える方法
- LLMがそのプロジェクト特有の条件を守った出力を確実に行う方法
- 前者に関しては定型のひな形を作ることに他ならない。今までよりも曖昧な表現は許されても、曖昧なフォーマットの使い方は許されるべきではないだろう。
- LLMに制約をかける方法としては2つの方法が考えられる。
- ひとつはプロジェクト独自のLLMを作ることだ。例えば1本目のプログラムは人間が作り、設計書とプログラムをLLMに覚えさせる。2本目は設計書を入れ、出力されたプログラムを人間が修正し、それをさらにLLMに覚えさせるといったように。
- もうひとつは、定型化したアプリケーション定義形式を作る。LLMにはプログラムを直接生成させずにこのアプリケーション定義形式の操作のみを行ってもらう。アプリケーション定義から実際のプログラムを生成するロジックのみ(LLMを使いながら)きっちり作りこんでやればよい。