プロンプトチェーンは、複雑なタスクをシンプルなプロンプトの連続に分解し、各ステップの出力が次のステップに入力される手法です。この技術により信頼性が大幅に向上し、単一のプロンプトでは不可能な高度なワークフローを実現できます。

<Callout type="tip" title="組み立てラインを想像してください">
工場の組み立てラインが製造工程を専門化されたステーションに分けるように、プロンプトチェーンはAIタスクを専門化されたステップに分けます。各ステップは一つのことを上手くこなし、組み合わせた出力は一度にすべてを行おうとするよりもはるかに優れたものになります。
</Callout>

## なぜプロンプトをチェーンするのか？

単一のプロンプトは、一度に多くのことをしようとするため、複雑なタスクでは苦戦します。AIは同時に理解、分析、計画、生成を行わなければならず、エラーや不整合が生じやすくなります。

<div className="my-6 grid md:grid-cols-2 gap-4">
  <div className="border rounded-lg bg-red-50/50 dark:bg-red-950/20 border-red-200 dark:border-red-900">
    <p className="text-sm font-semibold text-red-700 dark:text-red-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconX className="h-4 w-4" /> 単一プロンプトの課題</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">多段階の推論が混乱する</p>
      <p className="m-0!">異なる「思考モード」が衝突する</p>
      <p className="m-0!">複雑な出力の一貫性が欠ける</p>
      <p className="m-0!">品質管理の機会がない</p>
    </div>
  </div>
  <div className="border rounded-lg bg-green-50/50 dark:bg-green-950/20 border-green-200 dark:border-green-900">
    <p className="text-sm font-semibold text-green-700 dark:text-green-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconCheck className="h-4 w-4" /> チェーンが解決する</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">各ステップが一つのタスクに集中</p>
      <p className="m-0!">各モードに専門化されたプロンプト</p>
      <p className="m-0!">ステップ間で検証が可能</p>
      <p className="m-0!">個別のステップをデバッグし改善</p>
    </div>
  </div>
</div>

## 基本的なチェーンパターン

最もシンプルなチェーンは、あるプロンプトの出力を次のプロンプトに直接渡します。各ステップには明確で焦点を絞った目的があります。

<div className="my-6 flex items-center justify-center gap-3 p-6 bg-muted/30 rounded-lg overflow-x-auto">
  <div className="flex flex-col items-center">
    <div className="px-4 py-3 bg-blue-100 dark:bg-blue-900/50 border border-blue-200 dark:border-blue-800 rounded-lg text-center">
      <p className="text-sm font-medium text-blue-700 dark:text-blue-300 m-0!">プロンプト 1</p>
      <p className="text-xs text-blue-600 dark:text-blue-400 m-0!">（抽出）</p>
    </div>
    <p className="text-xs text-muted-foreground mt-1 m-0!">入力</p>
  </div>
  <div className="text-blue-400 dark:text-blue-500">→</div>
  <div className="flex flex-col items-center">
    <div className="px-4 py-3 bg-purple-100 dark:bg-purple-900/50 border border-purple-200 dark:border-purple-800 rounded-lg text-center">
      <p className="text-sm font-medium text-purple-700 dark:text-purple-300 m-0!">プロンプト 2</p>
      <p className="text-xs text-purple-600 dark:text-purple-400 m-0!">（分析）</p>
    </div>
    <p className="text-xs text-muted-foreground mt-1 m-0!">中間</p>
  </div>
  <div className="text-purple-400 dark:text-purple-500">→</div>
  <div className="flex flex-col items-center">
    <div className="px-4 py-3 bg-green-100 dark:bg-green-900/50 border border-green-200 dark:border-green-800 rounded-lg text-center">
      <p className="text-sm font-medium text-green-700 dark:text-green-300 m-0!">プロンプト 3</p>
      <p className="text-xs text-green-600 dark:text-green-400 m-0!">（生成）</p>
    </div>
    <p className="text-xs text-muted-foreground mt-1 m-0!">出力</p>
  </div>
</div>

<Callout type="info" title="ETGパターン">
最も一般的なチェーンパターンは**抽出（Extract）→ 変換（Transform）→ 生成（Generate）**です。まず生データを抽出し、次にそれを目的に合わせて整形し、最終的な出力を生成します。このパターンはほぼすべてのコンテンツタスクに有効です。
</Callout>

## チェーンの種類

異なるタスクには異なるチェーンアーキテクチャが必要です。ワークフローに合ったパターンを選択してください。

<ChainFlowDemo />

### シーケンシャルチェーン

最も単純なパターンです：各ステップは前のステップに依存します。リレー競走で各ランナーが次のランナーにバトンを渡すようなものと考えてください。

<ChainExample 
  type="sequential"
  steps={[
    { step: "ステップ 1: 抽出", prompt: "以下からすべての日付、名前、数値を抽出してください: [text]", output: '{ dates: ["2024-01-15", "2024-02-20"], names: ["John Smith", "Acme Corp"], numbers: [15000, 42] }' },
    { step: "ステップ 2: 分析", prompt: "この抽出されたデータを基に: [step1_output]、関係性とパターンを特定してください。", output: '{ patterns: ["毎月のミーティングが予定されている"], relationships: ["John SmithはAcme Corpで働いている"] }' },
    { step: "ステップ 3: 生成", prompt: "これらのパターンを使用して: [step2_output]、最も重要な発見を強調した要約レポートを作成してください。", output: "要約レポート: 文書の分析により、John SmithとAcme Corpの間にビジネス関係があり、毎月のミーティングが予定されていることが明らかになりました..." }
  ]}
/>

### パラレルチェーン

同じ入力に対して複数の視点が必要な場合、プロンプトを並列に実行して結果をマージします。これはシーケンシャルチェーンより高速で、より豊富な分析を提供します。

<ChainExample 
  type="parallel"
  steps={[
    { step: "入力", prompt: "製品レビューテキスト", output: '"このイヤホン大好きです！バッテリーがすごく長持ちするし、ケースのディスプレイがとても便利です。毎日の通勤に最適です。"' },
    { step: "ブランチ A: 感情", prompt: "感情を分析してください: [text]", output: '{ sentiment: "positive", score: 0.85 }' },
    { step: "ブランチ B: 機能", prompt: "言及されている機能を抽出してください: [text]", output: '{ features: ["バッテリー", "ディスプレイ"] }' },
    { step: "ブランチ C: ペルソナ", prompt: "ユーザーペルソナを特定してください: [text]", output: '{ persona: "通勤者" }' },
    { step: "マージ", prompt: "分析を統合レポートにまとめてください", output: "統合レポート: バッテリーとディスプレイを高く評価する通勤者からの好意的なレビュー。" }
  ]}
/>

### 条件付きチェーン

分類に基づいて入力を異なるパスにルーティングします。これはAIがまず入力をカテゴリ分けし、各カテゴリを異なる方法で処理するデシジョンツリーのようなものです。

<ChainExample 
  type="conditional"
  steps={[
    { step: "入力を分類", prompt: "この顧客メッセージを以下のいずれかに分類してください: クレーム、質問、フィードバック、その他。\n\nメッセージ: [text]", output: '{ classification: "complaint", confidence: 0.92 }' },
    { step: "ルート: 質問（スキップ）", prompt: "どのような情報が必要か特定してください", output: "スキップ - 入力はクレームとして分類されました" },
    { step: "ルート: クレーム", prompt: "問題とその重大度を特定してください: [text]", output: '{ issue: "配送遅延", severity: "medium" }' },
    { step: "回答を生成", prompt: "解決策を含む共感的な回答を生成してください: [analysis]", output: "お客様へ、遅延についてお詫び申し上げます。ご注文は優先対応いたしました..." }
  ]}
/>

### 反復チェーン

品質基準を満たすまで出力を継続的に改善します。AIは満足するか最大反復回数に達するまで、生成、評価、改善のループを繰り返します。

<Callout type="warning" title="反復回数の制限を設定">
無限ループを防ぎコストを制御するため、常に最大反復回数（通常3〜5回）を設定してください。収穫逓減の法則が適用されます：改善のほとんどは最初の2〜3回の反復で起こります。
</Callout>

<ChainExample 
  type="iterative"
  steps={[
    { step: "ドラフトを生成", prompt: "[ワイヤレスイヤホン]の製品説明を書いてください", output: "このワイヤレスイヤホンは、日常使用に適した良好な音質と快適なフィット感を提供します。" },
    { step: "評価（スコア: 5）", prompt: "この説明を以下の観点で1〜10で評価してください: 明確さ、説得力、正確性。\n\n説明: [current_draft]", output: '{ score: 5, improvements: ["具体的な機能を追加", "感情的なメリットを含める", "バッテリー寿命に言及", "行動喚起を追加"] }' },
    { step: "ドラフトを改善", prompt: "このフィードバックに基づいて説明を改善してください:\n\n現在: [current_draft]\nフィードバック: [improvements]", output: "クリスタルクリアなオーディオを体験してください。30時間のバッテリー寿命、アクティブノイズキャンセリング、そして一日中快適な人間工学に基づいたデザインを備えたプレミアムワイヤレスイヤホンです。音楽愛好家にもプロフェッショナルにも最適です。今すぐ注文して、リスニング体験を変革しましょう。" },
    { step: "評価（スコア: 8）", prompt: "この説明を以下の観点で1〜10で評価してください: 明確さ、説得力、正確性。\n\n説明: [improved_draft]", output: '{ score: 8, improvements: ["軽微: 保証情報を追加できる"] }\n\n✓ スコア >= 8: ループ終了' }
  ]}
/>

## 一般的なチェーンパターン

これらは実戦で検証されたパターンで、一般的な問題を解決します。出発点として使用し、必要に応じて適応させてください。

### 抽出 → 変換 → 生成

コンテンツ処理の主力です。データを引き出し、整形し、新しいものを作成します。

<div className="mb-4 p-3 rounded-lg bg-blue-50/50 dark:bg-blue-950/20 border border-blue-200 dark:border-blue-800">
  <p className="text-xs font-semibold text-blue-700 dark:text-blue-300 mb-1 m-0!">最適な用途</p>
  <p className="text-sm text-blue-600 dark:text-blue-400 m-0!">文書の要約、レポート生成、コンテンツの再利用、データからナラティブへの変換</p>
</div>

<ChainExample 
  type="sequential"
  steps={[
    { step: "抽出", prompt: "この文書から以下を抽出してください:\n- 主題\n- 主要な論点（リスト）\n- 裏付けとなる証拠（リスト）\n- 結論\nJSONで返してください。", output: '{ "topic": "気候変動の影響", "arguments": ["気温上昇", "海面上昇"], "evidence": ["NASAデータ", "IPCCレポート"], "conclusions": ["緊急な行動が必要"] }' },
    { step: "変換", prompt: "[ビジネスエグゼクティブ]向けにこの情報を再編成してください:\n[extracted_data]\n焦点: 経済的影響\n削除: 技術用語", output: '{ "summary": "ビジネスへの気候リスク", "key_points": ["サプライチェーンの混乱", "保険コストの上昇"], "action_items": ["脆弱性の評価", "適応策の計画"] }' },
    { step: "生成", prompt: "この再構成された情報を使用して、[エグゼクティブブリーフ]を作成してください:\n[transformed_data]\nトーン: プロフェッショナル\n長さ: 200語", output: "エグゼクティブブリーフ: 気候変動は当社のビジネスに重大な運営リスクをもたらします。主な懸念事項は、極端な気象現象によるサプライチェーンの混乱と保険料の上昇です。施設の脆弱性の即時評価と適応戦略の策定を推奨します..." }
  ]}
/>

### 分析 → 計画 → 実行

コードのリファクタリング、プロジェクト計画、または行動前に理解が必要なあらゆるタスクに最適です。

<div className="mb-4 p-3 rounded-lg bg-purple-50/50 dark:bg-purple-950/20 border border-purple-200 dark:border-purple-800">
  <p className="text-xs font-semibold text-purple-700 dark:text-purple-300 mb-1 m-0!">最適な用途</p>
  <p className="text-sm text-purple-600 dark:text-purple-400 m-0!">コードリファクタリング、プロジェクト計画、トラブルシューティング、戦略的意思決定、複雑な問題解決</p>
</div>

<ChainExample 
  type="sequential"
  steps={[
    { step: "分析", prompt: "このコードベース構造を分析し、以下を特定してください:\n- アーキテクチャパターン\n- 主要コンポーネント\n- 依存関係\n- 潜在的な問題\n[code]", output: '{ "pattern": "MVC", "components": ["UserController", "AuthService", "Database"], "dependencies": ["express", "mongoose"], "issues": ["入力検証なし", "シークレットがハードコード"] }' },
    { step: "計画", prompt: "この分析に基づいて、リファクタリング計画を作成してください:\n[analysis_output]\n目標: セキュリティの向上\n制約: 破壊的変更なし", output: '{ "steps": ["1. 入力検証ミドルウェアを追加", "2. シークレットを環境変数に移動", "3. レート制限を追加"], "priority": "high", "estimated_time": "4時間" }' },
    { step: "実行", prompt: "この計画のステップ1を実装してください:\n[plan_output]\nリファクタリングされたコードと説明を示してください。", output: "// 検証ミドルウェアを追加\nconst validateInput = (req, res, next) => {\n  const { email, password } = req.body;\n  if (!email || !isValidEmail(email)) {\n    return res.status(400).json({ error: 'Invalid email' });\n  }\n  next();\n};" }
  ]}
/>

### 生成 → 批評 → 改善

自己改善ループです。コンテンツを生成し、AIに批評させ、そのフィードバックに基づいて改善します。これはプロのライターと編集者が協働する方法を模倣しています。

<div className="mb-4 p-3 rounded-lg bg-green-50/50 dark:bg-green-950/20 border border-green-200 dark:border-green-800">
  <p className="text-xs font-semibold text-green-700 dark:text-green-300 mb-1 m-0!">最適な用途</p>
  <p className="text-sm text-green-600 dark:text-green-400 m-0!">マーケティングコピー、クリエイティブライティング、メールドラフト、プレゼンテーション、改訂から恩恵を受けるあらゆるコンテンツ</p>
</div>

<ChainExample 
  type="iterative"
  steps={[
    { step: "生成", prompt: "[忙しいプロフェッショナル]をターゲットにした[フィットネスアプリ]のマーケティングメールを書いてください。", output: "件名: 素早くフィットになろう！\n\nこんにちは！私たちのアプリはあなたの運動をサポートします。今日ダウンロードしてフィットネスの旅を始めましょう。ありがとうございます！" },
    { step: "批評", prompt: "マーケティングエキスパートとして、このメールを批評してください:\n[generated_email]\n評価項目: 件名、フック、価値提案、CTA、トーン\n各項目を1〜10で評価。", output: '{ "subject_line": 4, "hook": 3, "value_proposition": 2, "cta": 5, "tone": 4, "feedback": "一般的すぎる、具体的なメリットがない、緊急性が弱い" }' },
    { step: "改善", prompt: "このフィードバックに対応してメールを書き直してください:\n元: [generated_email]\n批評: [critique_output]\n最も低いスコアの要素に焦点を当ててください。", output: "件名: ランチ休憩に15分のワークアウト\n\n忙しいスケジュールですか？わかります。当アプリは、時間がまったくないプロフェッショナル向けに設計された科学に基づいたワークアウトを提供します。1日わずか15分で健康を変えた50,000人以上のエグゼクティブに参加しましょう。今すぐ無料トライアルを開始—未来のあなたが感謝します。" },
    { step: "最終スコア", prompt: "改善されたメールを再評価してください。", output: '{ "subject_line": 8, "hook": 8, "value_proposition": 9, "cta": 8, "tone": 9, "improvement": "+23ポイント合計" }' }
  ]}
/>

## チェーンの実装

実験用には手動で、本番システム用にはプログラムでチェーンを実装できます。シンプルに始めて、必要に応じて複雑さを追加してください。

### 手動チェーン

コピー＆ペーストアプローチは、プロトタイピングと実験に最適です。各プロンプトを手動で実行し、出力を確認し、次のプロンプトにペーストします。

<CodeEditor 
  language="python"
  filename="manual_chain.py"
  code={`# Pseudocode for manual chaining
step1_output = call_ai("Extract entities from: " + input_text)
step2_output = call_ai("Analyze relationships: " + step1_output)
final_output = call_ai("Generate report: " + step2_output)`}
/>

### プログラムによるチェーン

本番システムでは、コードでチェーンを自動化します。これによりエラー処理、ログ記録、アプリケーションとの統合が可能になります。

<CodeEditor 
  language="python"
  filename="chain.py"
  code={`def analysis_chain(document):
    # Step 1: Summarize
    summary = call_ai(f"""
        Summarize the key points of this document in 5 bullets:
        {document}
    """)
    
    # Step 2: Extract entities
    entities = call_ai(f"""
        Extract named entities (people, organizations, locations) 
        from this summary. Return as JSON.
        {summary}
    """)
    
    # Step 3: Generate insights
    insights = call_ai(f"""
        Based on this summary and entities, generate 3 actionable 
        insights for a business analyst.
        Summary: {summary}
        Entities: {entities}
    """)
    
    return {
        "summary": summary,
        "entities": json.loads(entities),
        "insights": insights
    }`}
/>

### チェーンテンプレートの使用

再利用性と容易な変更のために、チェーンを設定ファイルとして定義します。これによりプロンプトロジックをアプリケーションコードから分離できます。

<CodeEditor 
  language="yaml"
  filename="chain_template.yaml"
  code={`name: "Document Analysis Chain"
steps:
  - name: "extract"
    prompt: |
      Extract key information from this document:
      {input}
      Return JSON with: topics, entities, dates, numbers
    
  - name: "analyze"
    prompt: |
      Analyze this extracted data for patterns:
      {extract.output}
      Identify: trends, anomalies, relationships
    
  - name: "report"
    prompt: |
      Generate an executive summary based on:
      Data: {extract.output}
      Analysis: {analyze.output}
      Format: 3 paragraphs, business tone`}
/>

## チェーンでのエラー処理

チェーンはどのステップでも失敗する可能性があります。検証、リトライ、フォールバックを組み込んで、チェーンを堅牢にしましょう。

<ChainErrorDemo />

<Callout type="warning" title="ゴミを入れればゴミが出る">
あるステップが悪い出力を生成すると、後続のすべてのステップが影響を受けます。重要な中間結果は、次に渡す前に必ず検証してください。
</Callout>

### ステップ間の検証

構造化データを生成するステップの後には、検証ステップを追加してください。これによりエラーが連鎖する前に早期に発見できます。

<ValidationDemo />

### フォールバックチェーン

主要なアプローチが失敗した場合、よりシンプルなバックアップを用意しておきましょう。機能を信頼性と引き換えにします。

<FallbackDemo />

## チェーンの最適化

チェーンが動作したら、速度、コスト、信頼性を最適化します。これらはしばしばトレードオフの関係にあります。

<div className="my-6 grid md:grid-cols-3 gap-4">
  <div className="border rounded-lg bg-blue-50/50 dark:bg-blue-950/20 border-blue-200 dark:border-blue-900 p-4">
    <p className="text-sm font-semibold text-blue-700 dark:text-blue-400 mb-2 m-0!">レイテンシの削減</p>
    <div className="text-sm space-y-1">
      <p className="m-0!">独立したステップを並列化</p>
      <p className="m-0!">中間結果をキャッシュ</p>
      <p className="m-0!">シンプルなステップには小型モデルを使用</p>
      <p className="m-0!">類似の操作をバッチ処理</p>
    </div>
  </div>
  <div className="border rounded-lg bg-green-50/50 dark:bg-green-950/20 border-green-200 dark:border-green-900 p-4">
    <p className="text-sm font-semibold text-green-700 dark:text-green-400 mb-2 m-0!">コストの削減</p>
    <div className="text-sm space-y-1">
      <p className="m-0!">分類には安価なモデルを使用</p>
      <p className="m-0!">ループの反復回数を制限</p>
      <p className="m-0!">可能な場合は早期終了</p>
      <p className="m-0!">繰り返しクエリをキャッシュ</p>
    </div>
  </div>
  <div className="border rounded-lg bg-purple-50/50 dark:bg-purple-950/20 border-purple-200 dark:border-purple-900 p-4">
    <p className="text-sm font-semibold text-purple-700 dark:text-purple-400 mb-2 m-0!">信頼性の向上</p>
    <div className="text-sm space-y-1">
      <p className="m-0!">ステップ間に検証を追加</p>
      <p className="m-0!">リトライロジックを含める</p>
      <p className="m-0!">中間結果をログに記録</p>
      <p className="m-0!">フォールバックパスを実装</p>
    </div>
  </div>
</div>

## 実世界のチェーン例

完全な本番チェーンを見ていきましょう。このコンテンツパイプラインは、生のアイデアを洗練された記事パッケージに変換します。

### コンテンツパイプラインチェーン

<ContentPipelineDemo />

## まとめ

プロンプトチェーンは、不可能なタスクを達成可能なステップに分解することで、AIが達成できることを変革します。

<div className="my-6 grid md:grid-cols-2 gap-4">
  <div className="border rounded-lg bg-amber-50/50 dark:bg-amber-950/20 border-amber-200 dark:border-amber-900 p-4">
    <p className="text-sm font-semibold text-amber-700 dark:text-amber-400 mb-2 m-0!">チェーンが可能にすること</p>
    <div className="text-sm space-y-1">
      <p className="m-0!">複雑な多段階ワークフロー</p>
      <p className="m-0!">専門化による高品質</p>
      <p className="m-0!">より良いエラー処理と検証</p>
      <p className="m-0!">モジュール式で再利用可能なプロンプトコンポーネント</p>
    </div>
  </div>
  <div className="border rounded-lg bg-cyan-50/50 dark:bg-cyan-950/20 border-cyan-200 dark:border-cyan-900 p-4">
    <p className="text-sm font-semibold text-cyan-700 dark:text-cyan-400 mb-2 m-0!">主要な原則</p>
    <div className="text-sm space-y-1">
      <p className="m-0!">複雑なタスクをシンプルなステップに分解</p>
      <p className="m-0!">ステップ間の明確なインターフェースを設計</p>
      <p className="m-0!">中間出力を検証</p>
      <p className="m-0!">エラー処理とフォールバックを組み込む</p>
      <p className="m-0!">制約に応じて最適化</p>
    </div>
  </div>
</div>

<Callout type="tip" title="シンプルに始める">
2〜3ステップのシーケンシャルチェーンから始めてください。複雑さを追加する前に、確実に動作するようにしましょう。ほとんどのタスクは複雑なチェーンアーキテクチャを必要としません。
</Callout>

<Quiz 
  question="単一の複雑なプロンプトと比較して、プロンプトチェーンの主な利点は何ですか？"
  options={[
    "全体的に使用するトークンが少ない",
    "実行が速い",
    "各ステップが専門化でき、品質が向上しエラー処理が可能になる",
    "計画が少なくて済む"
  ]}
  correctIndex={2}
  explanation="プロンプトチェーンは複雑なタスクを専門化されたステップに分解します。各ステップは一つのことに集中でき、中間結果を検証でき、エラーを捕捉してリトライでき、専門化により全体的な品質が向上します。"
/>

次の章では、マルチモーダルプロンプティング—画像、音声、その他のテキスト以外のコンテンツを扱う方法について探ります。
