대화가 증가함에 따라 채팅 기록의 토큰 수가 모델 컨텍스트 창을 초과하거나 비용을 늘릴 수 있습니다. 압축 전략은 중요한 컨텍스트를 유지하면서 대화 기록의 크기를 줄여 에이전트가 장기 실행 상호 작용을 통해 계속 작동할 수 있도록 합니다.
Important
압축 프레임워크는 현재 실험적입니다. 이 기능을 사용하려면 #pragma warning disable MAAI001추가해야 합니다.
Important
압축 프레임워크는 현재 Python에서 실험적입니다.
agent_framework에서 압축 유형 가져오기
Go는 패키지를 통한 압축을 지원합니다 agent/compaction . 각 실행 전에 세션 기록을 압축할 수 있도록 압축 전략을 agent.ContextProvider 등록합니다.
압축이 중요한 이유
LLM에 대한 모든 호출에는 전체 대화 기록이 포함됩니다. 압축하지 않고 다음을 수행합니다.
- 토큰 제한 - 대화가 결국 모델의 컨텍스트 창을 초과하여 오류가 발생합니다.
- 비용 - 더 큰 프롬프트는 더 많은 토큰을 사용하므로 API 비용이 증가합니다.
- 대기 시간 - 입력 토큰이 많을수록 응답 시간이 느려집니다.
압축은 대화의 이전 부분을 선택적으로 제거, 축소 또는 요약하여 이러한 문제를 해결합니다.
핵심 개념
적용 가능성: 인메모리 히스토리 에이전트만
압축은 메모리에서 자신의 대화 기록을 관리하는 에이전트에만 적용됩니다. 서비스가 이미 컨텍스트 관리를 처리하므로 서비스 관리 컨텍스트 또는 대화 상태를 사용하는 에이전트는 압축을 활용하지 않습니다. 서비스 관리 에이전트의 예는 다음과 같습니다.
- Foundry 에이전트 — 컨텍스트는 Microsoft Foundry 서비스에 의해 서버 측에서 관리됩니다.
- 저장소를 사용하도록 설정된 응답 API (기본값) - 대화 상태는 OpenAI 서비스에서 저장 및 관리됩니다.
- Copilot Studio 에이전트 - 대화 컨텍스트는 Copilot Studio 서비스에서 유지 관리됩니다.
이러한 에이전트 유형의 경우 압축 전략을 구성하는 데 아무런 영향을 주지 않습니다. 압축은 에이전트가 자체 메모리 내 메시지 목록을 유지하고 각 호출 시 모델에 전체 기록을 전달하는 경우에만 관련이 있습니다.
압축은 MessageIndex 메시지를 인스턴스라는 MessageGroup 원자 단위로 그룹화한 플랫 메시지 목록의 구조화된 보기에서 작동합니다. 각 그룹은 메시지 수, 바이트 수 및 예상 토큰 수를 추적합니다.
메시지 그룹
A MessageGroup 는 함께 유지하거나 제거해야 하는 논리적으로 관련된 메시지를 나타냅니다. 예를 들어 도구 호출 및 해당 도구 결과 메시지가 포함된 도우미 메시지는 원자성 그룹을 형성합니다. 다른 메시지 없이 제거하면 LLM API 오류가 발생합니다.
각 그룹에는 MessageGroupKind이 있습니다.
| Kind | Description |
|---|---|
System |
하나 이상의 시스템 메시지. 압축하는 동안 항상 유지됩니다. |
User |
새 턴을 시작하는 단일 사용자 메시지입니다. |
AssistantText |
일반 도우미 텍스트 응답(도구 호출 없음) |
ToolCall |
원자 단위로 처리되는 도구 호출 및 해당 도구 결과 메시지가 포함된 도우미 메시지입니다. |
Summary |
요약 압축을 통해 생성된 압축된 메시지입니다. |
트리거
A CompactionTrigger 는 현재 MessageIndex 메트릭에 따라 압축을 진행할지 여부를 평가하는 대리자입니다.
public delegate bool CompactionTrigger(MessageIndex index);
클래스는 CompactionTriggers 일반적인 팩터리 메서드를 제공합니다.
| Trigger | 발생하는 경우 |
|---|---|
CompactionTriggers.Always |
매번(무조건) |
CompactionTriggers.Never |
안 함(압축을 사용하지 않도록 설정). |
CompactionTriggers.TokensExceed(maxTokens) |
포함된 토큰 수가 임계값을 초과합니다. |
CompactionTriggers.MessagesExceed(maxMessages) |
포함된 메시지 수가 임계값을 초과합니다. |
CompactionTriggers.TurnsExceed(maxTurns) |
포함된 사용자 턴 수가 임계값을 초과합니다. |
CompactionTriggers.GroupsExceed(maxGroups) |
포함된 그룹 수가 임계값을 초과합니다. |
CompactionTriggers.HasToolCalls() |
제외하지 않은 도구 호출 그룹이 하나 이상 있습니다. |
트리거를 CompactionTriggers.All(...) (논리적 AND) 또는 CompactionTriggers.Any(...) (논리적 OR)과 결합합니다.
// Compact only when there are tool calls AND tokens exceed 2000
CompactionTrigger trigger = CompactionTriggers.All(
CompactionTriggers.HasToolCalls(),
CompactionTriggers.TokensExceed(2000));
트리거 및 대상
모든 전략에는 다음 두 가지 조건자가 있습니다.
-
트리거 - 압축이 시작되는 시기를 제어합니다. 트리거가
false를 반환하면 전략은 완전히 건너뜁니다. -
대상 - 압축이 중지되는 시기를 제어합니다. 전략은 그룹을 증분 방식으로 제외하고 각 단계 후에 대상을 다시 평가하여 대상이 반환되는 즉시 중지합니다
true.
대상이 지정되지 않으면 기본값으로 트리거의 반대로 설정됩니다. 즉, 트리거 조건이 더 이상 발동하지 않으면 즉시 압축이 중지됩니다.
압축은 개체의 Message 플랫 목록에서 작동합니다. 메시지는 간단한 그룹 메타데이터로 주석을 달고, 전략은 메시지 목록이 모델에 프로젝션되기 전에 그룹을 제외된 것으로 표시하기 위해 해당 주석을 변경합니다.
메시지 그룹
메시지는 원자 단위로 그룹화됩니다. 각 그룹에는 GroupKind가 할당됩니다.
| Kind | Description |
|---|---|
system |
시스템 메시지. 압축하는 동안 항상 유지됩니다. |
user |
단일 사용자 메시지입니다. |
assistant_text |
일반 도우미 텍스트 응답(함수 호출 없음) |
tool_call |
함수 호출이 있는 도우미 메시지와 원자 단위로 처리되는 해당 도구 결과 메시지. |
압축 전략
CompactionStrategy은 프로토콜로서, async를 받아들여 바꿀 수 있는 모든 list[Message] 호출 가능 단위로, 만약 변경된 내용이 있을 경우 True을 반환합니다.
class CompactionStrategy(Protocol):
async def __call__(self, messages: list[Message]) -> bool: ...
토큰화기
토큰 인식 전략은 TokenizerProtocol 구현을 허용합니다. 기본 제공 CharacterEstimatorTokenizer 에서는 토큰당 4자 추론을 사용합니다.
from agent_framework import CharacterEstimatorTokenizer
tokenizer = CharacterEstimatorTokenizer()
특정 모델의 인코딩에 대한 정확한 토큰 수가 필요한 경우 사용자 지정 토큰 변환기를 전달합니다.
압축은 컨텍스트 공급자로 실행됩니다. 전략은 각 실행 전에 세션 기록을 검사하고 최신 컨텍스트를 유지하면서 이전 메시지 그룹을 줄일 수 있습니다.
Go 패키지에는 ToolResultStrategy, SlidingWindowStrategy, PipelineStrategy와 같은 전략 유형과 MessagesExceed 및 TurnsExceed와 같은 트리거 도우미가 포함됩니다.
압축 전략
모든 전략은 추상 CompactionStrategy 기본 클래스에서 상속됩니다. 각 전략은 시스템 메시지를 유지하고, MinimumPreserved 가장 최근의 비 시스템 그룹을 제거로부터 보호하는 바닥을 준수합니다.
압축 전략은 agent_framework에서 가져옵니다.
압축 전략은 github.com/microsoft/agent-framework-go/agent/compaction에서 가져옵니다.
TruncationCompactionStrategy
잘림 전략 (TruncationStrategy)
가장 간단한 방법: 대상 조건이 충족될 때까지 가장 오래된 비 시스템 메시지 그룹을 제거합니다.
- 원자성 그룹 경계를 존중합니다(도구 호출 및 결과 메시지가 함께 제거됨).
- 하드 토큰 예산 백스톱에 가장 적합합니다.
-
MinimumPreserved기본값은32입니다.
// Drop oldest groups when tokens exceed 32K, keeping at least 10 recent groups
TruncationCompactionStrategy truncation = new(
trigger: CompactionTriggers.TokensExceed(0x8000),
minimumPreserved: 10);
-
tokenizer가 제공되면 메트릭은 토큰 수이고, 그렇지 않으면 메시지 수가 사용됩니다. -
preserve_system기본값은True입니다.
from agent_framework import CharacterEstimatorTokenizer, TruncationStrategy
# Exclude oldest groups when tokens exceed 32 000, trimming to 16 000
truncation = TruncationStrategy(
max_n=32_000,
compact_to=16_000,
tokenizer=CharacterEstimatorTokenizer(),
)
SlidingWindowCompactionStrategy
슬라이딩 윈도우 전략
이전 대화 콘텐츠를 제거하여 임의의 메시지 수가 아닌 논리적 대화 단위를 존중하여 가장 최근의 교환 창만 유지합니다. 시스템 메시지는 전체에서 유지됩니다.
- 대화 길이를 예측 가능하게 관리하기에 가장 적합합니다.
개별 그룹이 아닌 논리적 턴 경계에서 작동하는 가장 오래된 사용자 턴 및 관련 응답 그룹을 제거합니다.
- 순서는 사용자 메시지로 시작하고 다음 사용자 메시지까지 모든 후속 도우미 및 도구 호출 그룹을 포함합니다.
-
MinimumPreserved의 기본값은1이며, 적어도 가장 최근의 비시스템 그룹을 유지합니다.
// Keep only the last 4 user turns
SlidingWindowCompactionStrategy slidingWindow = new(
trigger: CompactionTriggers.TurnsExceed(4));
이전의 모든 항목을 제외하고 가장 최근의 keep_last_groups 비시스템 그룹만 유지합니다.
-
preserve_system기본값은True입니다.
from agent_framework import SlidingWindowStrategy
# Keep only the last 20 non-system groups
sliding_window = SlidingWindowStrategy(keep_last_groups=20)
툴결과압축전략
이전 도구 호출 그룹을 압축 요약 메시지로 축소하여 전체 메시지 오버헤드 없이 읽을 수 있는 추적을 유지합니다.
- 사용자 메시지 또는 일반 도우미 응답을 건드리지 않습니다.
- 자세한 도구 결과에서 공간을 회수하는 첫 번째 패스 전략으로 가장 적합합니다.
- 다중 메시지 도구 호출 그룹(도우미 호출 + 도구 결과)을 다음과 같은
[Tool calls: get_weather, search_docs]간단한 요약으로 대체합니다. -
MinimumPreserved기본값으로2, 현재 턴의 도구 상호 작용이 계속 표시되도록 합니다.
// Collapse old tool results when tokens exceed 512
ToolResultCompactionStrategy toolCompaction = new(
trigger: CompactionTriggers.TokensExceed(0x200));
-
[Tool results: get_weather: sunny, 18°C]과 같은 형태로 압축된 요약 메시지로 축소됩니다. - 가장 최근의
keep_last_tool_call_groups도구 호출 그룹은 그대로 유지됩니다.
from agent_framework import ToolResultCompactionStrategy
# Collapse all but the newest tool-call group
tool_result = ToolResultCompactionStrategy(keep_last_tool_call_groups=1)
요약 압축 전략 (SummarizationCompactionStrategy)
요약 전략
LLM을 사용하여 대화의 이전 부분을 요약하여 단일 요약 메시지로 바꿔줍니다.
- 기본 프롬프트는 주요 사실, 의사 결정, 사용자 기본 설정 및 도구 호출 결과를 유지합니다.
- 요약을 위해 별도의 LLM 클라이언트가 필요합니다. 더 작고 빠른 모델을 사용하는 것이 좋습니다.
- 토큰 수를 크게 줄이면서 대화형 컨텍스트를 유지하는 데 가장 적합합니다.
- 사용자 지정 요약 프롬프트를 제공할 수 있습니다.
- 시스템 메시지와 가장 최근의
MinimumPreserved비시스템 그룹(기본값:4)을 보호합니다. - 요약 프롬프트를 사용하여 이전 메시지를 별도의
IChatClient메시지로 보낸 다음 요약을MessageGroupKind.Summary그룹으로 삽입합니다.
// Summarize older messages when tokens exceed 1280, keeping the last 4 groups
SummarizationCompactionStrategy summarization = new(
chatClient: summarizerChatClient,
trigger: CompactionTriggers.TokensExceed(0x500),
minimumPreserved: 4);
사용자 지정 요약 프롬프트를 제공할 수 있습니다.
SummarizationCompactionStrategy summarization = new(
chatClient: summarizerChatClient,
trigger: CompactionTriggers.TokensExceed(0x500),
summarizationPrompt: "Summarize the key decisions and user preferences only.");
- 포함된 비 시스템 메시지 수가 초과되면 트리거됩니다
target_count + threshold. - 메시지 그룹 경계에 따라 가까운
target_count최근 메시지를 유지합니다. 요약 작성기 입력 예산에 맞는 가장 오래된 전체 그룹을 요약합니다. - 클라이언트가
SupportsChatGetResponse필요합니다. - 기본적으로 요약 작성기 프롬프트 및 대본을 8,000개의 예상 토큰으로 제한합니다. 전체 메시지 그룹을 선택하므로 그룹이 예산에 맞게 분할되지 않습니다.
- 요약 작성기 입력 바인딩을 사용하지 않도록 설정
max_summary_input_tokens=None하거나 모델별 토큰 계산이 필요할 때 전달tokenizer=합니다. 전체 그룹이 맞지 않으면 요약을 건너뛰고 기존 기록은 변경되지 않습니다.
from agent_framework import SummarizationStrategy
# Summarize when non-system message count exceeds 6, retaining the 4 newest
summarization = SummarizationStrategy(
client=summarizer_client,
target_count=4,
threshold=2,
)
사용자 지정 요약 프롬프트를 제공합니다.
summarization = SummarizationStrategy(
client=summarizer_client,
target_count=4,
prompt="Summarize the key decisions and user preferences only.",
)
보존된 기록 대상과 독립적으로 요약 작성기 요청 예산을 제어합니다.
from agent_framework import CharacterEstimatorTokenizer, SummarizationStrategy
summarization = SummarizationStrategy(
client=summarizer_client,
target_count=4,
threshold=2,
max_summary_input_tokens=16_000,
tokenizer=CharacterEstimatorTokenizer(),
)
PipelineCompactionStrategy
여러 전략을 순차적 파이프라인으로 구성합니다. 각 전략은 이전 전략의 결과를 기반으로 작동하여, 순한 압축에서 공격적인 압축으로 계층화된 방식을 구현할 수 있습니다.
- 파이프라인의 자체 트리거는
CompactionTriggers.Always이고, 각 자식 전략은 자신의 트리거를 독립적으로 평가합니다. - 전략은 순서대로 실행되므로 가장 부드러운 전략을 최우선으로 하십시오.
PipelineCompactionStrategy pipeline = new(
new ToolResultCompactionStrategy(CompactionTriggers.TokensExceed(0x200)),
new SummarizationCompactionStrategy(summarizerChatClient, CompactionTriggers.TokensExceed(0x500)),
new SlidingWindowCompactionStrategy(CompactionTriggers.TurnsExceed(4)),
new TruncationCompactionStrategy(CompactionTriggers.TokensExceed(0x8000)));
이 파이프라인:
- 이전 도구 결과를 축소합니다(부드러운).
- 이전 대화 범위(보통)를 요약합니다.
- 마지막 4개 사용자 턴만 유지합니다(공격적).
- 예산을 초과하면 가장 오래된 그룹을 삭제합니다(비상 백스톱).
선택적 도구 호출 압축 전략
이전 도구 호출 그룹을 완전히 제외하고 마지막 keep_last_tool_call_groups도구 호출 그룹만 유지합니다.
- 사용자 또는 일반 도우미 메시지를 건드리지 않습니다.
- 도구 대화가 토큰 사용을 지배하고 전체 도구 기록이 필요하지 않은 경우에 가장 좋습니다.
from agent_framework import SelectiveToolCallCompactionStrategy
# Keep only the most recent tool-call group
selective_tool = SelectiveToolCallCompactionStrategy(keep_last_tool_call_groups=1)
톤버짓컴포즈드전략 (TokenBudgetComposedStrategy)
토큰 예산으로 구동되는 순차적 파이프라인으로 여러 전략을 구성합니다. 각 자식 전략은 순서에 따라 실행되며, 예산이 만족될 때 즉시 중단됩니다. 전략만으로는 목표에 도달할 수 없는 경우, 내장 대체 메커니즘은 가장 오래된 그룹을 제외합니다.
- 전략은 순서대로 실행됩니다. 가장 부드러운 전략을 먼저 배치합니다.
-
early_stop=True(기본값)은 토큰 예산이 충족되는 즉시 중지됩니다.
from agent_framework import (
CharacterEstimatorTokenizer,
SelectiveToolCallCompactionStrategy,
SlidingWindowStrategy,
SummarizationStrategy,
TokenBudgetComposedStrategy,
ToolResultCompactionStrategy,
)
tokenizer = CharacterEstimatorTokenizer()
pipeline = TokenBudgetComposedStrategy(
token_budget=16_000,
tokenizer=tokenizer,
strategies=[
ToolResultCompactionStrategy(keep_last_tool_call_groups=1),
SummarizationStrategy(client=summarizer_client, target_count=4, threshold=2),
SlidingWindowStrategy(keep_last_groups=20),
],
)
이 파이프라인:
- 이전 도구 결과를 축소합니다(부드러운).
- 이전 대화 범위(보통)를 요약합니다.
- 마지막 20개 그룹만 유지합니다(공격적).
- 예산(긴급 백스톱)을 초과하면 가장 오래된 첫 번째 제외로 돌아갑니다.
에이전트를 사용한 압축
압축 전략을 CompactionProvider에 랩핑하고 AIContextProvider로 등록합니다. 단일 전략 또는 PipelineCompactionStrategy를 생성자에 전달하십시오.
작성기 API에 등록
공급자를 ChatClientBuilder에 등록하고 UseAIContextProviders을 사용합니다. 공급자는 도구 호출 루프 내에서 실행되며, 각 LLM 호출 전에 메시지를 압축합니다.
IChatClient agentChatClient = openAIClient.GetChatClient(deploymentName).AsIChatClient();
IChatClient summarizerChatClient = openAIClient.GetChatClient(deploymentName).AsIChatClient();
PipelineCompactionStrategy compactionPipeline =
new(
new ToolResultCompactionStrategy(CompactionTriggers.TokensExceed(0x200)),
new SummarizationCompactionStrategy(summarizerChatClient, CompactionTriggers.TokensExceed(0x500)),
new SlidingWindowCompactionStrategy(CompactionTriggers.TurnsExceed(4)),
new TruncationCompactionStrategy(CompactionTriggers.TokensExceed(0x8000)));
AIAgent agent =
agentChatClient
.AsBuilder()
.UseAIContextProviders(new CompactionProvider(compactionPipeline))
.BuildAIAgent(
new ChatClientAgentOptions
{
Name = "ShoppingAssistant",
ChatOptions = new()
{
Instructions = "You are a helpful shopping assistant.",
Tools = [AIFunctionFactory.Create(LookupPrice)],
},
});
AgentSession session = await agent.CreateSessionAsync();
Console.WriteLine(await agent.RunAsync("What's the price of a laptop?", session));
Tip
요약 채팅 클라이언트에 더 작고 저렴한 모델(예: gpt-4o-mini)을 사용하여 요약 품질을 유지하면서 비용을 절감합니다.
단일 전략이 필요한 경우 CompactionProvider에 PipelineCompactionStrategy으로 래핑하지 않고 직접 전달하십시오.
agentChatClient
.AsBuilder()
.UseAIContextProviders(new CompactionProvider(
new SlidingWindowCompactionStrategy(CompactionTriggers.TurnsExceed(20))))
.BuildAIAgent(...);
ChatClientAgentOptions을(를) 통해 등록하기
공급자는 다음에 직접 지정할 수도 있습니다 :ChatClientAgentOptions.AIContextProviders
AIAgent agent = agentChatClient
.AsBuilder()
.BuildAIAgent(new ChatClientAgentOptions
{
AIContextProviders = [new CompactionProvider(compactionPipeline)]
});
비고
등록이 ChatClientAgentOptions를 통해 이루어질 때, CompactionProvider는 도구 호출 루프에서 사용되지 않습니다. 에이전트 수준 컨텍스트 공급자는 채팅 기록이 저장되기 전에 실행되므로 생성된 모든 합성 요약 메시지는 CompactionProvider 사용할 ChatHistoryProvider때 지속된 기록의 일부가 될 수 있습니다. 원래 저장된 기록을 유지하면서 진행 중인 요청 컨텍스트만 압축하려면 ChatClientBuilder을 통해 UseAIContextProviders(...)에 공급자를 등록하십시오.
임시 압축
CompactionProvider.CompactAsync 는 활성 에이전트 세션이 없는 임의의 메시지 목록에 전략을 적용합니다.
IEnumerable<ChatMessage> compacted = await CompactionProvider.CompactAsync(
new TruncationCompactionStrategy(CompactionTriggers.TokensExceed(8000)),
existingMessages);
선택한 압축 전략 및 토케나이저를 직접 구성합니다 Agent. 에이전트 수준 값은 기본 채팅 클라이언트에 구성된 기본값을 재정의하고, 단일 agent.run(...) 호출은 두 호출을 다시 재정의할 수 있습니다.
에이전트에 등록
from agent_framework import (
Agent,
CharacterEstimatorTokenizer,
SlidingWindowStrategy,
SummarizationStrategy,
TokenBudgetComposedStrategy,
ToolResultCompactionStrategy,
TruncationStrategy,
)
tokenizer = CharacterEstimatorTokenizer()
strategy = TokenBudgetComposedStrategy(
token_budget=16_000,
tokenizer=tokenizer,
strategies=[
ToolResultCompactionStrategy(keep_last_tool_call_groups=1),
SummarizationStrategy(client=summarizer_client, target_count=4, threshold=2),
SlidingWindowStrategy(keep_last_groups=20),
],
)
agent = Agent(
client=client,
name="ShoppingAssistant",
instructions="You are a helpful shopping assistant.",
compaction_strategy=strategy,
tokenizer=tokenizer,
)
session = agent.create_session()
print(await agent.run("What's the price of a laptop?", session=session))
Tip
요약 클라이언트에 더 작고 저렴한 모델(예: gpt-4o-mini)을 사용하여 요약 품질을 유지하면서 비용을 절감합니다.
하나의 전략만 필요한 경우 직접 전달합니다.
agent = Agent(
client=client,
compaction_strategy=SlidingWindowStrategy(keep_last_groups=20),
tokenizer=CharacterEstimatorTokenizer(),
)
한 실행에 대한 압축 재정의
한 요청에 다른 정책이 필요한 경우 전달 compaction_strategy 하고 tokenizeragent.run(...) 전달합니다.
response = await agent.run(
"Summarize the rollout risks.",
compaction_strategy=TruncationStrategy(max_n=8_000, compact_to=4_000),
tokenizer=tokenizer,
)
임시 압축
apply_compaction 는 활성 에이전트 세션 외부의 임의의 메시지 목록에 전략을 적용합니다.
from agent_framework import apply_compaction, TruncationStrategy, CharacterEstimatorTokenizer
tokenizer = CharacterEstimatorTokenizer()
compacted = await apply_compaction(
messages,
strategy=TruncationStrategy(
max_n=8_000,
compact_to=4_000,
tokenizer=tokenizer,
),
tokenizer=tokenizer,
)
압축 컨텍스트 공급자를 만들고 에이전트의 컨텍스트 공급자에 추가합니다.
import (
"github.com/microsoft/agent-framework-go/agent"
"github.com/microsoft/agent-framework-go/agent/compaction"
"github.com/microsoft/agent-framework-go/provider/foundryprovider"
)
compactionProvider := compaction.NewContextProvider(compaction.ContextProviderConfig{
Strategy: &compaction.PipelineStrategy{
Strategies: []compaction.Strategy{
&compaction.ToolResultStrategy{
Trigger: compaction.MessagesExceed(7),
MinimumPreservedGroups: 4,
},
&compaction.SlidingWindowStrategy{
Trigger: compaction.TurnsExceed(4),
MinimumPreservedTurns: 4,
},
},
},
})
a := foundryprovider.NewAgent(endpoint, token, foundryprovider.ModelDeployment(model), foundryprovider.AgentConfig{
Config: agent.Config{
ContextProviders: []agent.ContextProvider{compactionProvider},
},
})
Tip
전체 실행 가능한 예제는 컴팩션 파이프라인 샘플을 참조하세요.
Harness 에이전트로 압축 사용
위의 수동 설정은 압축 공급자가 실행되는 위치를 완전히 제어할 수 있습니다. 대신 Harness 에이전트는 서비스별 호출 기록 파이프라인에 압축을 연결하므로 긴 도구 호출 루프가 모델 호출 간에 압축될 수 있습니다.
압축은 기본적으로 꺼져 있습니다. 둘 다 HarnessAgentOptions.MaxContextWindowTokensMaxOutputTokens 설정하고 기본값 ContextWindowCompactionStrategy을 만들거나 고유한 전략을 제공하도록 설정합니다 CompactionStrategy .
HarnessAgent agent = chatClient.AsHarnessAgent(new HarnessAgentOptions
{
MaxContextWindowTokens = 128_000,
MaxOutputTokens = 16_384,
});
harness는 함수 호출 루프의 모든 모델 호출 전에 확인된 전략을 실행합니다. 또한 기본값 InMemoryChatHistoryProvider을 만들 때 전략의 채팅 리듀서로 해당 공급자를 구성합니다. 사용자 지정 ChatHistoryProvider 은 제공된 대로 사용됩니다.
DisableCompaction = true는 토큰 설정을 재정의하고 CompactionStrategyMaxOutputTokens 압축을 사용하거나 사용하지 않도록 설정할 때 계속 설정합니다ChatOptions.MaxOutputTokens.
chatClient.AsHarnessAgent(options) 동일한 new HarnessAgent(chatClient, options) 을 HarnessAgentOptions사용합니다.
압축은 둘 다 max_context_window_tokensmax_output_tokens 설정되거나 사용자 지정 단계 전략이 제공되지 않는 한 기본적으로 해제됩니다.
agent = create_harness_agent(
client,
max_context_window_tokens=128_000,
max_output_tokens=16_384,
)
토큰 설정을 사용하면 도구 루프 내에서 모든 모델 호출 전에 이전 단계가 실행되고 이후 단계가 실행 후 지속된 기록을 압축하는 동안 두 단계 모두에 대해 하나를 ContextWindowCompactionStrategy 다시 사용합니다. 사용자 지정 토케나이저history_provider=, 다른 기록 저장소 disable_compaction=True 또는 after_compaction_strategy두 단계를 모두 사용하지 않도록 설정 tokenizer= 하여 독립적으로 before_compaction_strategy 또는 ; 단계를 재정의합니다.
max_output_tokens 에서는 기본 max_tokens 채팅 옵션도 제공합니다.
Harness 에이전트는 현재 Go SDK에서 사용할 수 없습니다. 위와 같이 압축 컨텍스트 공급자를 수동으로 등록합니다.
전략 선택
| Strategy | 강도 | 컨텍스트 유지 | LLM 필요 | 적합한 대상 |
|---|---|---|---|---|
ToolResultCompactionStrategy |
Low | 높은 - 도구의 결과만 축소됨 | No | 장황한 도구 출력에서 공간 절약 |
SummarizationCompactionStrategy |
중간 | 보통 - 기록을 요약으로 대체합니다. | Yes | 컨텍스트가 중요한 긴 대화 |
SlidingWindowCompactionStrategy |
높음 | 낮음 - 전체 회전 삭제 | No | 고정된 턴 카운트 제한 |
TruncationCompactionStrategy |
높음 | 낮음 - 가장 오래된 그룹을 삭제합니다. | No | 긴급 토큰 예산 백스톱 |
PipelineCompactionStrategy |
Configurable | 자식 전략에 따라 다름 | 따라 다름 | 여러 대안 방법을 사용하여 계층화된 압축 |
| Strategy | 강도 | 컨텍스트 유지 | LLM 필요 | 적합한 대상 |
|---|---|---|---|---|
ToolResultCompactionStrategy |
Low | 높음 - 도구 결과를 요약 메시지로 축소 | No | 장황한 도구 출력에서 공간 절약 |
SelectiveToolCallCompactionStrategy |
낮음-보통 | 중간 - 이전 도구 호출 그룹을 완전히 제외합니다. | No | 결과가 더 이상 필요하지 않은 경우 도구 기록 제거 |
SummarizationStrategy |
중간 | 보통 - 기록을 요약으로 대체합니다. | Yes | 컨텍스트가 중요한 긴 대화 |
SlidingWindowStrategy |
높음 | 낮음 - 가장 오래된 그룹을 삭제합니다. | No | 고정 그룹 수 제한 |
TruncationStrategy |
높음 | 낮음 - 가장 오래된 그룹을 삭제합니다. | No | 긴급 메시지 백업 시스템과 토큰 예산 안전장치 |
TokenBudgetComposedStrategy |
Configurable | 자식 전략에 따라 다름 | 따라 다름 | 계층화된 압축을 위한 토큰 예산 목표와 여러 대안 |
| Strategy | 강도 | 컨텍스트 유지 | LLM 필요 | 적합한 대상 |
|---|---|---|---|---|
ToolResultStrategy |
Low | 높음 - 자세한 정보 표시 도구 결과 축소 | No | 장황한 도구 출력에서 공간 절약 |
SlidingWindowStrategy |
높음 | 낮음 - 가장 최근의 회전 유지 | No | 고정된 턴 카운트 제한 |
PipelineStrategy |
Configurable | 자식 전략에 따라 다름 | 따라 다름 | 여러 대안 방법을 사용하여 계층화된 압축 |