Freigeben über


Lagerung

Der Speicher steuert, wo der Chatverlauf gespeichert wird, wie viel Verlauf geladen werden soll und wie zuverlässig Sitzungen fortgesetzt werden können.

Integrierte Speichermodi

Agent Framework unterstützt zwei reguläre Speichermodi:

Modus Was gespeichert ist Typische Verwendung
Lokaler Sitzungszustand Vollständiger Chatverlauf in AgentSession.state (z. B. über InMemoryHistoryProvider) Dienste, die keine serverseitige Unterhaltungspersistenz erfordern
Vom Dienst verwalteter Speicher Konversationszustand im Dienst; AgentSession.service_session_id verweist darauf Dienste mit nativer Unterstützung für beständige Unterhaltungen

Speicher für Chatverlauf im Arbeitsspeicher

Wenn ein Anbieter keinen serverseitigen Chatverlauf erfordert, speichert Agent Framework den Verlauf lokal in der Sitzung und sendet relevante Nachrichten auf jeder Ausführung.

AIAgent agent = new OpenAIClient("<your_api_key>")
    .GetChatClient(modelName)
    .AsAIAgent(instructions: "You are a helpful assistant.", name: "Assistant");

AgentSession session = await agent.CreateSessionAsync();
Console.WriteLine(await agent.RunAsync("Tell me a joke about a pirate.", session));

// Works when in-memory storage is active.
IList<ChatMessage>? messages = session.GetService<IList<ChatMessage>>();
from agent_framework import InMemoryHistoryProvider
from agent_framework.openai import OpenAIChatClient

agent = OpenAIChatClient().as_agent(
    name="StorageAgent",
    instructions="You are a helpful assistant.",
    context_providers=[InMemoryHistoryProvider("memory", load_messages=True)],
)

session = agent.create_session()
await agent.run("Remember that I like Italian food.", session=session)

Verringern der Größe des Speicherverlaufs

Wenn der Verlauf für Modellgrenzwerte zu groß wird, wenden Sie einen Reducer an.

AIAgent agent = new OpenAIClient("<your_api_key>")
    .GetChatClient(modelName)
    .AsAIAgent(new ChatClientAgentOptions
    {
        Name = "Assistant",
        ChatOptions = new() { Instructions = "You are a helpful assistant." },
        ChatHistoryProviderFactory = (ctx, ct) => new ValueTask<ChatHistoryProvider>(
            new InMemoryChatHistoryProvider(
                new MessageCountingChatReducer(20),
                ctx.SerializedState,
                ctx.JsonSerializerOptions,
                InMemoryChatHistoryProvider.ChatReducerTriggerEvent.AfterMessageAdded))
    });

Hinweis

Die Reduzierungskonfiguration gilt für Speicherverlaufsanbieter. Für den dienstverwalteten Verlauf ist das Reduzierungsverhalten spezifisch für den Anbieter/Dienst.

Vom Dienst verwalteter Speicher

Wenn der Dienst den Unterhaltungsverlauf verwaltet, speichert die Sitzung einen Remoteunterhaltungsbezeichner.

AIAgent agent = new OpenAIClient("<your_api_key>")
    .GetOpenAIResponseClient(modelName)
    .AsAIAgent(instructions: "You are a helpful assistant.", name: "Assistant");

AgentSession session = await agent.CreateSessionAsync();
Console.WriteLine(await agent.RunAsync("Tell me a joke about a pirate.", session));
# Rehydrate when the service already has the conversation state.
session = agent.get_session(service_session_id="<service-conversation-id>")
response = await agent.run("Continue this conversation.", session=session)

Speichermuster von Drittanbietern

Für den Datenbank-/Redis/Blob-gestützten Verlauf implementieren Sie einen benutzerdefinierten Verlaufsdienst.

Wichtige Anleitungen:

  • Speichern Von Nachrichten unter einem sitzungsbezogenen Schlüssel.
  • Behalten Sie den zurückgegebenen Verlauf innerhalb von Modellkontextgrenzwerten bei.
  • Speichern Sie anbieterspezifische Bezeichner in session.state.
  • In Python sollte nur ein Verlaufsanbieter load_messages=True verwenden.
from agent_framework.openai import OpenAIChatClient

history = DatabaseHistoryProvider(db_client)
agent = OpenAIChatClient().as_agent(
    name="StorageAgent",
    instructions="You are a helpful assistant.",
    context_providers=[history],
)

session = agent.create_session()
await agent.run("Store this conversation.", session=session)

Beibehalten von Sitzungen über Neustarts hinweg

Speichern Sie den vollen AgentSession und nicht nur den Nachrichtentext.

JsonElement serialized = agent.SerializeSession(session);
// Store serialized payload in durable storage.
AgentSession resumed = await agent.DeserializeSessionAsync(serialized);
serialized = session.to_dict()
# Store serialized payload in durable storage.
resumed = AgentSession.from_dict(serialized)

Von Bedeutung

Behandeln Sie AgentSession als ein undurchsichtiges Zustandsobjekt und stellen Sie es mit derselben Agent-/Anbieterkonfiguration wieder her, die es erstellt hat.

Tipp

Verwenden Sie einen zusätzlichen Überwachungs-/Eval-Verlaufsanbieter (load_messages=False, store_context_messages=True), um einen erweiterten Kontext sowie Eingabe und Ausgabe zu erfassen, ohne das Laden des primären Verlaufs zu beeinträchtigen.

Nächste Schritte