🤖

[AI Agent Jump Start 基礎編#3] ハンズオン(基礎)

に公開

Azure OpenAI + Agents SDK で Web検索対応エージェントを作る

OpenAIの公式 Agents SDK を使えば、ツール呼び出し対応のエージェント開発が簡単にできます。
本記事では Azure OpenAI を利用し、さらに Tavily Search API を使った Web検索ツールを組み込んだ実装方法を解説します。


簡単なプログラムを実行する

まずは、Azure OpenAI と Agents SDK で簡単な「Hello, Agent!」を動かしてみましょう。

① 環境構築

Python 仮想環境を作り、必要なライブラリをインストールします。

mkdir my_agents_project
cd my_agents_project
python3 -m venv .venv
source .venv/bin/activate
pip install openai-agents tavily-python python-dotenv

② .env ファイルで APIキー管理

# Azure OpenAI
AZURE_OPENAI_API_KEY=your_azure_api_key
AZURE_OPENAI_ENDPOINT=https://your-resource-name.openai.azure.com/
AZURE_OPENAI_DEPLOYMENT=gpt-4o
AZURE_OPENAI_API_VERSION=2024-07-01-preview

# Tavily
TAVILY_API_KEY=your_tavily_api_key

👉 Tavily Search の APIキーは以下から取得してください。
https://app.tavily.com/home

③ Azure OpenAIを使ったシンプルなエージェント実装

次のコードは、Agents SDK + Azure OpenAI でシンプルなエージェントを実行する例です。

simple_agent.py

import os
from dotenv import load_dotenv
load_dotenv()

from agents import Agent, Runner, OpenAIChatCompletionsModel
from openai import AsyncAzureOpenAI

# 1) Azure OpenAI クライアントを作成
client = AsyncAzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    api_version=os.getenv("AZURE_OPENAI_API_VERSION"),  # 例: "2024-08-01-preview"
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT")   # 例: "https://<your-resource>.openai.azure.com"
)

# 2) Agents SDKが理解できる「model」にラップ
model = OpenAIChatCompletionsModel(
    openai_client=client,
    model=os.getenv("AZURE_OPENAI_DEPLOYMENT")  # ← デプロイ"名"(モデル名ではない)
)

# 3) エージェント作成
agent = Agent(
    name="Simple Assistant",
    instructions="あなたは有能なアシスタントです。日本語で簡潔に答えてください。",
    model=model
)

# 4) 実行
result = Runner.run_sync(agent, "AIエージェントとは何ですか?")
print(result.final_output)

✅ ここまでで、Azure OpenAI + Agents SDK の基本動作を確認できます。

ツールを自作する

次に、Web検索ツールを自作してエージェントに組み込みます。

① Tavilyを使ったWeb検索ツール

web_search.py

import os

from agents.tool import function_tool
from tavily import TavilyClient

from dotenv import load_dotenv

# 環境変数を読み込む
load_dotenv()

# Tavilyクライアント初期化
tavily = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))

@function_tool
def web_search(query: str, max_results: int = 3) -> str:
    """
    Web検索を行い、上位結果をまとめて返す。
    Tavily APIを使用。
    """
    try:
        response = tavily.search(query=query, max_results=max_results)
        summaries = []
        for item in response.get("results", []):
            title = item.get("title", "No Title")
            snippet = item.get("snippet", "")
            url = item.get("url", "")
            summaries.append(f"• {title}\n  {snippet}\n  URL: {url}")
        
        return "\n\n".join(summaries) if summaries else "検索結果が見つかりませんでした。"
    except Exception as e:
        return f"エラーが発生しました: {str(e)}"

② 作成したツールをエージェントに組み込み

run_search_agent.py

import os
import asyncio
from dotenv import load_dotenv
from agents import Agent, Runner, set_tracing_disabled, OpenAIChatCompletionsModel
from openai import AsyncAzureOpenAI
from web_search import web_search  # web_search.pyをインポート

# 環境変数を読み込む
load_dotenv()

#1) Azure OpenAIクライアントを作成
client = AsyncAzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
    azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT")
)

set_tracing_disabled(disabled=True)

# 2) Agents SDKが理解できる「model」にラップ
model = OpenAIChatCompletionsModel(
    openai_client=client,
    model=os.getenv("AZURE_OPENAI_DEPLOYMENT")  # ← デプロイ"名"(モデル名ではない)
)

#3) Search Agentを定義
agent = Agent(
    name="Search Agent",
    instructions="質問に答えるため、必要ならWeb検索を使ってください。",
    tools=[web_search],  # Tavily検索ツールを利用
    model=model
)

#4) 非同期でエージェントを実行
async def main():
    query = "OpenAI Agents SDKの特徴を簡単にまとめて"
    result = await Runner.run(agent, query)
    print("\n=== エージェントの最終回答 ===\n")
    print(result.final_output)

if __name__ == "__main__":
    asyncio.run(main())

@function_tool とは?

@function_toolAgents SDK が提供するデコレーターで、Python 関数をエージェントに呼び出し可能なツールとして登録するために使います。

仕組み

  • 関数の名前・引数・docstring からツールのメタ情報を自動生成
  • LLM が「どのツールを呼ぶべきか」を判断できるようスキーマを作成
  • Pydantic で引数をバリデートするため安全

ポイント

  • LLM に「使い方を説明する必要なし」
  • 自然言語プロンプトでツール選択が可能
  • JSONスキーマを自動生成(OpenAI Function Calling と同じ概念)

Tavilyとは?

Tavily は AIアプリ向けの Web検索API です。

  • 高速な検索(Google依存なし)
  • 検索結果の要約・スニペットが取得可能
  • OpenAI や LangChain との統合が容易

👉 今回はこれを Agents SDK のツール として実装しました。


実行結果

=== エージェントの最終回答 ===

OpenAI Agents SDKは、LLMベースのエージェントを簡単に構築できるPythonライブラリです。
主な特徴:
- ツール呼び出しを標準サポート
- マルチエージェント構成(ハンドオフ)
- Guardrailsによる出力検証
- トレーシング機能でデバッグ容易
参考:https://openai.github.io/openai-agents-python/

✅ まとめ

  • Azure OpenAI で Agents SDK を動かすにはAzureOpenAI クライアントと環境変数設定が必須

  • @function_tool で自作ツールを追加できる
    👉 今回は Tavily Search を使ってリアルタイム検索を実装

  • Runner.run / run_sync で簡単にエージェントを実行可能

DXC Lab

Discussion