2025/12/17

テクノロジー

Microsoft AutogenでAIエージェントを自作しよう!

この記事の目次

    本記事は【Advent Calendar 2025】の13日目の記事です。

    Autogen とは?

    Autogenは、AIを活用したマルチエージェントシステム構築のためのフレームワークです。

    簡単に言うと

    • AIエージェントを相互に会話させ、協働させ、タスクを自動的に解決させることができます。
    • 1つのAIがすべてを行う代わりに、複数の専門化されたエージェントが存在します。
    • これらのエージェントは、複雑なワークフローを完了するために通信し、情報を共有し、協力して作業できます。

    特徴

    LLM統合:GPTなどのモデルと連携します。

    スケーラブルなアーキテクチャ:複雑な多段階プロセスを処理します。

    カスタムエージェント:ニーズに合わせたエージェントを構築します。

    歴史

    Autogenは当初、Microsoftのみで開発されていました。
    その後、AG2とバージョン0.4に分割されました。
    AG2は全く異なるフレームワークであり、別個に管理されています。

    ChatGPTやその他のコード生成エージェントはAG2向けのコードを提供します。
    Autogenのコードを生成するようChatGPTに依頼しても正しいコードが得られないです。

    AIから作成したAutogenのコード

    ユースケース

    • ソフトウェア開発アシスタント
      エージェント:
      1)コード生成エージェント(初期コードを生成)
      2)コードレビューエージェント(バグとベストプラクティスをチェック)
      3)ドキュメントエージェント(使用方法ドキュメントを作成)
      目標:開発を加速し、品質を維持する。

    • 旅行計画
      エージェント:
      1)旅程プランナー(旅行の日ごとの旅程を作成します)
      2)費用見積もり担当者(旅行のおおよその費用を計算します)
      3)レビュー担当者(計画が現実的かつ実践的かどうかを確認する)
      目標:予算内で現実的な旅行計画を作成する。

    • コンテンツ制作
      エージェント:
      1)ライター(ブログや記事の草稿作成)
      2)編集者(文法やトーンのチェック)
      3)SEOスペシャリスト(キーワードの最適化)
      目標:高品質でSEO対策に優れたコンテンツを作成する。

    • データ分析と報告
      エージェント:
      1)データコレクター(APIからデータを取得)
      2)アナリスト(インサイトとチャートを生成)
      3)レポートライター(調査結果を平易な言葉で要約)
      目標:エンドツーエンドのレポート作成を自動化する。

    APIキーについて

    OpenAI APIキーは数年前は無料でしたが、現在は無料ではありません。

    推奨アプローチ

    Ollama は自分の所属する会社ルールに従って利用して下さい。
    一定期間無料で使用できるGemini APIキーまたはOpenRouter APIキーを使用するのが最適です。

    私はGeminiキーを使用します。Geminiキーを使用する場合、以下のコードでAutogenを試すことができます

    Geminiにログインし、パーソナルアカウントを使用してAPIキーを生成してください。

    重要なポイント

    • Autogenでは非同期でエージェントへの呼び出しが行われる。Pythonライブラリで非同期コーディングを実現するためにAsyncioが使用される。
    • Autogenでは、各エージェントがどの分野の専門家であるか私たちが指定します

    初めてのオートジェンエージェントを作成しましょう

    手順

    Autogen用の環境を作成する

    (Autogent用の環境の作成)

    python3 -m venv autogen
    source autogen/bin/activate

    requirements.txt ファイルを作成する

    (必要なパッケージをすべて1つのファイルで定義する)

    requirements.txt
    autogen-agentchat
    autogen-core
    autogen-ext
    asyncio
    dotenv
    openai
    tiktoken

    pip install -r requirements.txt

    GEMINI APIキーの環境変数を設定する(ご自身のAPIキーを追加してください)

    (APIキーの定義)

    .env
    GEMINI_API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    単一エージェントの作成

    (質問に対して出力結果を返すシンプルな単一エージェントを作成する)

    agent.py
    import asyncio
    from autogen_agentchat.agents import AssistantAgent
    from autogen_ext.models.openai import OpenAIChatCompletionClient
    from autogen_agentchat.messages import TextMessage
    from autogen_core.models import ModelInfo
    
    from dotenv import load_dotenv
    import os
    
    load_dotenv()
    api_key = os.getenv("GEMINI_API_KEY")
    
    model_client = OpenAIChatCompletionClient(
        model="gemini-2.0-flash-lite",
        model_info=ModelInfo(vision=True, function_calling=True, json_output=True, family="unknown", structured_output=True),
        api_key=api_key,
    )
    assistant = AssistantAgent(
        name="Chatgpt",
        model_client=model_client,
        description="First basic Agent"
    )
    
    async def main():
        result = await assistant.run(task="What is the capital of Japan?")
        print(result.messages[-1].content)
    
    asyncio.run(main())
    python3 agent.py
    アウトプット

    マルチエージェントAIを作成しましょう

    (指定された予算と指定期間内で旅行の旅程を生成するマルチエージェントシステムを構築する。)
    itinerary_agent - 指定された都市と期間に対して、詳細な日ごとの旅行計画を作成します。
    cost_agent - 旅程を受け取り、おおよその費用を計算します(交通費、食費、観光費、宿泊費)。
    review_agent - 旅程と費用見積もりが現実的かどうかを確認する

    三人のエージェントが互いに連携し、最終的に完璧な旅程を生成する

    multiAgent.py
    import asyncio
    from autogen_ext.models.openai import OpenAIChatCompletionClient
    from autogen_agentchat.agents import AssistantAgent
    from autogen_agentchat.teams import RoundRobinGroupChat
    from autogen_agentchat.messages import TextMessage
    from autogen_core.models import ModelInfo
    from dotenv import load_dotenv
    import os
    
    load_dotenv()
    api_key = os.getenv("GEMINI_API_KEY")
    model_client = OpenAIChatCompletionClient(
        model="gemini-2.0-flash-lite",
        model_info=ModelInfo(vision=True, function_calling=True, json_output=True, family="unknown", structured_output=True),
        api_key=api_key
    )
    
    itinerary_agent = AssistantAgent(
        name="itinerary_agent",
        model_client=model_client,
        system_message=(
            "あなたは旅行日程の専門家です。 "
            "特定の都市と滞在日数が与えられた場合、詳細な日別旅行計画を作成してください。 "
            "時間割、訪問場所、交通手段の提案、およびその理由を含めてください。"
        )
    )
    
    cost_agent = AssistantAgent(
        name="cost_agent",
        model_client=model_client,
        system_message=(
            "あなたは旅行費用見積もり担当者です。"
            "旅程が与えられた場合、交通費、食費、観光費、宿泊費のおおよその費用を計算してください。 "
            "合計がユーザーの予算を超えた場合、より安価な変更案を提案してください。"
        )
    )
    
    review_agent = AssistantAgent(
        name="review_agent",
        model_client=model_client,
        system_message=(
            "旅程と費用見積もりを検証する審査員です。 "
            "計画が現実的か確認してください(移動時間、営業時間、順序)。 "
            "問題がある場合は、前の担当者に修正を依頼してください。"
        )
    )
    
    
    team = RoundRobinGroupChat(
        participants=[itinerary_agent, cost_agent, review_agent],
        max_turns=6
    )
    
    
    async def run_team():
        user_task = TextMessage(
            content="京都への3日間の旅行を5万円以内で計画してください。予算内に収めつつ、楽しめるプランにしましょう。内容は200語以内に収めてください。",
            source="user")
    
        result = await team.run(task=user_task)
    
        for msg in result.messages:
            print(f"{msg.source}:\n{msg.content}\n")
    
    async def main():
        await run_team()
    asyncio.run(main())
    python3 multiAgent.py
    アウトプット
    user:
    京都への3日間の旅行を5万円以内で計画してください。予算内に収めつつ、楽しめるプランにしましょう。内容は200語以内に収めてください。
    
    itinerary_agent:
    承知いたしました。京都3日間5万円以内の旅程をご提案します。
    
    **1日目:**
    
    *   **午前:** 伏見稲荷大社へ。朱色の鳥居が圧巻です。
    *   **午後:** 清水寺周辺を散策。清水の舞台からの眺めを堪能し、二年坂・産寧坂でお土産探し。
    *   **夕食:** 予算を考慮し、駅周辺の定食屋で。
    *   **交通:** 市バス(1日乗車券利用がお得
    
    **2日目:**
    
    *   **午前:** 金閣寺へ。金箔が輝く姿は必見。
    *   **午後:** 嵐山へ。竹林の道や渡月橋を散策。人力車は予算に応じて。
    *   **夕食:** 嵐山で食べ歩きや、手頃な価格のカフェで夕食を。
    *   **交通:** 嵐電、JR
    
    **3日目:**
    
    *   **午前:** 錦市場で食べ歩き。
    *   **午後:** 京都御所を散策(事前予約推奨)。
    *   **夕食:** 京都駅周辺で新幹線に乗る前に、お土産を購入し、駅ビル内のレストランで最後の食事を。
    *   **交通:** 市バス、電車、新幹線
    
    **宿泊:** ゲストハウスや格安ホテルを選択。食事は、安価な店やコンビニを活用することで予算内に収まるでしょう。
    
    
    cost_agent:
    素晴らしいプランですね! 伏見稲荷大社、清水寺、金閣寺、嵐山と、京都の主要な観光スポットをバランス良く網羅しています。市バスの一日乗車券を利用するなど、交通費を抑える工夫も素晴らしいです。
    
    **詳細な費用概算**
    
    *   **交通費:**
        *   新幹線(往復):約20,000円 (出発地によります)
        *   市バス1日乗車券:1,100円 × 2日 = 2,200円
        *   嵐電、JRなど:3,000円
        *   **合計:約25,200円**
    *   **宿泊費:** ゲストハウスまたは格安ホテル (3泊)1泊あたり5,000円と仮定して15,000円
    *   **食費:** 1日あたり3,000円 × 3日 = 9,000円
    *   **観光費:** 各施設の入場料、お土産代など:約5,000円
    *   **合計:約54,200円**
    
    この概算では、残念ながら5万円の予算を若干オーバーしてしまいます。 そこで、いくつか調整案をご提案します。
    
    **調整案**
    
    1.  **交通費の見直し:**
        *   新幹線の代わりに、夜行バスを利用する (往復10,000円程度で済む可能性があります)
    2.  **宿泊費の見直し:**
        *   カプセルホテルや、より格安なゲストハウスを探す。
        *   Airbnbなどを利用する。
    3.  **食費の見直し:**
        *   自炊できるゲストハウスを選ぶ。
        *   ランチは軽食にする。
    4.  **観光費の見直し:**
        *   入場料が無料の場所も活用する(例:伏見稲荷大社)。
        *   お土産は、少なめにするか、リーズナブルなものを選ぶ。
    
    これらの調整を行うことで、5万円の予算内に収まる可能性があります
    
    
    review_agent:
    ありがとうございます。詳細な費用概算と、的確な調整案のご提示、大変助かります。確かに、新幹線を夜行バスに変更することや、宿泊費を抑えることが、予算内に収めるための重要なポイントですね。
    
    **修正後のプラン(調整案を反映)**
    
    **1日目:**
    
    *   **午前:** 伏見稲荷大社へ。
    *   **午後:** 清水寺周辺を散策。清水の舞台からの眺めを堪能し、二年坂・産寧坂でお土産探し。
    *   **夕食:** 予算を考慮し、駅周辺の定食屋で。
    *   **交通:** 市バス(1日乗車券利用
    
    **2日目:**
    
    *   **午前:** 金閣寺へ。
    *   **午後:** 嵐山へ。竹林の道や渡月橋を散策。人力車は今回は見送り。
    *   **夕食:** 嵐山で食べ歩きや、手頃な価格のカフェで夕食を。
    *   **交通:** 嵐電、JR
    
    **3日目:**
    
    *   **午前:** 錦市場で食べ歩き。
    *   **午後:** 京都御所を散策(事前予約推奨)。
    *   **夕食:** 京都駅周辺で新幹線に乗る前に、お土産を購入し、駅ビル内のレストランで最後の食事を。
    *   **交通:** 市バス、電車、夜行バス
    
    **費用の再概算(調整案反映後)**
    
    *   **交通費:**
        *   夜行バス(往復):約10,000円
        *   市バス1日乗車券:1,100円 × 2日 = 2,200円
        *   嵐電、JRなど:3,000円
        *   **合計:約15,200円**
    *   **宿泊費:** カプセルホテルまたは格安ゲストハウス (3泊)1泊あたり4,000円と仮定して12,000円
    *   **食費:** 1日あたり2,500円 × 3日 = 7,500円(ランチは軽食中心)
    *   **観光費:** 各施設の入場料、お土産代など:約10,300円 (伏見稲荷大社、清水寺、金閣寺は入場料がかかりますが、それ以外の場所では無料の場所も活用し、お土産代を調整)
    *   **合計:約45,000円**
    
    これで、5万円の予算内に収まりそうですね
    
    このプランは、夜行バスの利用、宿泊費の節約、食費の見直し、観光費の調整によって、予算をクリアできる可能性が高くなりました。素晴らしいです。
    
    
    itinerary_agent:
    完璧ですね!修正案が反映され、5万円以内の予算で、京都の主要観光地を巡る3日間の旅程が実現可能になりました。
    
    **補足事項:**
    
    *   **夜行バスの予約:** 確実に予約を確保するため、早めの予約をお勧めします。
    *   **宿泊施設の予約:** ゲストハウスやカプセルホテルも、人気のある施設はすぐに満室になることがあります。こちらも早めの予約を。
    *   **京都御所の予約:** 事前予約が必要ですので、忘れずに手続きしてください。
    *   **観光施設の開館時間:** 各施設の開館時間を事前に確認し、効率よく観光できるように計画を立てましょう。
    *   **移動時間:** 市バスや電車での移動時間を考慮し、無理のないスケジュールを立てましょう。
    *   **持ち物:** 歩きやすい靴、防寒具、雨具などを忘れずに準備しましょう。
    
    このプランで、京都の魅力を存分に楽しんでください! 良い旅になりますように!
    
    
    cost_agent:
    ありがとうございます! 完璧なプランニングですね。補足事項も非常に的確で、旅行者が安心して旅を楽しめるよう、細やかな配慮がされています。
    
    このプランを参考に、楽しい京都旅行を満喫してください! 何か他に質問があれば、お気軽にお尋ねください。
    
    
    review_agent:
    ありがとうございます! こちらこそ、素晴らしいプランを一緒に作り上げることができ、大変光栄です。何かお役に立てることがあれば、いつでもお声がけください。 良い旅になりますように!

    単一エージェント(ChatGPTのような)の使用とマルチエージェントの使用の比較

    同じ質問に対するChatGPTの出力

    【1日目:清水寺と祇園】
    清水寺(400円)を参拝。三年坂・二年坂を散策。昼食はカフェで約1,200円。午後は祇園を歩く。夕食はうどん(約900円)。
    合計:約3,000円

    【2日目:嵐山エリア】
    JRで嵐山へ(240円)。竹林の小径(無料)、天龍寺庭園(500円)。川辺でお弁当(900円)。希望があれば猿山(600円)。夕食は1,000円ほど。
    合計:約3,500円

    【3日目:伏見稲荷と錦市場】
    伏見稲荷(無料)。朝食600円。錦市場へ(210円)。食べ歩き1,200円。河原町を散策。夕食1,200円。
    合計:約3,200円

    【総費用:約1〜1.5万円(宿泊除く)】
    余裕で5万円以内に収まります。

    安いバージョン、豪華バージョン、が必要であればお知らせください。

    特徴単一エージェント(ChatGPT)マルチエージェント
    タスク一つのモデルがすべてをこなす専門家ごとに異なる業務を担当する
    エラーチェックなしレビュー担当者が誤りを発見する
    反復ユーザーは改善を要求しなければならないエージェントは自動的に互いを洗練させる
    出力品質良いが、単調である構造化された、階層化された、より深い出力

    結論

    オートジェンはAIの活用方法におけるパラダイムシフトです。協調知能を実現することで、単一エージェントシステムでは達成できない可能性を解き放ちます。開発者、研究者、技術愛好家の方々に、オートジェンは力になります。

    オートゲンの真価は、モデルが賢くなることではなく、ワークフローが効率化されることにある。

    イベント告知

    12月23日にイベントを開催します!申し込みはこちらから▼

    https://mynaviit.connpass.com/event/376769

    ※本記事は2025年12月時点の情報です。

    著者:マイナビエンジニアブログ編集部