ストーリー
田
田中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との比較
| 観点 | ReAct | Plan-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 逐次的な思考 |
| リプランニング | 実行中の想定外の状況に対して計画を動的に修正 |
| 適するタスク | 手順が明確で複数ステップを要する複合タスク |
チェックリスト
次のステップへ
次は「Reflectionパターン」を学びます。エージェントが自身の出力を評価し、反復的に改善するアプローチを理解しましょう。
推定読了時間: 30分