🐝

OpenAIのAI Agent SDK「openai-agents-python」を試してみた。

に公開

はじめに

こんにちは。よこやんです。
株式会社バニッシュ・スタンダードという会社でサーバーサイドエンジニアをやっています。
普段はSREチームに所属し、弊社サービスであるSTAFF STARTの保守や社内作業向けの機能改善などを行っております。
その傍で自身の技術力向上や知的好奇心を満たす目的で個人開発なども行っております。
最近はもっぱら競馬関連のシステム開発をおこなっているのですが、日進月歩のAI技術にもちょこちょこと手を出して色々と遊んでいます。
今回はOpenAIの出しているAI Agent SDK「openai-agents-python」でどんなことができるかを試してみたいと思います。

AIエージェントとは何か。

まずそもそもとして「AIエージェント」とはなんでしょうか?
自分の中のフワッとした理解をChatGPTさんに言語化してもらいました。

似たような言葉で「AIモデル」というものもありますが、こちらは主に「予測」「分類」「分析」など、与えられたデータに基づいて特定のタスク(例えば売上予測や画像認識など)を実行する知的エンジンです。AIモデルは単体で動作し、入力データに対して決まった出力を返すことに特化しています。
LLM(大規模言語モデル)は生成AIの一種で、言語処理に特化したAIモデルといえます。

一方、AIエージェントは、AIモデルを活用しながら、より広い範囲の業務プロセスやタスクを自律的にオーケストレーション(統合・制御)します。例えば、AIエージェントは在庫確認から発注、顧客対応まで複数のタスクを連続的かつ自律的に実行できます。AIエージェントは、必要に応じて複数のAIモデルや外部ツールと連携し、人間の介入を最小限に抑えて目標達成のために最適な行動を選択・実行します。

つまり、AIモデルは「知識や推論のエンジン」、AIエージェントは「自律的に行動し、タスクを実行するデジタル作業員」と言えます。AIエージェントはAIモデルを部品として活用しながら、より複雑で実用的な業務遂行を担う存在です。

最近のChatGPTなどのAIチャットサービスはユーザーのリクエストに対し、自律的にweb検索を行ったり、「イラスト書いて」というリクエストに対し、自律的に「DALL·E2」などの画像生成AIモデルに切り替えたりするなど、AIモデルの切り替えを自律的に行なっており、AI Agentとして機能しているといえます。

AI Agent SDKを使うと何ができるか。

OpenAI Agents SDK(openai-agents-python)を使うと、以下のようなマルチエージェントワークフローを簡単に組み立て・実行できます。
実は本ブログのネタは当初OpenAIが出しているマルチエージェントフレームワーク「Swarm」にする予定でした。
しかし、最新のreadmeを確認したところ

とあり、なんと半年程度で陳腐化してしまいました。
この辺りはAI関連技術の進化のスピードを実感してしまうところです。。

エージェント(Agents)の定義

LLMベースのエージェントを“instructions(振る舞い指示)”や“tools(外部機能)”、“guardrails(入出力バリデーション)”などで柔軟に設定可能。

例えば「アイデア出しエージェント」「要約エージェント」「ファクトチェックエージェント」など役割ごとに分けて設計できます

ハンドオフ(Handoffs)によるタスク移譲

エージェントが自身の役割を超えるタスクに遭遇した際、別エージェントへ処理を委譲する仕組みを提供します。
例えば、「司会」の役割をするAIエージェントと「専門家」の役割をするAIエージェントを用意した場合、「司会」に専門的な知識を要する質問を投げると、自律的に「専門家」にタスクを渡して代わりに回答してもらう、などの対処が可能です。

ガードレール(Guardrails)

入力値やエージェント出力をスキーマやルールで検証し、安全かつ期待どおりのやり取りを担保します

トレーシング(Tracing)

エージェント実行の追跡機能が組み込まれており、ワークフローの表示、デバッグ、最適化が可能です。


readmeにはあります。
なので実際に使ってみました。
今回作ったのはこちらです。
https://github.com/xiao1203/multi_aiagent_chat_app

UI部分はstreamlitを使いました。
こちらを実行すると、このようなシステムを使うことができます。

今回のこちらはAIエージェントの“instructions(振る舞い指示)”と複数エージェントの使い分けを明確にわかるようにしたサンプルになります。
これにより、まるで複数人で会議をしているような感覚になり、「壁打ち」が捗るのではないかな?と思いました。

次の項で本サンプルの詳細についてまとめます。

サンプル解説

システムアーキテクチャ

システムは以下の主要コンポーネントで構成されています:

  • Streamlit: Webインターフェース
  • OpenAI API: AIモデルとの通信
  • OpenAI Agent SDK: エージェントの管理
  • asyncio: 非同期処理
# コアとなるライブラリ
import streamlit as st
import openai
from agents import Agent, Runner
from agents.items import MessageOutputItem, ItemHelpers

エージェントシステムの実装

司会エージェントの定義

moderator = Agent(
    name="司会",
    instructions="あなたは会議の司会です。ユーザーの質問を整理し、必要に応じて専門家に話を振ってください。",
    model="gpt-4o",
)

専門家エージェントの定義

expert = Agent(
    name="専門家",
    instructions="あなたはITの技術専門家です。技術的な質問には根拠を示しながら詳しく回答してください。",
    model="gpt-4o",
)

今回はわかりやすく"振る舞い"を変えるだけにしました。
例えば、専門家エージェントにはweb検索を行わせる、などの機能を付与するときは

from agents import Agent, WebSearchTool

expert = Agent(
    name="専門家",
    instructions="あなたはITの技術専門家です。技術的な質問には根拠を示しながら詳しく回答してください。",
    model="gpt-4o",
    tools=[WebSearchTool()],
)

のような書き方ができますし、司会エージェントの機能で直接専門家エージェントにタスクを委譲させるような形にする場合は

moderator = Agent(
    name="司会",
    instructions="あなたは会議の司会です。ユーザーの質問を整理し、必要に応じて専門家に話を振ってください。",
    model="gpt-4o",
    handoffs=[expert],
)

のような書き方もできます。
今回は見せ方がうまく調整できなかったので専門家エージェントの条件付き呼び出すような形にしました。

expert_keywords = ["技術", "専門家", "IT", "システム", "セキュリティ"]
if any(word in moderator_output.final_output for word in expert_keywords):
    expert = Agent(
        name="専門家",
        instructions="あなたはITの技術専門家です。技術的な質問には根拠を示しながら詳しく回答してください。",
        model="gpt-4o",
    )

あとはstreanmlit側でどのように受け取るかの話で
イベントループの設定を行い

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

エージェントへのリクエストを非同期での実行としました

with st.spinner("司会が考えています..."):
    moderator_output = loop.run_until_complete(Runner.run(moderator, input_items))

このAIエージェントですが、toolsには自前で定義した関数なども呼び出せます。
以前の記事で作ったRAGなども応用して使うことができるはずです。
https://zenn.dev/vs_blog/articles/c51accd5b6d016

まとめ

今回はあくまで「さわり」だけでopenai-agents-pythonの全ての機能を触ってみることはできませんでした。
しかし、ちょっと触っただけでも「あんなことができるかも?」「もしやこれも?」などと色々と好奇心が刺激されるSDKでした。
バニッシュ・スタンダードでは主にGo言語での開発を行っているので、Go言語でAI Agentを作りたかった。。。
このようなライブラリもあったのですが、うまく使うことができずに時間切れ。
こちらは次回以降に持ち越したいと思います。

最後に

皆さん、この記事を最後まで読んでいただき、ありがとうございます。私たちのプロジェクトや技術的な挑戦に興味を持っていただけたなら、さらに嬉しい限りです。そして、この機会に弊社「株式会社バニッシュ・スタンダード」では現在エンジニア、デザイナーを積極的に探していることをお伝えしたいと思います。

私たちは会社のミッションである「つまらない常識を革めるプロダクトを開発し、おもしろく生きる人で世界をいっぱいにする。」を実現するため、この理念に共感してくれる新たな仲間を求めています。

私たちと一緒に、技術の最前線で働き、新しい未来を創造していきませんか?あなたの才能と情熱を、私たちのチームで発揮してください。興味のある方は、ぜひお問い合わせください。私たちはあなたからの応募を心からお待ちしています。

https://recruit.v-standard.com/

株式会社バニッシュ・スタンダード

Discussion