見出し画像

プログラム開発の生産性を上げる生成AIとの対話の進め方

※本記事は、1ヶ月ほど前に別テーマで投稿した以下の記事の「補足」部分を加筆修正したものです。
開発しているアプリケーション自体は、supply chain plannerというもので、pythonで約5,000ステップ程の実験的なコードです。開発内容の詳細については、下記URLのnote記事を参照ください。
グローバル・サプライチェーン計画と最適化のためのコンセプト検証 PoC:Proof of Concept|Yasushi Ohsugi (note.com)


【生成AIとの対話によるプログラム開発の進め方】

「生成AI、copilot(=chatGPT)やgeminiとの対話を進めながら、期待するコードを自動生成して、アプリケーション開発のスピードを加速する事ができる。」
これは、私のような(もともと開発スピードの遅い)初級プログラマの場合にのみ言えることなのかもしれませんが、この記事が参考になる方もいらっしゃるのではないかと思い、私の生成AIとの対話方法をまとめてみました。

それでは、どのように生成AIとの対話を進めれば良いのでしょうか?
以下は、数年前から趣味で始めたpython というプログラム言語を対象に、python のコードを自動生成するための「生成AIとの対話の進め方」について、私の実体験を簡単にまとめたものです。

 1. 生成AIとスムーズに会話できるコードサイズに絞って質問する

    質問例「これこれの機能を作りたいのですが、どのように書けばよいか、サンプル・コードを教えてください」

まず、これから作りたい機能、要求仕様を、生成AIとの対話がスムーズにできるレベル、経験的には、100ステップ前後のコードが生成されるレベルに要求仕様を分解します。
そして、「pythonで、これこれの機能を作りたいのですが、どのように書けばよいか、サンプル・コードを教えてください」とか、「pythonで、これこれの機能は、どのように書けば良いですか?」と問いかけます。

※あくまで個人的な推測ですが、「pythonで」の部分は、他の言語、JavaScript、C++、COBOL、PL/I などでも大丈夫だと思います。利用者の多い言語、ネット上にその言語のプログラミング・ノウハウが豊富に点在していることで、生成AIの回答内容、精度が上がるのではないかと思います。

 2. 生成AIとの共通理解の場を作るために質問を繰り返す

 質問例「先ほどの問題を以下のように再定義します」

次に、生成するpythonのテスト・コード(100ステップ前後)をデバッグして、期待する機能ができるまで対話を繰り返すという方法で開発しています。

具体的には、以下のような方法で、生成AIとの対話を繰り返しています。
 最初に定義する「要求仕様」は、生成AIにとって正しく理解できるレベルまで、問題を正確に定義、記述できていない事も多いので、回答結果を見て、質問の仕方に問題があった場合は、要求仕様を「再定義」します。
これは、期待する回答に近づけるために、生成AIとの共通理解の会話の場を作るという感覚です。
具体的には「先ほどの問題を以下のように再定義します」というようにして、回答が期待した内容に近づくまで、質問(=問題の再定義)を何度も繰り返すことが必要になる場合があります。

 一方で、エラー・メッセージが出た時の質問は、もともと言語の仕様がカチッと決まっている世界なので、余分な説明は付けずにそのままコピペして
「以下のエラーについて、原因と対処方法を教えて」
と一言つけて、気にせず丸投げすると、プログラムの問題点を指摘して、修正したコードを生成してくれます。
pythonの場合であれば、関連するライブラリ(今回はpandas, networkX, bokeh, plotlyなど)のエラーも含めて、分かりやすくエラー原因の説明や修正コードを教えてくれます。

 3. テスト・データの生成を依頼する

    質問例「これこれの属性名を持つテスト・データを作ってください」

プログラム開発ではよくあることだと思いますが、デバッグは比較的、楽にできるのですが、テスト・データの準備に時間がかかる事があります。

このような場合、「pythonで、これこれの機能を作りたいのですが、まずは入力用のテスト・データとして、ファイルのヘッダーが、これこれの属性名を持つデータを作ってください」とお願いすると、「はい。分かりました。」と即答してくれます。

この場合も、テスト・データの仕様を正しく理解してもらうためには、何度か質問を再定義して、共通理解の場を作る必要があります。
例えば、あるデータ属性の中にリスト形式のデータを持っているケースなど、データ構造が少し複雑な場合は、丁寧に補足説明してあげる必要が出てきます。

 4. 生成されたコードを流し読みで確認する

 質問例「このコードは、おかしくないですか?」

 生成されたコードに、ざーっと目を通していると、たまに期待する部分にコードの修正が入っていない場合や、あきらかに誤った書きっぷりの場合があります。
このような場合には「このコードは、おかしくないですか?」と問いかけると、「申し訳ありません」と、真面目に考え直してくれます。

 逆に、生成されたコードが、あまりにもスマートなコードで、私のような初級プログラマには理解できないコードが生成された場合には、
「このコードの処理内容を詳しく教えてください」と問いかけると、
便利な関数(例えば、最近ではpandasのmelt()関数など)や簡潔なfor文、正規表現、文字やリストの操作などの書き方について、詳しく解説してくれます。

 5. 処理機能の説明はプログラム仕様書にも使える

    質問例「以下のコードの処理内容を詳しく教えてください」

 先ほどの続きとなりますが、
「pythonで、以下のコードの処理内容を詳しく教えてください」
という問いかけをすると、生成される回答は、プログラム仕様書の代わりになるのではないかと思えるくらい、詳しい説明が付けられてきます。処理内容を各機能モジュール毎に分解して、順序立てて説明してくれます。
仕様書の記述レベルにもよりますが、分解された機能モジュールの仕様書、機能説明として、十分に通用するのではないかと思います。

 6. 実装方法のアイデアを複数提示して比較検討する

    質問例「アプローチ1の実装方法として、XXXという方法が、もう一つ、アプローチ2の実装方法として、YYYという方法が考えられますが、どちらが良いですか?」

最近の経験事例として、実装方法のアイデアをいくつか提示して、どの方法が良い問いかけるという対話の進め方も効果的です。

例えば「これこれの問題には、アプローチ1の実装方法として、XXXという方法が考えられますが、もう一つ、アプローチ2の実装方法として、YYYという方法が考えられます。どちらのアプローチが良いですか?」
と問いかけると、両方のサンプル・コードを生成して、「両方のアプローチで動かして、確認してください」といった回答を得ることができます。

 7. 100ステツプ前後のコードを複数回に分けて対話を進める

    質問例「あなたが理解できるコード・サイズには制限があるので、2回に分けて、まずは前半のコードを以下に提示します。」

最初にお話した「100ステップ前後のコードであれば、生成AIが直ぐにコードを生成して回答してくれる」という点について、
もう一段の工夫として、「あなたが理解できるコード・サイズには制限があるので、2回に分けて、まずは前半のコードを以下に提示します。」
といった会話を進めると、
「はい。前半部分のコードは理解しました。後半部分のコードを教えてください」
と直ぐに応答してくれます。
私の経験では、100ステツプ前後のコードを2回に分けて対話を進めることができましたが、生成AIがどこまでコードを読み込んで対話できるのかは未知数です。

近い将来、プログラム開発の世界においては、生成AIが1,000ステップ~10,000ステップ程度のコードを丸ごと読み込んで、処理内容を理解してスムーズに会話できるようになれば、(企業や研究機関などのプライベート環境では、既に実現しているのかもしれませんが)開発の生産性は飛躍的に上がってくると思います。

 8. 生成されたコードを追わずに結果で判断するケース

    質問例「データ変換処理について、ツリー構造のデータXXXがある時、ネットワーク構造のデータYYYに、以下の条件でデータ変換できますか?
条件1. XXXのnodeとYYYのnodeを同じ名称で定義する
条件2. ツリーの親子関係(self.node, child.node)をネットワークの需給関係edge( from_node, to_node)に対応させる
条件3. その他xxxについて考慮する  」

    比較的単純なデータ変換処理や、私が開発しているSupply Chain Plannerのケースであれば、サプライチェーンのtree構造から、ネットワーク最適化モジュールのネットワーク構造へ、モデル間でnodeデータをマッピングする処理など、データ変換処理の仕様が明確な場合については、仕様を丸投げして、期待する機能が動いていることを確認できれば、コードの細かい部分を追いかけなくてもOK、という状況になっている部分もあります。

 9. 生成AIとの対話履歴のログを残して再利用する

    質問例「以前、あなたと以下のようなやりとりをしました。この内容をもとに、以下の質問を考えてください」

質問」と「回答」の対話の内容は、テキスト・ファイルに残しておく。
 
これは最初にご紹介するべき点であったかもしれませんが、すべての対話は、私の場合であれば、テキストエディタで質問を起こして、生成AIからの回答は、すべてエディタ側にコピペして、テキスト・ファイルに対話のログを残しています。

 ログを残す理由は、生成AIとの対話が一過性のもので、翌日、同じテーマで対話を続けたい時に、それができない、メモリ・クリアされて忘れているという点にあります。
 そこで、過去の対話を見せて、「以前、あなたと以下のようなやりとりをしました。この内容をもとに、以下の質問を考えてください」といった対話の進め方をすることもあります。

【まとめ】

 以上のような開発スタイルから、私のような初級プログラマの場合であれば、個人的な感覚として、python開発の生産性は10倍~100倍くらい大幅に改善しているように思えます。
といいますか、自身の開発生産性というよりも、優秀なプログラマが開発作業をサポートしてくれているという感覚の方が正しいかもしれません。

 それから、生成AIとの向き合い方について、私の場合は「世界最高の知性と対峙しているという気持ちでリスペクトしながら会話する」という点を心がけています。
 特に、プログラム開発という世界に関していえば、期待する答えをうまく生成してくれない理由の多くは、質問する側に問題があるという前提で、対話のやり方を工夫しています。
 例えば、直接的な質問をぶつける前に、前提となる環境の説明や前提条件に関する質問をして、ある特定の問題領域に「意識を集中してもらう工夫」をします。
 それから、本当に知りたい質問にいきなりジャンプするのではなく、問題提起の方法や、本命の質問の手前で、助走路となる質問を繰り返すなど、回答しやすい環境を整備することで、生成される回答の質を上げることができるのではないかと思います。
回答の前提となる知識にどんな内容が必要か、問題領域などを事前に示唆してあげることが重要と思います。

以上、プログラム開発における生成AIとの対話の進め方について、ご紹介させていただきました。
本記事が、生成AIとのプログラム開発に興味のある方のご参考になれば幸いです。

2024年9月 晩夏
大杉 泰司

この記事が気に入ったらサポートをしてみませんか?