Agentive
AIエージェント活用

AIエージェント向けプロンプトエンジニアリング — システムプロンプト設計の極意

約7分で読めます

AIエージェントのシステムプロンプトは、エージェントの「人格」と「行動規範」を定義する最も重要な設計要素である。Role-Task-Formatパターン、Chain-of-Thought、Few-Shotの使い分けによって、エージェントの出力品質と安定性が大きく変わる。本記事では、プロダクション品質のシステムプロンプト設計を実践的に解説する。

Role-Task-Formatパターン

システムプロンプトの基本構造として最も効果的なのが、Role(役割)、Task(タスク)、Format(出力形式)を明確に分離するパターンである。

## Role(役割定義)
あなたはシニアソフトウェアエンジニアです。
- 10年以上のTypeScript開発経験があります
- セキュリティとパフォーマンスを最優先します
- コードレビューでは建設的なフィードバックを提供します

## Task(タスク定義)
ユーザーから提出されたコードをレビューしてください。
以下の観点で分析してください:
1. バグや潜在的な問題
2. セキュリティリスク
3. パフォーマンスの改善点
4. 可読性と保守性

## Format(出力形式)
以下のJSON形式で出力してください:
{
  "severity": "critical" | "warning" | "info",
  "category": "bug" | "security" | "performance" | "style",
  "line": <行番号>,
  "message": "<指摘内容>",
  "suggestion": "<改善案>"
}

役割定義のベストプラクティス

// 効果的な役割定義の要素
interface RoleDefinition {
  expertise: string[];       // 専門分野
  experience: string;        // 経験レベル
  priorities: string[];      // 優先事項
  constraints: string[];     // 制約条件
  personality: string;       // 応答スタイル
}

const codeReviewerRole: RoleDefinition = {
  expertise: ["TypeScript", "React", "Node.js", "セキュリティ"],
  experience: "シニアレベル(10年以上)",
  priorities: [
    "セキュリティ脆弱性の検出",
    "パフォーマンスボトルネックの特定",
    "コードの保守性向上",
  ],
  constraints: [
    "推測でコードを書かない",
    "既存のコーディング規約に従う",
    "変更は最小限にする",
  ],
  personality: "建設的で具体的なフィードバック",
};

Chain-of-Thoughtプロンプティング

複雑な推論が必要なタスクでは、思考プロセスを明示的にステップ分解するChain-of-Thought(CoT)が有効である。

以下の手順で段階的に分析してください:

### Step 1: 問題の理解
- ユーザーの要求を要約してください
- 暗黙の前提条件を特定してください
- 成功基準を明確にしてください

### Step 2: 選択肢の列挙
- 考えられるアプローチを3つ以上列挙してください
- 各アプローチのメリット・デメリットを分析してください

### Step 3: 最適解の選択
- Step 2の分析に基づいて最適なアプローチを選択してください
- 選択理由を明記してください

### Step 4: 実装
- 選択したアプローチを実装してください
- エッジケースも考慮してください

動的CoTの実装

function buildCoTPrompt(
  task: string,
  complexity: "low" | "medium" | "high"
): string {
  const steps: string[] = [];

  // 共通ステップ
  steps.push("1. 要求の理解と要約");

  if (complexity === "medium" || complexity === "high") {
    steps.push("2. 前提条件と制約の確認");
    steps.push("3. 複数のアプローチの検討");
  }

  if (complexity === "high") {
    steps.push("4. リスク分析と対策");
    steps.push("5. テストケースの設計");
  }

  steps.push(steps.length + 1 + ". 実装");

  return "以下の手順で段階的に取り組んでください:\n" +
    steps.map((s) => "- " + s).join("\n") +
    "\n\nタスク: " + task;
}

Few-Shotプロンプティング

具体的な入出力例を提示することで、AIの出力品質と一貫性を向上させる手法。

function buildFewShotPrompt(
  task: string,
  examples: Array<{ input: string; output: string }>
): string {
  let prompt = "以下の例を参考に、同じ形式で回答してください。\n\n";

  for (let i = 0; i < examples.length; i++) {
    prompt += "### 例" + (i + 1) + "\n";
    prompt += "入力: " + examples[i].input + "\n";
    prompt += "出力: " + examples[i].output + "\n\n";
  }

  prompt += "### 実際のタスク\n";
  prompt += "入力: " + task + "\n";
  prompt += "出力: ";

  return prompt;
}

// 使用例: コードレビューコメントの生成
const reviewExamples = [
  {
    input: "const data = JSON.parse(userInput)",
    output: JSON.stringify({
      severity: "critical",
      category: "security",
      message: "ユーザー入力の直接パースはJSON injection攻撃のリスク",
      suggestion: "バリデーションライブラリを使用してください",
    }),
  },
  {
    input: "if (arr.length == 0)",
    output: JSON.stringify({
      severity: "info",
      category: "style",
      message: "厳密等価演算子を使用してください",
      suggestion: "arr.length === 0 に変更",
    }),
  },
];

ネガティブプロンプティング

やってはいけないことを明示的に記述することで、よくある間違いを防止する。

## 禁止事項
以下の行動は絶対に行わないでください:

- 推測でコードを生成しない(不明な部分は質問する)
- 既存のテストを削除しない
- セキュリティに影響する変更を無断で行わない
- ライブラリのバージョンを勝手にアップグレードしない
- 環境変数やシークレットをログに出力しない
- 1つのコミットに無関係な変更を混ぜない

ガードレールプロンプトの実装

const guardRailPrompt = {
  forbidden_actions: [
    "ファイルを削除する(明示的な指示がない限り)",
    "外部APIにデータを送信する",
    "認証情報をログに出力する",
    "本番環境のデータベースに直接接続する",
  ],
  required_checks: [
    "変更前に既存テストが通ることを確認する",
    "セキュリティに影響する変更は警告を出す",
    "破壊的変更にはマイグレーションプランを含める",
  ],
  output_constraints: [
    "コードブロックには必ず言語を指定する",
    "変更箇所は差分形式で表示する",
    "理由を必ず添える",
  ],
};

プロンプトテンプレートの管理

プロジェクト全体で一貫したプロンプト品質を維持するため、テンプレートを一元管理する。

// prompts/templates.ts
export const TEMPLATES = {
  codeReview: {
    system: "あなたはシニアコードレビュアーです。",
    userTemplate: "以下のコードをレビューしてください:\n\n```{language}\n{code}\n```",
    outputFormat: "JSON形式で指摘事項を出力してください。",
  },
  bugFix: {
    system: "あなたはデバッグの専門家です。",
    userTemplate: "以下のエラーを分析して修正案を提示してください:\n\nエラー: {error}\nコード: {code}",
    outputFormat: "原因分析と修正コードを出力してください。",
  },
  documentation: {
    system: "あなたはテクニカルライターです。",
    userTemplate: "以下のコードのドキュメントを生成してください:\n\n```{language}\n{code}\n```",
    outputFormat: "JSDoc形式のコメントを生成してください。",
  },
};

プロンプト品質の評価指標

指標説明測定方法
一貫性同じ入力に対する出力のばらつき10回実行した出力の類似度
正確性出力が期待に合致する割合テストケースとの比較
フォーマット遵守率指定形式に従った出力の割合スキーマバリデーション
レイテンシプロンプト処理にかかる時間API応答時間の計測
トークン効率有用な出力/消費トークン比コスト対効果の分析

ベストプラクティス

  1. 具体的に書く: 曖昧な指示より具体的な例を示す方が効果的
  2. 構造化する: プロンプトを論理的なセクションに分割する
  3. テストする: プロンプトの変更は必ずA/Bテストで検証する
  4. バージョン管理する: プロンプトの変更履歴をgitで管理する

関連記事

A

Agentive 編集部

AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。