優れたプロンプトには共通の構造要素があります。これらの構成要素を理解することで、試行錯誤ではなく体系的にプロンプトを構築できるようになります。

<Callout type="tip" title="プロンプトの構成要素">
これらの構成要素はレゴブロックのようなものだと考えてください。すべてのプロンプトにすべての要素が必要なわけではありませんが、何が使えるかを知っておくことで、必要なものを正確に組み立てることができます。
</Callout>

## 主要な構成要素

効果的なプロンプトには、通常以下の要素の一部またはすべてが含まれます：

<PromptBreakdown parts={[
  { label: "役割", text: "あなたはシニアソフトウェアエンジニアです" },
  { label: "文脈", text: "Reactアプリケーションの開発に携わっています。" },
  { label: "タスク", text: "このコードのバグをレビューしてください" },
  { label: "制約", text: "セキュリティの問題のみに焦点を当ててください。" },
  { label: "形式", text: "発見事項を番号付きリストで返してください。" },
  { label: "例", text: "例：1. 42行目にSQLインジェクションのリスク" }
]} />

それぞれの構成要素を詳しく見ていきましょう。

## 1. 役割 / ペルソナ

役割を設定することで、モデルの回答を特定の専門性や視点を通して焦点を絞ることができます。

<Compare 
  before={{ label: "役割なし", content: "量子コンピューティングについて説明してください。" }}
  after={{ label: "役割あり", content: "あなたは複雑なトピックを初心者にもわかりやすく説明することを専門とする物理学教授です。量子コンピューティングについて説明してください。" }}
/>

役割を設定することで、モデルは以下のことができるようになります：
- 適切な語彙を使用する
- 関連する専門知識を適用する
- 一貫した視点を維持する
- 聴衆を適切に考慮する

### 効果的な役割のパターン

```
「あなたは[専門分野]で[X年]の経験を持つ[職業]です」
「[特徴]を持つ[役割]として振る舞ってください」
「あなたは[対象者タイプ]を支援する[分野]の専門家です」
```

## 2. 文脈 / 背景

文脈は、モデルがあなたの状況を理解するために必要な情報を提供します。覚えておいてください：あなたが伝えない限り、モデルはあなた、あなたのプロジェクト、あなたの目標について何も知りません。

<Compare 
  before={{ label: "弱い文脈", content: "このコードのバグを修正してください。" }}
  after={{ label: "強い文脈", content: "Express.jsを使用してNode.jsのREST APIを構築しています。APIはJWTトークンを使用してユーザー認証を処理します。ユーザーが保護されたルートにアクセスしようとすると、有効なトークンを持っていても403エラーが発生します。関連するコードは以下の通りです：[コード]" }}
/>

### 文脈に含めるべき内容

- **プロジェクトの詳細** — 技術スタック、アーキテクチャ、制約
- **現在の状態** — 試したこと、うまくいっていること、いないこと
- **目標** — 最終的に達成しようとしていること
- **制約** — 時間制限、技術要件、スタイルガイド

## 3. タスク / 指示

タスクはプロンプトの核心であり、モデルに何をしてほしいかを示します。具体的で曖昧さのないようにしましょう。

### 具体性のスペクトラム

<SpecificitySpectrum levels={[
  { level: "曖昧", text: "このエッセイを手伝ってください" },
  { level: "やや良い", text: "このエッセイを編集してください" },
  { level: "良い", text: "このエッセイの文法と明瞭さを編集してください" },
  { level: "最良", text: "このエッセイの文法と明瞭さを編集し、元のトーンを維持しながら冗長さを20%削減してください" }
]} />

### 効果的なアクション動詞

<div className="my-4 grid gap-2">
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-32">作成</span>
    <span className="text-muted-foreground">Write, Create, Generate, Compose, Design</span>
  </div>
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-32">分析</span>
    <span className="text-muted-foreground">Analyze, Evaluate, Compare, Assess, Review</span>
  </div>
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-32">変換</span>
    <span className="text-muted-foreground">Convert, Translate, Reformat, Summarize, Expand</span>
  </div>
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-32">説明</span>
    <span className="text-muted-foreground">Explain, Describe, Clarify, Define, Illustrate</span>
  </div>
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-32">問題解決</span>
    <span className="text-muted-foreground">Solve, Debug, Fix, Optimize, Improve</span>
  </div>
</div>

## 4. 制約 / ルール

制約はモデルの出力を制限します。よくある問題を防ぎ、関連性を確保します。

### 制約の種類

**長さの制約：**
```
「回答を200語以内にしてください」
「正確に5つの提案を提供してください」
「3〜4段落で書いてください」
```

**内容の制約：**
```
「コード例は含めないでください」
「技術的な側面のみに焦点を当ててください」
「マーケティング用語は避けてください」
```

**スタイルの制約：**
```
「フォーマルで学術的なトーンを使用してください」
「10歳の子供に話すように書いてください」
「直接的に、曖昧な表現は避けてください」
```

**範囲の制約：**
```
「Python 3.10以降で利用可能なオプションのみを考慮してください」
「提案は無料のツールに限定してください」
「追加の依存関係を必要としない解決策に焦点を当ててください」
```

## 5. 出力形式

出力形式を指定することで、使用可能な構造で回答を得ることができます。

### 一般的な形式

**リスト：**
```
「箇条書きリストで返してください」
「番号付きの手順リストを提供してください」
```

**構造化データ：**
```
「title、description、priorityをキーとするJSONで返してください」
「Feature、Pros、Consの列を持つMarkdownテーブルとしてフォーマットしてください」
```

**特定の構造：**
```
「以下の構造で回答してください：
 ## 概要
 ## 重要なポイント
 ## 推奨事項」
```

### JSON出力の例

```
この顧客レビューを分析し、JSONで返してください：
{
  "sentiment": "positive" | "negative" | "neutral",
  "topics": ["主なトピックの配列"],
  "rating_prediction": 1-5,
  "key_phrases": ["注目すべきフレーズ"]
}

レビュー：「商品は早く届き、動作も良好ですが、
説明書がわかりにくかったです。」
```

## 6. 例（Few-Shot Learning）

例は、モデルに正確に何を求めているかを示す最も強力な方法です。

### One-Shotの例

```
これらの文を過去形に変換してください。

例：
入力：「彼女は店まで歩く」
出力：「彼女は店まで歩いた」

次を変換してください：
入力：「彼らは毎朝走る」
```

### Few-Shotの例

```
これらのサポートチケットを緊急度で分類してください。

例：
「アカウントがハッキングされました」→ 重大
「パスワードの変更方法は？」→ 低
「支払いに失敗しましたが、請求されました」→ 高

分類してください：「設定を開くとアプリがクラッシュします」
```

## すべてを組み合わせる

すべての構成要素を使用した完全なプロンプトの例を示します：

<TryIt 
  title="完全なプロンプトの例"
  description="このプロンプトは6つの構成要素がすべて連携して機能する様子を示しています。試してみて、構造化されたプロンプトがプロフェッショナルな結果を生み出すことを確認してください。"
  prompt={`# 役割
あなたは開発者向けドキュメント作成で10年の経験を持つシニアテクニカルライターです。

# 文脈
決済処理サービスのREST APIのドキュメントを作成しています。対象読者は私たちのAPIをアプリケーションに統合する開発者です。彼らは中級レベルのプログラミング知識を持っていますが、決済処理の概念には不慣れかもしれません。

# タスク
新しい決済インテントを作成する以下のAPIエンドポイントのドキュメントを書いてください。

# 制約
- 明確で簡潔な言葉を使用する
- 一般的なエラーシナリオを含める
- バックエンドの実装詳細は含めない
- 読者がHTTPとJSONの基本を理解していると想定する

# 出力形式
以下の構造でドキュメントを作成してください：
1. エンドポイントの概要（2〜3文）
2. リクエスト（メソッド、URL、ヘッダー、ボディと例）
3. レスポンス（成功とエラーの例）
4. コード例（JavaScript/Node.jsで）

# エンドポイントの詳細
POST /v1/payments/intents
Body: { "amount": 1000, "currency": "usd", "description": "Order #1234" }`}
/>

## 最小限の効果的なプロンプト

すべてのプロンプトにすべての構成要素が必要なわけではありません。シンプルなタスクでは、明確な指示だけで十分な場合があります：

```
「Hello, how are you?」をスペイン語に翻訳してください。
```

追加の構成要素を使用するのは：
- タスクが複雑または曖昧な場合
- 特定のフォーマットが必要な場合
- 結果が期待と一致しない場合
- 複数のクエリ間で一貫性が重要な場合

## 一般的なプロンプトパターン

これらのフレームワークは、プロンプトを書く際に従うべきシンプルなチェックリストを提供します。各ステップをクリックすると例が表示されます。

<CRISPEFramework />

<RTFFramework />

## まとめ

効果的なプロンプトは発見されるものではなく、構築されるものです。これらの構造的な構成要素を理解し適用することで、以下のことができるようになります：

- 最初の試行でより良い結果を得る
- うまくいかないプロンプトをデバッグする
- 再利用可能なプロンプトテンプレートを作成する
- 意図を明確に伝える

<Quiz 
  question="回答の品質に最も大きな影響を与える構成要素はどれですか？"
  options={[
    "常に役割/ペルソナ",
    "常に出力形式",
    "タスクによって異なる",
    "プロンプトの長さ"
  ]}
  correctIndex={2}
  explanation="タスクによって効果的な構成要素は異なります。シンプルな翻訳には最小限の構造で十分ですが、複雑な分析には詳細な役割、文脈、形式の指定が有効です。"
/>

<TryIt 
  prompt={`あなたはSaaS製品で10年の経験を持つシニアプロダクトマネージャーです。

文脈：リモートチーム向けのタスク管理アプリを構築しています。私たちはエンジニアリングリソースが限られた小さなスタートアップです。

タスク：MVPで優先すべき3つの機能を提案してください。

制約：
- 機能は2人の開発者が4週間で実装可能であること
- TrelloやAsanaとの差別化ポイントに焦点を当てること

形式：各機能について以下を提供してください：
1. 機能名
2. 一文での説明
3. リモートチームにとって重要な理由`}
  description="このプロンプトは6つの構成要素をすべて使用しています。試してみて、構造化されたアプローチが焦点を絞った実用的な結果を生み出すことを確認してください。"
/>

## 自分のプロンプトを作ってみよう

今度はあなたの番です！このインタラクティブなプロンプトビルダーを使って、学んだ構成要素を活用して自分のプロンプトを構築してみましょう：

<PromptBuilder 
  title="インタラクティブプロンプトビルダー"
  description="各セクションに入力して、完全で構造化されたプロンプトを作成しましょう"
/>

<PromptChallenge
  title="章のチャレンジ：コードレビュープロンプトを作成する"
  task="セキュリティの脆弱性についてコードをレビューするようAIに依頼するプロンプトを書いてください。実用的なフィードバックを得られるほど具体的なプロンプトにしてください。"
  criteria={[
    "明確な役割または専門性レベルを含める",
    "コードレビューの種類を指定する（セキュリティに焦点）",
    "期待される出力形式を定義する",
    "適切な制約または範囲を設定する"
  ]}
  hints={[
    "コードレビュアーが持つべき専門知識について考えてください",
    "どのようなセキュリティの問題を探すべきか具体的にしてください",
    "構造化された回答形式を求めることを検討してください"
  ]}
  exampleSolution={`あなたはWebアプリケーションセキュリティとOWASP Top 10の脆弱性に精通したシニアセキュリティエンジニアです。

タスク：以下のコードのセキュリティ脆弱性をレビューしてください。

焦点を当てる項目：
- SQLインジェクションのリスク
- XSSの脆弱性
- 認証/認可の問題
- 入力バリデーションの欠陥

出力形式：
発見した各問題について：
1. 行番号
2. 脆弱性の種類
3. リスクレベル（高/中/低）
4. 推奨される修正方法

[レビュー対象のコード]`}
  difficulty="intermediate"
/>

次の章では、プロンプト構築の判断を導く基本原則について探っていきます。
