
もう迷わない!AIエディタへの「伝わる」プロンプト作成術【基本原則と実践テク】
こんばんは!IT業界で働くアライグマです!
AIエディタ、例えばGitHub CopilotやCursorといったツールは、私たちの開発スタイルに革命をもたらしつつあります。まるで隣に熟練のペアプログラマーがいるかのように、コードの提案、補完、さらには生成まで行ってくれるこれらのツールは、うまく活用すれば開発効率を飛躍的に向上させることができます。しかし、その能力を最大限に引き出すためには、実は「AIへの指示の出し方=プロンプト」が非常に重要になってくるのです。
「とりあえずコメントを書けば何か提案してくれるけど、期待通りじゃないことも多い」「もっとピンポイントで欲しいコードを生成してほしいけど、どう頼めばいいの?」――そんな悩みを抱えている開発者の方も少なくないのではないでしょうか。AIは非常に賢いですが、私たちの心を読んでくれるわけではありません。私たちが何を求めているのかを的確に伝えるプロンプトがあってこそ、AIはその真価を発揮します。
本記事では、AIエディタへのプロンプトはどんな書き方が最適なのか、その基本原則から具体的なテクニック、さらにはNG例まで、私の開発経験も踏まえながら徹底解説していきます。この記事を読めば、明日からのAIとの付き合い方がきっと変わるはずです。
なぜAIエディタへのプロンプトが重要なのか?
まず、なぜプロンプトの書き方がそんなに重要なのでしょうか。それはAIの特性と深く関わっています。
AIは「指示待ち」の賢いアシスタント
現在のAIコード生成ツールは、自ら能動的に「こんな機能が必要ではないですか?」と提案してくるわけではありません。基本的には、私たちが書いたコードの文脈や、与えられた指示(プロンプト)に基づいて動作する「指示待ち」の非常に賢いアシスタントです。そのため、指示が曖昧だったり情報が不足していたりすると、AIも何をすべきか迷ってしまい、期待外れのアウトプットしか返せなくなってしまいます。
プロンプトの質がアウトプットの質を左右する
料理に例えるなら、最高の食材(AIの能力)があっても、レシピ(プロンプト)が悪ければ美味しい料理は作れません。プロンプトが具体的で明確であればあるほど、AIは私たちの意図を正確に理解し、質の高いコードや提案を返してくれます。
「ゴミを入力すればゴミが出力される(Garbage In, Garbage Out)」の原則
これはコンピュータサイエンスの古い格言ですが、AIとの対話においても同様です。不適切または質の低いプロンプトを与えれば、AIも質の低い、あるいは役に立たないコードしか生成できません。AIの能力を最大限に引き出すには、まず私たち自身が良いプロンプトを与える努力をする必要があるのです。
良いプロンプトの基本原則「C.R.I.S.P.」
では、良いプロンプトとは具体的にどのようなものでしょうか。ここでは、覚えておくと便利な5つの基本原則を「C.R.I.S.P.」という頭文字でご紹介します。(※これは私が便宜上まとめたものであり、一般的なフレームワークではありません)
- C – Context (文脈を明確に): AIに現在の状況や背景情報を伝えましょう。どのようなプロジェクトで、どのような目的のコードを書いているのか、既存のコード構造はどうなっているかなど、文脈が明確であるほどAIは的確な判断ができます。
- R – Role (役割を与える): AIに特定の役割やペルソナを演じさせることで、より専門的な回答を引き出せる場合があります。例えば、「あなたはセキュリティ専門家です。以下のコードの潜在的な脆弱性を指摘してください」といった具合です。
- I – Instruction (指示を具体的に): 何をしてほしいのか、どのような出力形式を期待しているのかを具体的に指示します。「いい感じに」や「よしなに」では伝わりません。
- S – Specificity (詳細を記述する): 必要な機能、使用する変数名、期待するアルゴリズム、エラーハンドリングの方法など、詳細な情報を盛り込むほど、期待に近いコードが得られます。
- P – Polite & Precise (丁寧かつ正確に): AIは感情を持ちませんが、明確で誤解のない言葉遣いを心がけることは、結果として意図通りの出力を得るために重要です。また、質問形式にするなど、対話を意識することも有効です。
効果絶大!AIエディタへのプロンプト実践テクニック
上記の基本原則を踏まえ、さらに効果的なプロンプトを書くための具体的なテクニックを見ていきましょう。
具体的な指示をする (曖昧な「いい感じに」はNG)
最も重要なのは、何を、どのようにしてほしいのかを具体的に伝えることです。
- 期待する機能: 「ユーザーがログインできる機能」ではなく、「メールアドレスとパスワードを使ってユーザー認証を行い、成功したらJWTを返すAPIを作成して」のように具体的に。
- 入力と出力: 関数であれば、引数の型や意味、返り値の型や構造を明示します。
- エラー処理: どのようなエラーケースを考慮し、それぞれどのように処理してほしいかを伝えます。
段階的に指示を出す (複雑な処理は分割して依頼)
一度に多くの複雑な処理を依頼すると、AIも混乱しやすくなります。大きなタスクは小さなステップに分割し、段階的にAIに指示を出す方が、結果的に質の高いコードを得られることが多いです。
コードコメントを活用する (特にGitHub Copilotなど)
GitHub Copilotのようなツールは、コード内のコメントを非常に重要なコンテキストとして認識します。
- 関数やクラスの目的:
// この関数は、ユーザーIDを受け取り、ユーザー情報をデータベースから取得します。
- 引数と返り値の説明:
// @param {number} userId - ユーザーID
// @returns {Object|null} - ユーザーオブジェクト、または見つからない場合はnull
- 処理のステップ: 複雑な処理の前に、これから何をするのかをコメントで記述する。
これらのコメントを記述することで、AIは次に書かれるべきコードをより正確に予測できます。
既存のコード片や構造を提示する (一貫性を保つため)
新しい関数やクラスを作成する際に、プロジェクト内の既存の類似したコード片や、期待するコーディングスタイルを示すことで、AIはそれに倣った一貫性のあるコードを生成しやすくなります。
制約条件を伝える (使用するライブラリ、バージョン、コーディング規約など)
「この機能は〇〇ライブラリのバージョンX.Yを使って実装してほしい」「社内のコーディング規約(例:キャメルケース、インデントはスペース4つ)に従ってほしい」といった制約条件を明確に伝えることで、手戻りを減らすことができます。
否定形よりも肯定形で指示する
「〇〇しないで」という否定形の指示よりも、「〇〇して」という肯定形の指示の方が、AIは理解しやすい傾向があります。
「なぜ」そのコードが必要なのか背景を伝える (より適切な提案を引き出す)
単に「この処理を書いて」と指示するだけでなく、「〇〇という問題を解決するために、この処理が必要だ」というように、コードの目的や背景を伝えることで、AIはより文脈に即した、時にはより優れた代替案を提案してくれることもあります。
例:PHP/Laravelでのプロンプト例
私が普段PHP/Laravelで開発する際に使えそうなプロンプト例です。
- 良いコメントの例:
<?php
namespace App\Http\Controllers;
use App\Models\Order;
use Illuminate\Http\Request;
class OrderController extends Controller
{
/**
* 注文を作成するAPIエンドポイント
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*
* リクエストボディには以下の情報を含むこと:
* - customer_id (integer, 必須)
* - items (array, 必須): 各要素は { product_id: integer, quantity: integer } の形式
* - total_amount (integer, 必須)
*
* 成功時: 作成された注文情報をJSONで返す (ステータスコード201)
* 失敗時: バリデーションエラーなどをJSONで返す (ステータスコード400または500)
*/
public function store(Request $request)
{
// ここからCopilotに書いてもらうイメージ
}
}
- 具体的な指示の例 (エディタ内で対話的に): 「Laravelで、
Product
モデルにprice
というdecimal
型のカラムを追加するマイグレーションファイルを作成してください。price
は小数点以下2桁まで許可し、デフォルト値は0.00とします。」
例:JavaScript/Vue3でのプロンプト例
Vue3 (Composition API) でのプロンプト例です。
- 良いコメントの例 (スクリプトセットアップ内):
<script setup lang="ts">
import { ref, computed } from 'vue';
// Props: 商品の配列。各商品はname(string)とprice(number)を持つ
// const props = defineProps<{
// products: Array<{ name: string, price: number }>
// }>();
// emit: 商品が選択されたときに 'product-selected' イベントを発行し、選択された商品オブジェクトを渡す
// data: 選択された商品のIDを保持する (初期値はnull)
// const selectedProductId = ref<number | null>(null);
// computed: 税込み価格を計算する (税率は10%とする)
// function calculatePriceWithTax(price: number): number {
// // ここをAIに書かせる
// }
// methods: 商品を選択したときの処理
// function selectProduct(product: { name: string, price: number, id: number }) {
// // ここをAIに書かせる
// }
</script>
- 具体的な指示の例 (エディタ内で対話的に): 「Vue3 Composition APIで、
useTimer
というComposable関数を作成してください。この関数は、開始、停止、リセット機能を持つタイマーを実装し、現在の経過時間をリアクティブに返すようにしてください。」
これはNG!避けるべきプロンプトの書き方
逆に、以下のようなプロンプトはAIを混乱させ、期待する結果を得られない可能性が高いです。
- 曖昧すぎる指示: 「ユーザー管理機能を作って」「このバグを直して」 (何のバグ?どう直す?)
- 情報不足: 「この関数をもっと効率的にして」 (何の関数?現在の実装は?何を基準に効率的とする?)
- 矛盾した指示: 「シンプルで高機能なログインフォームを作って」 (シンプルさと高機能さは時としてトレードオフ)
- 非現実的な要求: 「明日までに全自動でこのECサイトを完成させて」
プロンプトエンジニアリング上達のコツ
最後に、AIエディタへのプロンプトスキルを向上させるためのヒントをいくつかご紹介します。
- とにかく試行錯誤する (トライ&エラーが基本): 色々な書き方を試し、AIの反応を見ながら調整していくのが一番の近道です。
- 他の人のプロンプトを参考にする: オンラインコミュニティや技術ブログで共有されている他の開発者のプロンプト例は非常に参考になります。
- AIの得意・不得意を理解する: AIは万能ではありません。得意な処理(定型的なコード生成、アルゴリズムの実装など)と、不得意な処理(高度な設計、複雑なビジネスロジックの完全な理解など)を把握することで、より効果的にAIを活用できます。
- フィードバックを活用する (反復的な改善): AIの提案が期待通りでなかった場合、何が問題だったのかを考え、プロンプトを修正して再度依頼してみましょう。この反復的なプロセスがスキル向上に繋がります。
- 小さな成功体験を積み重ねる: 最初から完璧なプロンプトを書こうとせず、まずは簡単なコード生成から試し、徐々に複雑な指示に挑戦していくと良いでしょう。
まとめ
AIエディタへのプロンプトは、もはや現代のエンジニアにとって、コードを書くスキルそのものと同じくらい重要なスキルセットの一つになりつつあります。明確で、具体的で、文脈を理解したプロンプトを書くことで、AIはあなたの開発作業を劇的に効率化し、より創造的な業務に集中する時間を与えてくれる強力なパートナーとなり得ます。
私がPjMとしてプロジェクトを推進する上でも、開発チーム全体の生産性向上は常に大きなテーマです。AIエディタと、それを使いこなすためのプロンプトエンジニアリングのスキルは、今後のチームの競争力を左右する要素の一つになると感じています。
本記事で紹介した基本原則やテクニックが、皆さんの日々の開発業務において、AIとのより良い協調関係を築くための一助となれば幸いです。ぜひ、今日から少し意識してプロンプトを工夫してみてください。きっと、AIエディタの新たな可能性が見えてくるはずです。