マルチエージェントシステムとは何か
マルチエージェントシステム(MAS) とは、複数のAIエージェントが役割を分担し、連携して複雑なタスクを達成する仕組みです。1つの巨大なモデルに全てを任せる代わりに、専門性を持つ複数の小さなエージェントを協調させることで、より高品質で信頼性の高いアウトプットが得られます。
Antigravity はマルチエージェント開発に強力な基盤を提供しており、2026年現在、AgentKit 2.0 との統合によってエージェント間の通信・状態管理・タスク分配が格段に容易になっています。
ここで扱うのはAntigravityを使ったマルチエージェントシステムの 設計思想から実装・本番運用 までを体系的に解説します。
なぜマルチエージェントが必要か
単一エージェントには以下の限界があります。
コンテキストウィンドウの制約
1つのエージェントが処理できる情報量には上限があります。大規模なコードベースの分析や、長期にわたるプロジェクト管理では、単一エージェントではコンテキストが溢れます。
専門性の欠如
汎用エージェントはすべてのタスクで平均的な品質を出しますが、専門エージェントは特定の領域で人間のエキスパートに近い精度を発揮します。
並列処理の不可
単一エージェントはタスクを順番に処理しますが、マルチエージェントは複数のサブタスクを並列で実行できます。
フォールトトレランスの欠如
1つのエージェントが失敗すると全体が止まりますが、マルチエージェントは失敗したエージェントを他のエージェントが補完できます。
マルチエージェント設計の基本パターン
パターン1:階層型(Hierarchical)
オーケストレーターエージェント が全体を統括し、ワーカーエージェント に具体的なサブタスクを割り当てます。
Orchestrator Agent
├── Researcher Agent(情報収集担当)
├── Analyst Agent(分析担当)
├── Writer Agent(文書作成担当)
└── Reviewer Agent(品質確認担当)
ユースケース: コンテンツ生成パイプライン、調査レポート自動作成、コードレビューシステム
パターン2:パイプライン型(Pipeline)
各エージェントが順番に処理を行い、前エージェントのアウトプットを次エージェントへ渡します。
Input → [前処理Agent] → [変換Agent] → [検証Agent] → Output
ユースケース: データ変換・クレンジング、多段階翻訳、テスト自動生成パイプライン
パターン3:並列型(Parallel)
同一または類似のタスクを複数エージェントが並列で実行し、最終エージェントが結果を統合します。
┌→ Agent A(手法1)→┐
Master Agent → ├→ Agent B(手法2)→ → Aggregator Agent → Output
└→ Agent C(手法3)→┘
ユースケース: 複数の観点からの文書評価、A/Bテストの並列実行、分散データ収集
Antigravity での実装:ステップバイステップ
Step 1:プロジェクト構造の設計
my-multi-agent-project/
├── agents/
│ ├── orchestrator.md ← マスターエージェントの指示
│ ├── researcher.md ← 調査エージェントの指示
│ ├── analyst.md ← 分析エージェントの指示
│ └── writer.md ← 執筆エージェントの指示
├── tools/
│ ├── web_search.py ← Web検索ツール
│ ├── file_reader.py ← ファイル読み込みツール
│ └── data_processor.py ← データ処理ツール
├── prompts/
│ └── task_templates/ ← タスク別プロンプトテンプレート
└── main.py ← エントリーポイント
Step 2:エージェントの定義(AGENTS.md 方式)
Antigravity では AGENTS.md ファイルにマルチエージェントの役割と責任を定義できます。
# Multi-Agent System Configuration
## Orchestrator Agent
役割: 全体の調整・タスク分解・品質管理
権限: 他の全エージェントへのタスク割り当て・状態確認
ツール: task_manager, status_monitor
## Researcher Agent
役割: 情報収集・データ取得・一次情報の整理
権限: web_search, file_read(読み取りのみ)
制約: 外部への書き込みを行わない
ツール: web_search, url_fetch, file_reader
## Analyst Agent
役割: 収集した情報の分析・パターン抽出・洞察生成
権限: データ処理ツールへのアクセス
入力: Researcher Agent からのデータ
ツール: data_processor, chart_generator
## Writer Agent
役割: 最終レポートの作成・フォーマット・ユーザー向け整理
権限: file_write(指定ディレクトリのみ)
入力: Analyst Agent からの分析結果
ツール: document_writer, markdown_formatter
Step 3:エージェント間通信の実装
from antigravity_sdk import AgentOrchestrator, Agent, Task
# エージェントの定義
orchestrator = Agent(
name="orchestrator",
instruction_file="agents/orchestrator.md",
model="gemini-2.5-pro-latest", # 高品質な判断が必要
)
researcher = Agent(
name="researcher",
instruction_file="agents/researcher.md",
model="gemini-2.5-flash", # 速度重視
tools=["web_search", "url_fetch"]
)
analyst = Agent(
name="analyst",
instruction_file="agents/analyst.md",
model="gemini-2.5-pro-latest",
tools=["data_processor"]
)
writer = Agent(
name="writer",
instruction_file="agents/writer.md",
model="gemini-2.5-flash",
tools=["document_writer"]
)
# オーケストレーターにエージェントを登録
orch = AgentOrchestrator(
master=orchestrator,
workers=[researcher, analyst, writer]
)
# タスクの実行
result = orch.run(
task="2026年の生成AI市場動向を調査・分析し、投資家向けレポートを作成してください",
output_format="markdown",
max_iterations=10
)
print(result.content)
Step 4:タスク分解と並列実行
import asyncio
from antigravity_sdk import ParallelAgentRunner
async def run_parallel_analysis(topic: str) -> dict:
"""
複数の観点から同時に分析を行う並列マルチエージェント
"""
runner = ParallelAgentRunner()
# 同一トピックを3つの異なる観点から並列分析
tasks = [
runner.submit(
agent="analyst",
task=f"{topic}の技術的な観点からの分析",
context={"perspective": "technical"}
),
runner.submit(
agent="analyst",
task=f"{topic}のビジネス・市場観点からの分析",
context={"perspective": "business"}
),
runner.submit(
agent="analyst",
task=f"{topic}のリスク・課題観点からの分析",
context={"perspective": "risks"}
)
]
# 並列で全タスクを実行(3x高速化)
results = await asyncio.gather(*tasks)
# 結果を統合エージェントに渡す
aggregator = runner.get_agent("aggregator")
final_report = await aggregator.synthesize(results)
return final_report
# 実行
report = asyncio.run(run_parallel_analysis("量子コンピュータの商用化"))
エラーハンドリングとリカバリー
本番のマルチエージェントシステムではエラーハンドリングが重要です。
from antigravity_sdk import AgentOrchestrator, AgentError, RetryPolicy
class ResilientOrchestrator:
"""
フォールトトレラントなマルチエージェントオーケストレーター
"""
def __init__(self):
self.orchestrator = AgentOrchestrator(...)
self.retry_policy = RetryPolicy(
max_retries=3,
backoff_factor=2.0,
retry_on=[AgentError.TIMEOUT, AgentError.RATE_LIMIT]
)
self.fallback_agents = {
"researcher": "researcher_backup", # バックアップエージェント
}
async def run_with_recovery(self, task: str) -> dict:
"""エラーリカバリー付きでタスクを実行"""
for attempt in range(self.retry_policy.max_retries):
try:
return await self.orchestrator.run(task)
except AgentError.CONTEXT_OVERFLOW as e:
# コンテキスト超過 → タスクを分割して再実行
subtasks = self._split_task(task, e.failed_agent)
return await self._run_subtasks(subtasks)
except AgentError.AGENT_FAILURE as e:
# エージェント失敗 → フォールバックエージェントで再試行
failed_name = e.agent_name
if failed_name in self.fallback_agents:
self.orchestrator.replace_agent(
failed_name,
self.fallback_agents[failed_name]
)
except AgentError.TIMEOUT:
wait_time = self.retry_policy.backoff_factor ** attempt
print(f"タイムアウト。{wait_time}秒後に再試行...")
await asyncio.sleep(wait_time)
raise Exception("最大リトライ回数超過")
def _split_task(self, task: str, failed_agent: str) -> list[str]:
"""コンテキスト超過時のタスク分割ロジック"""
# タスクを意味的に分割する実装
...
状態管理とメモリ共有
マルチエージェント間で情報を共有するための状態管理パターンです。
from antigravity_sdk import SharedMemory, AgentContext
# 共有メモリの初期化
shared_memory = SharedMemory(
backend="redis", # または "sqlite" / "in-memory"
namespace="project-x"
)
class ResearchAgent:
def __init__(self, memory: SharedMemory):
self.memory = memory
async def research(self, topic: str) -> None:
# 調査結果を共有メモリに保存
results = await self._web_search(topic)
await self.memory.set(
key=f"research:{topic}",
value=results,
ttl=3600 # 1時間キャッシュ
)
class AnalystAgent:
def __init__(self, memory: SharedMemory):
self.memory = memory
async def analyze(self, topic: str) -> str:
# 共有メモリから調査結果を読み取り
research_data = await self.memory.get(f"research:{topic}")
if not research_data:
raise ValueError(f"Research data for '{topic}' not found")
return await self._analyze(research_data)
本番環境での監視とデバッグ
エージェント実行のログ収集
import logging
from antigravity_sdk import AgentLogger
# 構造化ログの設定
agent_logger = AgentLogger(
output="./logs/agent_runs.jsonl",
include_prompts=True, # プロンプトをログに含める
include_responses=True, # 応答をログに含める
include_tool_calls=True, # ツール呼び出しをログに含める
log_level=logging.INFO
)
# ログから実行コストを分析
from antigravity_sdk import CostAnalyzer
analyzer = CostAnalyzer("./logs/agent_runs.jsonl")
report = analyzer.generate_report()
print(f"総トークン消費: {report.total_tokens:,}")
print(f"推定コスト: ${report.estimated_cost:.4f}")
print(f"最もコスト高なエージェント: {report.most_expensive_agent}")
パフォーマンス最適化の指針
- モデルの使い分け: 判断・推論が必要なタスクには高性能モデル、単純な処理には軽量・高速モデル
- 並列化: 依存関係のないタスクは並列実行で全体時間を短縮
- キャッシュ活用: 同一クエリの繰り返し実行はキャッシュで無駄なAPI呼び出しを防ぐ
- コンテキスト管理: エージェントに渡す情報は必要最小限に絞る
実践的なユースケース例
ユースケース1:コードレビュー自動化パイプライン
PR 作成
→ [Syntax Agent] コード構文チェック
→ [Security Agent] セキュリティ脆弱性スキャン(並列)
→ [Performance Agent] パフォーマンス問題の検出(並列)
→ [Style Agent] コーディング規約の確認(並列)
→ [Review Aggregator] 各エージェントのフィードバックを統合
→ PR コメントとして自動投稿
ユースケース2:競合分析レポート生成
競合分析の依頼
→ [Data Collector Agent] 公開情報の収集(並列×5社)
→ [Analyst Agent] 各社データの分析
→ [Trend Agent] 業界トレンドの特定
→ [Strategy Agent] 戦略的示唆の抽出
→ [Writer Agent] 経営層向けレポートの作成
→ 最終レポートをSlack/メールに自動配信
個人開発者の視点から(実体験メモ)
ここまでの要点
Antigravityを使ったマルチエージェント協調システムの構築は、以下のアプローチで段階的に進めることをおすすめします。
- パターン選択: 階層型・パイプライン型・並列型から適切なパターンを選ぶ
- 役割設計: 各エージェントの責任範囲を明確に定義する(AGENTS.md活用)
- 段階的実装: まず2〜3エージェントで動くプロトタイプを作り、徐々に拡張する
- エラーハンドリング: リトライ・フォールバック・タスク分割の仕組みを実装する
- 本番監視: ログ・コスト・パフォーマンスの継続的なモニタリング体制を整える
マルチエージェントシステムは複雑に見えますが、適切な設計パターンと段階的な実装で、個人開発者でも十分に扱いきれます。ぜひ小さなプロトタイプから始めてみてください。
マルチエージェントの基礎を固めたい方には、マルチエージェントオーケストレーションの発展ガイドも合わせてご覧ください。