Delen via


Storage

Opslag bepaalt waar de gespreksgeschiedenis zich bevindt, hoeveel geschiedenis wordt geladen en hoe betrouwbaar sessies kunnen worden hervat.

Ingebouwde opslagmodi

Agent Framework ondersteunt twee normale opslagmodi:

Modus Wat wordt opgeslagen Normaal gebruik
Status van lokale sessie Volledige chatgeschiedenis in AgentSession.state (bijvoorbeeld via InMemoryHistoryProvider) Services waarvoor geen gesprekspersistentie aan de serverzijde is vereist
Door de service beheerde opslag Gespreksstatus in de service; AgentSession.service_session_id verwijst ernaar Services met systeemeigen ondersteuning voor permanente gesprekken

Opslag van chatgeschiedenis in het geheugen

Wanneer een provider geen chatgeschiedenis aan de serverzijde vereist, bewaart Agent Framework de geschiedenis lokaal in de sessie en verzendt relevante berichten bij elke uitvoering.

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)

De geschiedenisgrootte in het geheugen verminderen

Als geschiedenis te groot wordt voor de modellimieten, gebruik een reducer.

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

Opmerking

De reducerconfiguratie is van toepassing op geschiedenisproviders in het geheugen. Voor de door de service beheerde geschiedenis is het reductiegedrag provider-/servicespecifiek.

Door de service beheerde opslag

Wanneer de service de gespreksgeschiedenis beheert, slaat de sessie een externe gespreks-id op.

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)

Opslagpatroon van derden

Implementeer een aangepaste geschiedenisprovider voor database-/Redis-/blob-ondersteunde geschiedenis.

Belangrijke richtlijnen:

  • Sla berichten op onder een sleutel voor sessiebereik.
  • Houd de geretourneerde geschiedenis binnen de contextlimieten van het model.
  • Providerspecifieke id's behouden in session.state.
  • In Python mag slechts één geschiedenisprovider load_messages=True gebruiken.
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)

Permanente sessies bij opnieuw opstarten

Behoud de volledige tekst AgentSession, niet alleen berichttekst.

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)

Belangrijk

Behandelen AgentSession als een ondoorzichtig statusobject en herstellen met dezelfde agent-/providerconfiguratie die het heeft gemaakt.

Aanbeveling

Gebruik een extra controle-/evaluatiegeschiedenisprovider (load_messages=False, ) store_context_messages=Trueom verrijkte context plus invoer/uitvoer vast te leggen zonder dat dit van invloed is op het laden van de primaire geschiedenis.

Volgende stappen