ジェフ・コグスウェル 2024年5月1日 11分読了
ChatGPT などの AI ツールは、コーディング時に役立ちます。理論的には、チャットボットにコーディングする必要がある内容の説明を提供すると、プラットフォームが適切なコード スニペットを返します。これを念頭に置いて、ChatGPT (および Google の Gemini などの他の生成 AI 製品) の支援を次のレベルに引き上げる方法を見てみましょう。これは、次の仕事に非常に重要になる可能性があります。
過去数十年にわたり、プログラマーには AI の代わりとなるものがありました。それは、集団で助け合うために協力し合う何百万人ものプログラマー仲間です。Stack Overflow などの Web サイトを少しでも利用したことがある人なら、質問に対してすぐにコード例やアドバイスを提供してくれる大勢の人がいることをご存知でしょう…ただし、その答えが何年も前からサイトに投稿されていない場合に限ります。
しかし、Stack Overflow や GitHub リポジトリのコメントでコードが正しいと書かれていても、それが正しいとは限りません。確かに、誰かが間違った回答を投稿した場合、他の人はすぐにその間違いを指摘します。その後、他の人が微妙なニュアンスで応答し、回答をさらに洗練させるかもしれません。しかし、その場合でも、コードをプロジェクトに貼り付けてうまくいくことを期待することはできません。コードを注意深く読み、理解し、特定のアプリケーションに適合するかどうかを確認する必要があります。適合しない場合は、自分のケースに合わせてコードを改良します。
世界中のプログラマーの集合的なオンライン意識は、今日の AI と同様に機能していました。AI を扱うときに理解する必要があるのは、同じルールが適用されるということです。
文字列が有効なメール アドレスであるかどうかを確認する必要があるコードを記述しているとします。ChatGPT にメール アドレスを確認するコードを作成するように単に依頼するのではなく、次のように、より具体的に記述する必要があります。
正規表現を使用して、文字列が今日のよく知られているトップレベル ドメインを使用した有効な電子メール アドレスであるかどうかを確認する C# コードが必要です。
参考までに、私は上記を ChatGPT 4 (月額料金がかかるプレミアム版) に入力しました。約 1 分ほど待った後、ChatGPT は「内部サーバー エラー」と応答しました。そこで、3.5 で再度試してみました。すると、非常に優れた C# コードが出力されました。
しかし、コードを見ると、問題に気づきました。現在のトップレベルドメインをチェックしていないのです。代わりに、文字列が、単語の後に @、文字と数字の文字列、ピリオド、文字と数字の文字列の形式に一致するかどうかをチェックしているだけです。最終的な文字列が実際に有効なトップレベルドメインであるかどうかは、どこにもチェックされていませんでした。(参考までに、トップレベルドメインは何百もあり、正規表現でそれらすべてを含めるとかなり巨大になります。おそらく、ChatGPT のソリューションの方が優れていたのでしょう。)
いずれにせよ、ChatGPT が何を提供しても、それを注意深く検証する必要があります。コードにそのまま挿入しないでください。プロンプトはできるだけ具体的にしますが、それでも懐疑的になりましょう。ChatGPT やその他の同様の AI ツールは完璧ではありません。
AI はコード内のバグを見つけるのが得意ですが、詳細なプロンプトを与える必要があります。プロンプトにコードを提供しながら、コードが何をすべきかの説明を与えず、ChatGPT にバグを見つけるように依頼することも可能です。
たとえば、整数を受け取り、その数が偶数の場合は文字列「odd」を返し、その逆の場合は整数を返す関数があるとします。(この関数は、意図的に間違った答えを言うゲームの一部である可能性があります。) ChatGPT にバグを見つけるように指示するだけで、ChatGPT はそれを検出してバグとして指摘します (ChatGPT が文字列を含むコードを分析できるのは非常に印象的ですが、それでも、さらに先に進むにはさらに多くの情報を提供する必要があります)。
バグクエリは、コード内のコメント(ChatGPT が読み取ります)とプロンプトの 2 つの場所に配置できます。プロンプトは次のようになります。
奇数を指定すると「even」を返し、偶数を指定すると「odd」を返すこの関数のバグを見つけてください。
もちろん、これは非常に不自然な例ですが、要点は伝わります。「私は読心術師ではない」という格言がここで当てはまります。ChatGPT は、コードで実行しようとしていることと、コードが実際に実行していることを区別できません。ここでの教訓は、プロンプトをできるだけ詳細にすることです。
より高度な機能のプロンプトの例を次に示します。
この関数は、米国の住所を文字列として受け取ります。郵便番号が 5 桁のみの場合、この関数は郵便番号に '-0000' を追加し、更新された郵便番号を含む文字列として住所全体を返します。代わりに 9 桁の郵便番号が指定された場合は、郵便番号が NNNNN-NNNN 形式 (N は 1 桁) であるかどうかを確認します。この形式が存在しない場合は、郵便番号をそれに応じて再フォーマットし、スペースを削除してダッシュを挿入します。バグを見つけてください。
次に、プロンプトとともにコードを貼り付けます。
それでも、ChatGPT は、コードが実際には正しいのにバグを特定することがあります。その場合、会話を続けることができます。「その特定のユースケース セットでは、コードは実際には正しいです。もう一度試していただけますか?」ChatGPT は忠実にそれを実行します。
次に、単体テストについて考えてみましょう。ChatGPT のような AI ツールは、単体テストの生成に最適です。ただし、考慮すべき重要な要素があります。コードを AI ツールに入力し、単体テストを生成するように要求すると、単体テストが生成されますが、記述したコードが実際に正しいかどうかはわかりません。実際、コードが正しいと仮定して開始します。そこから、すべて合格する単体テストを構築します。ただし、コードにバグがある場合、生成された単体テストではバグは検出されません。
AI ツールにユニット テストの作成を依頼する場合、コードを 1 行も記述する前にテストを作成して、ユニット テストを作成する標準的な手順に従う必要があります。つまり、コードが何を行うかをできるだけ詳細に記述してから、実際にコードを提供せずに AI にユニット テストを依頼する必要があります。
たとえば、数値が特定の範囲、たとえば 0 から 10 の範囲内にあるかどうかをテストする関数を作成するとします。数値が 0 未満の場合、文字列「0 未満」が返されます。数値が 10 より大きい場合、文字列「10 より大きい」が返されます。それ以外の場合は、「0 から 10 までの範囲内」が返されます。
渡された整数が 0 未満の場合、「0 未満」という文字列を返す関数を作成します。渡された整数が 10 より大きい場合、「10 より大きい」という文字列を返します。その他の整数の場合は、「0 から 10 の間」という文字列を返します。どのような単体テストを作成すればよいでしょうか。
ここで、AI ツールが 2 倍役立ちます。ユニット テストを終えてコードを書いた後、コードが正しいかどうかを AI ツールに尋ねることができます。多くの場合、AI ツールがバグを検出します。
ChatGPT などのほとんどの AI ツールは、会話スレッドを維持できることを覚えておいてください。ユニット テストに関する以前のプロンプトを提供して、後で同じスレッドで次のように質問することができます。上記の要件を満たすはずの関数を作成しました。バグはありますか? その後、コードを貼り付けることができます。
はい、ユニット テストでバグが見つかるはずですが、ChatGPT ではバグをより早く見つけて、修正方法を示します。
そして、それらの修正を実装し、ChatGPT が提供したテストを含むテスト スイートで修復されたコードを実行することもできます。アプリが成長し、チームが新しい機能を追加すると、フル パス テストごとにこれらのユニット テストを実行します。(ユニット テストは 1 回だけ実行されるのではないことに注意してください。自動化ツールを実行するたびに、通常はアプリケーション全体のすべてのユニット テストを実行して、新しいコードが既存のコードを壊していないことを確認します。)
ChatGPT は、コードの作成を支援するだけでなく、アプリの構築に必要な概念を理解するのにも役立ちます。
小規模な公益事業会社向けの請求アプリを構築しているとします。クライアントからの要件を収集しました。アプリに必要な機能を完全に理解し、データベースのモデリングを開始する準備が整いました。
しかし、今は ChatGPT に電話料金計算アプリのテーブルのリストを要求して、それを実行するときではありません。おそらく、何かが欠けているでしょう。たとえば、FCC には、定期的に送信する必要があるレポートに関する厳格な規則があります。テーブルには、それらのレポートのデータが含まれている必要があります。それを見逃して、クライアントがそれらのレポートを提供できない場合、FCC から罰金を科せられたときに、クライアントは非常に不満を抱くでしょう。
つまり、ChatGPT だけに頼るのではなく、FCC のサイトなど、他の場所で徹底的に調査するということです。その手順を踏んだら、ChatGPT に助けを求めることができます。
電話サービスなどのユーティリティの場合、そのようなアプリの構築にこれまで関わったことがないと、多くの間違いを犯しがちです。たとえば、発信者番号などのサービスには価格が関連付けられます。サービス名と価格をテーブルに入れるのは理にかなっているように思えますが、サービスは時間の経過とともに価格が変わり、通常は 1 年か 2 年ごとに値上がりするため、1 つのサービスに対して複数の行が必要になり、サービス名と価格に加えて、開始日と終了日も必要になります。
ここで ChatGPT が役に立ちます。次のように質問してください。
携帯電話の請求アプリで料金表を作成する場合、どの列を含める必要がありますか? また、ユーザーが含めるのを忘れる可能性が高い列について詳しく説明してください。
次のように質問することで、さらに範囲を広げることもできます。
電話料金請求アプリにはどのようなテーブルを含める必要がありますか。また、ユーザーが含め忘れる可能性のあるテーブルについても教えてください。
そこからダイアログを構築できます:
ServiceLocation というテーブルについて教えてください。なぜそれが必要なのですか?
ChatGPT が答えるにつれて、それについてさらに詳しく知ることができます。収集した要件を忘れずに伝えてください。重要なプロンプトは次の 2 つです。
クライアントから提示された要件は次のとおりです。何か忘れているものはありますか?
提供された表はこれらすべての要件をサポートしていますか?
常に覚えておいてください: ChatGPT は完璧ではありません。ChatGPT (および同様の生成 AI ツール) は誤った情報を提供する可能性があります。そのため、提供される情報を注意深く確認してテストする必要があります。また、AI ツールだけを使用するのではなく、政府の規制を調べ、その分野の人々にインタビューし、競合アプリを調べてください。すべてが整ったら、生成 AI が本当に信頼できるアシスタントになる可能性が高くなります。
ChatGPT などの AI ツールは、コーディング時に役立ちます。理論的には、チャットボットにコーディングする必要がある内容の説明を提供すると、プラットフォームが適切なコード スニペットを返します。これを念頭に置いて、ChatGPT (および Google の Gemini などの他の生成 AI 製品) の支援を次のレベルに引き上げる方法を見てみましょう。これは、次の仕事に非常に重要になる可能性があります。
過去数十年にわたり、プログラマーには AI の代わりとなるものがありました。それは、集団で助け合うために協力し合う何百万人ものプログラマー仲間です。Stack Overflow などの Web サイトを少しでも利用したことがある人なら、質問に対してすぐにコード例やアドバイスを提供してくれる大勢の人がいることをご存知でしょう…ただし、その答えが何年も前からサイトに投稿されていない場合に限ります。
しかし、Stack Overflow や GitHub リポジトリのコメントでコードが正しいと書かれていても、それが正しいとは限りません。確かに、誰かが間違った回答を投稿した場合、他の人はすぐにその間違いを指摘します。その後、他の人が微妙なニュアンスで応答し、回答をさらに洗練させるかもしれません。しかし、その場合でも、コードをプロジェクトに貼り付けてうまくいくことを期待することはできません。コードを注意深く読み、理解し、特定のアプリケーションに適合するかどうかを確認する必要があります。適合しない場合は、自分のケースに合わせてコードを改良します。
世界中のプログラマーの集合的なオンライン意識は、今日の AI と同様に機能していました。AI を扱うときに理解する必要があるのは、同じルールが適用されるということです。
文字列が有効なメール アドレスであるかどうかを確認する必要があるコードを記述しているとします。ChatGPT にメール アドレスを確認するコードを作成するように単に依頼するのではなく、次のように、より具体的に記述する必要があります。
正規表現を使用して、文字列が今日のよく知られているトップレベル ドメインを使用した有効な電子メール アドレスであるかどうかを確認する C# コードが必要です。
参考までに、私は上記を ChatGPT 4 (月額料金がかかるプレミアム版) に入力しました。約 1 分ほど待つと、ChatGPT は「内部サーバー エラー」と応答しました。そこで、3.5 で再度試してみました。すると、非常に優れた C# コードが出力されました。
しかし、コードを見ると、問題に気づきました。現在のトップレベルドメインをチェックしていないのです。代わりに、文字列が、単語の後に @、文字と数字の文字列、ピリオド、文字と数字の文字列の形式に一致するかどうかをチェックしているだけです。最終的な文字列が実際に有効なトップレベルドメインであるかどうかは、どこにもチェックされていませんでした。(参考までに、トップレベルドメインは何百もあり、正規表現でそれらすべてを含めるとかなり巨大になります。おそらく、ChatGPT のソリューションの方が優れていたのでしょう。)
いずれにせよ、ChatGPT が何を提供しても、それを慎重に検証する必要があります。コードにそのまま挿入しないでください。プロンプトはできるだけ具体的にしますが、それでも懐疑的になりましょう。ChatGPT やその他の同様の AI ツールは完璧ではありません。
AI はコード内のバグを見つけるのが得意ですが、詳細なプロンプトを与える必要があります。プロンプトにコードを提供しながら、コードが何をすべきかの説明を与えず、ChatGPT にバグを見つけるように依頼することも可能です。
たとえば、整数を受け取り、その数が偶数の場合は文字列「odd」を返し、その逆の場合は整数を返す関数があるとします。(この関数は、意図的に間違った答えを言うゲームの一部である可能性があります。) ChatGPT にバグを見つけるように指示するだけで、ChatGPT はそれを検出してバグとして指摘します (ChatGPT が文字列を含むコードを分析できるのは非常に印象的ですが、それでも、さらに先に進むにはさらに多くの情報を提供する必要があります)。
バグクエリは、コード内のコメント(ChatGPT が読み取ります)とプロンプトの 2 つの場所に配置できます。プロンプトは次のようになります。
奇数を指定すると「even」を返し、偶数を指定すると「odd」を返すこの関数のバグを見つけてください。
もちろん、これは非常に不自然な例ですが、要点は伝わります。「私は読心術師ではない」という格言がここで当てはまります。ChatGPT は、コードで何をしようとしているのか、そして実際に何をしているのかを区別できません。ここでの教訓は、プロンプトをできるだけ詳細にすることです。
より高度な機能のプロンプトの例を次に示します。
この関数は、米国の住所を文字列として受け取ります。郵便番号が 5 桁のみの場合、この関数は郵便番号に '-0000' を追加し、更新された郵便番号を含む文字列として住所全体を返します。代わりに 9 桁の郵便番号が指定された場合は、郵便番号が NNNNN-NNNN 形式 (N は 1 桁) であるかどうかを確認します。この形式が存在しない場合は、郵便番号をそれに応じて再フォーマットし、スペースを削除してダッシュを挿入します。バグを見つけてください。
次に、プロンプトとともにコードを貼り付けます。
それでも、ChatGPT はコードが実際には正しいのにバグを特定することがあります。その場合、会話を続けることができます。「その特定のユースケース セットでは、コードは実際には正しいです。もう一度試していただけますか?」ChatGPT は忠実にそれを実行します。
次に、単体テストについて考えてみましょう。ChatGPT のような AI ツールは、単体テストを生成するのに最適です。ただし、考慮すべき重要な要素があります。コードを AI ツールに入力し、単体テストを生成するように要求すると、単体テストが生成されますが、記述したコードが実際に正しいかどうかはわかりません。実際、コードが正しいと仮定して開始します。そこから、すべて合格する単体テストを構築します。ただし、コードにバグがある場合、生成された単体テストではバグは検出されません。
AI ツールにユニット テストの作成を依頼する場合、コードを 1 行も記述する前にテストを作成して、ユニット テストを作成する標準的な手順に従う必要があります。つまり、コードが何を行うかをできるだけ詳細に記述してから、実際にコードを提供せずに AI にユニット テストを依頼する必要があります。
たとえば、数値が特定の範囲、たとえば 0 から 10 の範囲内にあるかどうかをテストする関数を作成するとします。数値が 0 未満の場合、文字列「0 未満」が返されます。数値が 10 より大きい場合、文字列「10 より大きい」が返されます。それ以外の場合は、「0 から 10 までの範囲内」が返されます。
渡された整数が 0 未満の場合、「0 未満」という文字列を返す関数を作成します。渡された整数が 10 より大きい場合、「10 より大きい」という文字列を返します。その他の整数の場合は、「0 から 10 の間」という文字列を返します。どのような単体テストを作成すればよいでしょうか。
ここで、AI ツールが 2 倍役立ちます。ユニット テストを終えてコードを書いた後、コードが正しいかどうかを AI ツールに尋ねることができます。多くの場合、AI ツールがバグを検出します。
ChatGPT などのほとんどの AI ツールは、会話スレッドを維持できることを覚えておいてください。ユニット テストに関する以前のプロンプトを提供して、後で同じスレッドで次のように質問することができます。上記の要件を満たすはずの関数を作成しました。バグはありますか? その後、コードを貼り付けることができます。
はい、ユニット テストでバグが見つかるはずですが、ChatGPT ではバグをより早く見つけて、修正方法を示します。
そして、それらの修正を実装し、ChatGPT が提供したテストを含むテスト スイートで修復されたコードを実行することもできます。アプリが成長し、チームが新しい機能を追加すると、フル パス テストごとにこれらのユニット テストを実行します。(ユニット テストは 1 回だけ実行されるのではないことに注意してください。自動化ツールを実行するたびに、通常はアプリケーション全体のすべてのユニット テストを実行して、新しいコードが既存のコードを壊していないことを確認します。)
ChatGPT は、コードの作成を支援するだけでなく、アプリの構築に必要な概念を理解するのにも役立ちます。
小規模な公益事業会社向けの請求アプリを構築しているとします。クライアントから要件を収集しました。アプリに必要な機能を完全に理解し、データベースのモデリングを開始する準備が整いました。
しかし、今は ChatGPT に電話料金計算アプリのテーブルのリストを要求して、それを実行するときではありません。おそらく、何かが欠けているでしょう。たとえば、FCC には、定期的に送信する必要があるレポートに関する厳格な規則があります。テーブルには、それらのレポートのデータが含まれている必要があります。それを見逃して、クライアントがそれらのレポートを提供できない場合、FCC から罰金を科せられたときに、クライアントは非常に不満を抱くでしょう。
つまり、ChatGPT だけに頼るのではなく、FCC のサイトなど、他の場所で徹底的に調査するということです。その手順を踏んだら、ChatGPT に助けを求めることができます。
電話サービスなどのユーティリティの場合、そのようなアプリの構築にこれまで関わったことがないと、多くの間違いを犯しがちです。たとえば、発信者番号などのサービスには価格が関連付けられます。サービス名と価格をテーブルに入れるのは理にかなっているように思えますが、サービスは時間の経過とともに価格が変わり、通常は 1 年か 2 年ごとに値上がりするため、1 つのサービスに対して複数の行が必要になり、サービス名と価格に加えて、開始日と終了日も必要になります。
ここで ChatGPT が役に立ちます。次のように質問してください。
携帯電話の請求アプリで料金表を作成する場合、どの列を含める必要がありますか? また、ユーザーが含めるのを忘れる可能性が高い列について詳しく説明してください。
次のように質問することで、さらに範囲を広げることもできます。
電話料金請求アプリにはどのようなテーブルを含める必要がありますか。また、ユーザーが含め忘れる可能性のあるテーブルについても教えてください。
そこからダイアログを構築できます:
ServiceLocation というテーブルについて教えてください。なぜそれが必要なのですか?
ChatGPT が答えるにつれて、それについてさらに詳しく知ることができます。収集した要件を忘れずに伝えてください。重要なプロンプトは次の 2 つです。
クライアントから提示された要件は次のとおりです。何か忘れているものはありますか?
提供された表はこれらすべての要件をサポートしていますか?
常に覚えておいてください: ChatGPT は完璧ではありません。ChatGPT (および同様の生成 AI ツール) は誤った情報を提供する可能性があります。そのため、提供される情報を注意深く確認してテストする必要があります。また、AI ツールだけを使用するのではなく、政府の規制を調べ、その分野の人々にインタビューし、競合アプリを調べてください。すべてが整ったら、生成 AI が本当に信頼できるアシスタントになる可能性が高くなります。
テクノロジー業界の現状についてもっと知りたいですか? ご質問があれば、私たちが答えます。こちらでご覧ください。
Jeff Cogswell 氏は、「C++ All-In-One Desk Reference For Dummies」、「C++ Cookbook」、「Designing Highly Useable Software」など、数冊の技術書の著者です。20 年以上ソフトウェア エンジニアとして活動してきた Jeff 氏は、さまざまな開発トピックについて幅広く執筆してきました。C++ と JavaScript の専門家である同氏は、Linux での低レベル C 開発から、JavaScript と jQuery、PHP、ASP.NET MVC による最新の Web 開発まで、幅広い経験を持っています。
無料の Dice プロフィールにサインアップし、履歴書を追加して、優れたキャリアの洞察を発見し、テクノロジー関連のキャリアをスタートさせましょう。
元記事: https://www.dice.com/career-advice/how-to-build-better-ai-prompts-for-coding-help