OpenAI Swarm : トリアージエージェントの実装

このプロジェクトは、ユーザーの入力を適切なエージェントに振り分けるトリアージエージェントを含むSwarmの実装例です。主に3つのエージェント（トリアージ、販売、返金）が相互に連携して動作します。

https://hamaruki.com/swarm-experimental-sample/

## プロジェクトの構成

プロジェクトは以下のファイルで構成されています：

1. `agents.py`: エージェントとその機能を定義
2. `evals.py`: テストケースと評価関数を定義
3. `evals_util.py`: LLMを使用した会話評価のユーティリティ関数
4. `run.py`: メインのデモループを実行

## 主要なコードの解説

### agents.py

このファイルでは、トリアージ、販売、返金の各エージェントとその機能を定義しています。

```python
from swarm import Agent
from loguru import logger

# エージェントの定義
triage_agent = Agent(
    name="トリアージエージェント",
    instructions="ユーザーの要求を最適に処理できるエージェントを判断し、その会話をそのエージェントに転送します。",
)

sales_agent = Agent(
    name="販売エージェント",
    instructions="販売に対して非常に熱心になってください。",
)

refunds_agent = Agent(
    name="返金エージェント",
    instructions="ユーザーの返金要求を処理します。理由が高額すぎる場合は、返金コードを提供してください。ユーザーが主張する場合は、返金を処理します。",
    functions=[process_refund, apply_discount],
)

# 転送機能の定義
def transfer_back_to_triage():
    logger.info("トリアージエージェントに転送します")
    return triage_agent

def transfer_to_sales():
    logger.info("販売エージェントに転送します")
    return sales_agent

def transfer_to_refunds():
    logger.info("返金エージェントに転送します")
    return refunds_agent

# エージェントに転送機能を追加
triage_agent.functions = [transfer_to_sales, transfer_to_refunds]
sales_agent.functions.append(transfer_back_to_triage)
refunds_agent.functions.append(transfer_back_to_triage)
```

このコードでは、各エージェントの役割と指示を定義し、エージェント間の転送機能も実装しています。例えば、トリアージエージェントは販売エージェントと返金エージェントに転送する機能を持っています。




### evals.py

このファイルでは、エージェントの動作をテストし、会話の成功を評価するための関数とテストケースを定義しています。

```python
from swarm import Swarm
from agents import triage_agent, sales_agent, refunds_agent
from evals_util import evaluate_with_llm_bool, BoolEvalResult
import pytest

client = Swarm()

def conversation_was_successful(messages) -> bool:
    conversation = f"CONVERSATION: {json.dumps(messages)}"
    result: BoolEvalResult = evaluate_with_llm_bool(
        CONVERSATIONAL_EVAL_SYSTEM_PROMPT, conversation
    )
    return result.value

@pytest.mark.parametrize(
    "query,function_name",
    [
        ("返金したいです！", "transfer_to_refunds"),
        ("販売担当と話したいです。", "transfer_to_sales"),
    ],
)
def test_triage_agent_calls_correct_function(query, function_name):
    tool_calls = run_and_get_tool_calls(triage_agent, query)
    assert len(tool_calls) == 1
    assert tool_calls[0]["function"]["name"] == function_name
```

このコードでは、トリアージエージェントが正しい機能を呼び出しているかをテストしています。また、`conversation_was_successful`関数を使用して、会話全体の成功を評価しています。


<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">swarmの公式サンプルを日本語化してtriage_agentやってみた③<br>無事にテストケースの動作確認までできた！<br>取り敢えず一旦ここまででリリースします！！<br>＊だいぶ雰囲気が掴めてきた気がする。。。 <a href="https://t.co/azS3GmWGkR">https://t.co/azS3GmWGkR</a> <a href="https://t.co/KnhFOwzfAz">pic.twitter.com/KnhFOwzfAz</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1845725096117514579?ref_src=twsrc%5Etfw">October 14, 2024</a></blockquote> 


### run.py

このファイルは、トリアージエージェントを使用してデモループを実行します。

```python
from swarm.repl import run_demo_loop
from agents import triage_agent
from loguru import logger

if __name__ == "__main__":
    logger.info("Triage Agent のデモを開始します")
    run_demo_loop(triage_agent)
    logger.info("デモが終了しました")
```

このシンプルなスクリプトは、`run_demo_loop`関数を使用してトリアージエージェントのデモを実行します。

#### 販売エージェントの例

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">swarmの公式サンプルを日本語化してtriage_agentやってみて無事に購入処理をシミュレーションできた！！！ <a href="https://t.co/x5WQR0GudU">https://t.co/x5WQR0GudU</a> <a href="https://t.co/ig4d1Qxbuo">pic.twitter.com/ig4d1Qxbuo</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1845721373580419184?ref_src=twsrc%5Etfw">October 14, 2024</a></blockquote> 

#### 返金エージェントの例

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">swarmの公式サンプルを日本語化してtriage_agentやってみて無事に返金処理をシミュレーションできた！！！<br>＊完全に公式サンプルのやる順番を間違えた。。。 <a href="https://t.co/l4H0MMx0Sb">https://t.co/l4H0MMx0Sb</a> <a href="https://t.co/xBOFTjyOEa">pic.twitter.com/xBOFTjyOEa</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1845716739679744476?ref_src=twsrc%5Etfw">October 14, 2024</a></blockquote> 

## プロジェクトの特徴

1. **複数のエージェント**: トリアージ、販売、返金の3つのエージェントが連携して動作します。
2. **動的な転送**: ユーザーの要求に応じて、適切なエージェントに会話を転送します。
3. **自動評価**: LLMを使用して会話の成功を自動的に評価します。
4. **テスト駆動開発**: Pytestを使用したユニットテストにより、エージェントの動作を確認します。

## まとめ

このプロジェクトは、Swarmを使用して複数のエージェントを連携させる方法を示しています。トリアージエージェントが中心となり、ユーザーの要求を適切に振り分けることで、効率的な対応が可能になります。また、自動評価とテスト駆動開発のアプローチにより、エージェントの品質を維持しやすくなっています。

このような構造は、カスタマーサポートや情報提供システムなど、様々な応用が考えられます。プロジェクトの目的や要件に合わせて、エージェントの種類や転送ロジックをカスタマイズすることで、より効果的なシステムを構築できるでしょう。

## リポジトリ

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

https://github.com/Sunwood-ai-labs/swarm/blob/feature/docs-jp/README_JP.md

https://github.com/openai/swarm

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