1. 概要と要点
概要
本稿では、Microsoft AutoGen の AgentChat API における Swarm パターンの設計思想・実装構造・動作原理について技術的に考察する。Swarm は、複数のエージェントが共通の会話コンテキストを共有しながら、自律的にタスクを遂行・委譲しあう「分散協調型」のエージェント設計手法である。
本パターンでは、中央制御を必要とせず、各エージェントが自律的に他エージェントまたは人間へタスクをハンドオフできる。ツール呼び出しと人間介入(Human-in-the-Loop)を自然に組み込むことができ、AutoGen の高度な会話制御機能を活用するうえで重要な設計パターンと位置付けられる。
要点(Summary Points)
- Swarm はネイティブなタスク委譲パターン
各エージェントがHandoffMessageを用いて、他エージェントまたは人間ユーザーへタスクを明示的に委譲できる。 - 共通の会話コンテキストを共有
Swarm に参加するすべてのエージェントは、過去の会話ログを共有しており、状況を理解したうえでの対話が可能となる。 - 中央制御不要な分散設計
従来の Planner Agent を必要とせず、各エージェントが自律的に制御を移譲するため、柔軟な分散型マルチエージェント構成を実現。 - User へのハンドオフが可能
エージェントは"user"をハンドオフ先として指定でき、人間ユーザーの返答待ちも自然に制御フローに組み込める。 - ツール呼び出しとの統合が容易
特定のツール(例:refund_flight)を介して動作する他エージェントへの処理移譲もサポートされている。 - 高レベル API としての位置づけ
Swarm は AutoGen の高レベル抽象インタフェースであり、さらに詳細な制御が必要な場合は Core API による Handoff 設計も可能。 parallel_tool_calls=Falseの推奨設定
Swarm では逐次的な制御フローとエージェント間の一貫性維持が重要であるため、ツール呼び出しの並列実行は避けるべき。
parallel_tool_calls=Trueのまま使用すると、Handoff のタイミングが競合し、会話履歴の整合性やユーザー入力の受付処理が破綻する可能性がある。そのため、Swarm 利用時は以下のように設定するのが望ましい:
pythonCopyEditassistant = AssistantAgent(
name="agent_a",
model=...,
handoffs=[...],
parallel_tool_calls=False # Swarmパターンでは必須
)
2. Swarm の動作モデル
2.1 メッセージフロー
- エージェントAが発話を生成
- タスクを他エージェントに委譲するための
HandoffMessageを発行 - 委譲先のエージェントBが応答
- この流れを条件終了まで繰り返す
2.2 エージェント設計
- AssistantAgent では
handoffs=[...]により委譲先を制限可能 - モデルにはツール呼び出し(tool calling)能力が必須
- 並列ツール呼び出しは無効化推奨(
parallel_tool_calls=False)
3. 実装例(旅行サポートシステム)
- TravelAgent:旅行相談と返金処理の振り分け担当
- FlightsRefunder:
refund_flightツールにより処理実行 "user":人間ユーザーとして、情報提供のハンドオフ先に設定可能
ユーザーへのハンドオフ後は、その応答を再び処理チェーンに戻すことで継続的な対話が可能。
4. Swarm の設計的利点と応用上の注意点
| 項目 | 内容 |
|---|---|
| 分散性 | 各エージェントが中央制御を持たず自律的に委譲 |
| 一貫性 | 共通の会話履歴に基づく意思決定が可能 |
| 柔軟性 | User との対話、ツール連携も容易に統合可能 |
| 注意点 | 無限ループ防止やツール呼び出し制御の設計が必要 |
5. エージェント数や階層数の制約とその管理
AutoGen の Swarm パターンでは、エージェント数や階層数に対して明示的なハード制約は存在しないが、以下のような手法により間接的に管理・制御可能である。
5.1 制約の設定方法
| 制御手法 | 対象 | 内容 |
|---|---|---|
handoffs=[...] | 稼働エージェント数 | 各エージェントが委譲可能な相手を限定することで、Swarm に関与する数を抑制可能 |
MaxConsecutiveAutoReplyTermination | 会話階層の深さ | エージェント間の連鎖会話回数を制限(例:3回で打ち切り) |
カスタム TerminationCondition | 全般 | タスクのループ検出や呼び出し制限など、自作の論理条件で終了可能 |
SelectorGroupChat の活用 | 稼働選出制御 | 必要に応じて Swarm を使わずSelectorで制御可 |
5.2 実装例:階層の制限
pythonCopyEditfrom autogen_agentchat.conditions import MaxConsecutiveAutoReplyTermination# 3回以上連鎖不可
chat = GroupChat(
agents=[user, agent_a, agent_b],
messages=[],
max_round=20,
termination_condition=MaxConsecutiveAutoReplyTermination(n=3),
)
これにより、3回以上の連続エージェント応答を防ぎ、事実上の階層深度を制限できる。
6. parallel_tool_calls の補足解説
Swarm パターンでは、ツール呼び出しの逐次性が対話構造と制御フローの安定性に直結する。そのため、AutoGen の AssistantAgent に搭載されている parallel_tool_calls=True(デフォルト)設定は、Swarm 構成時には無効化すべきとされている。
6.1 問題点(True のまま使用した場合)
- HandoffMessage の競合:複数ツールを同時に呼び出すと、委譲先の制御が重複し、応答タイミングが不安定になる。
- 会話履歴の一貫性崩壊:Swarm の中核である「共通コンテキスト」の整合性が失われる恐れがある。
- ユーザー入力待ちの無視:”user” へのハンドオフが適切に機能せず、Human-in-the-Loop 処理が欠落する。
6.2 推奨設定
pythonCopyEditassistant = AssistantAgent(
name="agent_a",
model=...,
handoffs=[...],
parallel_tool_calls=False # Swarmパターンでは必須
)
上記のように逐次ツール呼び出しを明示することで、Swarm 本来の制御構造と対話安定性を維持できる。
7. Core API による高度制御との比較
Swarm は高レベル API に位置づけられるが、さらに細かい動作制御やシステム統合が必要な場合は Core API を直接使用した Handoff 実装が推奨される。
7.1 Swarm(AgentChat)と Core(BaseAgent)との違い
| 項目 | Swarm (AgentChat) | Core API (BaseAgent) |
|---|---|---|
| 実装難易度 | 低 | 高 |
| Handoff制御 | 自動構造あり | 開発者が明示的に定義 |
| 拡張性 | 限定的(プリセット依存) | 高(任意の条件分岐・ループ検出が可能) |
| 開発速度 | 高速プロトタイピング向き | 精密設計・商用向き |
7.2 選定指針
- 迅速なPoCや小規模な分散対話には Swarm(AgentChat)
- 複雑なルール管理・動的構成変化には Core API を選択するのが妥当
8. 結論と今後の展望
Swarm パターンは、AutoGen フレームワークにおけるマルチエージェント協調の基本形を提供し、以下のような特長を持つ:
- 自律分散型タスク処理の実現
- 会話履歴の統一による一貫性ある意思決定
handoffsによる明示的な制御移譲- ユーザー入力との自然な統合(Human-in-the-Loop)
ただし、設計次第では階層の深さやエージェント間の無限委譲による 暴走的構造も生じうるため、parallel_tool_calls の抑制や TerminationCondition の活用が必須となる。
今後、Swarm 構造は以下のような応用展開が期待される:
- ドメイン特化型エージェント群の協調応答(例:医療・法律・製造業)
- 複数モデル/複数APIの動的統合によるマルチバックエンド化
- 人間とAIの協調判断系(例:会議支援、コンサルティング、設計レビュー)


コメント