Поделиться через


Storage

Хранилище определяет, где живет журнал бесед, сколько загрузится журнал и как надежно можно возобновить сеансы.

Встроенные режимы хранения

Agent Framework поддерживает два регулярных режима хранения:

Mode Хранимые данные Типичное использование
Состояние локального сеанса Полная история чата в AgentSession.state (например, через InMemoryHistoryProvider) Службы, для которых не требуется сохраняемость бесед на стороне сервера
Управляемое службой хранилище Состояние беседы в службе; AgentSession.service_session_id указывает на него Службы с поддержкой собственной постоянной беседы

Хранилище журнала чата в памяти

Если поставщику не требуется журнал чата на стороне сервера, агент Framework сохраняет журнал локально в сеансе и отправляет соответствующие сообщения на каждом запуске.

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)

Уменьшение размера журнала в памяти

Если история становится слишком большой для ограничений модели, примените редуктор.

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

Замечание

Конфигурация редьюсеров применяется к поставщикам истории в памяти. Для истории, управляемой службой, поведение сокращения зависит от конкретного поставщика или службы.

Управляемое службой хранилище

Когда служба управляет журналом бесед, сеанс сохраняет идентификатор удаленной беседы.

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)

Шаблон хранилища третьих сторон

Для хранилища истории на базе базы данных/Redis/BLOB реализуйте настраиваемый провайдер истории.

Ключевое руководство.

  • Храните сообщения под ключом, привязанным к области сеанса.
  • Сохраняйте возвращенный журнал в пределах контекста модели.
  • Сохранять специфические для поставщика идентификаторы в session.state.
  • В Python 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)

Сохранение сеансов во время перезапуска

Сохраните полный AgentSession, а не только текст сообщения.

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)

Это важно

Относитесь к AgentSession как к непрозрачному объекту состояния и восстанавливайте его с той же конфигурацией агента или поставщика, которая его создала.

Подсказка

Используйте дополнительного поставщика журнала аудита/оценки (load_messages=False, store_context_messages=True), чтобы фиксировать обогащенный контекст и входные/выходные данные, не влияя на загрузку основного журнала.

Дальнейшие шаги