プランナーとは
Planner
与えられた目標を、実行可能なサブタスクの手順へ分解するエージェントの構成要素
ひとことで言うと
目標を、実際にこなせる細かい手順に分解する係を担うAIの部品。
概要
プランナー(Planner)とは、AIエージェントが持つ役割・構成要素の1つで、与えられた目標を達成するために必要なサブタスクを洗い出し、実行すべき手順(計画)を立てる部分を指す。 プランナーが立てた計画に基づいて、実際の行動やツール呼び出しを担う「エグゼキューター」が各ステップを実行するという役割分担(Plan-and-Execute方式)を取るエージェント設計が代表的な使われ方の1つ。 単一のLLM呼び出しの中で計画と実行を同時に行わせる設計もあれば、プランナーとエグゼキューターを別々のLLM呼び出しやエージェントとして明確に分離する設計もある。 計画は一度立てて終わりではなく、実行結果を踏まえて途中で計画自体を修正する「動的な再計画」を組み込む設計も多く、想定外の実行結果への対応力を高める。
背景
LLMに複雑なタスクを一度にこなさせようとすると、途中で目標を見失ったり非効率な手順を取ったりすることがある。 プランナーという役割を明確に分離することで、まず全体の見通し(計画)を立ててから個々のステップを実行するという、人間の問題解決に近い進め方をエージェントへ取らせるため、この構成要素が重視されるようになった。
アーキテクチャ
プランナーは、目標とこれまでの状況(観測結果)を入力として受け取り、次に実行すべきサブタスクの列、あるいは次の1ステップを出力する。 計画は一度に全ステップを確定させる場合もあれば、実行結果を見ながら逐次的に更新する場合もある。
ワークフロー
目標と現在の状況を入力として受け取る → 達成に必要なサブタスクを洗い出し実行順を決定 → エグゼキューターへ計画を渡す → 実行結果が当初の想定と異なる場合は計画を修正する。
コード例
プランナーとエグゼキューターを分離したエージェントの骨格
def plan(goal: str, llm) -> list[str]:
"""目標を達成するためのサブタスク一覧を生成する"""
prompt = f"次の目標を達成するための手順を箇条書きで示してください: {goal}"
response = llm.complete(prompt)
return parse_steps(response)
def run_agent(goal: str, llm, executor):
steps = plan(goal, llm)
for step in steps:
result = executor.execute(step)
if result.requires_replanning:
steps = plan(f"{goal}\n進捗: {result.summary}", llm)利点
- 複雑な目標を、見通しの立った実行可能なステップへ分解できる
- 計画と実行を分離することで、各役割に適したプロンプトやモデルを使い分けやすくなる
- 実行前に手順が可視化されるため、人間によるレビューや承認を挟みやすい
欠点
- プランナーの立てた計画が不適切だと、後続の実行全体に悪影響が及ぶ
- 状況の変化に応じて計画を柔軟に修正する仕組みがないと、当初の計画に固執し失敗しやすくなる
- 計画の粒度が粗すぎると実行時に詰まり、細かすぎると計画自体の生成コストが増す
比較
- エグゼキューター — プランナーが立てた計画を、実際に実行するのがエグゼキューターの役割
- AIエージェント — プランナーは、AIエージェントを構成する要素の1つ
- Chain-of-Thought — Chain-of-Thoughtが単一の推論過程を段階的に言語化するのに対し、プランナーは複数のサブタスクへの分解・実行計画の立案を担う
関連用語
よくある質問
プランナーとエグゼキューターは必ず別のLLM呼び出しにする必要がある?
必須ではない。 1つのLLM呼び出しの中で計画と実行を同時に行わせる設計も一般的だが、タスクが複雑な場合は役割を分離した方が安定しやすいとされる。
プランナーにはどんなモデルを使うべき?
計画の質はタスク全体の成否に直結するため、推論能力の高いモデルをプランナー役に、より軽量なモデルをエグゼキューター役に使い分ける構成もよく採用される。