🐱

Swarm Weather Agent: 天気情報を提供するインテリジェントなエージェント

2024/10/16に公開

はじめに

Swarm Weather Agentは、OpenAIのSwarmフレームワークを使用して構築された、インテリジェントな天気情報提供エージェントです。このプロジェクトは、単一のエージェントが複数の機能を持ち、ユーザーとのインタラクティブなやり取りを通じて天気情報の取得やメール送信を行う様子を示しています。

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

主な特徴

  1. 天気情報取得: 特定の都市の天気を取得
  2. メール送信: 天気情報を含むメールを送信
  3. 単一エージェント: 複数の機能を1つのエージェントで処理

エージェントのワークフロー

エージェントは以下のような流れで動作します:

  1. ユーザーからの入力を受け取る
  2. 入力内容を分析し、適切な機能(天気情報取得またはメール送信)を呼び出す
  3. 結果をユーザーに返す
  4. 追加の要求があれば再度処理を行い、なければ会話を終了する

コードの解説

agents.py

このファイルでは、天気エージェントの主要な機能が定義されています。

import json
import random
from datetime import datetime
from swarm import Agent

# 天気情報のダミーデータ
weather_data = {
    "東京": {"temp_range": (10, 30), "conditions": ["晴れ", "曇り", "雨", "雪"]},
    # ... 他の都市のデータ ...
}

def get_weather(location, time="now"):
    """指定された場所の現在の天気を取得します。"""
    if location not in weather_data:
        return json.dumps({"error": "指定された都市の天気情報が見つかりません。"})
    
    city_data = weather_data[location]
    temperature = random.randint(*city_data["temp_range"])
    condition = random.choice(city_data["conditions"])
    
    current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    weather_info = {
        "location": location,
        "temperature": f"{temperature}°C",
        "condition": condition,
        "time": current_time
    }
    
    return json.dumps(weather_info, ensure_ascii=False)

def send_email(recipient, subject, body):
    """電子メールを送信するための関数"""
    print("メールを送信中...")
    print(f"宛先: {recipient}")
    print(f"件名: {subject}")
    print(f"本文: {body}")
    return "送信完了!"

weather_agent = Agent(
    name="Weather Agent",
    instructions="""あなたは親切な天気情報提供エージェントです。
    ユーザーから都市名を聞いたら、その都市の天気情報を提供してください。
    また、ユーザーが希望する場合は、天気情報をメールで送信することもできます。
    現在、東京、大阪、札幌、福岡、那覇の天気情報を提供できます。""",
    functions=[get_weather, send_email],
)

このコードでは、get_weather関数で天気情報を取得し、send_email関数でメール送信をシミュレートしています。weather_agentオブジェクトは、これらの機能を持つエージェントを定義しています。

evals.py

このファイルには、エージェントの動作を評価するためのテストケースが含まれています。

from swarm import Swarm
from agents import weather_agent
import pytest

client = Swarm()

def run_and_get_tool_calls(agent, query):
    """エージェントにクエリを実行させ、ツール呼び出しを取得する関数"""
    message = {"role": "user", "content": query}
    response = client.run(
        agent=agent,
        messages=[message],
        execute_tools=False,
    )
    return response.messages[-1].get("tool_calls")

@pytest.mark.parametrize(
    "query",
    [
        "東京の天気は?",
        "那覇の天気を教えて。",
        "今日、傘が必要?札幌にいます。",
    ],
)
def test_calls_weather_when_asked(query):
    """天気について尋ねられた時に正しく天気関数を呼び出すかテストする"""
    tool_calls = run_and_get_tool_calls(weather_agent, query)

    assert len(tool_calls) == 1
    assert tool_calls[0]["function"]["name"] == "get_weather"

# ... 他のテストケース ...

これらのテストは、エージェントが適切に天気情報を取得する関数を呼び出しているかを確認します。

セットアップと実行方法

プロジェクトのセットアップにはuvを使用します。以下のコマンドで環境を準備できます:

pip install uv
uv venv
source .venv/bin/activate  # Linux/macOSの場合
.venv\Scripts\activate  # Windowsの場合
uv pip install -r requirements.txt

エージェントを実行するには、以下のコマンドを使用します:

python run.py

評価テストの実行

テストを実行するには、以下のコマンドを使用します:

pytest evals.py

詳細な出力を得たい場合は、-v-sオプションを追加できます。

デモ動画

エージェントの評価テストの実行動画

天気情報を取得する動画

天気情報を取得してメールを作成する動画

まとめ

Swarm Weather Agentは、OpenAIのSwarmフレームワークを活用した実用的なデモプロジェクトです。このプロジェクトを通じて、AIエージェントがどのように複数の機能を組み合わせて複雑なタスクを実行できるかを学ぶことができます。また、テストケースの実装方法や、対話型のデモループの作成方法についても良い例を提供しています。

このプロジェクトは、AIエージェントの開発や、自然言語処理を活用したアプリケーションの構築に興味がある開発者にとって、有益な学習リソースとなるでしょう。

リポジトリ

Weather agent (サンプル)

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

日本語化リポジトリ

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>

Discussion