2024.12.10
“放置系”なのにサイバー攻撃を監視・検知、「統合ログ管理ツール」とは 最先端のログ管理体制を実現する方法
ChatGPTを使ったシェルコマンドランチャーの開発と工夫(全1記事)
リンクをコピー
記事をブックマーク
広木大地氏:本日けっこう大事だなと思っているところが今回のイベントの趣旨です。ChatGPTには実は2つの側面があって、1つはこのプラットフォーム。WebUIになっているほうのChatGPTで、エンジニアじゃない人も触っていろいろ楽しめるもの。もう1つがAPIとしてのChatGPT。プロダクトにソフトウェアの一部として組み込んでいくもの。今日はAPIとしてGPTを組み込んでいく実践の話をできたらなと思っています。
プラットフォームとしてのChatGPTという要素にも、最近だとChatGPT Pluginとか、けっこうプラットフォームに力を入れている側面も出てきているので、こういう話も追々はしていきたいのですが、今日はAPIをうまく実践のプロダクトに活かしていくぞという話ができたらなと思っています。
実践のプロダクトに組み込むには隠れた工夫が必要です。いち早くいろいろと実践に取り入れてプレスを出していたり、「こういうふうに使っているよ」という発信があった各社からいろいろ聞いて勉強しちゃおうというのが今回の趣旨になります。もしかしたらちょっとおもしろい話があるかもしれないので、おもしろいなと思ったらシェアしてもらえるとうれしいです。
一発目のLTですが「いきなりお前かよ」ということで、僕がやります。LTはすごく久しぶりなので、なんかドキドキしています。ではいきなりいっちゃいますが、今日僕が紹介するのは「自然言語によるシェルコマンドランチャー wannaというものを作ったよ」です。
自己紹介です。(スライドを示して)この『エンジニアリング組織論への招待』という本を書いています。そしていろいろやっています。今回のイベントも主催していますし、画面の切り替えなども一生懸命やっています(笑)。
(スライドを示して)ChatGPT APIがリリースされてから3日後ぐらいに、こういった記事をQiitaに書きました。どういうものを作ったかというと、『いちいちシェルコマンド思い出せないので、ChatGPTで自然言語からスクリプトを生成するツールつくった』というものです。
デモを用意したので、まずはデモをご覧ください。wannaにはwanna thinkというサブコマンドがあってコマンドを考えるというコマンドです。
例えばこの場合「10回 helloworldと 言って」と言うと、そのためのbashスクリプトを考えてくれます。考えたものを「実行する」という指示を出すと実行できます。うまくできていたら、「保存する」と指示を出します。そうするとちょうどいいスクリプトの名前をいくつか考えてくれて、好きな名前を選ぶと保存できます。作成したスクリプトはその名前で再び呼び出せます。
名前だけだと、どんなスクリプトだったか思い出せなくなるので、自動的に指示の内容からスクリプトの概要も日本語で生成してくれます。再度実行する時に確認しながら実行できます。
次の例では、先ほどよりちょっと複雑なリクエストで「現在のディレクトリにある.pyファイルをすべて探してください」と言うと適切なbash スクリプトを考えてくれます。
これを実際に実行してみるとけっこうすごい行数になっちゃいました。何だろう? と思ったらvirtualenvの環境が入っちゃっていることがわかったので、「追加の指示」として「.venvを除いて」と言うと、.venvを除いた探索をしてくれて、行数が数えられます。そういう感じで追加の指示も出せます。なので、仕様を最初から決めるのではなくて作ったものを確認しながら仕様変更もできるのです。
スクリプト名や概要文についても、これまでのすべての指示を合わせた上で、考えてくれます。
今度の例で、エラーのSelf Healingについて説明します。この「メモリ使用率の高いやつを順に5つ表示して」という指示を出すのですが、実行してみたらちょっとエラーが起きちゃいました。AIはLinuxの環境を想定してコマンドを作ってみたところ、macの環境だったのでPOSIXが完全に一致せず、ある種のオプションを使うとエラーが出てしまいます。
そういった場合にも、wannaはこの実行結果を読み取って、反省して自動的に修正する機能が入っています。なので、こういうふうに「すみませんでした」と謝ってくれて、直してくれます。コードを再実行して直っているのを確認すると「正常に動作しているようですね。修正後のスクリプトはそれで問題ないです」といって「保存」ができます。そういう感じで、自動的に修復してくれるのがポイントです。
こういったものを作るのにどうやっているかというと、このLLMの仕事と人間の仕事を分けてある種のステートマシンとして実装しています。LLMは指示を受けて、生成したあとに実行するか、保存するか、追加指示するか、指示をリセットするか、終了するかを人間が選んで、それによって次の仕事を決めます。
実行してみたら今度は反省してみて実行結果を見て、ちょっと良くなさそうだったら「直して」と言えば自動でやってくれて、「保存するよ」と言ったら名前を提案してくれて、名前を選んで保存するというサイクルを回せます。
こういうふうにLLMの仕事と人間の仕事を分けて使っていくことがけっこうソフトウェアの設計では大事かなと(思います)。
大規模言語モデルの仕事は実装とかを提案をすること、人間の仕事は目的の提供と意思決定をすること。そのように定義して設計すると比較的使いやすいものができます。人間にとってまとまった文章(自然言語)を入力するのは意外と面倒くさかったりするので、できる限り意思決定だけを人間にやらせようというのがこのコンセプトです。
このように、複数のNLPタスクを組み合わせることで新しいUXができるのが、このChatGPTとか、こういった大規模言語モデルのすごいところだと思っています。今までは自然言語処理をしようと思ったら、それ専用のモデルやライブラリを一個一個用意する必要がありました。だけど、(GPTを使えば)プロンプトエンジニアリングだけでソースコードの生成、スクリプト名の提案、実行結果の評価とデバッグ、概要文の生成、ユーザー言語の推定などをすべて簡単に実装できます。
それぞれを組み合わせることでアプリケーションが作れるというのがポイントになります。NLPの民主化によって、これまではちょっと複雑そうだと思ったタスクに対して、NLPをわざわざ使わなかった部分を利用するようになるというところが、新しいユーザーエクスペリエンスにつながっていくという点でおもしろかったりします。
それでどんなプロンプトを使っているかというと、ちょっと見えにくいかと思いますが英語のほうがちょっと精度が良かったりするので英語で書いています。Chain of Thoughtを効かせるために、「ステップバイステップで考えてね」みたいなことをして、スクリプトも思考を深めています。1個だけ例を出してOne Shot Exampleを付けて、ユーザー言語を入力から推定して出力を縛るよというのを最後に付けています。
スクリプト名の提案もparseしやすいようにJSONとして出力して、「これで4つのcandidatesをリストアップしてね」と予めインプットしておいて、それによってリトライできたり。しかもこれ、JSONは時々parseできないものが出たりすると「失敗したよ」と言ってリトライさせるというのを入れ込んでいたりします。
もう1つ、実行結果から反省してデバッグする時のプロンプトもあります。bashの入出力をteeして……teeというのは出力しながらパイプするみたいなやつなんですが、teeして、それをキャプチャしたものをプロンプトの中に入れて、それをもとに問題があればコードの修正をサジェストしてくださいという指示も入れています。
複数の指示を出せるので、これまでの指示をまとめて「スクリプトの概要文を作ってください」というのもいけます。
プロンプトを英語で書くのは、「このプロンプトはいけるよ」みたいな論文やライブラリの例が豊富なので、それをある程度使いたいのです。一方で、ユーザーが日本語を使っている場合、日本語で返してほしいですよね。なので、「質問からユーザーの言語を推定して、その推定した言語で出力してね」ということを予め指定できるようにしています。そうすると、時折、突然英語をしゃべるということがなくなるのでちょっと便利です。
こういった工夫って、これまでのアプリケーションで培ってきたような、ある意味普通のエンジニアリングだなと考えています。つまり、既知のパターンの組み合わせと試行錯誤によってアプリケーションを良いものにしていくということです。LLMを活用するためのアプリケーションでも今までのエンジニアリングの知識は使えるし、それがあるほうがより良いアプリケーションができるなというのが正直な感想です。
もっと引いて考えてみると、こういうふうにコマンドを考えるコマンドのステートマシンをプロセスとして作っていくというのは、ソフトウェアやプロジェクトのプロセスを設計していくのと似ているなと感じました。
ある意味、組織プロセス設計と同じだと感じることが多くあります。今回紹介した、AIが提案して、人間が決めていくという構造も、ちょっと変えるとメンバーが提案してマネージャーが意思決定するという組織の設計の部分と似ています。
こういった組織設計の発想に近い部分も、AIの使い方としては必要になってくるのかなというのが作ってみた感想です。なので、ちょっとかっこいいことを言えば「すべての人がAIをマネジメントするマネージャーになるよ。これからはそういう時代なんだよね」という話ができればなと思っています。LTは以上です。
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
2024.12.09
10点満点中7点の部下に言うべきこと 部下を育成できない上司の特徴トップ5
2024.12.09
国内の有名ホテルでは、マグロ丼がなんと1杯「24,000円」 「良いものをより安く」を追いすぎた日本にとって値上げが重要な理由
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.12.10
職場であえて「不機嫌」を出したほうがいいタイプ NOと言えない人のための人間関係をラクにするヒント
2024.12.12
今までとこれからで、エンジニアに求められる「スキル」の違い AI時代のエンジニアの未来と生存戦略のカギとは
PR | 2024.11.26
なぜ電話営業はなくならない?その要因は「属人化」 通話内容をデータ化するZoomのクラウドサービス活用術
PR | 2024.11.22
「闇雲なAI導入」から脱却せよ Zoom・パーソル・THE GUILD幹部が語る、従業員と顧客体験を高めるAI戦略の要諦
2024.12.11
大企業への転職前に感じた、「なんか違うかも」の違和感の正体 「親が喜ぶ」「モテそう」ではない、自分の判断基準を持つカギ