OpenAI Agents SDKを使った、AIリサーチアシスタントの作り方
どーも、冨安です。
本業は北海道で農家なのですがただいまAIにドハマリ中です!
最近はAIエージェントと呼ばれる仕組みを作るツールが色々とでていて、色々と試してみてます😀
OpenAIからはOpenAI Agents SDKというフレームが出て、これを実験しています。
今回はOpenAI Agents SDKとFirecrawlを使って「AIリサーチアシスタント」を作る方法をお伝えします。

このアプリで何ができるの?
気になるトピックを入力するだけで、ウェブから関連情報を自動的に収集
集めた情報を整理して、読みやすいレポートを自動生成
さらに内容を充実させて、より深い洞察を追加

仕組みをシンプルに理解しよう
2つのAIエージェントが協力して働く
このアプリでは、2つのAIエージェントが協力して働きます:
情報収集エージェント
ウェブ上から情報を集める専門家
Firecrawlというツールを使ってインターネットを検索(APIでコストは発生)
集めた情報を整理して初期レポートを作成
内容強化エージェント
初期レポートを読み込んで分析する専門家
内容をより詳しく、わかりやすく強化
具体例や応用例を追加して、より充実したレポートに仕上げる
この「役割分担」をして、それぞれ得意なことに集中させることで、よりクオリティの高い結果が得られます。

開発手順:ステップバイステップ
ステップ1:プロジェクトのセットアップ
まずはプロジェクトのフォルダを作成し、必要なパッケージをインストールします。
# フォルダを作成して移動
mkdir ai_research_assistant
cd ai_research_assistant
# 仮想環境を作成(Pythonを分離環境で動かすため)
python -m venv venv
# 仮想環境を有効化
# Windowsの場合:
venv\Scripts\activate
# Mac/Linuxの場合:
source venv/bin/activate
# 必要なパッケージをインストール
pip install openai-agents firecrawl streamlit python-dotenv
ステップ2:APIキーを管理するファイルを作成
.envというファイルを作成して、APIキーを安全に管理しましょう。
# .envファイル
OPENAI_API_KEY=あなたのOpenAI APIキー
FIRECRAWL_API_KEY=あなたのFirecrawl APIキー
ステップ3:3つの主要なファイルを作成しよう
このアプリは3つのファイルで構成します。2つのエージェントと1つの検索ツールを使います。
tools.py:情報収集用のツール
my_agents.py:2つのAIエージェントの定義
app.py:メインのアプリケーション(UI部分)
それぞれのファイルを順番に作っていきましょう。
①まずはtools.py(情報収集ツール)
# tools.py
import streamlit as st
from typing import Dict, Any
from agents.tool import function_tool
from firecrawl import FirecrawlApp
@function_tool
async def deep_research(query: str, max_depth: int, time_limit: int, max_urls: int) -> Dict[str, Any]:
"""
ウェブから情報を集めるツール
"""
try:
# Firecrawlを使ってウェブ検索を行う準備
firecrawl_app = FirecrawlApp(api_key=st.session_state.firecrawl_api_key)
# 検索の詳細設定
params = {"maxDepth": max_depth, "timeLimit": time_limit, "maxUrls": max_urls}
# 検索状況をリアルタイムで表示するための設定
def on_activity(activity):
st.write(f"[{activity['type']}] {activity['message']}")
# 実際に検索を実行
with st.spinner("ウェブ検索中..."):
results = firecrawl_app.deep_research(query=query, params=params, on_activity=on_activity)
# 結果を返す
return {
"success": True,
"final_analysis": results["data"]["finalAnalysis"],
"sources_count": len(results["data"]["sources"]),
"sources": results["data"]["sources"],
}
except Exception as e:
st.error(f"検索エラー: {str(e)}")
return {"error": str(e), "success": False}
このファイルでは、Firecrawlを使ってウェブ検索を行う「deep_research」という機能を定義しています。この機能はAIに「ウェブ検索する能力」を与えます。
②次にmy_agents.py(AIエージェントの定義)
# my_agents.py
from agents import Agent
# 情報収集エージェント(Research Agent)の定義
def create_research_agent(tools):
"""情報を集めるエージェントを作成"""
return Agent(
name="research_agent",
instructions="""あなたは情報収集の専門家です。
トピックが与えられたら:
1. deep_researchツールを使ってウェブから情報を集めてください
2. 集めた情報を整理して、わかりやすいレポートにまとめてください
3. 情報源を明記してください
4. 重要なポイントを強調してください
""",
tools=tools,
)
# 内容強化エージェント(Elaboration Agent)の定義
def create_elaboration_agent():
"""レポートを充実させるエージェントを作成"""
return Agent(
name="elaboration_agent",
instructions="""あなたはレポートの内容を充実させる専門家です。
レポートが与えられたら:
1. レポートの内容を分析してください
2. 以下の方法で内容を充実させてください:
- 難しい概念をわかりやすく説明する
- 具体例や実例を追加する
- 重要なポイントをより詳しく説明する
- 図や表の説明を提案する
- 最新のトレンドや将来の予測を加える
- 実用的な応用方法を提案する
3. 事実に基づいた正確な情報を維持してください
4. 元の構造を保ちながら、より内容を豊かにしてください
""",
)
このファイルでは、2つのAIエージェントを定義しています:
Research Agent:情報収集を担当
Elaboration Agent:内容の充実化を担当
それぞれのエージェントには、どんな役割を担い、どう行動すべきかの「指示書」が与えられています。
③最後にapp.py(メインアプリ)
# app.py
import asyncio
import streamlit as st
import os
from dotenv import load_dotenv
from agents import Runner, set_default_openai_key
from tools import deep_research
from my_agents import create_research_agent, create_elaboration_agent
# 環境変数を読み込む
load_dotenv()
# ページの基本設定
st.set_page_config(page_title="AIリサーチアシスタント", page_icon="🔍", layout="wide")
# APIキーの設定
if "openai_api_key" not in st.session_state:
st.session_state.openai_api_key = os.getenv("OPENAI_API_KEY", "")
if "firecrawl_api_key" not in st.session_state:
st.session_state.firecrawl_api_key = os.getenv("FIRECRAWL_API_KEY", "")
# サイドバーにAPIキー入力欄を配置
with st.sidebar:
st.title("API設定")
openai_api_key = st.text_input("OpenAI APIキー", value=st.session_state.openai_api_key, type="password")
firecrawl_api_key = st.text_input(
"Firecrawl APIキー", value=st.session_state.firecrawl_api_key, type="password"
)
if openai_api_key:
st.session_state.openai_api_key = openai_api_key
set_default_openai_key(openai_api_key)
if firecrawl_api_key:
st.session_state.firecrawl_api_key = firecrawl_api_key
# メイン画面の内容
st.title("🔍 AIリサーチアシスタント")
st.markdown("調べたいトピックを入力するだけで、自動的に調査レポートを作成します")
# 調査トピックの入力欄
research_topic = st.text_input("調査トピックを入力してください:", placeholder="例: 人工知能の最新動向")
# 詳細設定の折りたたみセクション
with st.expander("詳細設定(上級者向け)"):
col1, col2, col3 = st.columns(3)
with col1:
max_depth = st.slider(
"検索の深さ",
min_value=1,
max_value=5,
value=3,
help="高い値ほど詳しい調査になりますが、時間がかかります",
)
with col2:
time_limit = st.slider(
"時間制限(秒)",
min_value=60,
max_value=300,
value=180,
help="調査にかける最大時間",
)
with col3:
max_urls = st.slider(
"調査するウェブサイト数",
min_value=5,
max_value=20,
value=10,
help="分析するウェブサイトの数",
)
# 実際の調査を行う関数
async def run_research_process(topic: str, max_depth: int, time_limit: int, max_urls: int):
"""AIエージェントによる調査プロセスを実行"""
# AIエージェントを準備
research_agent = create_research_agent([deep_research])
elaboration_agent = create_elaboration_agent()
# ステップ1: 情報収集エージェントによる調査
with st.spinner("エージェント1: 情報収集中..."):
research_prompt = f"""
以下のトピックについて調査してください: {topic}
以下の設定で検索を行ってください:
- 検索の深さ: {max_depth}
- 時間制限: {time_limit}秒
- ウェブサイト数: {max_urls}
調査結果を整理してレポートにまとめてください。
"""
research_result = await Runner.run(research_agent, research_prompt)
initial_report = research_result.final_output
# 初期レポートを表示
with st.expander("初期調査レポート(情報収集の結果)"):
st.markdown(initial_report)
# ステップ2: 内容強化エージェントによるレポート充実化
with st.spinner("エージェント2: レポートを充実化中..."):
elaboration_input = f"""
調査トピック: {topic}
初期調査レポート:
{initial_report}
このレポートの内容を充実させてください。具体例や応用例を追加し、
より深い洞察を提供してください。ただし、事実に基づいた正確さを維持してください。
"""
elaboration_result = await Runner.run(elaboration_agent, elaboration_input)
enhanced_report = elaboration_result.final_output
return enhanced_report
# 「調査開始」ボタン
if st.button(
"AIリサーチを開始", disabled=not (openai_api_key and firecrawl_api_key and research_topic)
):
if not openai_api_key or not firecrawl_api_key:
st.warning("APIキーを入力してください。")
elif not research_topic:
st.warning("調査トピックを入力してください。")
else:
try:
# レポート表示用の領域を確保
report_placeholder = st.empty()
# 調査状況表示用の領域
status_container = st.container()
with status_container:
st.subheader("調査状況:")
# AIによる調査を実行
enhanced_report = asyncio.run(
run_research_process(research_topic, max_depth, time_limit, max_urls)
)
# 最終レポートを表示
report_placeholder.markdown("## 最終調査レポート")
report_placeholder.markdown(enhanced_report)
# レポートのダウンロードボタン
st.download_button(
"レポートをダウンロード",
enhanced_report,
file_name=f"{research_topic.replace(' ', '_')}_report.md",
mime="text/markdown",
)
except Exception as e:
st.error(f"エラーが発生しました: {str(e)}")
# フッター
st.markdown("---")
st.markdown(
"OpenAI Agents SDKとFirecrawlを使用した自作リサーチアシスタント"
)
このファイルでは、アプリの見た目と動作を定義しています。Streamlitというライブラリを使って、シンプルなウェブインターフェースを作成しています。
ステップ4:アプリを実行しよう!
すべてのファイルを作成したら、以下のコマンドでアプリを起動します:
streamlit run app.py
ブラウザが自動的に開き、AIリサーチアシスタントのインターフェースが表示されます。

仕組みをもう少し詳しく解説
Research Agentは「情報を正確に集める」ことに集中
Elaboration Agentは「情報をわかりやすく充実させる」ことに集中
この役割分担により、一つのAIだけでは難しかった「情報収集の正確さ」と「内容の充実度」を実現させようとしています。
これは簡単なリサーチアシスタントでしかないですが、カスタマイズができるのがポイントだと思います。
XやChatGPTの本家のディープリサーチに比べたら全然だめですが、稼働はしてくれます😆
アプリのカスタマイズアイデア
このアプリを自分好みにアレンジする方法をいくつか紹介します。
特定分野専門のエージェント:医療や法律など特定分野の専門知識を持つエージェントを追加
レポート形式のカスタマイズ:ブログ記事、学術論文、プレゼン資料など特定の形式に特化
情報源の追加:学術論文データベースなど、別の情報源を追加
多言語対応:日本語以外の言語でも調査できるように拡張
など目的にに応じて、自由に作れるのが魅力😀
まとめ
この記事では、OpenAI Agents SDKとFirecrawlを使って、自分だけのAIリサーチアシスタントを作る方法をお伝えしました😀
いま流行りのディープリサーチも作ろうと思えば、自分で作れるんだなと思いました!
非エンジニアの実験は続く。