『エンジニアリング組織論への招待』の著者・広木大地氏

広木大地氏:本日けっこう大事だなと思っているところが今回のイベントの趣旨です。ChatGPTには実は2つの側面があって、1つはこのプラットフォーム。WebUIになっているほうのChatGPTで、エンジニアじゃない人も触っていろいろ楽しめるもの。もう1つがAPIとしてのChatGPT。プロダクトにソフトウェアの一部として組み込んでいくもの。今日はAPIとしてGPTを組み込んでいく実践の話をできたらなと思っています。

プラットフォームとしてのChatGPTという要素にも、最近だとChatGPT Pluginとか、けっこうプラットフォームに力を入れている側面も出てきているので、こういう話も追々はしていきたいのですが、今日はAPIをうまく実践のプロダクトに活かしていくぞという話ができたらなと思っています。

実践のプロダクトに組み込むには隠れた工夫が必要です。いち早くいろいろと実践に取り入れてプレスを出していたり、「こういうふうに使っているよ」という発信があった各社からいろいろ聞いて勉強しちゃおうというのが今回の趣旨になります。もしかしたらちょっとおもしろい話があるかもしれないので、おもしろいなと思ったらシェアしてもらえるとうれしいです。

一発目のLTですが「いきなりお前かよ」ということで、僕がやります。LTはすごく久しぶりなので、なんかドキドキしています。ではいきなりいっちゃいますが、今日僕が紹介するのは「自然言語によるシェルコマンドランチャー wannaというものを作ったよ」です。

自己紹介です。(スライドを示して)この『エンジニアリング組織論への招待』という本を書いています。そしていろいろやっています。今回のイベントも主催していますし、画面の切り替えなども一生懸命やっています(笑)。

ChatGPTで自然言語からスクリプトを生成するツールを開発

(スライドを示して)ChatGPT APIがリリースされてから3日後ぐらいに、こういった記事をQiitaに書きました。どういうものを作ったかというと、『いちいちシェルコマンド思い出せないので、ChatGPTで自然言語からスクリプトを生成するツールつくった』というものです。

デモを用意したので、まずはデモをご覧ください。wannaにはwanna thinkというサブコマンドがあってコマンドを考えるというコマンドです。

例えばこの場合「10回 helloworldと 言って」と言うと、そのためのbashスクリプトを考えてくれます。考えたものを「実行する」という指示を出すと実行できます。うまくできていたら、「保存する」と指示を出します。そうするとちょうどいいスクリプトの名前をいくつか考えてくれて、好きな名前を選ぶと保存できます。作成したスクリプトはその名前で再び呼び出せます。

名前だけだと、どんなスクリプトだったか思い出せなくなるので、自動的に指示の内容からスクリプトの概要も日本語で生成してくれます。再度実行する時に確認しながら実行できます。

次の例では、先ほどよりちょっと複雑なリクエストで「現在のディレクトリにある.pyファイルをすべて探してください」と言うと適切なbash スクリプトを考えてくれます。

これを実際に実行してみるとけっこうすごい行数になっちゃいました。何だろう? と思ったらvirtualenvの環境が入っちゃっていることがわかったので、「追加の指示」として「.venvを除いて」と言うと、.venvを除いた探索をしてくれて、行数が数えられます。そういう感じで追加の指示も出せます。なので、仕様を最初から決めるのではなくて作ったものを確認しながら仕様変更もできるのです。

スクリプト名や概要文についても、これまでのすべての指示を合わせた上で、考えてくれます。

今度の例で、エラーのSelf Healingについて説明します。この「メモリ使用率の高いやつを順に5つ表示して」という指示を出すのですが、実行してみたらちょっとエラーが起きちゃいました。AIはLinuxの環境を想定してコマンドを作ってみたところ、macの環境だったのでPOSIXが完全に一致せず、ある種のオプションを使うとエラーが出てしまいます。

そういった場合にも、wannaはこの実行結果を読み取って、反省して自動的に修正する機能が入っています。なので、こういうふうに「すみませんでした」と謝ってくれて、直してくれます。コードを再実行して直っているのを確認すると「正常に動作しているようですね。修正後のスクリプトはそれで問題ないです」といって「保存」ができます。そういう感じで、自動的に修復してくれるのがポイントです。

AIと人間の役割を決めてステートマシンとして実装

こういったものを作るのにどうやっているかというと、このLLMの仕事と人間の仕事を分けてある種のステートマシンとして実装しています。LLMは指示を受けて、生成したあとに実行するか、保存するか、追加指示するか、指示をリセットするか、終了するかを人間が選んで、それによって次の仕事を決めます。

実行してみたら今度は反省してみて実行結果を見て、ちょっと良くなさそうだったら「直して」と言えば自動でやってくれて、「保存するよ」と言ったら名前を提案してくれて、名前を選んで保存するというサイクルを回せます。

こういうふうにLLMの仕事と人間の仕事を分けて使っていくことがけっこうソフトウェアの設計では大事かなと(思います)。

大規模言語モデルの仕事は実装とかを提案をすること、人間の仕事は目的の提供と意思決定をすること。そのように定義して設計すると比較的使いやすいものができます。人間にとってまとまった文章(自然言語)を入力するのは意外と面倒くさかったりするので、できる限り意思決定だけを人間にやらせようというのがこのコンセプトです。

ChatGPTのすごいところは圧倒的な“NLPの民主化”

このように、複数のNLPタスクを組み合わせることで新しいUXができるのが、このChatGPTとか、こういった大規模言語モデルのすごいところだと思っています。今までは自然言語処理をしようと思ったら、それ専用のモデルやライブラリを一個一個用意する必要がありました。だけど、(GPTを使えば)プロンプトエンジニアリングだけでソースコードの生成、スクリプト名の提案、実行結果の評価とデバッグ、概要文の生成、ユーザー言語の推定などをすべて簡単に実装できます。

それぞれを組み合わせることでアプリケーションが作れるというのがポイントになります。NLPの民主化によって、これまではちょっと複雑そうだと思ったタスクに対して、NLPをわざわざ使わなかった部分を利用するようになるというところが、新しいユーザーエクスペリエンスにつながっていくという点でおもしろかったりします。

どのようなプロンプトを使っているのか?

それでどんなプロンプトを使っているかというと、ちょっと見えにくいかと思いますが英語のほうがちょっと精度が良かったりするので英語で書いています。Chain of Thoughtを効かせるために、「ステップバイステップで考えてね」みたいなことをして、スクリプトも思考を深めています。1個だけ例を出してOne Shot Exampleを付けて、ユーザー言語を入力から推定して出力を縛るよというのを最後に付けています。

スクリプト名の提案もparseしやすいようにJSONとして出力して、「これで4つのcandidatesをリストアップしてね」と予めインプットしておいて、それによってリトライできたり。しかもこれ、JSONは時々parseできないものが出たりすると「失敗したよ」と言ってリトライさせるというのを入れ込んでいたりします。

もう1つ、実行結果から反省してデバッグする時のプロンプトもあります。bashの入出力をteeして……teeというのは出力しながらパイプするみたいなやつなんですが、teeして、それをキャプチャしたものをプロンプトの中に入れて、それをもとに問題があればコードの修正をサジェストしてくださいという指示も入れています。

複数の指示を出せるので、これまでの指示をまとめて「スクリプトの概要文を作ってください」というのもいけます。

プロンプトを英語で書くのは、「このプロンプトはいけるよ」みたいな論文やライブラリの例が豊富なので、それをある程度使いたいのです。一方で、ユーザーが日本語を使っている場合、日本語で返してほしいですよね。なので、「質問からユーザーの言語を推定して、その推定した言語で出力してね」ということを予め指定できるようにしています。そうすると、時折、突然英語をしゃべるということがなくなるのでちょっと便利です。

すべての人がAIをマネジメントするマネージャーになる

こういった工夫って、これまでのアプリケーションで培ってきたような、ある意味普通のエンジニアリングだなと考えています。つまり、既知のパターンの組み合わせと試行錯誤によってアプリケーションを良いものにしていくということです。LLMを活用するためのアプリケーションでも今までのエンジニアリングの知識は使えるし、それがあるほうがより良いアプリケーションができるなというのが正直な感想です。

もっと引いて考えてみると、こういうふうにコマンドを考えるコマンドのステートマシンをプロセスとして作っていくというのは、ソフトウェアやプロジェクトのプロセスを設計していくのと似ているなと感じました。

ある意味、組織プロセス設計と同じだと感じることが多くあります。今回紹介した、AIが提案して、人間が決めていくという構造も、ちょっと変えるとメンバーが提案してマネージャーが意思決定するという組織の設計の部分と似ています。

こういった組織設計の発想に近い部分も、AIの使い方としては必要になってくるのかなというのが作ってみた感想です。なので、ちょっとかっこいいことを言えば「すべての人がAIをマネジメントするマネージャーになるよ。これからはそういう時代なんだよね」という話ができればなと思っています。LTは以上です。