生成AIで効果的にプログラムを作成するためのプロンプト
Microsft Coplit、Google Gemini、OpenAI ChatGPTに聞いた内容を取りまとめました。
生成AIでプログラムを生成するにあたって、プロンプトは非常に重要なものです。
このプロンプトが曖昧であれば、
当然、生成AIは誤ったプログラムを生成します。
(生成AIは、あいまいな部分を推測/補完してコードを書きます)
そういった状況を避けるためには、なるべくそういったAI判断が入る状況を生み出しにくいプロンプトのテンプレートを作成しました。
プロンプトについて
下記「プログラム生成テンプレート」の特徴と目標は以下の通り
- 曖昧さを排除
- AIに判断させない
- 人間が決めた仕様だけを実装させる
- 入出力例で誤解をゼロにする
- 完成条件でゴールを固定する
- 役割定義で出力の質を安定させる
プロンプトをまとめていて気になったのが、Geminiの冒頭部分。
「あなたは"経験豊富な◯◯エンジニア"です。
以下の仕様に従って、正確で保守性の高いコードを作成してください。」確認してみると、AIの「役割定義」をしているみたいです。
出力結果に対してどの程度の影響が出るのか気になるところ。
役割定義あなたは世界トップクラスの[言語名: Python/JavaScriptなど]エンジニアです。可読性が高く、保守性に優れ、エラー処理が堅牢なコードを書くことを専門としています。
プログラム生成プロンプト
【役割定義】
あなたは"経験豊富な◯◯エンジニア"です。以下の仕様に従って、正確で保守性の高いコードを作成してください。
【目的】
最重要項目です。
このプログラムの目的は、"何を実現するのか/何を解決するのか"を1~3行程度で書く
例:ユーザーIDを受け取り、そのユーザーのタスク一覧を返すAPIを作る。
- このプログラムは"どんな状況"で使われる
- 想定利用者は"誰"
- データの性質は"どんなものか"
【実行環境】
- 言語:
- バージョン:
- フレームワーク:
- OS:
- 使用可能な外部ライブラリ:
- 実行方法:
- ファイル構成:
【入力仕様】
- 入力形式:
- 型情報:
- 入力例:
【出力仕様】
- 出力形式:
- 型情報:
- 出力例:
【処理内容】
- 【最初に何をする】
- 【次に何をする】
- 【最後に何をする】
【制約・禁止事項】
- 使用してはいけないもの:
- やらなくてよいこと:
- any禁止/クラス禁止/1ファイルにまとめるなど
- パフォーマンス要件:
【コード構造】
- 関数構成:
- ファイル構成:
- 依存関係の扱い:
【エラーハンドリング】
- 入力が不正な場合の挙動:
- エラー時のログor例外:
【テスト】
- 想定テストケース:
- エラーケース:
- 境界値:
【完成条件】
以下を満たせば完成とする:
- 【条件1】
- 【条件2】
- 【条件3】
【出力形式】
- コードのみ出力
- 説明は簡潔に
- コメントは必要最低限
【追加】
- 改善案を最後に提示すること
- よくあるバグを防ぐための注意点も書くこと
- 不明点があればコードを書く前に質問すること
プロンプトの記載サンプル
仮テーマはわかりやすくするため、題材を以下のように設定
「ユーザーIDを受け取り、そのユーザーのタスク一覧を返すAPIをNuxt3のserver/apiで作る」
【役割設定】
あなたは経験豊富なNuxt.js/TypeScriptエンジニアです。
以下の仕様に従って、正確で保守性の高いコードを作成してください。
🔍解説:NuxtとTypeScriptに強い人格を指定することで、AIの出力が安定する。
【目的】
ユーザーIDを受け取り、そのユーザーに紐づくタスク一覧を返すNuxt3のserver/api用APIエンドポイントを作成する。
🔍解説:Nuxtのserver/apiで作ることを明確にするのがポイント。
【背景・前提】
- 小規模なタスク管理アプリのバックエンドとして使用する。
- DBはまだ導入していないため、仮データで動作させる。
- 今後PrismaやSupabaseに置き換える予定。
🔍解説:背景を書くと、AIが「仮データでOK」などの判断を誤らなくなる。
【実行環境】
- 言語:TypeScript
- Nuxtバージョン:3.12
- ランタイム:Node.js20
- server/apiを使用
- 外部ライブラリ:なし(標準のNitroAPIのみ)
🔍解説:Nuxtのバージョンを指定すると、古い書き方を避けられる。
【入力仕様】
- HTTPメソッド:GET
- クエリパラメータ:userId(number)
- 入力例:/api/tasks?userId=123
🔍解説:Nuxtのserver/apiはquery/bodyの扱いが曖昧になりやすいので、例を書くと精度が上がる。
【出力仕様】
JSONを返す
型情報:{userId:number,tasks:{id:number;title:string;done:boolean}[]}
出力例:
{"userId":123,"tasks":[{"id":1,"title":"買い物","done":false},{"id":2,"title":"メール返信","done":true}]}
🔍解説:TypeScriptの型を明示すると、AIが型安全なコードを書く。
【処理内容】
- クエリからuserIdを取得する
- userIdが存在しない場合は400を返す
- 仮データから該当ユーザーのタスクを抽出する
- JSON形式で返す
🔍解説:AIにアルゴリズムを文章で渡すと、誤解が激減する。
【制約・禁止事項】
- anyを使用しない
- PrismaやDB接続は行わない
- 1ファイルで完結させる
- defineEventHandlerを使用する
- エラーハンドリングを必ず入れる
🔍解説:Nuxtのserver/apiは書き方が複数あるため、制約を明確にすると安定する。
【コード構造】
- 1ファイル構成
- 型定義→仮データ→メイン処理の順で記述
- returnはJSONのみ
🔍解説:あなたの「構造美」へのこだわりに合わせた指定。
【エラーハンドリング】
- userIdが未指定の場合:400を返す
- userIdが数値でない場合:400を返す
🔍解説:NuxtのAPIはエラーを返す方法が複数あるため、方針を固定する。
【テスト】
- userId=123のとき、タスクが2件返る
- userIdが空のとき、400が返る
- userIdが文字列のとき、400が返る
【完成条件】
- サンプル入力で正しく動作する
- 出力が例と一致する
- 型エラーが発生しない
【出力形式】
- コードのみ出力
- 説明は不要
- コメントは必要最低限
【追加】
- 改善案を最後に提示すること
- 不明点があればコードを書く前に質問すること

0 件のコメント:
コメントを投稿