Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn die Gespräche zunehmen, kann die Tokenanzahl des Chatverlaufs die Modell-Kontextfenster überschreiten oder die Kosten erhöhen. Komprimierungsstrategien verringern die Größe der Aufgezeichneten Unterhaltungen und behalten gleichzeitig einen wichtigen Kontext bei, sodass Agents weiterhin über langfristige Interaktionen funktionieren können.
Important
Das Komprimierungsframework ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable MAAI001hinzufügen.
Important
Das Komprimierungsframework ist derzeit in Python experimentell. Importieren Sie Komprimierungstypen aus agent_framework.
Go unterstützt die Komprimierung über das agent/compaction Paket. Registrieren Sie eine Komprimierungsstrategie als agent.ContextProvider, damit sie den Sitzungsverlauf vor jeder Ausführung komprimieren kann.
Warum Komprimierung wichtig ist
Jeder Anruf an ein LLM umfasst den vollständigen Unterhaltungsverlauf. Ohne Komprimierung:
- Tokengrenzwerte – Unterhaltungen überschreiten schließlich das Kontextfenster des Modells und verursachen Fehler.
- Kosten – Größere Aufforderungen verbrauchen mehr Token und erhöhen die API-Kosten.
- Latenz – Mehr Eingabetoken bedeuten langsamere Reaktionszeiten.
Die Komprimierung löst diese Probleme durch selektives Entfernen, Reduzieren oder Zusammenfassen älterer Teile der Unterhaltung.
Wichtige Konzepte
Anwendbarkeit: Nur Speicherverlaufs-Agents
Komprimierung gilt nur für Agenten, die ihren eigenen Unterhaltungsverlauf im Speicher verwalten. Agenten, die auf vom Dienst verwaltetem Kontext und Konversationsstatus basieren, profitieren nicht von der Komprimierung, da der Dienst bereits die Kontextverwaltung übernimmt. Beispiele für vom Dienst verwaltete Agents sind:
- Foundry Agents – Kontext wird serverseitig vom Microsoft Foundry-Dienst verwaltet.
- Antwort-API mit aktiviertem Speicher (Standard) – Der Unterhaltungsstatus wird vom OpenAI-Dienst gespeichert und verwaltet.
- Copilot Studio-Agents – Gesprächskontext wird vom Copilot Studio-Dienst verwaltet.
Für diese Agenttypen hat die Konfiguration einer Komprimierungsstrategie keine Auswirkung. Komprimierung ist nur relevant, wenn der Agent eine eigene Nachrichtenliste im Arbeitsspeicher verwaltet und den vollständigen Verlauf an das Modell bei jedem Anruf weitergibt.
Die Komprimierung arbeitet auf einer MessageIndex strukturierten Ansicht der flachen Nachrichtenliste, die Nachrichten in atomare Einheiten gruppiert, die als MessageGroup-Instanzen bezeichnet werden. Jede Gruppe verfolgt die Nachrichtenanzahl, byteanzahl und die geschätzte Tokenanzahl nach.
Nachrichtengruppen
Ein MessageGroup stellt logisch zusammengehörige Nachrichten dar, die zusammen beibehalten oder entfernt werden müssen. Eine Assistentennachricht, die Toolaufrufe enthält, und die entsprechenden Toolergebnismeldungen bilden beispielsweise eine atomische Gruppe – das Entfernen eines Ohne den anderen würde ZU LLM-API-Fehlern führen.
Jede Gruppe hat ein MessageGroupKind:
| Kind | Description |
|---|---|
System |
Eine oder mehrere Systemmeldungen. Immer während der Komprimierung erhalten. |
User |
Eine einzelne Benutzernachricht, die eine neue Drehung startet. |
AssistantText |
Eine simple Textantwort des Assistenten (keine Toolaufrufe). |
ToolCall |
Eine Assistant-Nachricht mit Toolaufrufen und den entsprechenden Ergebnismeldungen des Tools, die als Atomeinheit behandelt werden. |
Summary |
Eine komprimierte Nachricht, die von der Zusammenfassungskomprimierung erzeugt wird. |
Trigger
Ein CompactionTrigger ist ein Delegat, der auswertet, ob die Komprimierung auf Basis der aktuellen MessageIndex Metriken fortgesetzt werden soll.
public delegate bool CompactionTrigger(MessageIndex index);
Die CompactionTriggers Klasse stellt allgemeine Fabrikmethoden bereit:
| Auslöser | Wird ausgelöst, wenn |
|---|---|
CompactionTriggers.Always |
Jedes Mal (bedingungslos). |
CompactionTriggers.Never |
Nie (Komprimierung wird deaktiviert). |
CompactionTriggers.TokensExceed(maxTokens) |
Die Anzahl der enthaltenen Tokens überschreitet den Schwellenwert. |
CompactionTriggers.MessagesExceed(maxMessages) |
Die Anzahl der eingeschlossenen Nachrichten überschreitet den Schwellenwert. |
CompactionTriggers.TurnsExceed(maxTurns) |
Die Anzahl der eingeschlossenen Benutzerinteraktionen überschreitet den Schwellenwert. |
CompactionTriggers.GroupsExceed(maxGroups) |
Die eingeschlossene Gruppenanzahl überschreitet den Schwellenwert. |
CompactionTriggers.HasToolCalls() |
Mindestens eine nicht ausgeschlossene Werkzeugaufrufgruppe ist vorhanden. |
Kombinieren von Triggern mit CompactionTriggers.All(...) (logisches UND) oder CompactionTriggers.Any(...) (logisches ODER):
// Compact only when there are tool calls AND tokens exceed 2000
CompactionTrigger trigger = CompactionTriggers.All(
CompactionTriggers.HasToolCalls(),
CompactionTriggers.TokensExceed(2000));
Trigger im Vergleich zum Ziel
Jede Strategie hat zwei Prädikate:
-
Trigger – Steuerelemente , wenn die Komprimierung beginnt. Wenn der Trigger
falsezurückgibt, wird die gesamte Strategie übersprungen. -
Ziel – Steuert , wenn die Komprimierung beendet wird. Strategien schließen Gruppen schrittweise aus und bewerten das Ziel nach jedem Schritt neu, wobei der Prozess endet, sobald das Ziel zurückkehrt
true.
Wenn kein Ziel angegeben wird, wird standardmäßig das Gegenteil des Triggers verwendet: Die Verdichtung wird beendet, sobald die Triggerbedingung nicht mehr erfüllt ist.
Komprimierung wird auf einer flachen Liste von Message Objekten ausgeführt. Nachrichten werden mit einfachen Gruppenmetadaten versehen, und Strategien mutieren diese Anmerkungen, um Gruppen als ausgeschlossen zu markieren, bevor die Nachrichtenliste auf das Modell projiziert wird.
Nachrichtengruppen
Nachrichten werden in atome Einheiten gruppiert. Jedem Gruppe wird ein GroupKind zugewiesen.
| Kind | Description |
|---|---|
system |
Systemmeldungen. Immer während der Komprimierung erhalten. |
user |
Eine einzelne Benutzernachricht. |
assistant_text |
Eine einfache Assistenz-Textantwort (keine Funktionsaufrufe). |
tool_call |
Eine Assistentennachricht mit Funktionsaufrufen sowie den entsprechenden Ergebnismeldungen des Tools, die als atome Einheit behandelt werden. |
Komprimierungsstrategien
Ein CompactionStrategy ist ein Protokoll – jedes async aufrufbares Element, das es list[Message] annehmen und direkt verändern kann, zurückkehrt True, sobald etwas geändert wurde:
class CompactionStrategy(Protocol):
async def __call__(self, messages: list[Message]) -> bool: ...
Tokenisierer
Tokenfähige Strategien akzeptieren eine TokenizerProtocol Implementierung. Das integrierte System CharacterEstimatorTokenizer verwendet eine Heuristik mit 4 Zeichen pro Token:
from agent_framework import CharacterEstimatorTokenizer
tokenizer = CharacterEstimatorTokenizer()
Übergeben Sie einen benutzerdefinierten Tokenizer, wenn Sie genaue Tokenanzahlen für die Codierung eines bestimmten Modells benötigen.
Komprimierung wird als Kontextanbieter ausgeführt. Strategien können den Sitzungsverlauf vor jeder Ausführung prüfen und ältere Nachrichtengruppen reduzieren und gleichzeitig den neuesten Kontext beibehalten.
Das Go-Paket enthält Strategietypen wie ToolResultStrategy, SlidingWindowStrategy und PipelineStrategy sowie Trigger-Hilfsfunktionen wie MessagesExceed und TurnsExceed.
Komprimierungsstrategien
Alle Strategien erben von der abstrakten CompactionStrategy Basisklasse. Jede Strategie behält Systemmeldungen bei und respektiert eine MinimumPreserved Schwelle, die die neuesten Nicht-System-Gruppen vor der Entfernung schützt.
Komprimierungsstrategien werden aus agent_frameworkimportiert.
Komprimierungsstrategien werden aus github.com/microsoft/agent-framework-go/agent/compactionimportiert.
Trunkierungs-Kompressionsstrategie
Abkürzungsstrategie
Der einfachste Ansatz: Entfernt die ältesten Nicht-System-Nachrichtengruppen, bis die Zielbedingung erfüllt ist.
- Respektiert atomische Gruppengrenzen (Toolaufrufe und Ergebnismeldungen werden zusammen entfernt).
- Am besten geeignet für feste Token-Budget-Sicherungen.
- Der Standardwert von
MinimumPreservedist32.
// Drop oldest groups when tokens exceed 32K, keeping at least 10 recent groups
TruncationCompactionStrategy truncation = new(
trigger: CompactionTriggers.TokensExceed(0x8000),
minimumPreserved: 10);
- Wenn ein
tokenizerWert angegeben wird, ist die Metrik die Tokenanzahl. Andernfalls wird die Nachrichtenanzahl eingeschlossen. - Der Standardwert von
preserve_systemistTrue.
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
Gleitfensterstrategie
Entfernt ältere Unterhaltungsinhalte, um nur das neueste Austauschfenster beizubehalten, wobei logische Unterhaltungseinheiten und nicht willkürliche Nachrichtenanzahl berücksichtigt werden. Systemnachrichten werden fortlaufend beibehalten.
- Am besten geeignet für die Begrenzung einer Unterhaltungslänge auf vorhersagbare Weise.
Entfernt die ältesten Benutzer turns und ihre zugehörigen Antwortgruppen, wobei logische Abgrenzungen der Turns verwendet werden und nicht auf einzelne Gruppen abgezielt wird.
- Ein Vorgang beginnt mit einer Benutzernachricht und umfasst alle nachfolgenden Assistenten- und Werkzeugaufrufgruppen bis zur nächsten Benutzernachricht.
-
MinimumPreservedwird standardmäßig auf1gesetzt (behält mindestens die neueste nicht-systemdefinierte Gruppe bei).
// Keep only the last 4 user turns
SlidingWindowCompactionStrategy slidingWindow = new(
trigger: CompactionTriggers.TurnsExceed(4));
Behält nur die neuesten keep_last_groups Nicht-Systemgruppen bei, mit Ausnahme aller älteren Gruppen.
- Der Standardwert von
preserve_systemistTrue.
from agent_framework import SlidingWindowStrategy
# Keep only the last 20 non-system groups
sliding_window = SlidingWindowStrategy(keep_last_groups=20)
WerkzeugsErgebnisVerdichtungsStrategie
Reduziert ältere Toolanrufgruppen in kompakte Zusammenfassungsmeldungen, wobei eine lesbare Ablaufverfolgung ohne den vollständigen Nachrichtenaufwand erhalten bleibt.
- Berührt keine Benutzernachrichten oder einfache Assistentenantworten.
- Am besten als Erstdurchlaufstrategie, um Platz aus ausführlichen Toolergebnissen zurückzufordern.
- Ersetzt Tool-Anrufgruppen mit mehreren Nachrichten (Assistentenanruf + Ergebnisse der Werkzeuge) durch eine kurze Zusammenfassung, wie
[Tool calls: get_weather, search_docs]. -
MinimumPreservedwird standardmäßig auf2zurückgesetzt, wodurch sichergestellt wird, dass die Toolinteraktionen des aktuellen Zuges sichtbar bleiben.
// Collapse old tool results when tokens exceed 512
ToolResultCompactionStrategy toolCompaction = new(
trigger: CompactionTriggers.TokensExceed(0x200));
- Reduziert sich in kompakte Zusammenfassungsmeldungen wie
[Tool results: get_weather: sunny, 18°C]z. B. . - Die neuesten
keep_last_tool_call_groupsToolanrufgruppen bleiben unberührt.
from agent_framework import ToolResultCompactionStrategy
# Collapse all but the newest tool-call group
tool_result = ToolResultCompactionStrategy(keep_last_tool_call_groups=1)
SummarizationCompactionStrategy
Strategie zur Zusammenfassung
Verwendet eine LLM, um ältere Teile der Unterhaltung zusammenzufassen und durch eine einzelne Zusammenfassungsnachricht zu ersetzen.
- Eine Standardaufforderung behält wichtige Fakten, Entscheidungen, Benutzereinstellungen und Ergebnisse von Toolanrufen bei.
- Erfordert einen separaten LLM-Client für die Zusammenfassung – ein kleineres, schnelleres Modell wird empfohlen.
- Am besten geeignet, um den Konversationskontext zu bewahren und gleichzeitig die Tokenanzahl erheblich zu erniedrigen.
- Sie können eine benutzerdefinierte Zusammenfassungsaufforderung bereitstellen.
- Schützt Systemmeldungen und die neuesten
MinimumPreservedNicht-Systemgruppen (Standard:4). - Sendet die älteren Nachrichten an separates
IChatClientmit einer Aufforderung zur Zusammenfassung und fügt dann die Zusammenfassung alsMessageGroupKind.SummaryGruppe ein.
// Summarize older messages when tokens exceed 1280, keeping the last 4 groups
SummarizationCompactionStrategy summarization = new(
chatClient: summarizerChatClient,
trigger: CompactionTriggers.TokensExceed(0x500),
minimumPreserved: 4);
Sie können eine benutzerdefinierte Zusammenfassungsaufforderung bereitstellen:
SummarizationCompactionStrategy summarization = new(
chatClient: summarizerChatClient,
trigger: CompactionTriggers.TokensExceed(0x500),
summarizationPrompt: "Summarize the key decisions and user preferences only.");
- Trigger, wenn die Anzahl der nicht systemfremden
target_count + thresholdNachrichten überschreitet. - Behält zuletzt verwendete Nachrichten in der Nähe
target_countbei, vorbehaltlich von Nachrichtengruppengrenzen; fasst die ältesten vollständigen Gruppen zusammen, die dem Zusammenfassungseingabebudget entsprechen. - Erfordert einen
SupportsChatGetResponseClient. - Begrenzt die Zusammenfassungsaufforderung und transkription standardmäßig auf 8.000 geschätzte Token. Sie wählt vollständige Nachrichtengruppen aus, sodass eine Gruppe niemals auf das Budget aufgeteilt wird.
- Legen Sie fest
max_summary_input_tokens=None, dass die gebundene Zusammenfassungseingabe deaktiviert oder übergebentokenizer=wird, wenn Sie modellspezifische Tokenzählung benötigen. Wenn keine vollständige Gruppe passt, wird die Zusammenfassung übersprungen, und der vorhandene Verlauf bleibt unverändert.
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,
)
Geben Sie eine benutzerdefinierte Zusammenfassungsaufforderung an:
summarization = SummarizationStrategy(
client=summarizer_client,
target_count=4,
prompt="Summarize the key decisions and user preferences only.",
)
Steuern Sie das Zusammenfassungsanforderungsbudget unabhängig vom Ziel "Aufbewahrungsverlauf":
from agent_framework import CharacterEstimatorTokenizer, SummarizationStrategy
summarization = SummarizationStrategy(
client=summarizer_client,
target_count=4,
threshold=2,
max_summary_input_tokens=16_000,
tokenizer=CharacterEstimatorTokenizer(),
)
Pipeline-Verdichtungsstrategie
Kombiniert mehrere Strategieansätze zu einer sequenziellen Pipeline. Jede Strategie basiert auf dem Ergebnis der vorherigen, wodurch eine abgestufte Komprimierung von sanft bis aggressiv ermöglicht wird.
- Der eigene Trigger der Pipeline lautet
CompactionTriggers.Always– jede untergeordnete Strategie wertet ihren eigenen Trigger unabhängig aus. - Strategien werden in der Reihenfolge ausgeführt, also setzen Sie die sanftsten Strategien zuerst.
PipelineCompactionStrategy pipeline = new(
new ToolResultCompactionStrategy(CompactionTriggers.TokensExceed(0x200)),
new SummarizationCompactionStrategy(summarizerChatClient, CompactionTriggers.TokensExceed(0x500)),
new SlidingWindowCompactionStrategy(CompactionTriggers.TurnsExceed(4)),
new TruncationCompactionStrategy(CompactionTriggers.TokensExceed(0x8000)));
Diese Pipeline:
- Klappt alte Werkzeugergebnisse auf sanfte Weise zusammen.
- Fasst ältere Gesprächszeiträume (mäßig) zusammen.
- Behält nur die letzten 4 Benutzerwechsel bei (aggressiv).
- Entfernt älteste Gruppen, wenn das Budget noch überschritten ist (Notfall-Backstop).
Selektive Werkzeuganruf-Komprimierungsstrategie
Ältere Werkzeugaufrufgruppen werden vollständig ausgeschlossen, wobei nur die letzte keep_last_tool_call_groups beibehalten wird.
- Berührt weder Benutzer- noch einfache Assistenten-Nachrichten.
- Am besten, wenn Der Toolchatter die Tokenverwendung dominiert und der vollständige Toolverlauf nicht benötigt wird.
from agent_framework import SelectiveToolCallCompactionStrategy
# Keep only the most recent tool-call group
selective_tool = SelectiveToolCallCompactionStrategy(keep_last_tool_call_groups=1)
TokenBudgetVerbundStrategie
Kombiniert mehrere Strategien in einer von einem Token-Budget gesteuerten sequenziellen Pipeline. Jede untergeordnete Strategie wird in der Reihenfolge ausgeführt und frühzeitig beendet, sobald das Budget erfüllt ist. Ein integrierter Fallback schließt die ältesten Gruppen aus, wenn die Strategien allein das Ziel nicht erreichen können.
- Strategien werden in der Reihenfolge ausgeführt; platzieren Sie die sanftsten Strategien zuerst.
-
early_stop=True(Standardeinstellung) wird beendet, sobald das Tokenbudget erfüllt ist.
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),
],
)
Diese Pipeline:
- Klappt alte Werkzeugergebnisse auf sanfte Weise zusammen.
- Fasst ältere Gesprächszeiträume (mäßig) zusammen.
- Speichert nur die letzten 20 Gruppen (aggressive Vorgehensweise).
- Fällt auf den ältesten Ausschluss zurück, wenn der Haushalt noch über dem Budget liegt (Notfall-Backstop).
Verwendung der Komprimierung mit einem Agent
Umschließen Sie eine Komprimierungsstrategie in einer CompactionProvider und registrieren Sie sie als eine AIContextProvider. Übergeben Sie entweder eine einzelne Strategie oder eine PipelineCompactionStrategy an den Konstruktor.
Registrieren mit der Generator-API
Registrieren Sie den Anbieter auf ChatClientBuilder mit UseAIContextProviders. Der Anbieter wird innerhalb der Werkzeugaufrufschleife ausgeführt und komprimiert Nachrichten vor jedem LLM-Aufruf.
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
Verwenden Sie ein kleineres, günstigeres Modell (wie gpt-4o-mini) für den Zusammenfassungs-Chat-Client, um Kosten zu senken und gleichzeitig die Zusammenfassungsqualität aufrechtzuerhalten.
Wenn nur eine Strategie benötigt wird, übergeben Sie sie direkt an CompactionProvider, ohne dass Sie sie in eine PipelineCompactionStrategy umschließen müssen.
agentChatClient
.AsBuilder()
.UseAIContextProviders(new CompactionProvider(
new SlidingWindowCompactionStrategy(CompactionTriggers.TurnsExceed(20))))
.BuildAIAgent(...);
Registrieren über ChatClientAgentOptions
Der Anbieter kann auch direkt bei ChatClientAgentOptions.AIContextProviders spezifiziert werden.
AIAgent agent = agentChatClient
.AsBuilder()
.BuildAIAgent(new ChatClientAgentOptions
{
AIContextProviders = [new CompactionProvider(compactionPipeline)]
});
Note
Wenn die Registrierung durch ChatClientAgentOptions erfolgt, wird CompactionProvider während der Toolaufrufschleife nicht aktiviert. Kontextanbieter auf Agentenebene werden ausgeführt, bevor der Chatverlauf gespeichert wird, sodass alle synthetischen Zusammenfassungsnachrichten, die von CompactionProvider erzeugt werden, Teil des gespeicherten Verlaufs werden können, wenn Sie ChatHistoryProvider verwenden. Um nur den In-Flight-Anforderungskontext zu komprimieren und dabei den ursprünglichen gespeicherten Verlauf beizubehalten, registrieren Sie den Anbieter stattdessen über ChatClientBuilderUseAIContextProviders(...) .
Ad-hoc-Komprimierung
CompactionProvider.CompactAsync wendet eine Strategie auf eine beliebige Nachrichtenliste ohne aktive Agentsitzung an:
IEnumerable<ChatMessage> compacted = await CompactionProvider.CompactAsync(
new TruncationCompactionStrategy(CompactionTriggers.TokensExceed(8000)),
existingMessages);
Konfigurieren Sie die ausgewählte Komprimierungsstrategie und den Tokenizer direkt auf Agent. Werte auf Agentebene setzen Standardwerte außer Kraft, die auf dem zugrunde liegenden Chatclient konfiguriert sind, und ein einzelner agent.run(...) Anruf kann beides erneut außer Kraft setzen.
Registrieren bei einem Agent
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
Verwenden Sie ein kleineres, kostengünstigeres Modell (z. B. gpt-4o-mini) für den Zusammenfassungs-Client, um die Kosten zu senken und gleichzeitig die Qualität der Zusammenfassung beizubehalten.
Wenn nur eine Strategie benötigt wird, übergeben Sie sie direkt:
agent = Agent(
client=client,
compaction_strategy=SlidingWindowStrategy(keep_last_groups=20),
tokenizer=CharacterEstimatorTokenizer(),
)
Überschreiben der Komprimierung für eine Ausführung
Übergeben compaction_strategy und tokenizer an den Zeitpunkt, an agent.run(...) dem eine Anforderung eine andere Richtlinie benötigt:
response = await agent.run(
"Summarize the rollout risks.",
compaction_strategy=TruncationStrategy(max_n=8_000, compact_to=4_000),
tokenizer=tokenizer,
)
Ad-hoc-Komprimierung
apply_compaction wendet eine Strategie auf eine beliebige Nachrichtenliste außerhalb einer aktiven Agentsitzung an:
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,
)
Erstellen Sie einen Komprimierungskontextanbieter, und fügen Sie ihn den Kontextanbietern des Agents hinzu:
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
Ein vollständiges ausführbares Beispiel finden Sie im Beispiel für die Komprimierungs-Pipeline.
Komprimierung mit Harness Agent verwenden
Das oben beschriebene manuelle Setup ermöglicht die vollständige Kontrolle darüber, wo ein Komprimierungsanbieter ausgeführt wird. Der Agent nutzt stattdessen die Komprimierung in die Pipeline für den Anrufverlauf pro Dienst, sodass lange Toolanrufschleifen zwischen Modellaufrufen komprimiert werden können.
Die Komprimierung ist standardmäßig deaktiviert. Legen Sie sowohl einen HarnessAgentOptions.MaxContextWindowTokensMaxOutputTokens Standardwert ContextWindowCompactionStrategyfest, als auch legen Sie fest CompactionStrategy , dass Sie Ihre eigene Strategie bereitstellen.
HarnessAgent agent = chatClient.AsHarnessAgent(new HarnessAgentOptions
{
MaxContextWindowTokens = 128_000,
MaxOutputTokens = 16_384,
});
Die Nutzungsfunktion führt die aufgelöste Strategie vor jedem Modellaufruf in der Funktionsaufrufschleife aus. Wenn er auch den Standardwert InMemoryChatHistoryProvidererstellt, konfiguriert er diesen Anbieter mit dem Chat-Reduzierung der Strategie. Eine Benutzerdefinierte ChatHistoryProvider wird wie angegeben verwendet.
DisableCompaction = truesetzt die Tokeneinstellungen außer Kraft und CompactionStrategyMaxOutputTokens legt weiterhin festChatOptions.MaxOutputTokens, wenn die Komprimierung aktiviert oder deaktiviert ist.
chatClient.AsHarnessAgent(options) und new HarnessAgent(chatClient, options) verwenden Sie dasselbe HarnessAgentOptions.
Die Komprimierung ist standardmäßig deaktiviert, es sei denn, beide max_context_window_tokens und max_output_tokens sie werden festgelegt, oder eine benutzerdefinierte Phasenstrategie wird bereitgestellt.
agent = create_harness_agent(
client,
max_context_window_tokens=128_000,
max_output_tokens=16_384,
)
Mit den Tokeneinstellungen verwendet die Verwendung eine ContextWindowCompactionStrategy für beide Phasen: Die Vorphase wird vor jedem Modellaufruf innerhalb der Toolschleife ausgeführt, während die Nachphase den Verlauf nach der Ausführung beibehalten hat. Überschreiben Sie entweder eine Phase unabhängig von before_compaction_strategy oder after_compaction_strategy; legen Sie tokenizer= für einen benutzerdefinierten Tokenizer, history_provider= für einen anderen Verlaufsspeicher oder disable_compaction=True zum Deaktivieren beider Phasen fest.
max_output_tokens stellt außerdem die Standard-Chatoption max_tokens zur Auswahl.
Der Nutzungs-Agent ist derzeit nicht im Go SDK verfügbar. Registrieren Sie einen Komprimierungskontextanbieter manuell wie oben dargestellt.
Auswählen einer Strategie
| Strategy | Aggressivität | Behält den Kontext bei | Erfordert LLM | Am besten geeignet für: |
|---|---|---|---|---|
ToolResultCompactionStrategy |
Niedrig | Hoch – reduziert nur Toolergebnisse | No | Freigeben des Platzes aus ausführlicher Toolausgabe |
SummarizationCompactionStrategy |
Medium | Mittel – ersetzt den Verlauf durch eine Zusammenfassung. | Yes | Lange Unterhaltungen, bei denen Kontext wichtig ist |
SlidingWindowCompactionStrategy |
Hoch | Niedrig - verliert gesamte Umdrehungen | No | Einschränkungen für harte Turn-Count-Werte |
TruncationCompactionStrategy |
Hoch | Niedrig – entfernt älteste Gruppen | No | Notfall-Token-Budget-Absicherungen |
PipelineCompactionStrategy |
Konfigurierbar | Hängt von Kinderstrategien ab | Hängt | Mehrschichtige Komprimierung mit mehreren Fallbacks |
| Strategy | Aggressivität | Behält den Kontext bei | Erfordert LLM | Am besten geeignet für: |
|---|---|---|---|---|
ToolResultCompactionStrategy |
Niedrig | Hoch – reduziert Die Ergebnisse des Tools in Zusammenfassungsmeldungen | No | Freigeben des Platzes aus ausführlicher Toolausgabe |
SelectiveToolCallCompactionStrategy |
Niedrig bis Mittel | Mittel – schließt alte Werkzeugaufrufgruppen völlig aus. | No | Entfernen des Toolverlaufs, wenn Ergebnisse nicht mehr benötigt werden |
SummarizationStrategy |
Medium | Mittel – ersetzt den Verlauf durch eine Zusammenfassung. | Yes | Lange Unterhaltungen, bei denen Kontext wichtig ist |
SlidingWindowStrategy |
Hoch | Niedrig – entfernt älteste Gruppen | No | Strikte Gruppenanzahlgrenzen |
TruncationStrategy |
Hoch | Niedrig – entfernt älteste Gruppen | No | Notfallnachrichten- oder Tokenbudget-Backstops |
TokenBudgetComposedStrategy |
Konfigurierbar | Hängt von Kinderstrategien ab | Hängt | Mehrschichtige Komprimierung mit dem Ziel eines Token-Budgets und mehreren Rückfalloptionen |
| Strategy | Aggressivität | Behält den Kontext bei | Erfordert LLM | Am besten geeignet für: |
|---|---|---|---|---|
ToolResultStrategy |
Niedrig | Hoch – reduziert ausführliche Toolergebnisse | No | Freigeben des Platzes aus ausführlicher Toolausgabe |
SlidingWindowStrategy |
Hoch | Niedrig - hält die neuesten Kurven | No | Einschränkungen für harte Turn-Count-Werte |
PipelineStrategy |
Konfigurierbar | Hängt von Kinderstrategien ab | Hängt | Mehrschichtige Komprimierung mit mehreren Fallbacks |