ユーザー設定、過去の対話、または外部の知識を記憶できるように、エージェントにコンテキストを追加します。
既定では、エージェントは、基になるサービスに必要な内容に応じて、チャット履歴を InMemoryChatHistoryProvider または基になる AI サービスに格納します。
次のエージェントは OpenAI チャット補完を使用するため、サービス内チャット履歴ストレージはサポートも必要もないため、 InMemoryChatHistoryProviderを自動的に作成して使用します。
using System;
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
?? throw new InvalidOperationException("Set AZURE_OPENAI_ENDPOINT");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";
AIAgent agent = new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
.AsAIAgent(
model: deploymentName,
instructions: "You are a friendly assistant. Keep your answers brief.",
name: "MemoryAgent");
Warnung
DefaultAzureCredential は開発には便利ですが、運用環境では慎重に考慮する必要があります。 運用環境では、待機時間の問題、意図しない資格情報のプローブ、フォールバック メカニズムによる潜在的なセキュリティ リスクを回避するために、特定の資格情報 ( ManagedIdentityCredential など) を使用することを検討してください。
カスタムChatHistoryProviderを使用するには、エージェントオプションに渡します。
using System;
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
?? throw new InvalidOperationException("Set AZURE_OPENAI_ENDPOINT");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";
AIAgent agent = new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
.AsAIAgent(model: deploymentName, options: new ChatClientAgentOptions()
{
ChatOptions = new() { Instructions = "You are a helpful assistant." },
ChatHistoryProvider = new CustomChatHistoryProvider()
});
セッションを使用して、実行間でコンテキストを共有します。
AgentSession session = await agent.CreateSessionAsync();
Console.WriteLine(await agent.RunAsync("Hello! What's the square root of 9?", session));
Console.WriteLine(await agent.RunAsync("My name is Alice", session));
Console.WriteLine(await agent.RunAsync("What is my name?", session));
ヒント
完全に実行可能なサンプル アプリケーションについては、 こちらを 参照してください。
ユーザー情報をセッション状態に格納し、パーソナル化命令を挿入するコンテキスト プロバイダーを定義します。
class UserMemoryProvider(ContextProvider):
"""A context provider that remembers user info in session state."""
DEFAULT_SOURCE_ID = "user_memory"
def __init__(self):
super().__init__(self.DEFAULT_SOURCE_ID)
async def before_run(
self,
*,
agent: Any,
session: AgentSession | None,
context: SessionContext,
state: dict[str, Any],
) -> None:
"""Inject personalization instructions based on stored user info."""
user_name = state.get("user_name")
if user_name:
context.extend_instructions(
self.source_id,
f"The user's name is {user_name}. Always address them by name.",
)
else:
context.extend_instructions(
self.source_id,
"You don't know the user's name yet. Ask for it politely.",
)
async def after_run(
self,
*,
agent: Any,
session: AgentSession | None,
context: SessionContext,
state: dict[str, Any],
) -> None:
"""Extract and store user info in session state after each call."""
for msg in context.input_messages:
text = msg.text if hasattr(msg, "text") else ""
if isinstance(text, str) and "my name is" in text.lower():
state["user_name"] = text.lower().split("my name is")[-1].strip().split()[0].capitalize()
コンテキスト プロバイダーを使用してエージェントを作成します。
client = FoundryChatClient(
project_endpoint="https://your-project.services.ai.azure.com",
model="gpt-4o",
credential=AzureCliCredential(),
)
agent = Agent(
client=client,
name="MemoryAgent",
instructions="You are a friendly assistant.",
context_providers=[UserMemoryProvider()],
)
それを実行します。エージェントはコンテキストにアクセスできるようになりました。
session = agent.create_session()
# The provider doesn't know the user yet — it will ask for a name
result = await agent.run("Hello! What's the square root of 9?", session=session)
print(f"Agent: {result}\n")
# Now provide the name — the provider stores it in session state
result = await agent.run("My name is Alice", session=session)
print(f"Agent: {result}\n")
# Subsequent calls are personalized — name persists via session state
result = await agent.run("What is 2 + 2?", session=session)
print(f"Agent: {result}\n")
# Inspect session state to see what the provider stored
provider_state = session.state.get("user_memory", {})
print(f"[Session State] Stored user name: {provider_state.get('user_name')}")
ヒント
完全な実行可能ファイルについては、 完全なサンプル を参照してください。
注
Python では、永続化/メモリは ContextProvider および HistoryProvider 実装によって処理されます。
InMemoryHistoryProvider は、組み込みのローカルのメモリ内履歴プロバイダーです。
RawAgent は、特定のケース (たとえば、コンテキスト プロバイダーが構成されておらず、サービス側のストレージ インジケーターがないセッションを使用する場合) に InMemoryHistoryProvider() を自動的に追加する場合がありますが、これはすべてのシナリオで保証されるわけではありません。
常にローカル永続化が必要な場合は、 InMemoryHistoryProvider を明示的に追加します。 また、複数のストアを同じ呼び出しに再生しないように、1 つの履歴プロバイダーのみが load_messages=Trueしていることを確認します。
また、context_providers の一覧の末尾に別の履歴プロバイダーを追加することで、store_context_messages=True に監査ストアを追加できます。
from agent_framework import InMemoryHistoryProvider
from agent_framework.mem0 import Mem0ContextProvider
memory_store = InMemoryHistoryProvider(load_messages=True) # add local history for a reused or serialized session
agent_memory = Mem0ContextProvider("user-memory", api_key=..., agent_id="my-agent") # add Mem0 provider for agent memory
audit_store = InMemoryHistoryProvider(
"audit",
load_messages=False,
store_context_messages=True, # include context added by other providers
)
agent = client.as_agent(
name="MemoryAgent",
instructions="You are a friendly assistant.",
context_providers=[memory_store, agent_memory, audit_store], # audit store last
)
既定では、エージェントはプロバイダーとセッションに応じて、ローカルのメモリ内履歴またはサービス管理履歴を使用します。
次の Foundry エージェントでは、プロジェクトに基づくモデルデプロイを使用します。 会話履歴を超えてアプリケーション固有のメモリまたはパーソナル化状態が必要な場合は、コンテキスト プロバイダーを追加します。
a := foundryprovider.NewAgent(
endpoint,
token,
foundryprovider.ModelDeployment(model),
foundryprovider.AgentConfig{
Instructions: "You are a friendly assistant. Keep your answers brief.",
Config: agent.Config{
Name: "MemoryAgent",
},
},
)
ユーザー情報をセッション状態に格納し、パーソナル化命令を挿入するコンテキスト プロバイダーを定義します。
import (
"context"
"fmt"
"strings"
"github.com/microsoft/agent-framework-go/agent"
"github.com/microsoft/agent-framework-go/message"
)
const userMemorySourceID = "user_memory"
type providerState struct {
UserName string `json:"user_name,omitempty"`
}
func newUserMemoryProvider() agent.ContextProvider {
return agent.NewContextProvider(agent.ContextProviderConfig{
SourceID: userMemorySourceID,
Provide: provideUserMemory,
Store: storeUserMemory,
})
}
func provideUserMemory(ctx context.Context, invoking agent.InvokingContext) ([]*message.Message, []agent.Option, error) {
session, _ := agent.GetOption(invoking.Options, agent.WithSession)
var state providerState
_, _ = session.Get(userMemorySourceID, &state)
instructions := "You don't know the user's name yet. Ask for it politely."
if state.UserName != "" {
instructions = fmt.Sprintf("The user's name is %s. Always address them by name.", state.UserName)
}
return nil, []agent.Option{agent.WithInstructions(instructions)}, nil
}
func storeUserMemory(ctx context.Context, invoked agent.InvokedContext) error {
session, _ := agent.GetOption(invoked.Options, agent.WithSession)
var state providerState
_, _ = session.Get(userMemorySourceID, &state)
for _, msg := range invoked.RequestMessages {
text := strings.TrimSpace(msg.Contents.Text())
lower := strings.ToLower(text)
if idx := strings.Index(lower, "my name is"); idx >= 0 {
parts := strings.Fields(text[idx+len("my name is"):])
if len(parts) == 0 {
continue
}
state.UserName = strings.Trim(parts[0], ".,!?")
session.Set(userMemorySourceID, state)
break
}
}
return nil
}
コンテキスト プロバイダーを使用してエージェントを作成します。
a := foundryprovider.NewAgent(
endpoint,
token,
foundryprovider.ModelDeployment(model),
foundryprovider.AgentConfig{
Instructions: "You are a friendly assistant.",
Config: agent.Config{
Name: "MemoryAgent",
ContextProviders: []agent.ContextProvider{newUserMemoryProvider()},
},
},
)
それを実行します。エージェントはコンテキストにアクセスできるようになりました。
ctx := context.Background()
session, err := a.CreateSession(ctx)
if err != nil {
panic(err)
}
// The provider doesn't know the user yet.
resp, err := a.RunText(ctx, "Hello, what is the square root of 9?", agent.WithSession(session)).Collect()
fmt.Println(resp, err)
// Teach the provider the user's name.
resp, err = a.RunText(ctx, "My name is Alice", agent.WithSession(session)).Collect()
fmt.Println(resp, err)
// Subsequent calls are personalized using session state.
resp, err = a.RunText(ctx, "What is 2 + 2?", agent.WithSession(session)).Collect()
fmt.Println(resp, err)
ヒント
完全な実行可能ファイルについては、 完全なサンプル を参照してください。
次のステップ
より深く進む: