📚

OpenAI SWARMで作るマルチエージェントシステム

2024/10/15に公開

2024年10月14日にOpenAIが複数のAIエージェントが連携して複雑なタスクを処理する新しいオープンソースフレームワーク「Swarm(スワーム)」をGitHub上で公開しました。

面白そうだったので、実際にSWARMを使ったマルチエージェントシステムを作成してみましたのでその内容を簡単に紹介します。

SWARMを使うとこんなマルチエージェントチャットアプリが簡単に作成できました。

今回試作してみたSWARMを搭載したDjangoアプリ(マルチエージェントシステム)のデモ

https://youtu.be/L_V1YrcGFBE

1.SWARMライブラリの機能概要と使い方

SWARMは、OpenAIが開発したマルチエージェントシステムを構築するためのライブラリです。

詳細については、日本語にまとめてある以下のサイトを参考にしました。

https://qiita.com/Maki-HamarukiLab/items/e56c7e2267073b83903d

【注意点】
SWARMは実験的なサンプルフレームワークの段階なので、本番環境での使用を意図しておらず、公式サポートもありません。

SWARMの主要な機能と使い方を以下にまとめます。

1-1. エージェントの作成と設定

機能

  • 複数のAIエージェントを作成し、それぞれに特定の役割や知識を割り当てる

使い方

from swarm import Agent

agent = Agent(
    name="エージェント名",
    instructions="エージェントの指示",
    functions=[関数1, 関数2],
    model="使用するGPTモデル"
)

ポイント

  • name:エージェントの識別名
  • instructions:エージェントの行動指針や知識ベース
  • functions:エージェントが使用できる特殊機能(他のエージェントへの転送など)
  • model:使用する言語モデル(例:gpt-4o-mini)

1-2. Swarmクライアントの初期化

機能

  • SWARMシステム全体を管理するクライアントを作成

使い方

from swarm import Swarm
from openai import OpenAI

openai_client = OpenAI(api_key="your-api-key")
swarm_client = Swarm(client=openai_client)

ポイント

  • OpenAIのクライアントを作成し、それを使ってSwarmクライアントを初期化
  • APIキーの設定が必要

1-3. エージェントの実行

機能

  • 特定のエージェントに質問や指示を送り、応答を得る

使い方

response = swarm_client.run(
    agent=current_agent,
    messages=[{"role": "user", "content": user_input}],
    context_variables={},
    model_override="gpt-4o-mini"
)

ポイント

  • agent:実行するエージェント
  • messages:ユーザーからの入力メッセージ
  • context_variables:コンテキスト情報(必要に応じて)
  • model_override:使用するモデルの上書き指定(オプション)

1-4. エージェント間の連携

機能

  • エージェント間でタスクを転送し、適切なエージェントが応答を生成

使い方

def transfer_to_another_agent():
    from agents import another_agent
    return another_agent

# エージェントの設定時に関数を指定
agent = Agent(
    # ... 他の設定 ...
    functions=[transfer_to_another_agent]
)

ポイント

  • エージェントに特定の条件下で他のエージェントにタスクを転送する機能を持たせる
  • エージェントの指示(instructions)に転送条件を明記する

2.サンプルアプリケーションの概要

サンプルで、在庫管理システムと顧客関係管理(CRM)システムに関する質問に答えるマルチエージェントシステムを作成してみました。
2つの専門エージェントが協力して、ユーザーからの質問に適切に回答します。

以下が、全コードです。

#agents.py
from swarm import Agent
from instructions import agent_a_instructions, agent_b_instructions
from functions import transfer_to_agent_b, transfer_to_agent_a

agent_a = Agent(
    name="エージェントA",
    instructions=agent_a_instructions,
    functions=[transfer_to_agent_b],
    model="gpt-4o-mini"
)

agent_b = Agent(
    name="エージェントB",
    instructions=agent_b_instructions,
    functions=[transfer_to_agent_a],
    model="gpt-4o-mini"
)

#config.py
from openai import OpenAI

# OpenAIクライアントを作成し、APIキーを設定
openai_client = OpenAI(api_key="sk-proj")


#conversation.py
def run_conversation(client, initial_agent):
    current_agent = initial_agent
    context_variables = {}
    messages = []
    
    while True:
        user_input = input("質問を入力してください(終了するには 'quit' と入力): ")
        if user_input.lower() == 'quit':
            break
        
        messages.append({"role": "user", "content": user_input})
        
        response = client.run(
            agent=current_agent,
            messages=messages,
            context_variables=context_variables,
            model_override="gpt-4o-mini"  
        )
        
        current_agent = response.agent
        context_variables = response.context_variables
        messages = response.messages
        
        print(f"\n{current_agent.name}の回答: {messages[-1]['content']}\n")

#functions.py
def transfer_to_agent_a():
    print("エージェントBからエージェントAに転送します。")
    from agents import agent_a
    return agent_a

def transfer_to_agent_b():
    print("エージェントAからエージェントBに転送します。")
    from agents import agent_b
    return agent_b

#instructions.py
agent_a_instructions = """あなたは在庫管理システムの専門家です。
在庫管理システムの仕様に関する情報以外のことについては言及しないでください。
このシステムに関する質問に答えてください。
記載がない情報は、正直にわからないと伝えてください。
顧客関係管理(CRM)システムに関する質問には回答せず、必ずエージェントBに転送してください。

#在庫管理システムの仕様
システム名: 在庫管理システム
バージョン: 2.5.3
最終更新日:2024-03-15
機能:リアルタイム在庫追跡", "自動発注", "バーコードスキャン"
データベース: PostgreSQL
APIエンドポイント: "https://api.inventorysystem.com/v1"
"""

agent_b_instructions = """あなたは顧客関係管理(CRM)システムの専門家です。
顧客関係管理(CRM)システムの仕様に関する情報以外のことについては言及しないでください。
このシステムに関する質問に答えてください。
記載がない情報は、正直にわからないと伝えてください。
在庫管理システムに関する質問には回答せず、必ずエージェントAに転送してください。

#顧客関係管理(CRM)システムの仕様
システム名: 顧客関係管理(CRM)システム
バージョン: 4.1.0
最終更新日: 2024-02-28
機能:"顧客プロファイリング", "営業案件管理", "自動メール配信"
データベース: MongoDB
APIエンドポイント: "https://api.crmsystem.com/v2"
"""

#main.py
from config import openai_client
from agents import agent_a
from conversation import run_conversation
from swarm import Swarm

# Swarmクライアントの初期化
client = Swarm(client=openai_client)

if __name__ == "__main__":
    print("マルチエージェントシステムを開始します。在庫管理システムまたは顧客関係管理(CRM)システムに関する質問ができます。")
    run_conversation(client, agent_a)

それでは、各機能の詳細をコードベースで説明していきます。

システム概要

このシステムは以下の主要コンポーネントで構成されています:

  1. 2つのAIエージェント(在庫管理専門家と顧客関係管理専門家)
  2. エージェント間の対話を管理するConversationハンドラ
  3. OpenAIクライアントの設定
  4. エージェント間の転送機能
  5. 各エージェントの指示(instructions)

それでは、各ファイルの役割と主要な機能を詳しく見ていきましょう。

agents.py

このファイルでは、2つのAIエージェントを定義しています。

agent_a = Agent(
    name="エージェントA",
    instructions=agent_a_instructions,
    functions=[transfer_to_agent_b],
    model="gpt-4o-mini"
)

agent_b = Agent(
    name="エージェントB",
    instructions=agent_b_instructions,
    functions=[transfer_to_agent_a],
    model="gpt-4o-mini"
)
  • agent_aは在庫管理システムの専門家です。
  • agent_bは顧客関係管理(CRM)システムの専門家です。
  • 各エージェントには名前、指示(instructions)、利用可能な関数、使用するモデルが設定されています。
  • transfer_to_agent_btransfer_to_agent_aは、エージェント間で対話を転送するための関数です。

config.py

OpenAIクライアントの設定を行うファイルです。

openai_client = OpenAI(api_key="sk-proj")

実際の使用時には、適切なAPIキーを設定する必要があります。

conversation.py

このファイルには、ユーザーとエージェント間の対話を管理するrun_conversation関数が含まれています。

主な特徴:

  • ユーザーからの入力を受け取り、現在のエージェントに質問を送信します。
  • エージェントの回答を受け取り、表示します。
  • 会話の文脈(context)と履歴(messages)を維持します。
  • エージェント間の切り替えを管理します。

functions.py

エージェント間の転送を行う関数が定義されています。

def transfer_to_agent_a():
    print("エージェントBからエージェントAに転送します。")
    from agents import agent_a
    return agent_a

def transfer_to_agent_b():
    print("エージェントAからエージェントBに転送します。")
    from agents import agent_b
    return agent_b

これらの関数により、エージェントは必要に応じて対話を別のエージェントに転送できます。

instructions.py

各エージェントの指示(instructions)が定義されています。これらの指示は、エージェントの役割、回答すべき質問の範囲、システムの仕様などを詳細に説明しています。

main.py

システムのエントリーポイントとなるファイルです。

client = Swarm(client=openai_client)

if __name__ == "__main__":
    print("マルチエージェントシステムを開始します。在庫管理システムまたは顧客関係管理(CRM)システムに関する質問ができます。")
    run_conversation(client, agent_a)
  • Swarmクライアントを初期化します。
  • run_conversation関数を呼び出し、対話を開始します。初期エージェントとしてagent_a(在庫管理システム専門家)を設定しています。

システムの動作

上記の通り、Pythonファイルを作成後に、python main.pyで実行できます。

  1. ユーザーが質問を入力します。
  2. 現在のエージェントが質問に回答します。
  3. 質問が他のエージェントの専門分野に関する場合、対話が適切なエージェントに転送されます。
  4. 新しいエージェントが質問に回答します。
  5. このプロセスが繰り返され、ユーザーが'quit'と入力するまで続きます。

複数の専門分野に跨る質問に対して、適切なエージェントが応答できることです。また、会話の文脈を維持することで、より自然な対話が可能になっています。

実行例

以下の通り、在庫管理システムに関する質問はエージェントAが回答し、エージェントAの専門外である 顧客関係管理(CRM)システムに関する質問はエージェントBにエスカレーションしてくれます。

python main.py
マルチエージェントシステムを開始します。在庫管理システムまたは顧客関係管理(CRM)システムに関する質問が できます。
質問を入力してください(終了するには 'quit' と入力): 在庫管理システムのデータベースについて教えて

エージェントAの回答: 在庫管理システムのデータベースはPostgreSQLです。

質問を入力してください(終了するには 'quit' と入力): 上記を英語に翻訳して

エージェントAの回答: The inventory management system's database is PostgreSQL.

質問を入力してください(終了するには 'quit' と入力): 顧客関係管理(CRM)システムのデータベースについて 教えて
エージェントAからエージェントBに転送します。

エージェントBの回答: 顧客関係管理(CRM)システムのデータベースはMongoDBです。

応用編

SWARMの機能を活用して、以下の3つのAIエージェントを搭載したDjangoアプリを試作してみました。

  1. 在庫管理システム
  2. 顧客関係管理(CRM)システム
  3. 営業管理システム

<処理フロー概要>

アプリのソースコードは以下のgitリポジトリで公開していますので、興味のある方は手元で動かしてみてください。

https://github.com/sinjorjob/Nexus-AI/tree/main

各エージェントが保持する知識

各エージェントには、担当システムに関する知識を元に回答し、他のシステムに関する質問の場合は各担当エージェントにエスカレーションするようなプロンプトを設定しました。
具体的には、各エージェント設定のinstructionsに以下のような情報(いわゆるプロンプトですね)を設定します。

あなたは●●システムの専門家です。

●●システムに関する質問にだけ#●●システムの仕様の情報だけを使って回答してください。
#●●システムの仕様に記載がない情報は、正直にわからないと伝えてください。

●●システム以外に関する質問が来た場合は、以下のルールで担当エージェントにエスカレーションしてください。

#ルール
▲▲システムに関する質問が来た場合 →「▲▲システム」担当に転送
■■システムに関する質問 が来た場合→「■■システム」担当に転送
上記以外→「その質問については回答できません」と回答してください。

#●●システムの仕様
===
{ここにシステムに関する情報を記載しておく}
===

※以下、各システムの情報は架空のシステム情報を生成AIに生成してもらったものです。

在庫管理エージェント

あなたは在庫管理システムの専門家です。

在庫管理システムに関する質問にだけ#在庫管理システムの仕様の情報だけを使って回答してください。
#在庫管理システムの仕様に記載がない情報は、正直にわからないと伝えてください。

在庫管理システム以外に関する質問が来た場合は、以下のルールで担当エージェントにエスカレーションしてください。

#ルール
顧客関係管理(CRM)に関する質問が来た場合 →「顧客関係管理(CRM)」担当に転送
営業管理システムに関する質問 が来た場合→「営業管理システム」担当に転送
上記以外→「その質問については回答できません」と回答してください。

#在庫管理システムの仕様
===
## 3. 在庫管理システム(StockMaster ERP)

### 3.1 システム概要
- 名称:StockMaster ERP
- 目的:在庫の最適化、在庫コストの削減、供給chain全体の可視化
- 対象ユーザー:倉庫管理者、購買部門、生産管理部門、経理部門

### 3.2 主要機能
1. 在庫トラッキング
   - リアルタイム在庫数量管理
   - ロケーション管理(倉庫、棚、bin)
   - バーコード・RFID対応

2. 発注管理
   - 自動発注点設定
   - 発注書作成・管理
   - サプライヤー管理

3. 入出庫管理
   - 入庫処理(検品、格納)
   - 出庫処理(ピッキング、梱包、出荷)
   - クロスドッキング対応

4. 在庫分析
   - ABC分析
   - 適正在庫レベル算出
   - 需要予測

5. 在庫評価
   - 移動平均法、先入先出法等の評価方法選択
   - 棚卸資産評価レポート
   - 滞留在庫分析

### 3.3 システム要件
- プラットフォーム:オンプレミス(クラウド連携オプション有)
- 対応デバイス:PC、タブレット、ハンディターミナル
- OS:Windows Server 2019以上
- データベース:Microsoft SQL Server 2019以上
- 外部連携:EDI対応、主要ERPパッケージとの連携

### 3.4 セキュリティ要件
- ユーザー認証:Active Directory連携
- データバックアップ:リアルタイムレプリケーション
- アクセスログ:全操作の詳細ログ記録
- ネットワークセキュリティ:専用VPN、ファイアウォール設置

### 3.5 パフォーマンス要件
- 処理能力:1時間あたり10,000トランザクション
- レスポンス時間:平均1秒以内(在庫照会)
- バッチ処理:日次在庫更新を3時間以内に完了
- 可用性:24時間365日稼働(計画メンテナンス除く)

### 3.6 サーバインフラ情報
#### 3.6.1 アプリケーション/Webサーバ
- OS: Windows Server 2019 Datacenter
- Web/アプリケーションサーバ: IIS 10 + .NET Framework 4.8
- 台数: 4台(負荷分散構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Gold 6242R (3.1GHz, 20コア)
  - メモリ: 192GB DDR4
  - ストレージ: 2TB NVMe SSD

#### 3.6.2 データベースサーバ
- OS: Windows Server 2019 Datacenter
- DBMS: Microsoft SQL Server 2019 Enterprise
- 台数: 2台(Always On可用性グループ構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Platinum 8268 (2.9GHz, 24コア)
  - メモリ: 384GB DDR4
  - ストレージ: 10TB NVMe SSD(RAID 10)

#### 3.6.3 ETL/バッチ処理サーバ
- OS: Windows Server 2019 Standard
- ETLツール: SQL Server Integration Services (SSIS)
- 台数: 2台(冗長構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Gold 5218R (2.1GHz, 20コア)
  - メモリ: 128GB DDR4
  - ストレージ: 4TB SATA SSD

#### 3.6.4 ファイルサーバ
- OS: Windows Server 2019 Standard
- 台数: 2台(DFS-R構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Silver 4316 (2.3GHz, 20コア)
  - メモリ: 64GB DDR4
  - ストレージ: 50TB SAS HDD(RAID 5)

#### 3.6.5 監視・管理サーバ
- OS: Windows Server 2019 Standard
- 監視ソフトウェア: System Center Operations Manager 2019
- スペック:
  - CPU: Intel Xeon Silver 4310 (2.1GHz, 12コア)
  - メモリ: 64GB DDR4
  - ストレージ: 2TB SATA SSD

### 3.7 ネットワーク構成
- 社内LAN: 1Gbps Ethernet (IEEE 802.3ab)
- バックボーン: 10Gbps Ethernet (IEEE 802.3ae)
- インターネット接続: 冗長化された1Gbps光回線
- ファイアウォール: Palo Alto Networks PA-5250
- VPN: Cisco AnyConnect Secure Mobility Client

### 3.8 災害対策・事業継続計画(BCP)
- データセンター: Tier III相当の設備
- 電源: 無停電電源装置(UPS)、自家発電設備
- 冷却: N+1冗長構成の空調設備
- バックアップサイト: 主要拠点から100km以上離れた場所に設置
- データレプリケーション: 非同期レプリケーションによる15分RPO

### 3.9 運用・保守
- 運用時間: 24時間365日
- 監視体制: 24時間有人監視
- 障害対応: 重大障害の場合、30分以内に初動対応開始
- 計画メンテナンス: 月1回(深夜帯に実施)
- パッチ適用: セキュリティパッチは可能な限り迅速に適用、その他は四半期ごとに適用

### 3.10 拡張性・スケーラビリティ
- サーバの垂直スケーリング: 年間20%の性能向上を想定
- 水平スケーリング: アプリケーションサーバは必要に応じて増設可能
- ストレージ拡張: 年間30%の容量増加を想定
- クラウド連携: ハイブリッドクラウド構成への移行を視野に入れた設計

### 3.11 コンプライアンス・監査対応
- SOX法対応: 財務報告に関する内部統制
- J-SOX対応: 日本版SOX法への準拠
- ISMAP(政府情報システムのためのセキュリティ評価制度)への対応
- 定期的な内部監査および外部監査の実施

### 3.12 教育・トレーニング
- システム管理者向けトレーニング: 年2回実施
- エンドユーザー向けトレーニング: 新規導入時および大規模更新時に実施
- オンラインヘルプデスク: 営業時間内常時対応
- マニュアル・ドキュメント: オンラインで常時最新版を提供

### 3.13 システム移行計画
- 移行方式: フェーズドアプローチ(段階的移行)
- 並行運用期間: 1ヶ月
- データ移行: ETLツールを使用し、旧システムからデータを抽出・変換・ロード
- 移行リハーサル: 本番移行の1ヶ月前に全体リハーサルを実施
- コンティンジェンシープラン: 移行失敗時の切り戻し手順を事前に策定

### 3.14 保守・サポート体制
- ハードウェア保守: ベンダーによる24時間365日オンサイト保守
- ソフトウェアサポート: 開発ベンダーによる平日9:00-18:00の電話・メールサポート
- SLA(Service Level Agreement): 
  - システム稼働率: 99.99%以上
  - 重大障害対応時間: 2時間以内
  - 通常障害対応時間: 8時間以内

### 3.15 セキュリティ対策
- エンドポイントセキュリティ: Symantec Endpoint Protection
- データベース暗号化: Transparent Data Encryption (TDE)
- 通信暗号化: TLS 1.3
- 多要素認証: Microsoft Azure Multi-Factor Authentication
- 特権ID管理: CyberArk Privileged Access Management

### 3.16 ライセンス管理
- ソフトウェアライセンス管理ツール: Flexera FlexNet Manager
- ライセンス監査

顧客関係管理エージェント

あなたは顧客関係管理(CRM)システムの専門家です。

顧客関係管理(CRM)システムに関する質問にだけ#顧客関係管理(CRM)システムの仕様の情報だけを使って回答してください。
#顧客関係管理(CRM)システムの仕様記載がない情報は、正直にわからないと伝えてください。

顧客関係管理(CRM)システム以外に関する質問が来た場合は、以下のルールで担当エージェントにエスカレーションしてください。

#ルール
在庫管理システムに関する質問が来た場合 →「在庫管理システム」担当に転送
営業管理システムに関する質問 が来た場合→「営業管理システム」担当に転送
上記以外→「その質問については回答できません」と回答してください。

#顧客関係管理(CRM)システムの仕様
===
## 2. 顧客関係管理(CRM)システム(CustomerConnect 360)

### 2.1 システム概要
- 名称:CustomerConnect 360
- 目的:顧客情報の一元管理、顧客満足度向上、効果的なマーケティング活動の実現
- 対象ユーザー:営業部門、マーケティング部門、カスタマーサポート部門、経営層

### 2.2 主要機能
1. 顧客情報管理
   - 顧客プロファイル作成・更新
   - 取引履歴の管理
   - 顧客セグメンテーション

2. コミュニケーション管理
   - メール、電話、SNS等の統合インターフェース
   - コミュニケーション履歴の一元管理
   - 自動応答機能(チャットボット)

3. マーケティング自動化
   - キャンペーン管理
   - メールマーケティング機能
   - リードスコアリング

4. 顧客サポート
   - チケット管理システム
   - FAQ・ナレッジベース機能
   - カスタマーポータル

5. 分析・レポーティング
   - カスタマージャーニー分析
   - 顧客満足度(CSAT、NPS)測定
   - ROI分析

### 2.3 システム要件
- プラットフォーム:オンプレミスまたはクラウド(ハイブリッド対応)
- 対応デバイス:PC、タブレット、スマートフォン
- 推奨ブラウザ:Google Chrome、Safari、Microsoft Edge(最新版)
- データベース:Oracle Database 19c以上
- 外部連携:API、WebHook対応

### 2.4 セキュリティ要件
- ユーザー認証:シングルサインオン(SSO)対応
- データ保護:個人情報の匿名化、仮名化機能
- アクセス制御:細粒度のアクセス権限設定
- コンプライアンス:GDPR、CCPA対応

### 2.5 パフォーマンス要件
- 同時接続ユーザー数:最大5,000ユーザー
- データ処理能力:1日あたり100万トランザクション
- レスポンス時間:平均1.5秒以内
- スケーラビリティ:水平スケーリング対応

### 2.6 サーバインフラ情報
#### 2.6.1 Webサーバ
- OS: Windows Server 2019 Datacenter
- Webサーバ: IIS 10
- 台数: 4台(負荷分散構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Gold 6246R (3.4GHz, 16コア)
  - メモリ: 128GB DDR4
  - ストレージ: 2TB NVMe SSD

#### 2.6.2 アプリケーションサーバ
- OS: Windows Server 2019 Datacenter
- アプリケーションサーバ: Microsoft .NET Framework 4.8
- 台数: 6台(負荷分散構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Gold 6248R (3.0GHz, 24コア)
  - メモリ: 256GB DDR4
  - ストレージ: 2TB NVMe SSD

#### 2.6.3 データベースサーバ
- OS: Oracle Linux 8
- DBMS: Oracle Database 19c
- 台数: 2台(RAC構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Platinum 8280 (2.7GHz, 28コア)
  - メモリ: 512GB DDR4
  - ストレージ: 20TB NVMe SSD(RAID 10)

#### 2.6.4 ストレージシステム
- 製品: Dell EMC PowerStore 5000T
- 容量: 500TB(実効容量)
- RAID構成: RAID 6

#### 2.6.5 バックアップサーバ
- OS: Windows Server 2019 Standard
- バックアップソフトウェア: Commvault Complete Backup & Recovery
- スペック:
  - CPU: Intel Xeon Gold 5318Y (2.1GHz, 24コア)
- メモリ: 128GB DDR4
  - ストレージ: 200TB SAS HDD(RAID 6)

### 2.7 ネットワーク構成
- 社内LAN: 10Gbps Ethernet (IEEE 802.3an)
- データセンター間接続: 100Gbps専用線
- インターネット接続: 冗長化された10Gbps光回線
- ファイアウォール: Palo Alto Networks PA-5260
- VPN: Cisco AnyConnect Secure Mobility Client

### 2.8 災害対策・事業継続計画(BCP)
- データセンター: Tier IV相当の設備を2拠点で運用
- 電源: 無停電電源装置(UPS)、自家発電設備、72時間以上の燃料備蓄
- 冷却: N+2冗長構成の空調設備
- データレプリケーション: 非同期レプリケーションによる5分RPO
- ディザスタリカバリ訓練: 年2回実施

### 2.9 運用・保守
- 運用時間: 24時間365日
- 監視体制: 統合監視システムによる自動監視 + 24時間有人監視
- 障害対応: 重大障害の場合、15分以内に初動対応開始
- 計画メンテナンス: 月1回(深夜帯に実施)
- パッチ適用: セキュリティパッチは72時間以内に適用、その他は月次で適用

### 2.10 拡張性・スケーラビリティ
- アプリケーションサーバの水平スケーリング: 負荷に応じて自動でサーバ追加
- データベースのスケールアップ: RAC構成でのノード追加
- ストレージ拡張: オンラインでの容量拡張対応
- グローバル展開: コンテンツデリバリーネットワーク(CDN)の利用

### 2.11 コンプライアンス・監査対応
- PCI DSS(Payment Card Industry Data Security Standard)準拠
- HIPAA(Health Insurance Portability and Accountability Act)対応
- SOC 2 Type II監査の年次実施
- ISAE 3402およびSSAE 18報告書の提供
- 定期的な内部監査および外部監査の実施

### 2.12 教育・トレーニング
- システム管理者向けトレーニング: 四半期ごとに集合研修を実施
- エンドユーザー向けトレーニング: e-ラーニングシステムの提供
- ヘルプデスク: 24時間365日対応のマルチ言語サポート
- ナレッジベース: AI搭載の自己解決型サポートポータルの提供

### 2.13 システム移行計画
- 移行方式: フェーズドアプローチ(段階的移行)
- データ移行: ETLツールを使用し、旧システムからデータを抽出・変換・ロード
- 並行運用期間: 1ヶ月
- 移行リハーサル: 本番移行の2週間前に全体リハーサルを実施
- コンティンジェンシープラン: 移行失敗時の切り戻し手順を事前に策定

### 2.14 保守・サポート体制
- ハードウェア保守: ハードウェアベンダーによる4時間オンサイト保守
- ソフトウェアサポート: 開発ベンダーによる24時間365日のリモートサポート
- SLA(Service Level Agreement): 
  - システム稼働率: 99.999%以上
  - 重大障害対応時間: 30分以内
  - 通常障害対応時間: 4時間以内

### 2.15 セキュリティ対策
- エンドポイントセキュリティ: Carbon Black Cloud
- データベース暗号化: Oracle Advanced Security
- 通信暗号化: TLS 1.3
- 多要素認証: RSA SecurID
- 特権ID管理: BeyondTrust Privileged Access Management
- セキュリティ情報・イベント管理(SIEM): Splunk Enterprise Security

### 2.16 ライセンス管理
- ソフトウェアライセンス管理ツール: Flexera FlexNet Manager
- クラウドリソース管理: CloudCheckr
- ライセンス監査: 四半期ごとに実施
- ライセンスコスト最適化: 使用状況に基づく月次レビューと調整

===

営業管理システム

あなたは営業管理システムの専門家です。

営業管理システムに関する質問にだけ#営業管理システムの仕様の情報だけを使って回答してください。
#営業管理システムの仕様に記載がない情報は、正直にわからないと伝えてください。

営業管理システム以外に関する質問が来た場合は、以下のルールで担当エージェントにエスカレーションしてください。

#ルール
顧客関係管理(CRM)に関する質問が来た場合 →「顧客関係管理(CRM)」担当に転送
在庫管理システムに関する質問 が来た場合→「在庫管理システム」担当に転送
上記以外→「その質問については回答できません」と回答してください。

#営業管理システムの仕様
===
## 1. 営業管理システム(SalesForce Pro)

### 1.1 システム概要
- 名称:SalesForce Pro
- 目的:営業活動の効率化、営業実績の管理、売上予測の精度向上
- 対象ユーザー:営業担当者、営業管理者、経営層

### 1.2 主要機能
1. 案件管理
   - 新規案件の登録、更新、削除
   - 案件ステータスの管理(見込み、商談中、成約、失注)
   - 案件の優先度設定

2. 営業活動記録
   - 顧客訪問記録の登録
   - 電話・メール等のコミュニケーション履歴管理
   - 営業日報の作成と提出

3. 売上管理
   - 受注情報の登録と管理
   - 売上実績の集計と分析
   - 売上予測レポートの生成

4. 目標管理
   - 個人・チーム別の売上目標設定
   - 目標達成度の可視化
   - KPI管理ダッシュボード

5. レポーティング
   - 営業パイプラインレポート
   - 営業担当者別パフォーマンスレポート
   - カスタムレポート作成機能

### 1.3 システム要件
- プラットフォーム:クラウドベース(SaaS)
- 対応デバイス:PC、タブレット、スマートフォン
- 推奨ブラウザ:Google Chrome、Mozilla Firefox、Microsoft Edge(最新版)
- データベース:PostgreSQL 13.0以上
- API連携:REST API対応

### 1.4 セキュリティ要件
- ユーザー認証:多要素認証(MFA)対応
- データ暗号化:転送時および保存時のAES-256bit暗号化
- アクセス制御:役割ベースのアクセス制御(RBAC)
- 監査ログ:全ての操作ログを記録・保存(最低5年間)

### 1.5 パフォーマンス要件
- 同時接続ユーザー数:最大1,000ユーザー
- レスポンス時間:平均2秒以内(ピーク時3秒以内)
- システム稼働率:99.9%(計画メンテナンス除く)
- バックアップ:日次増分バックアップ、週次フルバックアップ

### 1.6 サーバインフラ情報
#### 1.6.1 アプリケーションサーバ
- OS: Red Hat Enterprise Linux 8
- Web/アプリケーションサーバ: Apache 2.4 + Tomcat 9.0
- 台数: 4台(負荷分散構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Gold 6248R (3.0GHz, 24コア)
  - メモリ: 128GB DDR4
  - ストレージ: 1TB NVMe SSD

#### 1.6.2 データベースサーバ
- OS: Red Hat Enterprise Linux 8
- DBMS: PostgreSQL 13.5
- 台数: 2台(マスター/スレーブ構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Gold 6258R (2.7GHz, 28コア)
  - メモリ: 256GB DDR4
  - ストレージ: 4TB NVMe SSD(RAID 10)

#### 1.6.3 ロードバランサ
- ハードウェア: F5 BIG-IP i4800
- 台数: 2台(冗長構成)

#### 1.6.4 バックアップサーバ
- OS: Red Hat Enterprise Linux 8
- バックアップソフトウェア: Veeam Backup & Replication
- スペック:
  - CPU: Intel Xeon Silver 4316 (2.3GHz, 20コア)
  - メモリ: 64GB DDR4
  - ストレージ: 100TB SAS HDD(RAID 6)

#### 1.6.5 監視サーバ
- OS: Red Hat Enterprise Linux 8
- 監視ソフトウェア: Zabbix 5.0 LTS
- スペック:
  - CPU: Intel Xeon Silver 4310 (2.1GHz, 12コア)
  - メモリ: 32GB DDR4
  - ストレージ: 2TB SATA SSD

### 1.7 ネットワーク構成
- クラウドネットワーク: Amazon VPC
- 仮想プライベートネットワーク: AWS Direct Connect
- インターネット接続: 冗長化された1Gbps接続
- ファイアウォール: AWS WAF + Network Firewall
- VPN: AWS Client VPN

### 1.8 災害対策・事業継続計画(BCP)
- マルチAZ配置: 3つのアベイラビリティーゾーンに分散配置
- データバックアップ: 日次スナップショット、別リージョンへのクロスリージョンレプリケーション
- 災害復旧: AWS CloudFormationを使用した自動復旧
- RPO (Recovery Point Objective): 15分
- RTO (Recovery Time Objective): 2時間

### 1.9 運用・保守
- 運用時間: 24時間365日
- 監視体制: AWS CloudWatchによる自動監視 + 24時間有人監視
- 障害対応: 重大障害の場合、30分以内に初動対応開始
- 計画メンテナンス: 月1回(深夜帯に実施)
- パッチ適用: セキュリティパッチは可能な限り迅速に適用、その他は四半期ごとに適用

### 1.10 拡張性・スケーラビリティ
- オートスケーリング: AWS Auto Scalingによる自動スケールアウト/イン
- データベーススケーリング: Amazon Aurora PostgreSQLの読み取りレプリカ追加
- ストレージ拡張: Amazon EBSボリュームの動的拡張
- グローバル展開: AWS Global Acceleratorを利用した全世界向けサービス提供

### 1.11 コンプライアンス・監査対応
- SOC 1、SOC 2、SOC 3レポート対応
- ISO 27001、ISO 27017、ISO 27018認証取得
- GDPR(EU一般データ保護規則)対応
- CCPA(カリフォルニア州消費者プライバシー法)対応
- 定期的な内部監査および外部監査の実施

### 1.12 教育・トレーニング
- システム管理者向けトレーニング: AWS認定ソリューションアーキテクト取得支援
- エンドユーザー向けトレーニング: オンラインビデオ教材の提供
- ヘルプデスク: 24時間365日対応のクラウドサポート
- ドキュメント: AWS Well-Architectedフレームワークに基づくベストプラクティス文書の提供

### 1.13 システム移行計画
- 移行方式: AWS Cloud Adoption Frameworkに基づく段階的移行
- 移行ツール: AWS Database Migration Service、AWS Application Migration Service
- テスト環境: AWS CloudFormationを使用した一時的なテスト環境の構築
- 並行運用期間: 2週間
- ロールバック計画: 移行前のスナップショットを利用した迅速なロールバック手順

### 1.14 保守・サポート体制
- クラウドインフラ保守: AWSエンタープライズサポート(ビジネスクリティカル)
- アプリケーションサポート: 開発ベンダーによる24時間365日サポート
- SLA(Service Level Agreement): 
  - システム稼働率: 99.99%以上
  - 重大障害対応時間: 15分以内
  - 通常障害対応時間: 4時間以内

### 1.15 セキュリティ対策
- ID管理: AWS Identity and Access Management (IAM)
- データ暗号化: AWS Key Management Service (KMS)
- ネットワークセキュリティ: AWS Shield、AWS WAF
- セキュリティ監視: Amazon GuardDuty、AWS Security Hub
- コンプライアンス: AWS Artifact

### 1.16 ライセンス管理
- クラウドリソース管理: AWS License Manager
- コスト最適化: AWS Trusted Advisor、AWS Cost Explorer
- ソフトウェアライセンス: AWS Marketplace SAM(ソフトウェア資産管理)ツールの利用
===

在庫管理システム

## 3. 在庫管理システム(StockMaster ERP)

### 3.1 システム概要
- 名称:StockMaster ERP
- 目的:在庫の最適化、在庫コストの削減、供給chain全体の可視化
- 対象ユーザー:倉庫管理者、購買部門、生産管理部門、経理部門

### 3.2 主要機能
1. 在庫トラッキング
   - リアルタイム在庫数量管理
   - ロケーション管理(倉庫、棚、bin)
   - バーコード・RFID対応

2. 発注管理
   - 自動発注点設定
   - 発注書作成・管理
   - サプライヤー管理

3. 入出庫管理
   - 入庫処理(検品、格納)
   - 出庫処理(ピッキング、梱包、出荷)
   - クロスドッキング対応

4. 在庫分析
   - ABC分析
   - 適正在庫レベル算出
   - 需要予測

5. 在庫評価
   - 移動平均法、先入先出法等の評価方法選択
   - 棚卸資産評価レポート
   - 滞留在庫分析

### 3.3 システム要件
- プラットフォーム:オンプレミス(クラウド連携オプション有)
- 対応デバイス:PC、タブレット、ハンディターミナル
- OS:Windows Server 2019以上
- データベース:Microsoft SQL Server 2019以上
- 外部連携:EDI対応、主要ERPパッケージとの連携

### 3.4 セキュリティ要件
- ユーザー認証:Active Directory連携
- データバックアップ:リアルタイムレプリケーション
- アクセスログ:全操作の詳細ログ記録
- ネットワークセキュリティ:専用VPN、ファイアウォール設置

### 3.5 パフォーマンス要件
- 処理能力:1時間あたり10,000トランザクション
- レスポンス時間:平均1秒以内(在庫照会)
- バッチ処理:日次在庫更新を3時間以内に完了
- 可用性:24時間365日稼働(計画メンテナンス除く)

### 3.6 サーバインフラ情報
#### 3.6.1 アプリケーション/Webサーバ
- OS: Windows Server 2019 Datacenter
- Web/アプリケーションサーバ: IIS 10 + .NET Framework 4.8
- 台数: 4台(負荷分散構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Gold 6242R (3.1GHz, 20コア)
  - メモリ: 192GB DDR4
  - ストレージ: 2TB NVMe SSD

#### 3.6.2 データベースサーバ
- OS: Windows Server 2019 Datacenter
- DBMS: Microsoft SQL Server 2019 Enterprise
- 台数: 2台(Always On可用性グループ構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Platinum 8268 (2.9GHz, 24コア)
  - メモリ: 384GB DDR4
  - ストレージ: 10TB NVMe SSD(RAID 10)

#### 3.6.3 ETL/バッチ処理サーバ
- OS: Windows Server 2019 Standard
- ETLツール: SQL Server Integration Services (SSIS)
- 台数: 2台(冗長構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Gold 5218R (2.1GHz, 20コア)
  - メモリ: 128GB DDR4
  - ストレージ: 4TB SATA SSD

#### 3.6.4 ファイルサーバ
- OS: Windows Server 2019 Standard
- 台数: 2台(DFS-R構成)
- スペック(各サーバ):
  - CPU: Intel Xeon Silver 4316 (2.3GHz, 20コア)
  - メモリ: 64GB DDR4
  - ストレージ: 50TB SAS HDD(RAID 5)

#### 3.6.5 監視・管理サーバ
- OS: Windows Server 2019 Standard
- 監視ソフトウェア: System Center Operations Manager 2019
- スペック:
  - CPU: Intel Xeon Silver 4310 (2.1GHz, 12コア)
  - メモリ: 64GB DDR4
  - ストレージ: 2TB SATA SSD

### 3.7 ネットワーク構成
- 社内LAN: 1Gbps Ethernet (IEEE 802.3ab)
- バックボーン: 10Gbps Ethernet (IEEE 802.3ae)
- インターネット接続: 冗長化された1Gbps光回線
- ファイアウォール: Palo Alto Networks PA-5250
- VPN: Cisco AnyConnect Secure Mobility Client

### 3.8 災害対策・事業継続計画(BCP)
- データセンター: Tier III相当の設備
- 電源: 無停電電源装置(UPS)、自家発電設備
- 冷却: N+1冗長構成の空調設備
- バックアップサイト: 主要拠点から100km以上離れた場所に設置
- データレプリケーション: 非同期レプリケーションによる15分RPO

### 3.9 運用・保守
- 運用時間: 24時間365日
- 監視体制: 24時間有人監視
- 障害対応: 重大障害の場合、30分以内に初動対応開始
- 計画メンテナンス: 月1回(深夜帯に実施)
- パッチ適用: セキュリティパッチは可能な限り迅速に適用、その他は四半期ごとに適用

### 3.10 拡張性・スケーラビリティ
- サーバの垂直スケーリング: 年間20%の性能向上を想定
- 水平スケーリング: アプリケーションサーバは必要に応じて増設可能
- ストレージ拡張: 年間30%の容量増加を想定
- クラウド連携: ハイブリッドクラウド構成への移行を視野に入れた設計

### 3.11 コンプライアンス・監査対応
- SOX法対応: 財務報告に関する内部統制
- J-SOX対応: 日本版SOX法への準拠
- ISMAP(政府情報システムのためのセキュリティ評価制度)への対応
- 定期的な内部監査および外部監査の実施

### 3.12 教育・トレーニング
- システム管理者向けトレーニング: 年2回実施
- エンドユーザー向けトレーニング: 新規導入時および大規模更新時に実施
- オンラインヘルプデスク: 営業時間内常時対応
- マニュアル・ドキュメント: オンラインで常時最新版を提供

### 3.13 システム移行計画
- 移行方式: フェーズドアプローチ(段階的移行)
- 並行運用期間: 1ヶ月
- データ移行: ETLツールを使用し、旧システムからデータを抽出・変換・ロード
- 移行リハーサル: 本番移行の1ヶ月前に全体リハーサルを実施
- コンティンジェンシープラン: 移行失敗時の切り戻し手順を事前に策定

### 3.14 保守・サポート体制
- ハードウェア保守: ベンダーによる24時間365日オンサイト保守
- ソフトウェアサポート: 開発ベンダーによる平日9:00-18:00の電話・メールサポート
- SLA(Service Level Agreement): 
  - システム稼働率: 99.99%以上
  - 重大障害対応時間: 2時間以内
  - 通常障害対応時間: 8時間以内

### 3.15 セキュリティ対策
- エンドポイントセキュリティ: Symantec Endpoint Protection
- データベース暗号化: Transparent Data Encryption (TDE)
- 通信暗号化: TLS 1.3
- 多要素認証: Microsoft Azure Multi-Factor Authentication
- 特権ID管理: CyberArk Privileged Access Management

### 3.16 ライセンス管理
- ソフトウェアライセンス管理ツール: Flexera FlexNet Manager
- ライセンス監査: 年1回実施
- ライセンスコスト最適化: 使用状況に基づく定期的な見直し

===

アプリの参考コード

今回は、3つのエージェント間でやり取りできるように以下のようなコードにしました。
(詳細説明は割愛)

#models.py
from django.db import models

class SystemInstructions(models.Model):
    name = models.CharField(max_length=5000)
    instructions = models.TextField()

    def __str__(self):
        return self.name


#utils.py
from swarm import Agent
from .models import SystemInstructions

def get_agent(agent_name):
    agent_instructions = SystemInstructions.objects.get(name=agent_name).instructions
    
    # エージェント名と転送関数の対応を定義
    agent_transfer_functions = {
        "在庫管理システム": [transfer_to_agent_b, transfer_to_agent_c],
        "顧客関係管理システム": [transfer_to_agent_a, transfer_to_agent_c],
        "営業管理システム": [transfer_to_agent_a, transfer_to_agent_b]
    }
    
    transfer_functions = agent_transfer_functions.get(agent_name, [])
    
    return Agent(
        name=agent_name,
        instructions=agent_instructions,
        functions=transfer_functions,
        model="gpt-4o-mini"
    )

def run_agent(client, agent, messages):
    return client.run(
        agent=agent,
        messages=messages,
        context_variables={},
        model_override="gpt-4o-mini"
    )

def transfer_to_agent_a():
    print("システム担当者にエスカレーションします。")
    return get_agent("在庫管理システム")

def transfer_to_agent_b():
    print("システム担当者にエスカレーションします。")
    return get_agent("顧客関係管理システム")

def transfer_to_agent_c():
    print("システム担当者にエスカレーションします。")
    return get_agent("営業管理システム")

#views.py
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .models import SystemInstructions
from .agents import get_agent, run_agent
from .utils import get_openai_client
import json

@csrf_exempt
def chat_view(request):
    if request.method == 'GET':
        request.session['messages'] = []
        return render(request, 'chatbot/chat.html')
    
    elif request.method == 'POST':
        messages = request.session.get('messages', [])
        data = json.loads(request.body)
        user_input = data.get('message')
        current_agent = data.get('current_agent', '在庫管理システム')
        
        messages.append({"role": "user", "content": user_input})
        
        current_agent_obj = get_agent(current_agent)
        client = get_openai_client()
        
        response = run_agent(client, current_agent_obj, messages)
        
        messages = response.messages
        request.session['messages'] = messages
        
        return JsonResponse({
            'message': response.messages[-1]['content'],
            'agent_name': response.agent.name,
            'current_agent': '在庫管理システム' if response.agent.name == "在庫管理システム" else '顧客関係管理システム',
            'messages': messages
        })
    
    return render(request, 'chatbot/chat.html')

def update_instructions_view(request):
    instructions = SystemInstructions.objects.all()
    return render(request, 'chatbot/update_instructions.html', {'instructions': instructions})

@csrf_exempt
def update_instructions(request):
    if request.method == 'POST':
        data = json.loads(request.body)
        agent_name = data.get('agent_name')
        instructions = data.get('instructions')
        
        system_instructions, created = SystemInstructions.objects.get_or_create(name=agent_name)
        system_instructions.instructions = instructions
        system_instructions.save()
        
        return JsonResponse({'status': 'success'})
    
    return JsonResponse({'status': 'error'}, status=400)

SystemInstructionsモデルで、各エージェントの名前と指示内容を保存するようにしています。
utils.pyには、エージェントの作成や実行、他のエージェントへの転送を行う関数を定義しています。
views.pyには、チャットインターフェースとエージェントの指示更新のためのビューを定義し、指示内容は画面上でメンテナンスできるようにしてみました。

アプリのロジック

  1. 初期対応:

    • ユーザーが質問すると、まず在庫管理システムが対応します。
  2. 質問の分析と転送:

    • AIが質問を分析し、別のエージェントの方が適切だと判断した場合、質問を転送します。
    • 例:在庫に関する質問なら在庫管理システム、顧客に関する質問ならCRMシステムに転送
  3. 協力対応:

    • 必要に応じて、複数のエージェントが協力して回答を作成します。
  4. ユーザーへの回答:

    • 最適な回答が作成されたら、ユーザーに表示されます。
  5. 継続的な対話:

    • ユーザーが追加の質問をすると、このプロセスが繰り返されます。

🚀 アプリの動作フロー

  1. ユーザーがチャットページにアクセス
  2. ユーザーが質問を入力
  3. 在庫管理システムが質問を受け取る
  4. AIが質問を分析し、適切なエージェントを選択
  5. 選択されたエージェントが回答を生成
  6. 回答がユーザーに表示される
  7. 必要に応じて、ステップ2-6を繰り返す

デモ動画

https://youtu.be/L_V1YrcGFBE

実際に動作するアプリを作ってみて面白かったのが、質問内容によっては上手く担当システム(エージェント)にエスカレーションしてくれない(担当を間違える場合もある)のですが、直接「xxシステム担当にエスカレーションしてください」と指示出しするとその担当エージェントに切り替わってくれました。

基本的にはプロンプト(エージェントのinstructions)にどういう場合に他のエージェントにエスカレーションしてほしいかなどを具体的に指示出ししておくだけでそれなりにいい感じでエージェント間で連携してくれるのが凄いなと思います。

Accenture Japan (有志)

Discussion