🚀 VS Codeでで入手しましょう!

Copilot Chatのためのプロンプトエンジニアリング

この記事では、Visual Studio CodeのCopilot Chatからより適切で関連性の高い応答を得るためのプロンプトの書き方のヒントについて説明します。プロンプトエンジニアリングまたはプロンプト作成は、AIについて議論する際によく耳にするフレーズであり、AI APIエンドポイントに送信する情報とそのパッケージ方法を指します。

VS CodeまたはGitHub Copilotを初めて使用する場合は、最初にGitHub Copilotの概要記事を確認するか、はじめにチュートリアルに直接進むことをお勧めします。

インライン提案とチャットのためにCopilotエクスペリエンスを最適化するためのさまざまなオプションがあります

Copilotのインライン提案を最大限に活用する

GitHub Copilot拡張機能は、より効率的にコーディングできるように、提案を自動的に提示します。Copilotに可能な限り最良の提案をしてもらうために役立つ(「プロンプト」)ことがあります。そして、良い知らせは、これらはあなたと同僚があなたのコードを理解するのに役立つため、あなたはすでに今これらを行っている可能性が高いということです。

Copilotにコンテキストを提供する

Copilotは、あなたが何をしているのか、そしてあなたが何について助けを求めているのかを知るための十分なコンテキストがある場合に最適に機能します。特定のプログラミングタスクについて同僚に助けを求めるときにコンテキストを提供するのと同じように、Copilotでも同じことができます。

ファイルを開く

コード補完のために、Copilotはエディター内の現在のファイルと開いているファイルを見て、コンテキストを分析し、適切な提案を作成します。Copilotを使用している間に関連ファイルをVS Codeで開いておくと、このコンテキストを設定するのに役立ち、Copilotがプロジェクトのより大きな全体像を見ることができます。

トップレベルコメント

同僚に簡単な概要レベルの紹介をするのと同じように、作業中のファイルのトップレベルコメントは、Copilotが作成している部分の全体的なコンテキストを理解するのに役立ちます。

適切なインクルードと参照

作業に必要なインクルードまたはモジュール参照を手動で設定するのが最善です。Copilotは提案を行うことができますが、含める必要がある依存関係を最もよく知っているのはあなたでしょう。これは、提案を作成するときに使用したいフレームワーク、ライブラリ、およびそれらのバージョンをCopilotに知らせるのにも役立ちます。

次のTypeScriptの例では、addメソッドの出力をログに記録したいと考えています。インクルードがない場合、Copilotはconsole.logを使用することを提案します

Copilot inline suggestion proposes Console.log when no imports in the file.

一方、Log4jsへの参照を追加すると、Copilotは出力のログ記録にそのフレームワークを使用することを提案します

Copilot inline suggestion proposes logging using the imported logging framework.

意味のある関数名

fetchData()という名前のメソッドは、同僚(または数か月後のあなた)にはあまり意味がないのと同じように、fetchData()もCopilotの役には立ちません。意味のある関数名を使用すると、Copilotが目的の処理を行う本文を提供しやすくなります。

具体的で適切にスコープされた関数コメント

関数名は、長すぎることなく記述できる程度にしか記述できません。関数コメントは、Copilotが知る必要のある詳細を埋めるのに役立ちます。

サンプルコードでCopilotを準備する

Copilotを正しい方向に導くための1つのコツは、探しているものに近いサンプルコードをコピーして、開いているエディターに貼り付けることです。小さな例を提供することで、Copilotが達成したい言語とタスクに一致する提案を生成するのに役立ちます。Copilotが必要とするコードを提供し始め、実際に使用するようになったら、サンプルコードをファイルから削除できます。これは、Copilotが古いコード提案をデフォルトで提供する場合に、より新しいライブラリバージョンにCopilotをジャンプスタートさせるのに特に役立ちます。

一貫性を保ち、品質基準を高く保つ

Copilotは、既存のパターンに従う提案を生成するためにあなたのコードに食いつくので、「ごみを入れると、ごみが出る」という格言が当てはまります。

常に高い品質基準を維持するには、規律が必要になる場合があります。特に、何かを動作させるために高速かつ大雑把にコーディングしている場合、「ハッキング」モード中はCopilotの補完を無効にしたい場合があります。CopilotステータスメニュードロップダウンをCopilotステータスバー項目を選択して表示することで、補完を一時的に無効にできます。

Hover over the Copilot Status bar item displays "Show Copilot status menu"

ドロップダウンから、補完を完全に無効にするか、アクティブなファイルタイプ(たとえば、Markdownファイル)のみを無効にすることができます。

Copilot Status menu dropdown with Disable Completions selected

Copilot Chatを最大限に活用する

チャットインターフェースを介してCopilotからアシスタンスを得ることもできます。GitHub Copilot Chat拡張機能をインストールすることで可能です。

チャットを使用してGitHub Copilotと対話する場合、エクスペリエンスを最適化するためにできることがいくつかあります。

チャット参加者とスラッシュコマンドを使用する

チャット参加者は、コードベースまたは特定のドメインやテクノロジーに関する追加のコンテキストを収集するように設計されています。適切な参加者を使用することで、Copilot Chatはより良い情報を見つけてCopilotバックエンドに送信できます。たとえば、開いているプロジェクトに関する質問をしたい場合は@workspaceを使用し、VS Codeの機能とAPIについて詳しく知りたい場合は@vscodeを使用します。

Asking the @vscode participant how to change the VS Code colors

スラッシュコマンドは、質問をするときにCopilot Chatがあなたの意図を理解するのに役立ちます。コードベースについて学習しているのか(/explain)、問題を修正する手伝いが欲しいのか(/fix)、それともテストケースを作成しているのか(/tests)? Copilot Chatにあなたが何をしようとしているかを知らせることで、タスクに合わせて応答を調整し、役立つコマンド、設定、およびコードスニペットを提供できます。

Inline Chat slash command list

プロジェクトのスコープまたは現在のタスクを自然言語クエリで記述することもできますが、チャット参加者とスラッシュコマンドを使用する方が簡潔で明確です。

Copilot Chatのチャット参加者スラッシュコマンドの詳細をご覧ください。

コンテキストにチャット変数を使用する

@workspace@vscodeなどのチャット参加者は、ドメイン固有のコンテキストを提供するチャット変数を貢献できます。チャットプロンプトで#記号を使用してチャット変数を参照できます。チャット変数を使用することで、チャットプロンプトに含めるコンテキストをより具体的にすることができます。

たとえば、#file変数は、ワークスペースから特定のファイルをチャットプロンプトで参照できます。これにより、作業中のファイルに関するコンテキストを提供することで、Copilot Chatからの回答がコードにより関連性の高いものになります。「#file:package.jsonの改善点を提案してもらえますか?」や「#file:devcontainer.jsonに拡張機能を追加するにはどうすればよいですか?」などの質問をすることができます。#file変数を使用することで、Copilotからより的を絞った正確な応答を得ることができます。

チャットビューのコンテキストをアタッチボタンを使用して、チャットメッセージにコンテキストを追加することもできます。次に、クイックピックから、現在の選択範囲、ワークスペースから1つまたは複数のファイル、またはソースコードから1つまたは複数のシンボルなど、特定のタイプのコンテキストを選択できます。

Screenshot of VS Code Copilot Chat view, showing the Attach context button and context Quick Pick.

Copilot Chatでコンテキスト変数を使用するの詳細をご覧ください。

具体的に、そしてシンプルに

Copilotに何かを依頼するときは、依頼内容を具体的にし、大きなタスクを別々の小さなタスクに分割します。たとえば、TypeScriptとPugを使用し、MongoDBデータベースからデータを取得する製品ページを持つExpressアプリを作成するようにCopilotに依頼しないでください。代わりに、最初にTypeScriptとPugでExpressアプリを作成するようにCopilotに依頼します。次に、製品ページを追加するように依頼し、最後にデータベースから顧客データを取得するように依頼します。

Copilotに特定のタスクを実行するように依頼する場合は、使用したい入力、出力、API、またはフレームワークについて具体的に説明してください。プロンプトが具体的であるほど、結果は良くなります。たとえば、「データベースから製品データを読み取る」ではなく、「カテゴリ別にすべての製品を読み取り、データをJSON形式で返し、Mongooseライブラリを使用する」を使用します。

ソリューションを反復処理する

Copilot Chatに助けを求めるとき、最初に応答にとらわれることはありません。ソリューションを改善するために、Copilotを反復処理してプロンプトすることができます。Copilotは、生成されたコードのコンテキストと現在の会話の両方を持っています。

以下は、インラインチャットを使用してフィボナッチ数を計算する関数を作成する例です

First response from Copilot for a function to calculate Fibonacci numbers

再帰を使用しないソリューションを好むかもしれません

Ask Copilot to not use recursion and new result

コーディング規約に従うか、変数名を改善するようにCopilotに依頼することもできます

Ask Copilot to use better variable names and new result

結果を既に受け入れている場合でも、後でいつでもCopilotにコードを反復処理するように依頼できます。

Copilotのプロンプトに関するその他のリソース

GitHub Copilotを生産的に使用する方法について詳しく知りたい場合は、次のビデオとブログ投稿をフォローアップできます