プロンプト エンジニアリングの基礎とベスト プラクティス
このユニットで取り上げる内容は次のとおりです。
- プロンプト エンジニアリングとは何か?
- プロンプト エンジニアリングの基礎
- プロンプト エンジニアリングのベスト プラクティス
- Copilot がプロンプトから学習する方法
プロンプト エンジニアリングとは何か?
プロンプト エンジニアリングとは、プロジェクト固有のニーズに合わせて、コンテキストに適したコードを調整して生成できるように GitHub Copilot などの AI システムをガイドするための明確な指示を作成するプロセスです。 これにより、コードは、正しい構文、機能、コンテキストであることが保証されます。
プロンプト エンジニアリングとは何かを理解したので、その原則のいくつかについて学習しましょう。
プロンプト エンジニアリングの原則
具体的な戦略を調べる前に、まず、以下の 4 つの S に要約されるプロンプト エンジニアリングの基本原則を理解しましょう。 これらの中心となるルールは、効果的なプロンプトを作成するための基礎となります。
- 単一 (Single): 常に、明確に定義された 1 つのタスクまたは質問をプロンプトの対象にします。 この明確さは、Copilot から正確で有用な応答を引き出すために非常に重要です。
- 具体的 (Specific): 指示は、必ず明確で詳細なものにします。 具体的であれば、コード候補の適用可能性と正確性が高まります。
- 短くする (Short): プロンプトは、具体的でありながら、簡潔で要点をとらえたものにします。 このバランスにより、Copilot のオーバーロードや対話の複雑化を招くことなく、明確さが確保されます。
- 周囲環境 (Surround): わかりやすいファイル名を使い、関連ファイルを開いたままにします。 これにより、Copilot に豊富なコンテキストが提供され、よりカスタマイズされたコード候補が得られます。
これらの中心原則は、効率的かつ効果的なプロンプトを作成するための基礎を築きます。 この 4 つの S を念頭に置き、GitHub Copilot との各対話が確実に最適化されるようにする高度なベスト プラクティスについて詳しく見てみましょう。
プロンプト エンジニアリングのベスト プラクティス
4 つの S に基づいた次の高度なプラクティスによって Copilot との連携が改善および強化されるため、生成されるコードは、正確であるだけでなく、プロジェクト固有のニーズやコンテキストと完全に一致することが保証されます。
十分な明瞭さを提供する
"単一" と "具体的" の原則に基づいて、プロンプトの明示性を常に目指します。 たとえば、"指定されたリストから偶数をフィルター処理して返す Python 関数を作成してください" というようなプロンプトは、焦点が単一であり、かつ具体的です。
詳細を含む十分なコンテキストを提供する
"周囲環境" の原則に従って、コンテキストを使用して Copilot の理解を深めます。 提供されるコンテキスト情報が多いほど、生成されるコード候補の適合性が高まります。 たとえば、コードの先頭にいくつかのコメントを追加して、求めている応答についてより多くの詳細を提供すると、Copilot がプロンプトを理解して、より適切なコード候補を提供するためのより多くのコンテキストを提供できます。
上記の例では、短さを保ちながら、より多くの詳細を提供するための手順を使用しました。 このプラクティスは "短くする" の原則に従っており、詳細と簡潔さのバランスを取って、コミュニケーションの明瞭さと正確さを確保します。
注
また、Copilot は、コード エディターで並行して開いているタブを使用して、コードの要件に関するより多くのコンテキストを取得します。
学習用の例を提供する
例を使用すると、要件や期待を明確にすることができます。また、抽象的な概念を示したり、プロンプトを Copilot にとってより具体的なものにしたりすることもできます。 適切に作成された例は、Copilot がパターンをすばやく理解するのに役立ち、より少ないリビジョン サイクルを必要とするより正確な初期提案につながります。 このアプローチは、より大きな機能の基盤となる定型コード、テスト テンプレート、反復的な実装を生成する場合に特に効果的です。
アサートと反復
GitHub Copilot の可能性を最大限に引き出し、開発ワークフローを加速するための鍵の 1 つは、戦略的反復の実践です。 最初のプロンプトでは、運用環境に対応したコードが常に生成されるわけではありません。これは完全に問題ありません。 手動で出力を絞り込むのではなく、Copilot との効率的な対話の始まりとして扱います。
最初の出力が探しているものでない場合は、最初から始めないでください。 代わりに、提案されたコードを消去し、追加された詳細と例を使用して最初のコメントを強化し、Copilot に再度プロンプトを表示します。 この反復的なアプローチでは、多くの場合、従来の開発方法よりも高品質でデプロイに対応したコードが得られます。各イテレーションは、Copilot による特定の要件の理解に基づいて構築されるためです。
プロンプト作成のスキルを向上するためのベスト プラクティスを学習したので、Copilot が学習できる例を提供する方法を詳しく見てみましょう。
Copilot がプロンプトから学習する方法
GitHub Copilot は、膨大な量のデータでトレーニングされた AI モデルに基づいて動作します。 特定のコード コンテキストの理解を深めるために、エンジニアは多くの場合、例を提供します。 このプラクティスは機械学習で一般的に見られるものであり、次のようなさまざまなトレーニング アプローチにつながっています。
ゼロショット学習
このアプローチでは、GitHub Copilot は、基礎的なトレーニングのみに依存し、具体的な例なしでコードを生成します。 このアプローチは、一般的なパターンと標準機能を迅速に実装するのに最適です。 たとえば、温度を摂氏と華氏の間で変換する関数を作成するとします。 まず、必要な内容を説明するコメントを記述するだけで始めることができます。Copilot は、前のトレーニングに基づいて、他の例を使用せずに、運用環境に対応したコードを生成できる場合があります。
ワンショット学習
このアプローチでは、単一の例が与えられ、特定のパターンと規則に従うコンテキスト対応の応答をより多く生成するモデルを支援します。 これは、コードベース全体で一貫した実装を作成し、コード標準を維持しながら機能開発を加速するために特に効果的です。 前のゼロショットの例に基づいて、温度変換関数の例を提供し、別の同様の関数を作成するように Copilot に依頼します。 これは、次のようになります。
少数ショット学習
この方法では、ゼロショットの予測不可能性と微調整の精度のバランスを取るいくつかの例が Copilot に提供されます。 このアプローチは、複数のシナリオとエッジ ケースを処理する高度な実装を生成し、手動テストと絞り込みに費やす時間を短縮することに優れています。 1 日の時刻に応じて挨拶を送信するコードを生成するとします。 そのプロンプトの少数ショット バージョンを次に示します。
チャット履歴の連鎖プロンプトと管理
複数の手順を必要とする複雑な機能に取り組む場合は、GitHub Copilot Chat との拡張会話を行う場合があります。 詳細なコンテキストは、Copilot が要件を理解するのに役立ちますが、長い会話履歴を維持すると、処理の面で非効率的でコストがかかる可能性があります。
たとえば、基本的な実装から始めて、エラー処理、テスト、ドキュメント、最適化を繰り返し追加できます。 各ターンは前のコンテキストに基づいていますが、完全な履歴は長くなります。
ターン 1: "ユーザー認証関数の作成" ターン 2: "無効な資格情報のエラー処理を追加する"
ターン 3: "認証関数の単体テストを追加する" ターン 4: "JSDoc コメントを追加して関数を文書化する" ターン 5: "パフォーマンスを向上させるために関数を最適化する"
注
完全な会話履歴を含む長いプロンプトでは、1 ターンあたり 2 ~ 3 個の PRU を使用できます。 コンテキストを要約したり、会話をリセットしたりすると、要求ごとに 1 PRU に近づけることができます。
これを効率的に管理するには:
- 会話が長くなったときにコンテキストを要約する: "ユーザー認証に関する以前の説明に基づいて、ブルート フォース攻撃を防ぐためにレート制限を追加します"
- リセットして、新しい機能に焦点を当てたコンテキストを提供する: 会話全体を繰り返すのではなく、重要な詳細を使って新たに始めます
- 完全な実装を繰り返す代わりに、前の作業への簡潔な参照を使用する
専門的なタスクを促す役割
ロールプロンプトには、特定の種類のエキスパートとして機能するように GitHub Copilot に指示する必要があります。これにより、特殊なドメインに対して生成されるコードの品質と関連性が大幅に向上します。 このアプローチは、最初の試みでよりターゲットを絞ったソリューションを得ることで、開発を加速するのに役立ちます。
セキュリティエキスパートの役割
セキュリティ クリティカルな機能に取り組む場合は、セキュリティの専門家のように考えるよう Copilot に促します。
「サイバーセキュリティの専門家として行動する。 一般的な脆弱性をチェックし、OWASP ガイドラインに従うパスワード検証関数を作成します。
この方法では、通常、次を含むコードが生成されます。
- 入力データの整形
- 一般的な攻撃に対する保護
- 業界標準の検証パターン
- セキュリティのベスト プラクティス
パフォーマンス最適化ロール
パフォーマンスクリティカルなコードの場合は、パフォーマンスエキスパートロールを使用します。
"パフォーマンス最適化の専門家として行動します。 この並べ替えアルゴリズムをリファクタリングして、大規模なデータセットを効率的に処理します。
多くの場合、次の結果が得られます。
- 最適化されたアルゴリズムとデータ構造
- メモリ効率の高い実装
- スケーラビリティに関する考慮事項
- パフォーマンス監視に関する推奨事項
テストスペシャリストの役割
包括的なテスト スイートを作成する場合は、テストの専門家の視点を活用します。
「試験スペシャリストとして行動する。 エッジ ケースやエラー シナリオなど、この支払処理モジュールの包括的な単体テストを作成します。"
通常、次の結果が生成されます。
- 徹底したテスト網羅性
- エッジ ケースの処理
- モック実装
- エラー条件テスト
ロールプロンプトを使用すると、初期実装にドメインの専門知識を組み込み、複数のリビジョン サイクルの必要性を減らすことで、運用環境に対応したコードを迅速に取得できます。
Copilot がプロンプトを使用して学習する方法を理解したので、Copilot が実際にプロンプトを使用してコードを提案する方法を詳しく見てみましょう。