Freigeben über


Schritt 4: Speicher und Persistenz

Fügen Sie Ihrem Agent Kontext hinzu, damit es sich an Benutzereinstellungen, vergangene Interaktionen oder externes Wissen erinnern kann.

Richten Sie den Arbeitsspeicher mit einem benutzerdefinierten ChatHistoryProvider ein:

using System;
using Azure.AI.OpenAI;
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 AzureOpenAIClient(new Uri(endpoint), new AzureCliCredential())
    .GetChatClient(deploymentName)
    .AsAIAgent(instructions: "You are a friendly assistant. Keep your answers brief.", name: "MemoryAgent");

Verwenden Sie eine Sitzung, um den Kontext für alle Ausführungen beizubehalten:

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));

Tipp

Sehen Sie sich das vollständige Beispiel für die vollständige ausgeführte Datei an.

Definieren Sie einen Kontextanbieter, der zusätzlichen Kontext in jeden Agentaufruf eingibt:

class UserNameProvider(BaseContextProvider):
    """A simple context provider that remembers the user's name."""

    def __init__(self) -> None:
        super().__init__(source_id="user-name-provider")
        self.user_name: str | None = None

    async def before_run(
        self,
        *,
        agent: Any,
        session: AgentSession,
        context: SessionContext,
        state: dict[str, Any],
    ) -> None:
        """Called before each agent invocation — add extra instructions."""
        if self.user_name:
            context.instructions.append(f"The user's name is {self.user_name}. Always address them by name.")
        else:
            context.instructions.append("You don't know the user's name yet. Ask for it politely.")

    async def after_run(
        self,
        *,
        agent: Any,
        session: AgentSession,
        context: SessionContext,
        state: dict[str, Any],
    ) -> None:
        """Called after each agent invocation — extract information."""
        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():
                # Simple extraction — production code should use structured extraction
                self.user_name = text.lower().split("my name is")[-1].strip().split()[0].capitalize()

Erstellen Sie einen Agent mit dem Kontextanbieter:

credential = AzureCliCredential()
client = AzureOpenAIResponsesClient(
    project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
    deployment_name=os.environ["AZURE_OPENAI_RESPONSES_DEPLOYMENT_NAME"],
    credential=credential,
)

memory = UserNameProvider()

agent = client.as_agent(
    name="MemoryAgent",
    instructions="You are a friendly assistant.",
    context_providers=[memory],
)

Hinweis

In Python wird Persistenz/Speicher von Verlaufsanbietern behandelt. A BaseHistoryProvider ist auch ein BaseContextProvider, und InMemoryHistoryProvider ist die integrierte lokale Implementierung. RawAgent kann InMemoryHistoryProvider("memory") in bestimmten Fällen automatisch hinzufügen (z. B. wenn eine Sitzung ohne konfigurierte Kontextanbieter oder ohne dienstseitige Speicherindikatoren verwendet wird), jedoch ist dies nicht in allen Szenarien garantiert. Wenn Sie immer lokale Persistenz wünschen, fügen Sie eine explizite InMemoryHistoryProvider Hinzulage hinzu. Stellen Sie außerdem sicher, dass nur ein Verlaufsanbieter über load_messages=True verfügt, damit Sie nicht mehrere Speicher in demselben Aufruf zurückspielen.

Sie können auch einen Überwachungsspeicher hinzufügen, indem Sie am Ende von context_providers einen weiteren Verlaufsspeicheranbieter mit store_context_messages=True anhängen.

from agent_framework import InMemoryHistoryProvider

memory_store = InMemoryHistoryProvider("memory", load_messages=True)
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, memory_store, audit_store],  # audit store last
)

Führen Sie es aus – der Agent hat jetzt Zugriff auf den Kontext:

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 extracts and stores it
result = await agent.run("My name is Alice", session=session)
print(f"Agent: {result}\n")

# Subsequent calls are personalized
result = await agent.run("What is 2 + 2?", session=session)
print(f"Agent: {result}\n")

print(f"[Memory] Stored user name: {memory.user_name}")

Tipp

Sehen Sie sich das vollständige Beispiel für die vollständige ausgeführte Datei an.

Nächste Schritte

Gehen Sie tiefer: