스토리지는 대화 기록이 있는 위치, 로드된 기록의 양 및 세션을 얼마나 안정적으로 재개할 수 있는지를 제어합니다.
기본 제공 스토리지 모드
Agent Framework는 두 가지 일반 스토리지 모드를 지원합니다.
| 모드 | 저장되는 내용 | 일반적인 사용량 |
|---|---|---|
| 로컬 세션 상태 | 전체 채팅 기록 AgentSession.state (예:InMemoryHistoryProvider |
서버 쪽 대화 지속성이 필요하지 않은 서비스 |
| 서비스 관리 스토리지 | 서비스의 대화 상태; AgentSession.service_session_id 을 가리킵니다. |
네이티브 영구 대화 지원이 있는 서비스 |
메모리 내 채팅 기록 스토리지
공급자에 서버 쪽 채팅 기록이 필요하지 않은 경우 에이전트 프레임워크는 세션에 로컬로 기록을 유지하고 각 실행 시 관련 메시지를 보냅니다.
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 하고 해당 개체를 만든 것과 동일한 에이전트/공급자 구성으로 복원합니다.
팁 (조언)
추가 감사/eval 기록 공급자(load_messages=False, store_context_messages=True)를 사용하여 기본 기록 로드에 영향을 주지 않고 보강된 컨텍스트와 입력/출력을 캡처합니다.