AI

【AIエージェント】OpenAI Agents SDKでマルチエージェントシステムを実装してみた

今回は、OpenAI Agents SDKを用いて簡単なマルチエージェントの構築について解説します。

マルチエージェント構築を検討している方の参考になるよう解説していきます。

構築するフロー図

今回構築するマルチエージェントのフロー図は以下の通りです。

```mermaid
graph TD;
    A[ユーザー入力] -->|意図検出| B[エージェント1: 意図検出]
    B -->|処理を分岐| C[エージェント2: ルータ]

    C -->|Web検索| D[エージェント3: Web検索エージェント]
    C -->|ファイル検索| E[エージェント4: ファイル検索エージェント]
    C -->|文章要約| F[エージェント5: 文章要約エージェント]

    D --> I[結果出力]
    E --> I[結果出力]
    F--> |文章翻訳| H[エージェント6: 文章翻訳エージェント]
    H --> I[結果出力]

````

上記はVscode上でmermaid記法で記述したい内容を表示したものです

このシステムは、ユーザーの質問に対して最適な形で回答するために、複数のAIエージェントが連携して動く「マルチエージェント構成」を採用しています。

以下はその流れの概要です。

①ユーザーの意図を理解する
まず最初に、ユーザーが入力した質問の“意図”を検出し、AIが理解しやすい形に再構築します。

②処理の振り分け
次に、質問内容に応じて「Web検索」「ファイル検索」「文章要約」など、どのエージェントが対応すべきかを判断します。

③適切なエージェントが処理を実行
振り分けられたエージェントが、それぞれの役割に応じて処理を行います。
たとえば、Web情報の取得が必要な場合はWeb検索エージェント、社内資料の中から答えを探す場合はファイル検索エージェントが回答を生成します。

④最終的な回答を出力
各エージェントの処理結果を統合し、ユーザーにわかりやすく回答を提示します。

では、次に、具体的にコードで書くとどのようになるか確認していきます。

マルチエージェントのコード

OpenAI Agents SDKでは、Agent機能で複数のエージェントを作成、Handoff機能を使用して、作成したエージェントのうちどのエージェントにデータを渡すのかを切り替えていきます。

Agents SDKの機能については、こちらの記事を参考にしてください。

では、順にコードを見ていきます。

APIキーとツール設定

from dotenv import load_dotenv
from agents import Agent, Runner, handoff, WebSearchTool, FileSearchTool, set_tracing_export_api_key
from agents.tool import UserLocation
import os

# .envファイルの読み込み
load_dotenv()

# トレース情報をOpenAIに送信(トラブルシューティング用)
set_tracing_export_api_key(os.getenv("OPENAI_API_KEY"))


まず、.envファイルからAPIキーの情報を読み込みます。
set_tracing_export_api_keyを使い、OpenAIのダッシュボードで実行履歴が確認できるように設定しています。

ツールの定義:Web検索とファイル検索

web_search_tool = WebSearchTool(
    user_location=UserLocation(
        type="approximate",
        country="JP",
        timezone="Asia/Tokyo"
    ),
    search_context_size="medium"
)

file_search_tool = FileSearchTool(
    vector_store_ids=["xxxxxx"],
    max_num_results=3
)

WebSearchToolは、現在地情報を元に検索結果を調整できます。今回はTokyoで設定しています。

FileSearchToolは、指定したベクトルストア(ファイル検索用のデータベース)から情報を取得します。
ベクトルストアは、OpenAIのダッシュボードのStroageから確認/作成ができます。

各種エージェントの定義

今回以下のエージェントを準備します。

  • 質問意図検出エージェント
  • 質問の振り分けエージェント(タスクルーターエージェント)
  • Web検索エージェント
  • ファイル検索エージェント
  • 文章要約エージェント
  • 翻訳エージェント

それでは、順に作成したコードを解説していきます。

質問意図検出エージェント

# 質問意図検出エージェントの定義
clarification_agent = Agent(
    name="Clarification Agent",
    instructions="""あなたは高度な自然言語理解を持つAIアシスタントです。
    ユーザーの入力を分析し、曖昧さを解消しつつ、より明確で適切な質問文を再構築してください。

    ### **処理の流れ**
    1. ユーザーの入力を理解し、意図を特定する。
    2. ユーザーの質問が曖昧な場合、明確で具体的な表現に言い換える。
    3. 質問の意味が変わらないように注意する。
    4. 質問がすでに明確な場合は、そのまま出力する。

    ---

    ### **ルール**
    - ユーザーの意図を可能な限り具体的に捉える。
    - 曖昧な表現(例: 「最近の技術」「いい感じの方法」)を具体化する。
    - 口語的な表現(例: 「ってどうなの?」)を正式な質問形式に修正する。
    - 再構築する際、不要な装飾語は削除する。
    - 専門用語が必要なら適切に補う。

    ---

    ### **入力例**
    **ユーザーの入力:**
    "AIについて教えて?"

    **出力例**
    "AIの基本的な仕組みと活用方法について教えてください。"

    ---

    ユーザーの入力を受け取り、適切な意図と再構築した質問に変換してください。
    変換が完了したら、タスクルーターエージェント(TaskRouter)にハンドオフしてください。

    """,
    handoffs=[handoff(task_router_agent)]
)


このエージェントでは、ユーザーの曖昧な質問を、AIが処理しやすい形に整えるようにしています。
明確になった質問を、次のタスクルーターエージェントに引き継いでいます。

タスクルーターエージェント

# タスクルーターエージェントの定義
task_router_agent = Agent(
    name="TaskRouter",
    instructions="""
    あなたは質問に応じて、必要なエージェントにハンドオフするエージェントです。
    Web検索が必要な場合は、Web検索エージェント(WebSearchAssistant)にハンドオフしてください。
    ファイル検索が必要な場合は、ファイル検索エージェント(FileSearchAssistant)にハンドオフしてください。
    文書要約が必要な場合は、文書要約エージェント(SummaryAssistant)にハンドオフしてください。
    """,
    handoffs=[
        handoff(web_search_agent),
        handoff(file_search_agent),
        handoff(summary_agent)
    ]
)

タスクルーターエージェントでは、ユーザーの質問に対して、「どのエージェントが処理すべきか?」を判断して振り分けます。
質問の内容から、AIが「Web検索」か「ファイル検索」か、あるいは「要約が必要か」を自動で選んでくれます。

Web検索エージェント

# Web検索エージェントの定義
web_search_agent = Agent(
    name="WebSearchAssistant",
    instructions="""
    最新の情報を提供するために、必要に応じてWeb検索を行って回答してください。
    """,
    tools=[web_search_tool],
)

前のタスクルーターエージェントが、Web検索が必要と判断した場合、このエージェントに行きます。
このエージェントでは、検索ツールを利用して、最新情報を収集します。

ファイル検索エージェント

# ファイル検索エージェントの定義
file_search_agent = Agent(
    name="FileSearchAssistant",
    instructions="""
    内部ドキュメントから関連情報を検索し、ユーザーの質問に回答してください。
    """,
    tools=[file_search_tool],
)

前のタスクルーターエージェントが、ファイル検索が必要と判断した場合、このエージェントに行きます。
このエージェントでは、社内のドキュメントの検索を行います。
ベクトル検索エンジンと連携して、予め作成した、StrageのVector Storeから検索を行います。

文章要約エージェント/翻訳エージェント

# 翻訳エージェントの定義
translation_agent = Agent(
    name="TranslationAgent",
    instructions="""
    あなたは翻訳エージェントです。与えられた文章を翻訳してください。
    翻訳が完了したら、ユーザーに回答を提供してください。
    """
)

# 文書要約エージェントの定義
summary_agent = Agent(
    name="SummaryAssistant",
    instructions="""あなたは文章要約を行うアシスタントです。与えられた文章を要約してください。
    要約が完了したら、翻訳エージェント(TranslationAgent)にハンドオフしてください。""",
    handoffs=[handoff(translation_agent)]
)

前のタスクルーターエージェントが、文章要約が必要と判断した場合、このエージェントに行きます。
要約が完了すると、自動的に翻訳エージェントへ引き継ぎ、翻訳を行うようにしています。

以上でエージェントの設定は完了です。

実行例

各エージェントが回答するようにな質問文を用意し、実行していきます。

Web検索の例

query = "現在の東京の天気を調べて教えてください?"
result = Runner.run_sync(language_router, "こんにちは、お元気ですか?")
print(result.final_output)

実行すると以下のように出力されました。

現在、東京では小雨が降っており、気温は14℃です。

## Weather for 〒134-0083 東京都江戸川区中葛西8丁目13:
現在の状態: 小雨、57°F (14°C)

Daily Forecast:
* Sunday, April 13: 低: 57°F (14°C)、高: 58°F (15°C)、説明: にわか雨
* Monday, April 14: 低: 59°F (15°C)、高: 71°F (22°C)、説明: とても風が強い
* Tuesday, April 15: 低: 49°F (10°C)、高: 68°F (20°C)、説明: とても風が強い
* Wednesday, April 16: 低: 53°F (12°C)、高: 69°F (21°C)、説明: 日差しが明るい
* Thursday, April 17: 低: 56°F (13°C)、高: 69°F (21°C)、説明: 雲が増す
* Friday, April 18: 低: 54°F (12°C)、高: 73°F (23°C)、説明: 上層雲からの晴れ間
* Saturday, April 19: 低: 60°F (16°C)、高: 79°F (26°C)、説明: 所により晴れ


最新の情報や詳細な予報については、信頼できる天気予報サイトやアプリをご確認ください。 

ファイル検索の例

query = "Azureの資格を持っている社員をファイル検索してください。"
result = Runner.run_sync(clarification_agent, query)
print(result.final_output)

実行すると以下のように出力されました。

Azureの資格を持っている社員は以下の通りです:

1. **佐藤 太郎** - Azure Fundamentals
2. **田中 美咲** - Azure Fundamentals
3. **小林 海斗** - Azure Fundamentals

要約+翻訳の例

with open('sample.txt', 'r', encoding='utf-8') as f:
    query = f.read()
    query = query + "上記の文章を要約してください。"

result = Runner.run_sync(clarification_agent, query)
print(result.final_output)

実行すると、’sample.txt’を要約・翻訳してくれました。

In recent years, AI (artificial intelligence) technology has evolved rapidly, bringing significant changes to our lives and society. What was once considered science fiction, "machines that think like humans," have now become reality and are deeply integrated into our daily lives. AI is no longer a technology handled only by specialists, but a presence that everyone interacts with unconsciously, such as voice assistants on smartphones, recommendation functions for online shopping, and social media feed displays.

AI stands for "Artificial Intelligence," a term that refers to technologies that impart human-like intelligence to computers. Using methods like Machine Learning and Deep Learning, AI can learn patterns from data to perform reasoning and decision-making. This has allowed AI to handle complex tasks that were once only possible for humans.

AI Use Cases

AI is already utilized in many fields. For example, in the medical field, AI is used in image diagnostic support, improving the accuracy of detecting lesions from MRI and CT images. AI learns from vast amounts of past medical data and can detect subtle abnormalities with high precision, supporting doctors' diagnoses. In diseases where early detection is crucial, the introduction of AI may save patients' lives.

In the manufacturing industry, AI is used in a method called "predictive maintenance," which prevents problems by predicting signs of equipment failure using sensor data. This improves production efficiency and reduces maintenance costs.

Recently, Generative AI has gained attention. This is a technology where AI automatically generates text, images, sounds, or program code. Notable examples include ChatGPT from OpenAI and image generation AI like Midjourney and Stable Diffusion. For instance, ChatGPT, an AI capable of natural conversation, is used in various contexts such as summarizing texts, brainstorming ideas, programming assistance, and supporting English learning.

Challenges and Concerns Brought by AI
・・・

まとめ

このように、エージェント同士を組み合わせることで、1つの質問に対して「意図を明確化 → タスクを自動振り分け → 処理 → 出力」までを、すべて自動で処理する仕組みを構築できました。

さらに、エージェントの数を増やして業務フローに沿った作業を順番に実行させることで、定型業務や情報処理の効率化にもつなげることができます。
特に業務フローが明確に定まっているような分野では、こうしたAIエージェントの活用が今後ますます広がっていくことが予想されます。

まだまだ発展途上の分野ですが、OpenAIをはじめ各社から新しい機能やツールのアップデートも続々と登場しているので、今後もウォッチしていきます。