모델 컨텍스트

모델 컨텍스트 (Model Context)

모델 컨텍스트는 Chat Completion 메시지를 저장하고 검색하는 역할을 해요. 항상 모델 클라이언트와 함께 사용돼서 LLM 기반 응답을 생성하지요. 이번 글에서는 AutoGen Core의 컨텍스트가 무엇인지, 그리고 대화가 길어질 때 컨텍스트 오버플로를 어떻게 피하는지 살펴볼게요.

출처: 공식 문서 - Model Context

버퍼형 대화 컨텍스트

예를 들어 autogen_core.model_context.BufferedChatCompletionContext는 최근 사용(MRU, most-recent-used) 컨텍스트로, 최근 buffer_size개 메시지까지만 저장해요. 이는 많은 LLM에서 컨텍스트 오버플로를 피하는 데 유용해요.

autogen_core.model_context.BufferedChatCompletionContext를 쓰는 예시를 볼게요:

from dataclasses import dataclass

from autogen_core import AgentId, MessageContext, RoutedAgent, SingleThreadedAgentRuntime, message_handler
from autogen_core.model_context import BufferedChatCompletionContext
from autogen_core.models import AssistantMessage, ChatCompletionClient, SystemMessage, UserMessage
from autogen_ext.models.openai import OpenAIChatCompletionClient
@dataclass
class Message:
    content: str
class SimpleAgentWithContext(RoutedAgent):
    def __init__(self, model_client: ChatCompletionClient) -> None:
        super().__init__("A simple agent")
        self._system_messages = [SystemMessage(content="You are a helpful AI assistant.")]
        self._model_client = model_client
        self._model_context = BufferedChatCompletionContext(buffer_size=5)

    @message_handler
    async def handle_user_message(self, message: Message, ctx: MessageContext) -> Message:
        # Prepare input to the chat completion model.
        user_message = UserMessage(content=message.content, source="user")
        # Add message to model context.
        await self._model_context.add_message(user_message)
        # Generate a response.
        response = await self._model_client.create(
            self._system_messages + (await self._model_context.get_messages()),
            cancellation_token=ctx.cancellation_token,
        )
        # Return with the model's response.
        assert isinstance(response.content, str)
        # Add message to model context.
        await self._model_context.add_message(AssistantMessage(content=response.content, source=self.metadata["type"]))
        return Message(content=response.content)

첫 질문 후에 이어지는 후속 질문을 해 보도록 할게요:

model_client = OpenAIChatCompletionClient(
    model="gpt-4o-mini",
    # api_key="sk-...", # Optional if you have an OPENAI_API_KEY set in the environment.
)

runtime = SingleThreadedAgentRuntime()
await SimpleAgentWithContext.register(
    runtime,
    "simple_agent_context",
    lambda: SimpleAgentWithContext(model_client=model_client),
)
# Start the runtime processing messages.
runtime.start()
agent_id = AgentId("simple_agent_context", "default")

# First question.
message = Message("Hello, what are some fun things to do in Seattle?")
print(f"Question: {message.content}")
response = await runtime.send_message(message, agent_id)
print(f"Response: {response.content}")
print("-----")

# Second question.
message = Message("What was the first thing you mentioned?")
print(f"Question: {message.content}")
response = await runtime.send_message(message, agent_id)
print(f"Response: {response.content}")

# Stop the runtime processing messages.
await runtime.stop()
await model_client.close()

두 번째 응답을 보면, 에이전트가 이제 이전 응답을 기억해낼 수 있다는 걸 알 수 있어요.

더 알아보기 (Learn more)