メインコンテンツへスキップ

OpenAI Agents SDKを使った、AIリサーチアシスタントの作り方

    どーも、冨安です。

    本業は北海道で農家なのですがただいまAIにドハマリ中です!

    最近はAIエージェントと呼ばれる仕組みを作るツールが色々とでていて、色々と試してみてます😀


    OpenAIからはOpenAI Agents SDKというフレームが出て、これを実験しています。

    今回はOpenAI Agents SDKとFirecrawlを使って「AIリサーチアシスタント」を作る方法をお伝えします。

    画像

    このアプリで何ができるの?

    • 気になるトピックを入力するだけで、ウェブから関連情報を自動的に収集

    • 集めた情報を整理して、読みやすいレポートを自動生成

    • さらに内容を充実させて、より深い洞察を追加

    画像

    仕組みをシンプルに理解しよう

    2つのAIエージェントが協力して働く

    このアプリでは、2つのAIエージェントが協力して働きます:

    1. 情報収集エージェント

      • ウェブ上から情報を集める専門家

      • Firecrawlというツールを使ってインターネットを検索(APIでコストは発生)

      • 集めた情報を整理して初期レポートを作成

    2. 内容強化エージェント

      • 初期レポートを読み込んで分析する専門家

      • 内容をより詳しく、わかりやすく強化

      • 具体例や応用例を追加して、より充実したレポートに仕上げる

    この「役割分担」をして、それぞれ得意なことに集中させることで、よりクオリティの高い結果が得られます。

    画像

    開発手順:ステップバイステップ

    ステップ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つの検索ツールを使います。

    1. tools.py:情報収集用のツール

    2. my_agents.py:2つのAIエージェントの定義

    3. 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リサーチアシスタントのインターフェースが表示されます。

    画像

    仕組みをもう少し詳しく解説


    1. Research Agentは「情報を正確に集める」ことに集中

    2. Elaboration Agentは「情報をわかりやすく充実させる」ことに集中

    この役割分担により、一つのAIだけでは難しかった「情報収集の正確さ」と「内容の充実度」を実現させようとしています。

    これは簡単なリサーチアシスタントでしかないですが、カスタマイズができるのがポイントだと思います。

    XやChatGPTの本家のディープリサーチに比べたら全然だめですが、稼働はしてくれます😆

    アプリのカスタマイズアイデア

    このアプリを自分好みにアレンジする方法をいくつか紹介します。

    1. 特定分野専門のエージェント:医療や法律など特定分野の専門知識を持つエージェントを追加

    2. レポート形式のカスタマイズ:ブログ記事、学術論文、プレゼン資料など特定の形式に特化

    3. 情報源の追加:学術論文データベースなど、別の情報源を追加

    4. 多言語対応:日本語以外の言語でも調査できるように拡張

    など目的にに応じて、自由に作れるのが魅力😀

    まとめ

    この記事では、OpenAI Agents SDKとFirecrawlを使って、自分だけのAIリサーチアシスタントを作る方法をお伝えしました😀

    いま流行りのディープリサーチも作ろうと思えば、自分で作れるんだなと思いました!

    非エンジニアの実験は続く。


     
     
    北海道(平取町とむかわ町)100ha農場🌱×AI実験🤖|農業法人役員| 5年目で年商1億円達成。 ブロッコリー/大豆/カボチャ/ネギなど栽培 農家がAI実装目指して独学・実験中。AI活用やITツールを活用した地方暮らしやのその可能性の開拓過程を発信しています。

    あなたへのおすすめ