Azure AI Foundry Agent Serviceで、シングルエージェントだけでなくマルチエージェントがサポートされていたので、実装方法をご紹介します。
実行環境
- Python 3.11.9
- azure-ai-projects 1.0.0b11
事前準備
以下のリンクを参考に、Azure AI Foundry Agent Serviceの環境をセットアップし、エージェントを作成する準備を行います。
手順を実行するためには、Azure AI アカウント所有者などのアクセス許可が必要になるので、リンクに記載のあるアクセス許可を付与し実行してください。
エージェントの作成
Azure AI Foundry Agent Serviceでは、Foundry ポータルやSDK、REST APIなどでエージェントを作成することができます。
詳細は省略しますが、ポータルではGUIで「New Agent」をクリックするだけで作成することが可能です。

作成したエージェントの設定は、右に表示されるSetupで編集できます。
deploymentで利用するLLMモデルやinstructionsでエージェントがどのように動作するか指示を設定することができます。
他にも、エージェントがアクセス可能なデータソース(Knowledge)や実行させるタスク(Actions)を設定することも可能です。

マルチエージェントの作成
Azure AI Foundry Agent Serviceでは、「接続済みエージェント (Connected Agents)」を利用することで、他のエージェントをツールとして設定し、自動的にオーケストレーションを行うことが可能です。
接続済みエージェントを活用することで、コラボレーションのマルチエージェントシステムを構築することができます。この機能は、FoundryポータルやSDKを通じて実装することが可能です。
以下では、Pythonを用いた実装方法について記載します。
※ コードは以下のリンクを参考に作成しています。
コード
.envなど環境変数に次の値を記載します。
PROJECT_ENDPOINT="<Azure_AI_Foundry_project_endpoint>" MODEL_DEPLOYMENT_NAME="<deployment_name>"
次のコマンドを実行し、必要なPythonパッケージをインストールします。
pip install azure-ai-projects pip install azure-identity
以下のコードは次の処理を行います。
- クライアントの作成
- ツールとして利用するエージェント(second_agent)の作成
- プロジェクト内のすべてのエージェントを取得し、全エージェントの接続済みエージェントを作成
- 接続済みエージェントをツールとして利用するエージェント(summarize_agent)を作成
- 新規threadを作成し、ユーザーの質問への回答を生成
- メッセージを取得
import os from dotenv import load_dotenv from azure.ai.agents.models import ConnectedAgentTool from azure.ai.projects import AIProjectClient from azure.identity import DefaultAzureCredential # .env ファイルを読み込む load_dotenv() project_endpoint = os.environ["PROJECT_ENDPOINT"] # Ensure the PROJECT_ENDPOINT environment variable is set SummarizeAgent_INSTRUCTIONS = """ ユーザーの質問に応じて、必要なエージェント(tool)を使い情報を収集後に回答を生成します。 すべてのエージェントからの回答を要約し、そこから導き出される結論を回答します。 """ # Create an AIProjectClient instance project_client = AIProjectClient( endpoint=project_endpoint, credential=DefaultAzureCredential(), # Use Azure Default Credential for authentication ) with project_client: agent_name = "second_agent" second_agent = project_client.agents.create_agent( model=os.environ["MODEL_DEPLOYMENT_NAME"], # Model deployment name name=agent_name, # Name of the agent instructions="あなたは、法律や倫理に詳しいエージェントです。法律や倫理の観点から回答を生成します。", # Instructions for the agent ) print(f"Created agent, ID: {second_agent.id}") # すべてのエージェントを取得 connected_agents = [] agent_list = project_client.agents.list_agents() for agent in agent_list: print(f"Agent ID: {agent.id}, Name: {agent.name}, Instructions: {agent.instructions}") # connected agents を作成 # agentの名称に"-"が含まれているとエラーが発生するため、"_"に変更 connected_agent_name = agent.name.replace("-", "_") connected_agent = ConnectedAgentTool( id=agent.id, name=connected_agent_name, description=f"{agent.instructions}") connected_agents.append(connected_agent.definitions[0]) # Create agent woth other agent as tool summarize_agent = project_client.agents.create_agent( model=os.environ["MODEL_DEPLOYMENT_NAME"], # Model deployment name name="summarize_agent", # Name of the agent instructions=SummarizeAgent_INSTRUCTIONS, tools = connected_agents ) print(f"Created summarize agent, ID: {summarize_agent.id}") # Create a thread for communication thread = project_client.agents.threads.create() print(f"Created thread, ID: {thread.id}") # Add a message to the thread message = project_client.agents.messages.create( thread_id=thread.id, role="user", # Role of the message sender content="AIのトレンドと新規サービスに関して教えてください。", # Message content ) print(f"Created message, ID: {message['id']}") # Create and process an agent run run = project_client.agents.runs.create_and_process(thread_id=thread.id, agent_id=summarize_agent.id) print(f"Run finished with status: {run.status}") # Check if the run failed if run.status == "failed": print(f"Run failed: {run.last_error}") # Delete the agent when done project_client.agents.delete_agent(second_agent.id) project_client.agents.delete_agent(summarize_agent.id) print("Deleted agent") # Fetch and log all messages messages = project_client.agents.messages.list(thread_id=thread.id) for message in messages: print(f"Role: {message.role}, Agent_id: {message.agent_id}, Content: {message.content}")
実行結果
コードを実行すると、次のようなログ結果になります。
Created agent, ID: asst_1P0smoggpTs0z2UQdq0Mq6eC Agent ID: asst_1P0smoggpTs0z2UQdq0Mq6eC, Name: second_agent, Instructions: あなたは、法律や倫理に詳しいエージェントです。法律や倫理の観点から回答を生成します。 Agent ID: asst_uyMWzGulusStpFul5uVNDi3G, Name: first_agent, Instructions: あなたは市場に詳しいエージェントです。市場情報に関して回答を行います。 Created summarize agent, ID: asst_I6R2rKA7ZPPWsno69DcbbtFZ Created thread, ID: thread_u9PSBmqBzjeObTooR69Lgvjg Created message, ID: msg_mOLLF1hVfcdNfGCPNX72f9BF Run finished with status: RunStatus.COMPLETED Deleted agent Role: MessageRole.AGENT, Agent_id: asst_I6R2rKA7ZPPWsno69DcbbtFZ, Content: [{'type': 'text', 'text': {'value': 'AIのトレンドと新規サービスに関する情報を 、市場動向と法律・倫理の観点からまとめました。\n\n### 市場動向\n1. **自然言語処理の進化**: チャットボットやバーチャルアシスタントが広がっており、業界特化型のカスタマイズサービスが増加しています。\n2. **生成AIの台頭**: テキストや画像を生成するツールが注目され、クリエイティブ作業の効率化に寄与しています。例としてOpenAIのChatGPTやDALL-Eなどがあります。\n3. **AI駆動のデータ分析**: ビッグデータ解析を行うAIツールが普及し、特定業界向けの解析サービスが新たに登場 しています。\n4. **AIとIoTの統合**: スマートホームやスマートシティの進展があり、ユーザー行動を学習するスマートデバイスなどが登場しています。\n5. **個別化サービスの向上**: リアルタイムで最適な商品を推薦するパーソナライズサービスが進化しています。\n6. **教育へのAI活用**: 学習を支援するプラットフォームが出現し、生徒に最適な学習プランを提供しています。\n7. **倫理的利用への対応**: AIの倫理やプライバシー問題に対応するためのサービスが立ち上がっています。\n\n### 法律と倫理\n1. **プライバシーとデータ保護**: データ処理における透明性やユーザーの同意が求められます。特にGDPRに基づく規制は厳格です。\n2. **知的財産権**: AIが生成したコンテンツの著作権帰属についての議論が続いています。また、通信と特許に関する問題も重要です。\n3. **アルゴリズムの透明性**: バイアスの除去や 意思決定プロセスの説明可能性が求められており、特に医療や金融分野での利用が重要視されています。\n4. **倫理的考慮**: AI導入による人権侵害や雇用喪失のリスクに対する社会的対応が必要です。\n5. **規制と基準**: 各国でAIに関する法律や倫理ガイドラインが整備されつつあり、国際的な調和が求められています。\n\n### 結論\nAIのトレンドや新規サービスの進展は、利便性や効率を高めつつ、同時に法律や倫理の課題を引き起こしています。このため、技術革新と法的・倫理的枠組みの調和が 今後の重要なテーマとなるでしょう。倫理的視点を損なわずに、革新的サービスを開発することが期待されます。', 'annotations': []}}] Role: MessageRole.USER, Agent_id: None, Content: [{'type': 'text', 'text': {'value': 'AIのトレンドと新規サービスに関して教えてください。', 'annotations': []}}]
また、Azure AI Foundryでは実行結果をより詳しく確認できます。
処理内容を確認すると、2つのエージェントがツールとして利用され、その意見をもとに最終的な回答が生成されていることが確認できます。
おわりに
今回はAzure AI Foundry Agent Serviceでのマルチエージェントの構築に関して、ご紹介しました。
独自にオーケストレーションの仕組みを作る必要がない点など、非常に簡単に構築できた印象です。
また、ツールの実行結果を含めた詳細な処理内容も、特別な実装なしに確認することができる点は大変便利だと感じました。
接続できるデータソースなども様々な種類が用意されていたので、機能拡張も容易に実装できそうです。