すべての優れたプロンプトは、共通の構造的要素を持っています。これらのコンポーネントを理解することで、試行錯誤ではなく体系的にプロンプトを構築できるようになります。

<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">書く、作成する、生成する、作曲する、デザインする</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">分析する、評価する、比較する、アセスする、レビューする</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">変換する、翻訳する、再フォーマットする、要約する、拡張する</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">説明する、記述する、明確にする、定義する、図解する</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">解決する、デバッグする、修正する、最適化する、改善する</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学習）

例は、モデルに正確に何が欲しいかを示す最も強力な方法です。

### ワンショットの例

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

例：
入力：「彼女は店に歩いて行く」
出力：「彼女は店に歩いて行った」

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

### 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
ボディ：{ "amount": 1000, "currency": "usd", "description": "Order #1234" }`}
/>

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

すべてのプロンプトにすべてのコンポーネントが必要なわけではありません。単純なタスクには、明確な指示だけで十分な場合があります：

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

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

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

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

<CRISPEFramework />

<RTFFramework />

## まとめ

効果的なプロンプトは、発見されるものではなく、構築されるものです。これらの構造的コンポーネントを理解し適用することで、以下が可能になります：

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

<Quiz 
  question="応答品質に最も大きな影響を与えるコンポーネントはどれですか？"
  options={[
    "常に役割/ペルソナ",
    "常に出力フォーマット",
    "タスクによって異なる",
    "プロンプトの長さ"
  ]}
  correctIndex={2}
  explanation="異なるタスクは異なるコンポーネントから恩恵を受けます。単純な翻訳は最小限の構造で済みますが、複雑な分析は詳細な役割、コンテキスト、フォーマット指定から恩恵を受けます。"
/>

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

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

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

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

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

## 自分のプロンプトを作成する

さあ、あなたの番です！このインタラクティブなプロンプトビルダーを使って、学んだコンポーネントを使って自分のプロンプトを構築してみましょう：

<PromptBuilder 
  title="インタラクティブプロンプトビルダー"
  description="各セクションを埋めて、完全で構造化されたプロンプトを作成してください"
/>

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

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

焦点を当てる項目：
- SQLインジェクションのリスク
- XSSの脆弱性
- 認証/認可の問題
- 入力検証のギャップ

出力フォーマット：
見つかった各問題について：
1. 行番号
2. 脆弱性の種類
3. リスクレベル（高/中/低）
4. 推奨される修正

[レビューするコード]`}
  difficulty="intermediate"
/>

次の章では、プロンプト構築の決定を導く核となる原則を探ります。
