Udostępnij przez


Magazyn

Pamięć kontroluje, gdzie przechowywana jest historia konwersacji, ile historii jest ładowane oraz jak niezawodnie można wznawiać sesje.

Wbudowane tryby przechowywania

Struktura agenta obsługuje dwa zwykłe tryby przechowywania:

Tryb Co jest przechowywane Typowe użycie
Stan sesji lokalnej Pełna historia czatu w AgentSession.state (na przykład za pośrednictwem InMemoryHistoryProvider) Usługi, które nie wymagają trwałości konwersacji po stronie serwera
Magazyn zarządzany przez usługę Stan konwersacji w usłudze; AgentSession.service_session_id wskazuje na to Usługi z natywną trwałą obsługą konwersacji

Magazyn historii czatów w pamięci

Jeśli dostawca nie wymaga historii czatów po stronie serwera, program Agent Framework przechowuje historię lokalnie w sesji i wysyła odpowiednie komunikaty w każdym uruchomieniu.

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)

Zmniejszenie rozmiaru historii w pamięci

Jeśli historia będzie zbyt duża dla limitów modelu, zastosuj narzędzie redukujące.

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

Uwaga / Notatka

Konfiguracja reduktora ma zastosowanie do dostawców historii w pamięci. W przypadku historii zarządzanej przez usługę zachowanie redukcji jest specyficzne dla dostawcy/usługi.

Magazyn zarządzany przez usługę

Gdy usługa zarządza historią konwersacji, sesja przechowuje identyfikator konwersacji zdalnej.

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)

Wzorzec magazynu innej firmy

W przypadku historii opartej na bazie danych, Redisie lub blobie, zaimplementuj niestandardowego dostawcę historii.

Najważniejsze wskazówki:

  • Przechowuj komunikaty pod kluczem zasięgu sesji.
  • Zachowaj zwracaną historię w granicach kontekstu modelu.
  • Utrwalanie identyfikatorów specyficznych dla dostawcy w programie session.state.
  • W języku Python tylko jeden dostawca historii powinien używać load_messages=True.
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)

Utrwalanie sesji przy ponownych uruchomieniach

Zachowaj pełną strukturę AgentSession, a nie tylko tekst wiadomości.

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)

Ważne

Traktuj AgentSession jako nieprzezroczystym obiekt stanu i przywróć go przy użyciu tej samej konfiguracji agenta/dostawcy, która go utworzyła.

Tip

Użyj dodatkowego dostawcy historii audytu/ewaluacji (load_messages=False, store_context_messages=True), aby przechwycić wzbogacony kontekst oraz dane wejściowe/wyjściowe, nie wpływając na ładowanie historii głównej.

Dalsze kroki