Swarmフレームワークを使用した航空会社カスタマーサービスの自動化

近年、人工知能（AI）技術の進歩により、カスタマーサービスの自動化が急速に進んでいます。本記事では、Swarmフレームワークを使用して構築された航空会社のカスタマーサービスシステムについて紹介します。このシステムは、複数のAIエージェントを組み合わせることで、様々な顧客の要求に効率的に対応することができます。



## システム概要

このシステムは、以下の主要なエージェントで構成されています：

1. **振り分けエージェント**: 顧客のリクエストを分析し、適切な専門エージェントに転送します。
2. **フライト変更エージェント**: フライトの変更やキャンセルに関する要求を処理します。
   - フライトキャンセルエージェント
   - フライト変更エージェント
3. **手荷物紛失エージェント**: 手荷物の紛失に関する問い合わせを処理します。

各エージェントは特定のタスクに特化しており、連携して複雑な顧客サービスのワークフローを実現します。

## システムの特徴

1. **マルチエージェントアーキテクチャ**: 複数のエージェントが協調して働くことで、複雑な要求にも柔軟に対応できます。

2. **言語モデルの活用**: 各エージェントは高度な言語モデルを基盤としており、自然言語での対話が可能です。

3. **コンテキスト管理**: 顧客情報やフライト情報などのコンテキストを保持し、対話の中で適切に活用します。

4. **自動評価システム**: エージェントの性能を自動的に評価し、継続的な改善を支援します。

5. **多言語対応**: 日本語と英語のテストケースが用意されており、多言語での対応が可能です。

## 技術的な詳細

システムの中核となるのは`main.py`ファイルです。ここでは、Swarmフレームワークの`run_demo_loop`関数を使用して対話セッションを開始します。各エージェントの定義は`configs/agents.py`に、エージェントが使用するツール（関数）は`configs/tools.py`に記述されています。

評価システムは`evals/`ディレクトリに実装されており、`function_evals.py`スクリプトを使用してエージェントの性能を定量的に評価できます。

はい、動かし方や主要なコードについて、コードブロックを使用して解説します。

## システムの実行方法

1. まず、必要な依存関係とSwarmフレームワークをインストールします。

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

```bash
python main.py
```

このコマンドにより、対話式のカスタマーサービスデモが開始されます。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">swarmで航空会社カスタマーサービスの例を日本語化して遊んでみた！！<br>---<br>ちゃんと振り分けエージェントが手荷物紛失処理を行ってくれて、もう一度聞くとちゃんと処理中って返ってくる。。。これって結構感動する！ <a href="https://t.co/ZpY9FNmn5k">https://t.co/ZpY9FNmn5k</a> <a href="https://t.co/5Qi3s2mtut">pic.twitter.com/5Qi3s2mtut</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1845148134688850380?ref_src=twsrc%5Etfw">October 12, 2024</a></blockquote> 

## 主要なコードの解説

### main.py

`main.py`は、システムのエントリーポイントです。ここでは、コンテキスト変数を設定し、デモループを開始します。

```python
from configs.agents import *
from swarm.repl import run_demo_loop

# コンテキスト変数の設定
context_variables = {
    "customer_context": """ここに顧客の詳細情報があります:
1. CUSTOMER_ID: customer_12345
2. NAME: John Doe
3. PHONE_NUMBER: (123) 456-7890
4. EMAIL: johndoe@example.com
5. STATUS: Premium
6. ACCOUNT_STATUS: Active
7. BALANCE: $0.00
8. LOCATION: 1234 Main St, San Francisco, CA 94123, USA
""",
    "flight_context": """顧客は、ニューヨークのLGA（ラガーディア）からロサンゼルスのLAXへの次の便を予約しています。
フライト番号は1919です。出発日時は2024年5月21日午後3時（東部時間）です。""",
}

if __name__ == "__main__":
    # デモループの実行
    run_demo_loop(triage_agent, context_variables=context_variables, debug=True)
```

### configs/agents.py

`agents.py`ファイルでは、各エージェントの定義と、エージェント間の転送関数を記述しています。

```python
from swarm import Agent

# 振り分けエージェントの定義
triage_agent = Agent(
    name="振り分けエージェント",
    instructions=triage_instructions,
    functions=[transfer_to_flight_modification, transfer_to_lost_baggage],
)

# フライト変更エージェントの定義
flight_modification = Agent(
    name="フライト変更エージェント",
    instructions="""あなたは航空会社のカスタマーサービスのフライト変更エージェントです。
      ユーザーがどのサブ意図に紹介されるべきかを決定する専門のカスタマーサービスエージェントです。
意図がフライト変更関連の質問であることは既に分かっています。まず、メッセージ履歴を見て、ユーザーがフライトをキャンセルしたいのか変更したいのかを判断できるか確認してください。
ユーザーがキャンセルリクエストなのか変更リクエストなのかが分かるまで、明確化のための質問をしてください。分かったら、適切な転送関数を呼び出してください。毎回、明確化のための質問をするか、関数の1つを呼び出してください。""",
    functions=[transfer_to_flight_cancel, transfer_to_flight_change],
    parallel_tool_calls=False,
)

# その他のエージェント定義...
```

### configs/tools.py

`tools.py`ファイルには、エージェントが使用できるツール（関数）が定義されています。

```python
# 人間のエージェントにエスカレーション
def escalate_to_agent(reason=None):
    return f"エージェントにエスカレーション: {reason}" if reason else "エージェントにエスカレーション"

# フライト変更を実行
def change_flight():
    return "フライトの変更が成功しました！"

# 返金プロセスを開始
def initiate_refund():
    status = "返金が開始されました"
    return status

# その他のツール定義...
```

## 評価システムの実行

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">swarmで航空会社カスタマーサービスの例を日本語化して遊んでみた②<br>評価スクリプトを回してみたところ<br>日本語化しても精度93.3%！これは結構良いのでは <a href="https://t.co/hIaZAlX2el">https://t.co/hIaZAlX2el</a> <a href="https://t.co/16E6jJFuqa">pic.twitter.com/16E6jJFuqa</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1845151716540547348?ref_src=twsrc%5Etfw">October 12, 2024</a></blockquote> 

評価システムを実行するには、以下のコマンドを使用します：

```bash
cd evals
python function_evals.py
```

`function_evals.py`の主要な部分は以下の通りです：

```python
import json
from configs.agents import *
from evals.eval_utils import run_function_evals

# 評価用のテストケースファイルのパス
triage_test_cases = "eval_cases/triage_cases_JP.json"
flight_modification_cases = "eval_cases/flight_modification_cases_JP.json"

# 各テストケースの実行回数
n = 5

if __name__ == "__main__":
    # 振り分けエージェントの評価を実行
    with open(triage_test_cases, "r") as file:
        triage_test_cases = json.load(file)
    run_function_evals(
        triage_agent,
        triage_test_cases,
        n,
        eval_path="eval_results/triage_evals_JP.json",
    )

    # フライト変更エージェントの評価を実行
    with open(flight_modification_cases, "r") as file:
        flight_modification_cases = json.load(file)
    run_function_evals(
        flight_modification,
        flight_modification_cases,
        n,
        eval_path="eval_results/flight_modification_evals_JP.json",
    )
```

このスクリプトは、指定されたテストケースを使用して各エージェントの性能を評価し、結果をJSONファイルに保存します。

これらのコード例は、システムの主要な部分を示しています。実際のシステムでは、これらのコンポーネントが連携して動作し、ユーザーからの入力に基づいて適切なエージェントが応答を生成します。評価システムを使用することで、エージェントの性能を継続的に監視し、改善することができます。

## システムの評価

システムの評価は、事前に定義されたテストケースを使用して行われます。各テストケースは、ユーザーの入力と期待される関数呼び出しのペアで構成されています。評価スクリプトは、エージェントの応答が期待される関数呼び出しと一致するかどうかを確認し、精度を計算します。

例えば、以下のようなテストケースが用意されています：

```json
{
  "conversation": [
    {"role": "user", "content": "私の荷物が届いていません！"}
  ],
  "function": "transfer_to_lost_baggage"
}
```

このケースでは、システムが「手荷物紛失エージェント」に転送することが期待されています。

## 今後の展望

このシステムは、航空会社のカスタマーサービスを大幅に効率化する可能性を秘めています。今後の改善点として以下が考えられます：

1. より多様なケースへの対応
2. 実際の航空会社システムとの統合
3. 会話の履歴を考慮したより高度な対話管理
4. ユーザーフィードバックを基にしたエージェントの継続的な学習

## 結論

Swarmフレームワークを活用したこの航空会社カスタマーサービスシステムは、AIによる自動化の可能性を示す素晴らしい例です。複数のエージェントが協調して働くことで、人間のオペレーターに近い柔軟性と効率性を実現しています。今後、このようなシステムがさらに進化し、様々な産業でのカスタマーサービスの質を向上させることが期待されます。


## リポジトリ

https://github.com/Sunwood-ai-labs/swarm-sample-box/tree/main/examples/airline


<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>