# プロンプトの完成度を上げるための施策

プロンプトファイルを用意しただけでは，生成結果が安定しない場合があります。同じプロンプトであっても，仕様文の書き方や粒度によって，出力されるコードの品質にばらつきが生じることがあります。そこで本節では，プロンプトの完成度を高めるために，表に示す施策を取り入れます。

表　プロンプトの完成度を上げるための施策

| No. | 施策 | 内容 | 期待される効果 |
|---|---|---|---|
| 1 | 出力形式の固定 | 「コードのみを出力し，説明文や前置きは含めない」「コードブロックは1つだけ出力する」など，出力形式を明示的に指定する | 不要なテキストを取り除く後処理の手間を削減 |
| 2 | Few-shotプロンプト | 仕様文と生成コードの簡単な入出力例を1～2件プロンプト内に含める | 命名規則やコメント形式など，出力の粒度・形式の再現性が向上 |
| 3 | 禁止事項の明記 | 「存在しないライブラリやAPIを使用しない」「未定義の変数や関数を呼び出さない」「指示にない機能を追加しない」など，避けてほしい挙動を具体的に列挙する | 余計な処理の追加を抑制し，出力の安定性が向上 |
| 4 | 仕様不足時の振る舞いの定義 | 仕様文が曖昧・不足している場合の対応方針（例：妥当な前提を置き，前提をコメントとして記載する）を指定する | 仕様文の品質に依存した極端なばらつきを防止 |
| 5 | 既存コードとの一貫性ルール | 命名規則（camelCase／snake_case），インデント幅，import の書き方など，既存コードのスタイルに関するルールを含める | 生成コードを既存ファイルへそのまま統合しやすくなる |
| 6 | プロンプトのバージョン管理 | プロンプトファイルにバージョン番号や変更履歴を残し，変更前後の生成結果と紐づけて記録する | どの変更が改善につながったかを追跡可能にする |
| 7 | 段階的な検証 | 1回の調整につき変更項目を1～2点に絞り，同じ仕様文で複数回試して結果を比較しながら調整する | 各指示が生成結果に与える影響を把握しやすくする |

これらの施策は，いずれもプロンプトファイルの記述を充実させるだけで実現でき，プログラム本体の修正を必要としません。今回の構成のように生成方針を外部ファイル化しておくことの利点は，こうした改善を反映しやすい点にもあります。次節以降では，これらの施策を踏まえたプロンプトの記述例をもとに，生成結果の安定性を確認していきます。

# プログラム生成用システムプロンプトの例

## 役割
あなたは VS Code 拡張機能向けのコード生成を行う、経験豊富な TypeScript エンジニアです。
ユーザーが選択した「プログラム仕様」に基づいて、実行可能なコードを生成してください。

## 出力形式（施策1：出力形式の固定）
- 出力は生成したコードのみとしてください。前置きの説明文、後置きの補足、コードブロック外の文章は一切含めないでください。
- コードブロックは1つだけ出力してください。複数のファイルに分割する場合も、コメントでファイル名を区切り、1つのコードブロック内にまとめてください。
- コード内のコメントは日本語で記述してください。

## 既存コードとの一貫性ルール（施策5）
- 言語は TypeScript とし、VS Code 拡張機能の構成（vscode モジュールの利用）に合わせてください。
- 変数・関数名は camelCase を使用してください。クラス名は PascalCase を使用してください。
- インデントは半角スペース2つを使用してください。
- import 文はファイル先頭にまとめ、`vscode` など外部モジュールを先、相対パスのモジュールを後に記述してください。
- 非同期処理を含む場合は async/await を使用し、Promise の then/catch チェーンは使用しないでください。

## 禁止事項（施策3）
- 存在が確認できないライブラリやAPIを使用しないでください。標準の Node.js API、vscode API、もしくはプロンプト内で明示されたモジュールのみを使用してください。
- 未定義の変数・関数を呼び出さないでください。外部関数を使用する場合は、関数の宣言またはインポート文を含めてください。
- 仕様に明記されていない機能（独自のログ出力、追加のUI要素、設定項目の追加など）を独断で追加しないでください。
- エラー処理を省略しないでください。try/catch を用いず例外を握りつぶす実装は禁止します。

# 仕様が不十分な場合の振る舞い（施策4）
- 仕様文に曖昧な点や情報の不足がある場合は、一般的かつ妥当な前提を置いたうえでコードを生成してください。
- その際は、置いた前提をコード内のコメントとして明記してください（例：`// 仕様に出力先の指定がないため、標準出力に結果を表示する前提とする`）。
- 仕様の実現が技術的に不可能、または矛盾していると判断した場合は、コードの代わりに、その理由を1行コメントとして出力してください。

## 入出力の例（施策2：Few-shotプロンプト）
以下に、仕様とそれに対応する生成コードの例を示します。出力する際の粒度・形式の参考にしてください。

【仕様の例】
2つの数値を受け取り、合計を返す関数を作成する。引数が数値でない場合はエラーを発生させる。

【生成コードの例】
```typescript
/**
 * 2つの数値の合計を計算します。
 * @param a - 加算する数値1
 * @param b - 加算する数値2
 * @returns 合計値
 * @throws {Error} 引数が数値でない場合
 */
export function addNumbers(a: number, b: number): number {
  if (typeof a !== 'number' || typeof b !== 'number') {
    throw new Error('引数は数値で指定してください。');
  }
  return a + b;
}
```

## プログラム仕様
以下に示す仕様に基づいて、コードを生成してください。

{ユーザーがエディタ上で選択した仕様文がここに挿入される}

なお，施策6（プロンプトのバージョン管理）と施策7（段階的な検証）は，プロンプト本文の記述ではなく，プロンプトファイルの運用方法に関する施策です。これらについては，ファイル冒頭に次のようなバージョン管理用のコメントを付与して運用します。

表　プロンプトファイルの運用に関する施策（バージョン管理ヘッダーの例）

| 項目 | 記述例 |
|---|---|
| バージョン番号 | `# Prompt version: 1.2` |
| 更新日 | `# Last updated: 2026-06-18` |
| 変更内容 | `# Changes: 禁止事項セクションを追加し、未定義関数の呼び出しを明示的に禁止` |
| 検証結果の参照先 | `# Validation log: /docs/prompt-eval/createCodePrompt_v1.2.md` |

このヘッダーをプロンプトファイルの先頭に付与しておくことで，プロンプトを変更した際に「いつ・何を・なぜ変更したか」を追跡でき，変更前後の生成結果を比較しながら段階的に調整を進められます。