C# でも動作するマルチエージェント フレームワーク AutoGen

2025/01/12
★★★

AutoGen for .NET

AutoGen の情報を Web で調べると、Python コードの例が多く出てきますが、AutoGen for .NET といった C# 対応のもの提供されています。

Auto Gen for .NET は、Nuget パッケージとして公開されており、実際にコードを書く場合は、このパッケージをインストールして利用します。

Assistant Agent

Assistant Agent は LLM を使用してタスクを解決するエージェントです。 OpenAI のモデルを使用する場合は、AssistantAgent を使用します。 他のモデルを使用する場合は、それぞれ用意されている他のクラスを使用します。 Azure OpenAI Service のモデルを使用する場合は、OpenAIChatAgent を使用します。その他、OllamaAgent, GeminiChatAgent,MistralClientAgent 等が利用できます。

今回は、OpenAIChatAgent を使用して Azure OpenAI Servcie に配置した GPT-4o-mini モデルを使用します。事前に Nuget から AutoGen パッケージをインストールしておきます。

string azureOpenAIEndpoint = "<Azure OpenAI Service エンドポイント>";
string azureOpenAIKey = "<Azure OpenAI Service キー>";
string azureOpneAIModelDeployName = "<Azure OpenAI Service 配置モデル名>";

// Azure OpenAI Service チャット クライアントの生成
AzureOpenAIClient azureOpenAIClient = new(new Uri(azureOpenAIEndpoint), new AzureKeyCredential(azureOpenAIKey));
var chatClient = azureOpenAIClient.GetChatClient(azureOpneAIModelDeployName);

// アシスタント エージェントの生成
var assistantAgent = new OpenAIChatAgent(
	chatClient: chatClient,
	name: "assistant",
	systemMessage: "あなたはユーザーが実行するタスクを支援するアシスタントです。")
	.RegisterMessageConnector()
	.RegisterPrintMessage();

まず、Azure OpenAI client library for .NET の AzureOpenAIClient を生成し、GetChatClient メソッドで、OpenAI.Chat.ChatClient のインスタンスを取得します。
次に、OpenAIChatAgent コンストラクタで、OpenAI.Chat.ChatClient のインスタンス、エージェント名、システムメッセージを渡します。その他 temperature, maxTokens 等のパラメータをここで渡すこともできます。
OpenAIChatAgent インスタンス生成後、拡張メソッド RegisterMessageConnector で、エージェントのミドルウェアに OpenAIChatRequestMessageConnector を登録します。これによりモデル固有のメッセージ形式とのメッセージ形式の変換ができるようになります。
最後に、拡張メソッド RegisterPrintMessage で、メッセージが出力されるようにします。

User Proxy Agent

User Proxy Agent は、ユーザーの入力を他のエージェントにプロキシするためのエージェントです。UserProxyAgent を使用します。

// User Proxy Agent の生成
var userProxyAgent = new UserProxyAgent(
	name: "user",
	humanInputMode: HumanInputMode.ALWAYS)
	.RegisterPrintMessage();

// User Proxy Agent -> アシスタント エージェントへメッセージを送信して会話を開始
await userProxyAgent.InitiateChatAsync(
	receiver: assistantAgent,
	message: "こんにちは assistant、タスクの実行を支援してください。",
	maxRound: 10);

UserProxyAgent のコンストラクタで、エージェント名、入力モードを指定します。入力モード HumanInputMode が、ALWAYS の場合は、UserProxyAgent がメッセージを受信するたびにユーザーの入力を求めます。
次に、UserProxyAgent のインターフェース IAgent の拡張メソッド InitiateChatAsync でエージェント間の会話を開始します。メッセージを受信するエージェントとして先にインスタンスを生成した assistantAgent を指定しています。

User Proxy Agent と Assistant Agent との会話の実行

これまで説明したコードをコンソール アプリケーションで実装した例は以下となります。

using AutoGen;
using AutoGen.Core;
using AutoGen.OpenAI;
using AutoGen.OpenAI.Extension;
using Azure;
using Azure.AI.OpenAI;

namespace AutoGenConsoleAppDemo001;

internal class Program
{
    private static readonly string _azureOpenAIEndpoint = "https://<Azure OpenAI Service エンドポイント ドメイン名>.openai.azure.com/";
	private static readonly string _azureOpenAIKey = "<Azure OpenAI Service エンドポイント キー>";
	private static readonly string _azureOpenAIModelDeployName = "gpt-4o-mini";
	
	static async Task Main(string[] args)
	{
		string azureOpenAIEndpoint = _azureOpenAIEndpoint;
		string azureOpenAIKey = _azureOpenAIKey;
		string azureOpneAIModelDeployName = _azureOpenAIModelDeployName;

		// Azure OpenAI Service チャット クライアントの生成
		AzureOpenAIClient azureOpenAIClient = new(new Uri(azureOpenAIEndpoint), new AzureKeyCredential(azureOpenAIKey));
		var chatClient = azureOpenAIClient.GetChatClient(azureOpneAIModelDeployName);

		// アシスタント エージェントの生成
		var assistantAgent = new OpenAIChatAgent(
			chatClient: chatClient,
			name: "assistant",
			systemMessage: "あなたはユーザーが実行するタスクを支援するアシスタントです。")
			.RegisterMessageConnector()
			.RegisterPrintMessage();

		// User Proxy Agent の生成
		var userProxyAgent = new UserProxyAgent(
			name: "user",
			humanInputMode: HumanInputMode.ALWAYS)
			.RegisterPrintMessage();

        // User Proxy Agent -> アシスタント エージェントへメッセージを送信して会話を開始
		await userProxyAgent.InitiateChatAsync(
			receiver: assistantAgent,
			message: "こんにちは、assistant, タスクの実行を支援してください。",
			maxRound: 10);
	}
}

このコードの実行後、userProxyAgent から assistantAgent へメッセージが送信され、ユーザーの入力を待機します。 alt text

メッセージを入力し [Enter] を押すと、userProxyAgent から assistantAgent へ入力されたメッセージが送信され、assistantAgent からの返信が出力されます。 alt text

メッセージのコンテキストを維持してメッセージの入力ができます。 alt text

InitiateChatAsync メソッドの引数で指定した maxRound の回数に達するか、exit を入力するとプログラムが終了します。 alt text

今回は、AutoGen for .NET の User Proxy Agent, Assistant Agent を使用した簡単な壁打ちチャットの例を説明しました。今後は、もっと多くのエージェントを利用した例を説明できればと考えています。

コメント (0)

コメントの投稿