LESSON 30分

ストーリー

田中VPoE
ReActパターンの弱点は何だったか覚えているか?
あなた
「一歩先しか考えない」という計画性の欠如ですよね。1ステップごとに次を考えるので、全体を見通した効率的な行動ができない
田中VPoE
その通り。例えば「月次売上レポートを作成して」と頼まれたとき、ReActだと「まず売上データを取得しよう」「次にカテゴリ別に集計しよう」と逐次的に進むが、最初からやるべきことの全体像が見えていない
あなた
最初に計画を立ててから実行するパターンが必要なんですね
田中VPoE
まさにそれが Plan-and-Execute パターンだ。最初にタスクを分解して計画を立て、それを順番に実行する。途中で計画の修正(リプランニング)も可能だ

Plan-and-Executeパターンとは

基本概念

Plan-and-Execute は、タスクを最初に複数のサブタスクに分解(Plan)し、それぞれを順次実行(Execute)するエージェント設計パターンです。

Plan-and-Executeの流れ:

[ユーザーの指示]

[Plan(計画立案)]
  → タスクをサブタスクに分解
  → 実行順序を決定
  → 各サブタスクに必要なツールを特定

[Execute(順次実行)]
  → サブタスク1を実行
  → サブタスク2を実行
  → ...

[Replan(必要に応じて再計画)]
  → 実行結果を評価
  → 計画を修正

[最終結果]

具体例:月次売上レポート作成

ユーザー: 2026年2月の月次売上レポートを作成してください

--- Plan(計画立案)---
以下の手順でレポートを作成します:
1. 2月の売上データをDBから取得する
2. カテゴリ別に売上を集計する
3. 前月(1月)のデータと比較する
4. トップ10商品を特定する
5. レポートを整形して出力する

--- Execute(順次実行)---

[Step 1] fetch_sales_data(period="2026-02")
→ 結果: 総売上 ¥45,230,000、注文数 12,340件

[Step 2] aggregate_by_category(period="2026-02")
→ 結果: 家電 ¥18,500,000、アパレル ¥12,300,000、...

[Step 3] fetch_sales_data(period="2026-01")
→ 結果: 総売上 ¥42,100,000(前月比 +7.4%)

[Step 4] get_top_products(period="2026-02", limit=10)
→ 結果: 1位 ワイヤレスイヤホンX ¥2,340,000、...

[Step 5] format_report(data=collected_results)
→ 月次売上レポートを生成

--- 最終結果 ---
整形されたレポートをユーザーに返却

ReActとの比較

観点ReActPlan-and-Execute
計画タイミング毎ステップ判断最初に全体計画
効率性試行錯誤的見通しを持って効率的
柔軟性非常に高い中程度(リプランで対応)
複雑なタスクステップ増で精度低下計画で全体を管理
デバッグThought で確認計画と実行を分離して確認
適するタスク探索的・対話的手順が明確・複合的

使い分け指針

タスクの性質を判断:

タスクの手順が事前にわかるか?
├── はい → Plan-and-Execute
│         (レポート作成、データ処理パイプラインなど)
└── いいえ → 探索的な要素が強いか?
              ├── はい → ReAct
              │         (トラブルシューティング、調査など)
              └── どちらでもない → ハイブリッド
                    (計画を立てつつ各ステップでReActを使う)

リプランニング

なぜリプランニングが必要か

実行中に想定外の状況が発生することがあります。

状況対応
データ不足必要なデータがDBに存在しない代替データソースを使う計画に変更
エラー発生APIがタイムアウトリトライ or 別の方法に切り替え
新情報の発見追加で必要な分析が判明計画にステップを追加
前提の変化ユーザーが途中で条件を変更計画を全面的に再作成

リプランニングの実装

interface Plan {
  steps: PlanStep[];
  currentStepIndex: number;
  status: "in_progress" | "completed" | "replanning";
}

interface PlanStep {
  id: number;
  description: string;
  tool: string;
  params: Record<string, unknown>;
  status: "pending" | "completed" | "failed";
  result?: unknown;
}

async function planAndExecuteAgent(userMessage: string): Promise<string> {
  // Phase 1: 計画立案
  let plan = await createPlan(userMessage);

  // Phase 2: 順次実行
  for (let i = 0; i < plan.steps.length; i++) {
    const step = plan.steps[i];

    try {
      const result = await executeTool(step.tool, step.params);
      step.result = result;
      step.status = "completed";
    } catch (error) {
      step.status = "failed";

      // リプランニング: 残りの計画を修正
      plan = await replan(plan, error);
      i = plan.currentStepIndex - 1; // リプラン後の位置に戻る
    }
  }

  // Phase 3: 結果の統合
  return await synthesizeResults(plan);
}

Plan-and-Executeの利点と課題

利点

利点説明
全体最適最初に全体を見通すため効率的な実行が可能
進捗管理計画に対する進捗を明確にトラッキング可能
並列実行依存関係のないステップを並列で実行可能
予測可能性事前に必要なステップ数やコストを見積もれる

課題

課題説明対策
初期計画の精度不十分な計画だと効率が下がる計画立案プロンプトの品質向上
柔軟性の低さ想定外の状況への対応が遅いリプランニング機能の実装
計画のオーバーヘッド簡単なタスクでも計画立案が必要タスク難易度に応じてパターンを切り替え
計画の粒度細かすぎても粗すぎても非効率適切な粒度のガイドラインを設定

まとめ

ポイント内容
Plan-and-Executeの定義最初に計画を立て、順次実行するエージェントパターン
ReActとの違い全体を見通した計画 vs 逐次的な思考
リプランニング実行中の想定外の状況に対して計画を動的に修正
適するタスク手順が明確で複数ステップを要する複合タスク

チェックリスト

  • Plan-and-Executeパターンの基本フロー(Plan → Execute → Replan)を理解した
  • ReActパターンとの使い分け基準を説明できる
  • リプランニングの必要性と実装方法を理解した
  • 計画立案の粒度について考慮すべき点を把握した

次のステップへ

次は「Reflectionパターン」を学びます。エージェントが自身の出力を評価し、反復的に改善するアプローチを理解しましょう。


推定読了時間: 30分