Microsoft Agent Framework をローカルLLMで試してみる その2
シリーズ一覧
一覧
Microsoft Agent Framework をローカルLLMで試してみる その1
Microsoft Agent Framework をローカルLLMで試してみる その2
Microsoft Agent Framework をローカルLLMで試してみる その3(LoggingFactory)
Microsoft Agent Framework をローカルLLMで試してみる その4(Tool)
Microsoft Agent Framework をローカルLLMで試してみる その5(AIFunction)
Microsoft Agent Framework をローカルLLMで試してみる その6(ChatHistoryProvider)
Microsoft Agent Framework をローカルLLMで試してみる その7(ChatHistoryProvider)
Microsoft Agent Framework をローカルLLMで試してみる その8(ChatHistoryProvider)
Microsoft Agent Framework をローカルLLMで試してみる その9(AIContextProvider)
Microsoft Agent Framework をローカルLLMで試してみる その10(AIContextProvider)
Microsoft Agent Framework をローカルLLMで試してみる その11(AIContextProviderで簡易RAG)
Microsoft Agent Framework をローカルLLMで試してみる その12(Structured Output)
Microsoft Agent Framework をローカルLLMで試してみる その13(ミドルウェア)
はじめに
Microsoft Agent FrameworkをローカルLLMで試してみる その1では、Microsoft Agent Frameworkを使用して、ローカルLLMで簡単なエージェントを作成してみました。
次はAIAgentクラスの機能を色々と試してみたいと思います。
AIAgentクラスの基本的な使い方
IChatClientのAsAIAgentの引数
| 引数 | 型 | 説明 |
|---|---|---|
| instructions | string | システムプロンプト |
| name | string | エージェントの名前を指定します。Tool As Agentとして利用する場合等に使用されます。 |
| description | string | エージェントの説明を指定します。Tool As Agentとして利用する場合等に使用されます。 |
| loggerFactory | ILoggerFactory | エージェントのログを記録するためのILoggerFactoryを指定します。 |
| tools | IList<AITool> | エージェントが使用するツールのコレクションを指定します |
| services | IServiceProvider | エージェントが使用するサービスを指定します。 |
システムプロンプトを設定する
コード
AIAgent agent = chatClient.AsAIAgent(
instructions: "日本語で回答します。"
);
//プロンプトの送信
AgentResponse response = await agent.RunAsync("Hello");
Console.WriteLine(response);
結果
こんにちは!ご質問やお手伝いしたいことがあれば、遠慮なく教えてくださいね。
- Helloとして送信したプロンプトに対して、システムプロンプトで指定した内容が反映されて日本語で回答が返ってきています。
LM Studioへのリクエスト
{
"messages": [
{
"role": "system",
"content": "日本語で回答します。"
},
{
"role": "user",
"content": "Hello"
}
],
"model": "openai/gpt-oss-20b"
}
- LM Studioのログでリクエストを確認するとinstructionsに指定した内容がsystemロールとしてmessagesに追加されていることがわかります。
Toolを利用する
コード
//Toolとして使用する関数の定義
[DisplayName("GetDateTime")]
[Description("現在の日時を取得します。")]
static string GetDateTime() => DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
AIAgent agent = chatClient.AsAIAgent(
tools: [
AIFunctionFactory.Create(GetDateTime)
]
);
//プロンプトの送信
AgentResponse response = await agent.RunAsync("今、何時ですか?");
Console.WriteLine(response);
- メタデータとしてDisplayName属性とDescription属性を定義した関数を用意し、AIFunctionFactory.CreateメソッドでAIToolに変換してAsAIAgentのtools引数に渡しています。
結果
現在の時刻は **2026‑04‑05 11:55:16** です。
- 「-」は文字コードによっては「?」と表示されることがあります。
LM Studioへのリクエスト
1回目
{
"messages": [
{
"role": "user",
"content": "今、何時ですか?"
}
],
"model": "openai/gpt-oss-20b",
"tools": [
{
"type": "function",
"function": {
"description": "現在の日時を取得します。",
"name": "GetDateTime",
"parameters": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}
}
}
],
"tool_choice": "auto"
}
- リクエストにtoolsが追加され、ツールが登録されていることがわかります。
2回目
{
"messages": [
{
"role": "user",
"content": "今、何時ですか?"
},
{
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "405181428",
"type": "function",
"function": {
"name": "GetDateTime",
"arguments": "{}"
}
}
]
},
{
"role": "tool",
"tool_call_id": "405181428",
"content": "\"2026-04-05 11:55:16\""
}
],
"model": "openai/gpt-oss-20b",
"tools": [
{
"type": "function",
"function": {
"description": "現在の日時を取得します。",
"name": "GetDateTime",
"parameters": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}
}
}
],
"tool_choice": "auto"
}
- ツールの呼び出しに対するレスポンスがtoolロールとしてmessagesに追加されていることがわかります。
Tool As Agentを利用する
コード
子エージェントの作成
AIAgent childAgent = chatClient.AsAIAgent(
name: "TimeKeeperAgent",
instructions: "ユーザーの質問に対して現在の日時を提供します。",
description: "このAI Agentは日時について答えてくれます。",
tools: [AIFunctionFactory.Create(GetDateTime)]
);
- Tool As Agentとして利用する子エージェントを作成します。子エージェントは現在の日時を提供する役割を持たせています。
親エージェントの作成
AIAgent parentAgent = chatClient.AsAIAgent(
tools: [
childAgent.AsAIFunction()
]
);
//プロンプトの送信
AgentResponse response = await parentAgent.RunAsync("今何時?");
Console.WriteLine("親エージェントの回答:");
Console.WriteLine(response);
- 親エージェントを作成し、子エージェントをツールとして登録します。親エージェントに対して「今何時?」とプロンプトを送信してみます。
結果
親エージェントの回答:
現在時刻は **2026-04-05 12:03:51** です。
- 子エージェントが呼び出されて現在の日時が親エージェントの回答として返ってきています。
- こちらも「-」が文字コードによっては「?」と表示されることがあります。
LM Studioへのリクエスト
1回目
{
"messages": [
{
"role": "user",
"content": "今何時?"
}
],
"model": "openai/gpt-oss-20b",
"tools": [
{
"type": "function",
"function": {
"description": "このAI Agentは日時について答えてくれます。",
"name": "TimeKeeperAgent",
"parameters": {
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"description": "Input query to invoke the agent.",
"type": "string"
}
},
"additionalProperties": false
}
}
}
],
"tool_choice": "auto"
}
- 親エージェントへのリクエスト
- toolsに子エージェントがツールとして登録されていることがわかります。
- 子エージェントのnameとdescriptionがfunctionのnameとdescriptionとして追加されていることがわかります。
- また、AsAIFunctionによって入力パラメータにqueryが追加されていることもわかります。
2回目
{
"messages": [
{
"role": "system",
"content": "ユーザーの質問に対して現在の日時を提供します。"
},
{
"role": "user",
"content": "現在時刻"
}
],
"model": "openai/gpt-oss-20b",
"tools": [
{
"type": "function",
"function": {
"description": "現在の日時を取得します。",
"name": "GetDateTime",
"parameters": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}
}
}
],
"tool_choice": "auto"
}
- 子エージェントへのリクエスト
- 親エージェントから子エージェントへのリクエストが行われていることがわかります。
- messagesには親エージェントのプロンプトが含まれていないことがわかります。親エージェントから子エージェントへのリクエストは、子エージェントのプロンプトのみで構成されていることがわかります。
3回目
{
"messages": [
{
"role": "system",
"content": "ユーザーの質問に対して現在の日時を提供します。"
},
{
"role": "user",
"content": "現在時刻"
},
{
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "369901242",
"type": "function",
"function": {
"name": "GetDateTime",
"arguments": "{}"
}
}
]
},
{
"role": "tool",
"tool_call_id": "369901242",
"content": "\"2026-04-05 12:03:51\""
}
],
"model": "openai/gpt-oss-20b",
"tools": [
{
"type": "function",
"function": {
"description": "現在の日時を取得します。",
"name": "GetDateTime",
"parameters": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}
}
}
],
"tool_choice": "auto"
}
- 子エージェントへのリクエスト
- 子エージェントでツールの呼び出しが行われていることがわかります。
4回目
{
"messages": [
{
"role": "user",
"content": "今何時?"
},
{
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "836401931",
"type": "function",
"function": {
"name": "TimeKeeperAgent",
"arguments": "{\r\n \"query\": \"現在時刻\"\r\n}"
}
}
]
},
{
"role": "tool",
"tool_call_id": "836401931",
"content": "\"現在時刻は **2026‑04‑05\\u202F12:03:51** です。\""
}
],
"model": "openai/gpt-oss-20b",
"tools": [
{
"type": "function",
"function": {
"description": "このAI Agentは日時について答えてくれます。",
"name": "TimeKeeperAgent",
"parameters": {
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"description": "Input query to invoke the agent.",
"type": "string"
}
},
"additionalProperties": false
}
}
}
],
"tool_choice": "auto"
}
- 親エージェントへのリクエスト
- 子エージェントの回答がtoolロールで親エージェントのmessagesに追加されていることがわかります。
- 子エージェントの回答で半角スペースが「\u202F」に変換されているのがいまいち
- LLMの出力では「\u202F」ではないのでAsAIFunctionによる変換の可能性が高い
まとめ
AIAgentクラスの機能を色々と試してみました。システムプロンプトの設定やToolの利用、Tool As Agentの利用など、様々な機能を活用することで、より高度なエージェントを構築することができます。LM Studioのログを確認することで、AIAgentクラスがどのようにプロンプトを構築しているかを理解することもできました。
次はLoggingFactoryを利用してエージェントのログを記録してみたいと思います。
Discussion