生成AIでプログラミング②

生成AIで効果的にプログラムを作成するためのプロンプト

生成AIが望むものは生成AI自身に聞いてみる!
Microsft Coplit、Google Gemini、OpenAI ChatGPTに聞いた内容を取りまとめました。

生成AIでプログラムを生成するにあたって、プロンプトは非常に重要なものです。
このプロンプトが曖昧であれば、
当然、生成AIは誤ったプログラムを生成します。
(生成AIは、あいまいな部分を推測/補完してコードを書きます)
そういった状況を避けるためには、なるべくそういったAI判断が入る状況を生み出しにくいプロンプトのテンプレートを作成しました。

プロンプトについて

下記「プログラム生成テンプレート」の特徴と目標は以下の通り
  • 曖昧さを排除
  • AIに判断させない
  • 人間が決めた仕様だけを実装させる
  • 入出力例で誤解をゼロにする
  • 完成条件でゴールを固定する
  • 役割定義で出力の質を安定させる

プロンプトをまとめていて気になったのが、Geminiの冒頭部分。
「あなたは"経験豊富な◯◯エンジニア"です。
以下の仕様に従って、正確で保守性の高いコードを作成してください。」

確認してみると、AIの「役割定義」をしているみたいです。
出力結果に対してどの程度の影響が出るのか気になるところ。
役割定義
あなたは世界トップクラスの[言語名: Python/JavaScriptなど]エンジニアです。
可読性が高く、保守性に優れ、エラー処理が堅牢なコードを書くことを専門としています。

 

プログラム生成プロンプト

【役割定義】
あなたは"経験豊富な◯◯エンジニア"です。
以下の仕様に従って、正確で保守性の高いコードを作成してください。

【目的】
最重要項目です。
このプログラムの目的は、"何を実現するのか/何を解決するのか"を1~3行程度で書く
例:ユーザーIDを受け取り、そのユーザーのタスク一覧を返すAPIを作る。

【背景・前提】
  • このプログラムは"どんな状況"で使われる
  • 想定利用者は"誰"
  • データの性質は"どんなものか"

【実行環境】
  • 言語:
  • バージョン:
  • フレームワーク:
  • OS:
  • 使用可能な外部ライブラリ: 
  • 実行方法:
  • ファイル構成:

【入力仕様】
  • 入力形式:
  • 型情報:
  • 入力例:

【出力仕様】
  • 出力形式:
  • 型情報:
  • 出力例:

【処理内容】
  1. 【最初に何をする】
  2. 【次に何をする】
  3. 【最後に何をする】

【制約・禁止事項】
  • 使用してはいけないもの:
  • やらなくてよいこと:
  • 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が型安全なコードを書く。

【処理内容】
  1. クエリからuserIdを取得する
  2. userIdが存在しない場合は400を返す
  3. 仮データから該当ユーザーのタスクを抽出する
  4. 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 件のコメント:

コメントを投稿