ADKで再現！エヴァンゲリオン「マギシステム」

## はじめに

エヴァンゲリオンに登場するスーパーコンピューターシステム「マギ」。3つの異なる思考（メルキオール、バルタザール、キャスパー）が合議によって意思決定を行うその仕組みは、現代のAIエージェントのアーキテクチャ設計においても非常に示唆に富んでいます。

本記事では、GoogleのAgent Development Kit (ADK) を用いて、このマギシステムの「**並列ファンアウト/ギャザーパターン**」を再現する方法を紹介します。複数のエージェントが並行して思考し、その結果を集約して最終決定を下すプロセスは、複雑なAIシステムの構築に役立つはずです。


## マギシステムの基本構造とADKでの再現

マギシステムは、以下の3つの独立したCPUで構成されています。

* **メルキオール (Melchior):** 科学的・論理的思考を担当。客観的なデータに基づき、最も合理的な結論を導き出す。
* **バルタザール (Balthasar):** 戦略的・実用的な思考を担当。現実的な実行可能性と成功確率を重視する。
* **キャスパー (Casper):** 道徳的・倫理的思考を担当。人間性や長期的な影響、倫理的側面を考慮する。

これらのCPUがそれぞれ独立した分析を行い、その結果を中央制御コンピューターが集約して最終的な判断を下します。ADKでは、これを`LlmAgent`（各CPU）と`ParallelAgent`、`SequentialAgent`（中央制御）を組み合わせることで再現できます。

### ADKにおける「並列ファンアウト/ギャザー」とは？

ADKの**並列ファンアウト/ギャザーパターン**は、複数の独立したエージェント（ファンアウト）を同時に実行し、その結果を後続のエージェント（ギャザー）が収集・集計するワークフローです。これにより、各CPUの思考を並行して進めることができ、システム全体の応答速度を向上させます。


## ADKエージェントの実装

それでは、具体的なADKコードを見ていきましょう。

### 0. 環境構築

最初に仮装環境の作成と必要なパッケージのインストールを行います。
```sh
# 仮想環境の作成と有効化
python3 -m venv env
source env/bin/activate
# 必要なパッケージのインストール
pip install google-adk google-generativeai
```

### 1. 各CPUエージェントの定義（LlmAgent）

まず、メルキオール、バルタザール、キャスパーをそれぞれ独立した`LlmAgent`として定義します。重要なのは、各エージェントの**役割を明確に指示するプロンプト**と、結果を保存するための`output_key`を指定することです。

```python
from google.adk.agents import LlmAgent, SequentialAgent, ParallelAgent

# 使用するLLMモデルIDを設定
# ご自身のGoogle Cloudプロジェクトで利用可能なモデルIDを設定してください。
# 例: "gemini-1.5-flash-latest", "gemini-pro"
MODEL_ID = "gemini-2.0-flash" 

# --- 各CPUエージェントの定義 ---

# メルキオールエージェント (科学的・論理的分析)
melchior_agent = LlmAgent(
    name="MelchiorAgent",
    instruction="""
    あなたはエヴァンゲリオンのマギシステムにおける「メルキオール」です。
    提示された状況に対し、科学的・論理的な思考のみに基づいて分析し、最も合理的かつ客観的な結論を導き出してください。
    感情を排除し、事実に基づいたデータ分析と確率論を用いて、最適な解決策や予測を提供してください。
    出力はJSON形式で、キー「reasoning」に判断理由、「conclusion」に結論を含めてください。
    """,
    model=MODEL_ID,
    output_key="melchior_analysis" # 結果を 'melchior_analysis' キーで状態に保存
)

# バルタザールエージェント (戦略的・実用的分析)
balthasar_agent = LlmAgent(
    name="BalthasarAgent",
    instruction="""
    あなたはエヴァンゲリオンのマギシステムにおける「バルタザール」です。
    提示された状況に対し、戦略的かつ実用的な思考に基づいて分析し、現実的な実行可能性と成功確率を考慮した結論を導き出してください。
    複数の選択肢とその結果を提示し、リスク管理と回避策の検討も重視してください。
    出力はJSON形式で、キー「reasoning」に判断理由、「conclusion」に結論を含めてください。
    """,
    model=MODEL_ID,
    output_key="balthasar_strategy" # 結果を 'balthasar_strategy' キーで状態に保存
)

# キャスパーエージェント (道徳的・倫理的分析)
casper_agent = LlmAgent(
    name="CasperAgent",
    instruction="""
    あなたはエヴァンゲリオンのマギシステムにおける「キャスパー」です。
    提示された状況に対し、道徳的・倫理的な側面から評価し、人間性や長期的な影響、倫理的リスクを考慮した意見を提示してください。
    倫理的観点からの懸念や警告、あるいは人間的な配慮の必要性を提言する形で影響を与えてください。
    出力はJSON形式で、キー「reasoning」に判断理由、「conclusion」に結論を含めてください。
    """,
    model=MODEL_ID,
    output_key="casper_ethics" # 結果を 'casper_ethics' キーで状態に保存
)
```

### 2. 並列実行と中央制御による集約のワークフロー

次に、`ParallelAgent`で上記の3つのCPUを並行して実行し、その後に`LlmAgent`である中央制御コンピューターで結果を集約・判断する`SequentialAgent`を構築します。

```python
# --- 並列実行（ファンアウト）部分 ---
# メルキオール、バルタザール、キャスパーを同時に実行
gather_concurrent_cpu_outputs = ParallelAgent(
    name="ConcurrentCPUS",
    sub_agents=[melchior_agent, balthasar_agent, casper_agent]
)

# --- 中央制御コンピューター（ギャザー）部分 ---
# 各CPUからの情報を状態 (state) から読み取り、統合判断を行うLlmAgent
magi_central_control_agent = LlmAgent(
    name="MAGICentralControlAgent",
    instruction="""
    あなたはエヴァンゲリオンのマギシステムの中央制御コンピューターです。
    以下の情報を統合し、最終的な意思決定を下してください。

    メルキオールの分析: {{melchior_analysis}}
    バルタザールの戦略: {{balthasar_strategy}}
    キャスパーの倫理的評価: {{casper_ethics}}

    これらの異なる視点を総合的に評価し、状況の緊急性、目標達成への効率性、リスク、倫理的妥当性を考慮して、最終的な判断を行ってください。
    出力はJSON形式で、キー「integrated_reasoning」に統合判断の理由、「final_decision」に最終的な行動方針または結論を含めてください。
    """,
    model=MODEL_ID # 中央制御コンピューターもLLMを使用
)

# --- マギシステム全体のパイプライン ---
# SequentialAgent内にParallelAgentとGathering Agentをネストし、ワークフローを定義
magi_pipeline = SequentialAgent(
    name="MAGISystemWithParallel",
    sub_agents=[
        gather_concurrent_cpu_outputs, # 最初に3つのCPUを並列で実行
        magi_central_control_agent     # その後、中央制御コンピューターが結果を集約し最終判断
    ]
)

# ADKがロードするエージェントのルートとして定義
root_agent = magi_pipeline
```
### 3. .env
Google AI Studioで取得したGeminiのAPIキーを記入します。

```
GOOGLE_GENAI_USE_VERTEXAI=FALSE
GOOGLE_API_KEY=【GeminiのAPIキー】
```

### 4. \_\_init__.py

```
from . import agent
```



## プロジェクトのセットアップと実行

このコードを実行するには、ADKプロジェクトの正しいディレクトリ構造と、`root_agent`の定義が必要です。

```
/your_project_root/
├── magi_agent/
    ├── __init__.py 
    ├── .env        # (Optional) APIキーなどの環境変数を記述
    └── agent.py    # 上記のADKエージェント定義を記述

```

`magi_agent/agent.py`に上記のコードを保存し、`__init__.py`ファイルを配置してください。

### 実行コマンド

プロジェクトのルートディレクトリで以下のADK webコマンドを実行します。

```bash
adk web
```

これにより、ADKにビルトインされている開発用UIが立ち上がります。
コンソールに表示されたURLにアクセスすると、このような画面に遷移します。

![スクリーンショット 2025-06-17 19.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107686/cb8fbcba-3573-49a4-8135-1ad418516cb7.png)

左上の「select an agent」から先ほど作成した「magi_agent」を選択します。
すると画面の表示が変わり、プロンプトの入力欄が表示されました。
![スクリーンショット 2025-06-17 19.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107686/72e7aca5-ec70-44bf-950e-5c2952664eb1.png)

試しにMAGIにエヴァンゲリオンっぽい感じで「緊急事態！使徒が第3新東京市に接近中。迎撃戦略を立案せよ。」と命令してみます。

するとこのようにそれぞれのエージェントから回答が返ってきます。![スクリーンショット 2025-06-17 19.39.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107686/63431fe1-6e39-4bcf-a010-0db2323cae22.png)

最終的な結論は以下のようになりました。

>最終判断：段階的迎撃戦略の実行
理由:
>
>生存優先: 使徒迎撃は人類の生存に関わる最優先事項である。（キャスパー）
効率性: メルキオールの提案する段階的迎撃は、初期段階で敵戦力を減衰させ、最終的にエヴァンゲリオンによる殲滅を目指す、成功確率の高い戦略である。（メルキオール：0.99）
リスク管理: バルタザールの提案するPlan A（初期迎撃プラン：段階的防御）は、都市防衛システムの活用により、エヴァンゲリオンへの依存を減らし、リスクを抑制する。
倫理的配慮: キャスパーの提言に基づき、市民の避難を最優先とし、環境への影響を最小限に抑えるよう努める。
行動方針:
>
>市民の避難: 最優先で市民の避難を開始。安全な避難経路と避難場所を確保。（キャスパー）
初期迎撃 (バルタザールPlan A):
第3新東京市防御システムを起動し、使徒に対し迎撃ミサイルを発射。
ポジトロン砲のチャージを開始。
エヴァンゲリオン初号機の出撃準備。
使徒のATフィールド強度、攻撃方法、移動速度を観測。
必要に応じて、ポジトロン砲を発射。
段階的迎撃への移行 (メルキオール):
初期迎撃の効果が不十分な場合、迎撃地点B（市街地境界）に陽電子砲を展開し、使徒を捕捉する。
エヴァンゲリオン投入 (メルキオール & バルタザールPlan B):
最終防衛ライン（NERV本部直上）にて、エヴァンゲリオン初号機を投入。
パイロット（シンジ）の精神状態をモニタリングし、適切なサポート体制を構築。（キャスパー）
接近戦に備え、プログレッシブナイフ、ポジトロンライフル（近接射撃用）を装備。
ATフィールドを中和または破壊する戦略を立案。
使徒の弱点を探し、攻撃。
最終手段 (バルタザールPlan C):
上記プランが全て失敗した場合、または使徒の殲滅が不可能と判断した場合、ネルフ司令官の承認を得て、N2爆弾の使用を検討する。これは最終手段とし、倫理的リスクを十分に考慮する。（キャスパー）
モニタリングと戦略修正: 各プランの実行状況はリアルタイムでモニタリングし、必要に応じて戦略を修正する。（バルタザール）
戦闘後の復旧: 戦闘後には、速やかに復旧作業を開始し、市民生活の安定を図る。（キャスパー）
>特記事項:
>
>パイロットへの精神安定剤の準備、エヴァンゲリオンの予備パーツの準備、市街地への被害を最小限に抑えるための戦闘区域制限、ネルフ本部からの遠隔サポート体制を確立する。
環境汚染の影響を最小限に抑えるための対策を講じる。
国際社会への説明責任を果たすための準備を行う。
実行。

なんだかそれっぽい回答になっていますね！


## まとめ

本記事では、ADKの`LlmAgent`、`ParallelAgent`、`SequentialAgent`を組み合わせることで、エヴァンゲリオンのマギシステムを再現する方法を紹介しました。

この「並列ファンアウト/ギャザーパターン」は、複雑な意思決定を伴うAIシステムや、複数の異なる視点からの分析が必要な場面において非常に強力なアプローチです。ADKを活用して、あなたも独自のマルチエージェントシステムを構築してみてはいかがでしょうか。

## 参考

https://google.github.io/adk-docs/

https://qiita.com/youtoy/items/1d129272bd2bebc7c0f5

https://zenn.dev/hakoten/articles/06557100337fb3