AWS Machine LearningVeröffentlichung der Quelle

Groundhog Day für AI-Agenten: Musterträger-Muster für die Nutzung von OpenAI-Modellen auf Amazon Bedrock

Jedes Mal, wenn Sie Ihren Agent auslösen, muss er seine gesamte Lebensgeschichte noch einmal lesen, bevor er eine Aktion ausführt. So kann er sich daran erinnern, ohne dass Sie ihm wieder denselben Kontext geben müssen.

Jedes Mal, wenn Sie Ihren Agent auslösen, muss er seine gesamte Lebensgeschichte noch einmal lesen, bevor er eine Aktion ausführt. So kann er sich daran erinnern, ohne dass Sie ihm wieder denselben Kontext geben müssen.

In dem Film Groundhog Day lebt die Figur von Bill Murray jeden Tag wieder das gleiche Datum am 2. Februar. Er wacht auf die gleiche Liedausgabe aus dem Radio, in demselben Gasthaus und in derselben kleinen Stadt – immer wieder, wie einige Filmfans schätzen, für 34 Jahre.

Nichts, was er am Vortag erreicht hat, bleibt bestehen, es sei denn, er bereitet es neu von vorne vor. AI-Agenten leben in einer Version von Groundhog Day. Jedes Mal, wenn ein Agent einen Schritt macht (ein Werkzeug ruft, das Ergebnis liest, entscheidet, was als Nächstes zu tun ist), muss er dem Modell seine gesamte Geschichte bis jetzt übermitteln, um die Kontinuität aufrechtzuerhalten: die Definitionen der Werkzeuge, die Anweisungen, alle vorherigen Werkzeugaufrufe und jedes Ergebnis. Das Modell prognostiziert nur den nächsten Token basierend auf dem eingegebenen Input. Es hat keine interne Speicherkapazität zwischen den Anfragen, sodass es alles erneut lesen muss. Nach 20 Durchgängen einer Programmiersitzung liest das Modell die Durchgänge 1–19 noch einmal ab, und es sind Sie, die für jedes dieser Tokens wieder und wieder bezahlen müssen.

Der Caching des Prompts bricht den Kreislauf. Der Dienst speichert Ihren Eingabe-Prompt (Anweisungen, Werkzeuge und Inhalt) und verwendet ihn bei der nächsten Anfrage wieder, und zwar für einen Bruchteil des Eingabepreises.

In diesem Beitrag zeige ich Ihnen den Lebenszyklus eines Agents – von seinem ersten Aufruf bis zu dem Moment, in dem er neue Tools erhält und Helfer bekommt. Dabei zeige ich Ihnen auch, wie der Prompt-Caching die Kosten senkt und sicherstellt, dass die Agenten reaktiv und konsistent bleiben.

Was ein Agent an seinen LLM sendet

Bevor über Caching gesprochen wird, ist es hilfreich, zu sehen, was die erste Aufruf eines typischen Agenten zum großen Sprachmodell (LLM) enthält:

  • Tool-Liste – Die Definitionen jeder Funktion, die der Agent aufrufen kann. Änderungen, wenn Sie eine neue Version veröffentlichen.
  • Anleitungen – Der Entwickler-Prompt: Regeln, Persönlichkeit, Richtlinien, Beispiele. Ebenso die Änderungen pro Veröffentlichung.
  • Historie – Alles, was bisher in dieser Sitzung stattgefunden hat: die Aufgabe, die Toolanrufe des Modells und die Ergebnisse der Tools (die sich mit jedem Durchgang erweitern).
  • Neuer Turn – Der neueste Werkzeugergebnis oder Benutzernachricht (die möglicherweise jedes Mal anders sein kann).

Was ein Agent an das Modell sendet, Satz für Satz, wenn keine Caching-Einstellung vorgenommen wird:

Abbildung 1: Was ein Agent auf jede Runde an das Modell sendet

Wie die Prompt-Caching-Technologie im Hintergrund funktioniert

Wenn ein Modell einen Prompt liest, führt es zuerst eine Operation namens Prefill durch. Während der Prefill-Phase verarbeitet das Modell jedes Eingabetoken und erstellt die Schlüssel- und Wertvektoren (auch als Key-Value oder KV bekannt), die den Arbeitszustand des Modells bilden. Dies geschieht vor dem Zeitpunkt, an dem das Modell seinen ersten Token schreibt.

Die Prompt-Caching-Speicherung bewahrt diesen Zustand auf, der den System-Prompt, die Tools, den Inhalt, die Historie usw. enthält. Wenn eine spätere Anfrage mit denselben Eingabetiktern (d.h. demselben Text) beginnt, lädt der Prompt-Caching-Dienst den gespeicherten Zustand anstatt ihn erneut zu berechnen. Danach wird nur das Neue im nächsten Payload für das Modell verarbeitet. Die Prompt-Caching kann implizit sein, wobei Amazon Bedrock entscheidet, wo der wiederverwendbare Präfix endet, oder explizit, wenn Ihr Code diesen Endpunkt mit prompt_cache_breakpoint markiert. Sie können beide Ansätze zusammen verwenden, und wir empfehlen dies.

Turn 1 im Vergleich zu Turn 2

Abbildung 2: Turn 1 bewahrt den Anfang des Prompts bis zum Breakpoint, und Turn 2 verwendet ihn erneut und zahlt nur den vollen Preis für die neue Frage

Implizit oder explizit – und warum brauchen wir beides?

Für agentische Arbeitslasten ermöglicht die implizite Caching-Technik es Bedrock, zu entscheiden, was gespeichert werden soll, während das Gespräch sich entwickelt. Bei expliziter Caching bietet es sich an, gemeinsames Inhalt wie Tools und Anleitungen für die Wiederverwendung in verschiedenen Sitzungen sowie bei der Auslösung von Hilfsagenten zu markieren. Man benötigt nicht immer beide Formen der Caching, aber die Kombination davon bietet einen wieder verwendbaren Ausgangspunkt, während Bedrock das wachsende Gespräch automatisch verwaltet.

Neue Sitzungen können ebenfalls diesen gemeinsamen Ausgangspunkt wieder verwenden, während jede Konversation auf ihrem eigenen gespeicherten Verlauf basiert. In diesem Beitrag beginnen wir mit der ersten Runde und zeigen anschließend, wie das gespeicherte Inhalt in späteren Runden, neuen Tools und über Subagenten weitergegeben werden kann.

Hallo, gespeicherte Welt

Der erste Sieg besteht darin, den statischen Teil des Prompts zu cachen: die Tools und Anleitungen, die bei allen Anfragen gleich bleiben. Diese Beispiele verwenden Ihren bestehenden Amazon Bedrock-Client, TOOLS und task. Ersetzen Sie den verkürzten INSTRUCTIONS-String durch Ihre eigentlichen Richtlinien und Beispiele. Der wiederverwendbare Präfix muss 1.024 Tokens umfassen, um als gültig zu gelten.

Wenn Sie statische Inhalte cachen, verwenden Sie den expliziten Modus: wählen Sie den Punkt aus, an dem der gespeicherte Präfix endet.

KEY = "support-agent:v7:gpt-6-astra"
INSTRUCTIONS = "Your full support policies and examples..."

# Rendered context: [provider context][TOOLS][INSTRUCTIONS] | [task]
# Cache starts at the beginning; the marker below chooses its end.
resp = client.responses.create(
    model="us.openai.gpt-6-astra",
    store=False,  # Response storage; prompt caching still works.
    include=["reasoning.encrypted_content"],
    prompt_cache_key=KEY,
    prompt_cache_options={"mode": "explicit", "ttl": "30m"},
    tools=TOOLS,  # Rendered before instructions; keep order stable.
    input=[
        {
            "role": "developer",
            "content": [{
                "type": "input_text",
                "text": INSTRUCTIONS,
                # Save through this whole block, including TOOLS.
                "prompt_cache_breakpoint": {"mode": "explicit"},
            }],
        },
        # User message is processed but not cached.
        {"role": "user", "content": task},
    ],
)

Der prompt_cache_key gibt dem Dienst an, welche Anfragen gemeinsam in der Cache gespeichert werden sollen. Wir kommen wieder darauf zurück, wie man ihn verwendet, wenn man in neuen Sitzungen die Cache lesen will. In einem unserer Tests mit explizitem Caching schrieben die Tools und Anleitungen mit dem Präfix „4.000-token“ bei der ersten Anfrage 4.120 Tokens in die Cache und lesen diese 4.120 Tokens bei späteren Anfragen. Die task (oder Benutzeranfrage) liegt jenseits der Cache-Grenze, daher führt dies nicht zu einem Schreibvorgang in die Cache.

Denken Sie daran, dass die Prompt-Caching-Funktion nur dann funktioniert, wenn genau denselben Text übergeben wird. Stellen Sie sicher, dass die Anweisungen des Agents und die Liste der Tools jedes Mal auf dieselbe Weise serialisiert werden. Die Model Context Protocol (MCP)-Server und andere Formen der Tool-Übergabe müssen indexiert werden, damit sie konsistent bleiben. Alles, was sich ändert – wie das Datum, der Benutzername oder die Anfrage-ID – sollte nach den gespeicherten Anweisungen verbleiben.

Da der Inhalt wächst und sich ändert (unterschiedliche Tools und Inhalte), verwenden Sie den impliziten Modus, damit die Service-App den Gesprächsverlauf übernimmt. Hier hat die erste Anfrage keinen expliziten Marker. Die neueste einsetzbare Nachricht ist die Aufgabe des Benutzers, sodass der automatische Punkt der Unterbrechung nach dieser Aufgabe erfolgt und die Tools, Anleitungen sowie die Aufgabe zusammen umfasst. Der Modus wird ausdrücklich im folgenden Beispiel dargestellt, um Klarheit zu schaffen – obwohl der implizite Modus standardmäßig aktiv ist. Die Einstellung von store=False lässt die Gesprächshistorie in Ihrer Anwendung erhalten. Sie deaktiviert das Caching nicht.

def ask_with_implicit_cache(history):
    return client.responses.create(
        model="us.openai.gpt-6-astra",
        store=False,
        include=["reasoning.encrypted_content"],
        prompt_cache_key=KEY,
        prompt_cache_options={"mode": "implicit", "ttl": "30m"},
        tools=TOOLS,
        input=history,  # Everything gets cached
    )

history = [
    {"role": "developer", "content": INSTRUCTIONS},
    {"role": "user", "content": task},
]
# Automatic endpoint: the end of the user message.
resp = ask_with_implicit_cache(history)

Das ist nützlich, wenn der nächste Schritt denselben Aufgabe weitergeht. Eine andere Aufgabe passt nicht zum Präfix der alten Aufgabe, und die implizite Schreibung erzeugt nicht unbedingt eine separate Eintragung nur für Werkzeuge und Anleitungen. Verwenden Sie dort einen expliziten Marker, wenn Sie den kürzeren gemeinsamen Präfix für die Wiederverwendung zwischen den Aufgaben benötigen.

Verwenden Sie beides, wenn der Agent einen gemeinsamen Ausgangspunkt und eine wachsende Historie benötigt. Beginnen Sie mit dem markierten Entwickler-Block im folgenden Codebeispiel und rufen Sie die Funktion ask_with_implicit_cache auf. Der Anfragen-Level-Modus bleibt implizit. Der Block-Level-Marker fügt nach den Anweisungen einen expliziten Punkt hinzu. Der Dienst kann auch durch das neueste einsetzbare Nachrichtenset erhalten. Dadurch bleibt der gemeinsame Präfix verfügbar, während die Konversation wächst.

history = [
    {
        "role": "developer",
        "content": [{
            "type": "input_text",
            "text": INSTRUCTIONS,
            "prompt_cache_breakpoint": {"mode": "explicit"}, 
        }],
    },
    {"role": "user", "content": task},
]
# Still implicit mode, now with an explicit startup save point in the history.
resp = ask_with_implicit_cache(history)

Speichern des Gesprächsverlaufs und der Toolergebnisse

Das Modell fordert die Tools nach Namen auf und gibt ihre Argumente an. Ihre Anwendung muss diese ausführen. execute_function ist ein Hilfsmittel, das Sie erstellen, um diese Anfragen an die entsprechenden Python-Funktionen zu leiten und deren Ergebnisse zurückzugeben. Der folgende Loop verwendet dieses Hilfsmittel, um jedes angeforderte Tool auszuführen. Es fügt das Ausgabeergebnis des Modells sowie alle Ergebnisse der Tools zur history-Liste hinzu und sendet diese Liste erneut, bis das Modell eine endgültige Antwort gibt. Im impliziten Modus kann Amazon Bedrock den unveränderten Präfix wieder verwenden und den hinzugefügten Inhalt durch das letzte Toolergebnis in der Cache speichern. Die früheren Nachrichten sowie der ursprüngliche TOOLS-Inhalt bleiben unverändert.

import json

# Map tool names to their Python implementations.
TOOL_HANDLERS = {
    "get_owner": get_owner,
    # Register your other initial tools here.
}

def execute_function(name, arguments):
    """Run the requested tool and return its result."""
    handler = TOOL_HANDLERS.get(name)
    if handler is None:
        return {"error": f"Unknown tool: {name}"}
    return handler(**arguments)

while True:
    # Preserve all output items, including encrypted reasoning.
    history.extend(resp.output)
    calls = [x for x in resp.output if x.type == "function_call"]
    if not calls:
        break
    for call in calls:
        result = execute_function(call.name, json.loads(call.arguments))
        history.append({
            "type": "function_call_output",
            "call_id": call.call_id,
            "output": json.dumps(result),
        })
    # The last result in this group supplies the automatic endpoint.
    resp = ask_with_implicit_cache(history)

Für Nachfragen fügen Sie eine neue Benutzernachricht hinzu und rufen den Helfer erneut an. Die früheren Nachrichten bleiben unverändert, sodass ihre gespeicherten Endpunkte weiterhin verfügbar sind.

Rollende Punkte: Jeder Wurf liest alles vorher

Abbildung 3: Rollende Bremspunkte, bei denen jeder Wurf alles vorher liest und nur das Ergebnis seines eigenen Werkzeugs schreibt

Für eine separaten, nur expliziten Ausführung wird die Geschichte mit zwei Nachrichten aus dem kombinierten Beispiel „Hello cached world“ neu erstellt. Dieser Loop umfasst die Ergebnisse des Tools in input_text-Blöcken und markiert das endgültige Ergebnis in jedem Batch. Die früheren Markierungen bleiben in history. Für lange Gespräche siehe die aktuellen Suchregeln.

import json

while True:
    resp = client.responses.create(
        model="us.openai.gpt-6-astra", store=False,
        include=["reasoning.encrypted_content"],
        tools=TOOLS, prompt_cache_key=KEY, input=history,
        prompt_cache_options={"mode": "explicit", "ttl": "30m"},
    )
    d = resp.usage.input_tokens_details
    print("read", d.cached_tokens, "write", d.cache_write_tokens)
    history.extend(resp.output)  # Includes encrypted reasoning.
    calls = [x for x in resp.output if x.type == "function_call"]
    if not calls:
        break
    batch = []
    for call in calls:
        result = execute_function(call.name, json.loads(call.arguments))
        batch.append({
            "type": "function_call_output", "call_id": call.call_id,
            "output": [{"type": "input_text", "text": json.dumps(result)}],
        })
    # Add the newest boundary; retain every earlier marker.
    batch[-1]["output"][-1]["prompt_cache_breakpoint"] = {"mode": "explicit"}
    history.extend(batch)

GPT-6 Astra war im sechsturnigen Arbeitsumfang der beste impliziter Ergebnis: Der Eingabekostenverlust ist etwa 62 Prozent niedriger als bei der Ausführung ohne Caching. Explizite Roll-Breakpoints sparen bei demselben Modell etwa 61 Prozent. Beide verwenden mehr Historie, während das Gespräch weiterging. Das sind Ergebnisse des Arbeitsumfangs. Messen Sie die Einsparungen Ihres eigenen Agents.

Abbildung 4: Eingangskosten jedes Caching-Systems auf GPT-6 Astra, im Verhältnis zu keinem Caching

Vorsehen Sie sich vor:

  • Nur ein statischer Punkt im expliziten Modus – Die Tools und Anleitungen werden in Caching gespeichert, aber die wachsende Historie wird bei jedem Schritt erneut verarbeitet (0,61). Diese Einschränkung gilt nicht für das zusammengefasste Beispiel, das ebenfalls durch geeignete Gesprächsabschlüsse gespeichert wird.
  • Der Verschiebung eines einzelnen Brekers kann die Wiederverwendung des Caches verhindern und in der nur expliziten-Modus wiederholte Schreiben verursachen. Halten Sie auch den Breker des vorherigen Durchgangs bei.
  • Nur eine implizite Schreibweise durch ein wechselndes Aufgabeprojekt – Eine neue Aufgabe könnte die Tools und Anleitungen teilen, aber nicht den zuvor gespeicherten Endpunkt. Fügen Sie nach den geteilten Anleitungen einen expliziten Marker hinzu, wenn unterschiedliche Aufgaben diesen kürzeren Präfix wieder verwenden müssen.

Wenn die Tools sich ändern

Manchmal ändert sich die Liste der Tools eines Agenten, oder neue Tools werden hinzugefügt. Halten Sie die ursprüngliche Liste stabil: Das Hinzufügen, Entfernen oder Umbereichung von Definitionen kann den gespeicherten Präfix verwirren. Wählen Sie den Ansatz, der zum Zustand des verfügbaren Tools passt.

Wenn bekannte Tools in verschiedenen Schritten des Prozesses des Agents aufgerufen werden: Senden Sie dieselbe sortierte TOOLS und verwenden Sie allowed_tools, um das zu begrenzen, was das Modell aufrufen kann. Mit allowed_tools lässt "mode": "auto" das Modell entscheiden, ob ein zugelassener Tool aufgerufen wird, und "mode": "required" erfordert mindestens einen Aufruf eines zugelassenen Tools. Geben Sie dies als tool_choice ein. Die Beschränkung ändert den in der Cache gespeicherten Katalog nicht:

tool_choice={"type": "allowed_tools", "mode": "auto",
             "tools": [{"type": "function", "name": "get_owner"}]}

Neue Tools während einer Sitzung. Sowohl Amazon Bedrock Runtime als auch Amazon Bedrock Mantle-Endpunkte akzeptieren einen Eingabe-Item-Typ namens additional_tools für GPT-6 Astra, GPT-6.1 Sol und GPT-5.6 Luna. Für die Verfügbarkeit der Modelle nach AWS-Regionen siehe Unterstützte Modelle nach AWS-Region in Amazon Bedrock. Registrieren Sie das neue Tool get_due_date in der Hilfsfunktion execute_function, fügen dann sein Schema dem abgeschlossenen Historie-Inhalt aus dem Agent-Loop hinzu. Halten Sie den ursprünglichen TOOLS unverändert:

TOOL_HANDLERS["get_due_date"] = get_due_date
NEW_TOOL = {
    "type": "function", "name": "get_due_date",
    "description": "Return the due date for a support case.",
    "strict": True,
    "parameters": {
        "type": "object",
        "properties": {"case_id": {"type": "string"}},
        "required": ["case_id"], "additionalProperties": False,
    },
}
history.append({
    "type": "additional_tools", "role": "developer",
    "tools": [NEW_TOOL],
})
history.append({
    "role": "user", "content": "Find the due date for case C-123.",
})
# Implicit mode saves through this new user message, including NEW_TOOL.
resp = ask_with_implicit_cache(history)
d = resp.usage.input_tokens_details
print("old prefix read", d.cached_tokens, "new write", d.cache_write_tokens)

# Example output:
# old prefix read 2048 new write 256

Ein neues Tool erscheint während der Sitzung

Abbildung 5: Das Hinzufügen eines Tools erhält das vorherige Präfix wieder verwendbar, mit Beispielzahlen aus GPT-6 Astra auf Amazon Bedrock Runtime

Führen Sie den Toolsausführungszyklus mit der neuen Antwort fort. Der Zyklus fügt die Ausgabe des Modells zu history hinzu, startet alle angeforderten Tools und fügt deren Ergebnisse hinzu. Halten Sie das Element additional_tools in späteren Anfragen bei, damit das neue Tool weiterhin verfügbar bleibt. Im impliziten Modus kann Amazon Bedrock durch die neue Benutzernachricht Caching durchführen, einschließlich der Toolsdefinitionen, die vorher folgen. Im expliziten Modus allein behalten Sie die früheren Breakpoints bei und fügen einen hinzu zu einem input_text Block in dieser Benutzernachricht. Das Element additional_tools selbst kann keinen Breakpoint enthalten.

Unterschiedliche Rollen, unterschiedliche Kataloge. Wenn verschiedene Agentenrollen unterschiedliche Tools benötigen, wählen Sie zu Beginn jeder Sitzung einen stabilen Tool-Profil, wie z. B. Support oder billing. Jeder Profil erhält seinen eigenen gespeicherten Präfix. Markieren Sie die gemeinsamen Anweisungen, damit später mit diesem Profil weitere Aufgaben diese wieder verwenden können, und verwenden Sie anschließend entweder den einen oder anderen Modus, je nachdem, wie die Konversation sich entwickelt.

Verkürzte Tool-Profilen

Abbildung 6: Jeder Toolprofil hat seinen eigenen gespeicherten Präfix, der von wiederholten Sitzungen verwendet werden kann

Unteragenten und Nebenanrufe

Die Delegation sollte nicht dazu führen, dass jeder Helfer dieselbe Grundinformation erneut liest. Teilen Sie den Präfix und fügen Sie anschließend die Aufgaben jedes Helfers am Ende hinzu. Beachten Sie, dass bei der Verwendung von Caching mit AI-Agenten die Tools und Systemanweisungen verloren gehen oder ausgenutzt werden können. Etablieren Sie verantwortungsvolle AI-Praktiken, die die Implementierung des Prompt-Caching als Teil dieser Governance umfassen.

Wärme einmal, dann verteile dich. Sende zuerst eine gewöhnliche Anfrage und warte, bis sie abgeschlossen ist, bevor die Helfer aktiviert werden. Markiere den gemeinsamen Kontext explizit in jeder Anfrage, auch wenn der Modus implizit ist:

shared = {"role": "developer", "content": [{
    "type": "input_text", "text": INSTRUCTIONS,
    "prompt_cache_breakpoint": {"mode": "explicit"},
}]}
warm = client.responses.create(
    model="us.openai.gpt-6-astra", store=False,
    tools=TOOLS, prompt_cache_key=KEY,
    prompt_cache_options={"mode": "implicit", "ttl": "30m"},
    max_output_tokens=16,
    input=[shared, {"role": "user", "content": "Reply READY."}],
)
d = warm.usage.input_tokens_details
if not (d.cache_write_tokens or d.cached_tokens):
    raise RuntimeError("Shared prefix was not cached.")
from concurrent.futures import ThreadPoolExecutor

# helper_tasks contains the task text for each helper.
helper_inputs = [
    [shared, {"role": "user", "content": task}]
    for task in helper_tasks
]
with ThreadPoolExecutor(max_workers=4) as pool:
    helpers = list(pool.map(ask_with_implicit_cache, helper_inputs))

Die Hilfsmittel verwenden dieselben TOOLS, Modell und KEY wie die Warmup-Phase. Eine Warmup-Phase, die bis zum Ausgabekap endet, kann den Cache weiterhin füllen. Die Verwendungsprüfung bestätigt die Aktivität des Caches, bevor die Hilfsmittel beginnen.

Subagenten: Wärmen Sie den gemeinsamen Präfix einmal auf, dann verteilen Sie sich aus

Abbildung 7: Erwärmen Sie den gemeinsamen Präfix vor dem Start der Hilfsmittel, und jeder Hilfsmittel fügt anschließend seine eigene Aufgabe hinzu.

Geben Sie den Seitenanrufen denselben Anfang. Der Agent-Schleife wird history erstellt, indem jeder resp.output sowie die entsprechenden Ergebnisse der Tools hinzugefügt werden, einschließlich des verschlüsselten Arguments. Nachdem das Elternteil abgeschlossen ist, kopieren Sie diese vollständige Liste für den Zusammenfasser oder den Richter. Der gleiche Helfer behält die Tools, das Modell und die Schlüssel unverändert:

from copy import deepcopy

# history is the completed history built by the agent loop above.
# Copy it so the helper can add instructions without changing the parent.
helper_history = deepcopy(history)
helper_history.append({
    "role": "developer",
    "content": "Summarize this conversation in one sentence. Do not call tools.",
})
summary = ask_with_implicit_cache(helper_history)
d = summary.usage.input_tokens_details
print("history read", d.cached_tokens, "write", d.cache_write_tokens)
print(summary.output_text)

# Example output (assumed values and conversation):
# history read 4096 write 32
# Case C-123 is due on October 31, 2026.

Der Helfer kann den gespeicherten Teil von history wieder verwenden, aber die hinzugefügte Entwickler-Meldung erweitert nicht automatisch den Cache, um die Zusammenfassungsanweisung einzubeziehen. Wenn später eingehende Anfragen denselben Historie und die Anweisung verwenden, sollte die Anweisung in einem input_text-Block mit prompt_cache_breakpoint gesetzt werden. Für eine einmalige Zusammenfassung ist kein zusätzlicher Marker erforderlich.

Pausen, Neustarts und der Cache-Key

Pausen. Cached-Prefixe haben eine Mindestdauer von 30 Minuten (TTL), die durch erfolgreiche Wiederverwendung aktualisiert wird und möglicherweise länger anhält. Wenn eine Sitzung bald wieder beginnt, kann eine gewöhnliche Aufwärmphase den Prefix vor Ablauf erneuern. Vergleichen Sie den Kosten dieser Anfrage mit der Entladung des Caches. Für die TTL-Regeln siehe die Amazon Bedrock-Dokumentation.

Neue Sitzungen. Halten Sie prompt_cache_key stabil für Anfragen, die ein gemeinsames Präfix verwenden. Eine spezifische Schlüsselung pro Sitzung isoliert die Sitzungen auch dann, wenn ihre Anfragen identisch sind. Im folgenden Beispiel ermöglichte der Wechsel auf einen gemeinsamen Schlüssel es den Sitzungen, das Präfix wiederzuverwenden.

Neue Sitzungen nutzen den Cache nur, wenn sie denselben Schlüssel teilen

Abbildung 8: Eine session-spezifische Schlüsselung trennt die Cache-Einträge, und ein gemeinsamer Schlüssel ermöglicht es den übereinstimmenden Sessions, sie wiederzuverwenden.

Die Wiederverwendung des bestehenden Cachinginhalts erfordert denselben Modell, AWS-Konto und Region sowie einen verfügbaren passenden Präfix. Das folgende Beispiel kombiniert einen expliziten Startmarkierung mit dem impliziten Modus. Jede Sitzung beginnt mit denselben Anweisungen und ihrer eigenen Aufgabe. Beide verwenden denselbe berechnete Schlüssel:

import hashlib

def cache_key(app, model, prompt_version, instructions):
    digest = hashlib.sha256(instructions.encode()).hexdigest()[:12]
    return f"{app}:{prompt_version}:{model}:{digest}"

KEY = cache_key("support-agent", "us.openai.gpt-6-astra", "v7", INSTRUCTIONS)
prefix = {"role": "developer", "content": [{
    "type": "input_text", "text": INSTRUCTIONS,
    "prompt_cache_breakpoint": {"mode": "explicit"},
}]}
for label, question in [
    ("session A", "Explain the refund policy without calling tools."),
    ("session B", "Explain the escalation policy without calling tools."),
]:
    # A fresh conversation for each session; the startup prefix matches.
    session_history = [prefix, {"role": "user", "content": question}]
    result = ask_with_implicit_cache(session_history)
    d = result.usage.input_tokens_details
    print(label, "read", d.cached_tokens, "write", d.cache_write_tokens)

Beim kalten Start schreibt Sitzung 1 den gemeinsamen Präfix. Sitzung 2 kann ihn lesen, auch wenn ihre Aufgabe unterschiedlich sein kann. Jede Aufgabe kann auch implizit in der Cache gespeichert werden. Überprüfen Sie die Verwendungszähler: passende Schlüssel und Markierungen ermöglichen die Wiederverwendung, aber eine Cache-Eintragung muss immer verfügbar sein.

Was die Prompt-Caching-Leistung bietet

Kosten. Für einen von GPT-6 Astra angetriebenen Agenten mit einem Startwert von 8.000 Tokens und sechs Durchgängen, bei denen jeweils 2.000 Tokens hinzukommen, senkten einmalige statische Caching-Einstellungen die Kosten auf $0,50, während die rollierenden Punkte die Kosten des modellierten Inputs um 64 Prozent reduzierten: von $0,87 auf $0,32 pro Sitzung.

Abbildung 9: Kumulativer Eingangskosten pro Sitzung für das Beispiel des Support-Agenten, unter Verwendung der On-Demand-Preise von Amazon Bedrock für GPT-6 Astra

Wie man erkennt, dass die Caching-Funktion funktioniert

Mit der Verwendung der Antwort beginnen. cached_tokens berichtet über Eingaben, die aus dem Cache gelesen wurden, und cache_write_tokens berichtet über Eingaben, die in den Cache geschrieben wurden. Wenn das Gespräch weitergeht, prüfen Sie, ob spätere Sätze die frühere Geschichte wiederholen und ob neue Schreibvorgänge den hinzugefügten Inhalt widerspiegeln.

Für die Produktionsüberwachung am Amazon Bedrock Runtime-Endpunkt verwenden Sie die CacheReadInputTokenCount und CacheWriteInputTokenCount-Metriken in Amazon CloudWatch. Aktivieren Sie das Protokollieren von Modellaufrufen, wenn Sie individuelle Anfragenーテkler benötigen, und durchsuchen Sie diese anschließend mit Amazon CloudWatch Logs Insights. Für den Amazon Bedrock Mantle-Endpunkt dokumentieren Sie die Felder für die Antwortverwendung in Ihren Anwendungslog-Dateien. In seinem Amazon CloudWatch-Namespace gibt es derzeit keine separaten Cache-Zähler.

Um die Kosten zu überprüfen, filtern Sie den AWS Cost Explorer auf Amazon Bedrock und gruppieren Sie nach Verwendungsart. Cache-Leseoperationen, Cache-Schreiboperationen und uncachete Eingaben erscheinen als separate Einträge pro Modell. Excludeieren Sie Einträge mit Ausgabetoken, wenn sie den Anteil am Eingangskosten berechnen sollen.

Eine kurze Checkliste

  • Halten Sie den wiederverwendbaren Präfix stabil. Legen Sie gemeinsame Tools und Anleitungen zuerst ab, fügen Sie anschließend die Gesprächshistorie und neue Wörter hinzu. Das Ändern eines Zeitstempels, einer Nachricht oder einer Tooldefinition verhindert die Wiederverwendung über diesen Wandel hinaus. Ein kürzerer Präfix kann jedoch weiterhin verwendet werden, wenn es seinen eigenen gespeicherten Endpunkt hat.
  • Wählen Sie Grenzen um das Inhalt, das Sie wiederverwenden möchten. Verwenden Sie impliziten Caching für eine wachsende Historie, explizite Markierungen für gemeinsame Präfixe oder beides. Der explizit-only-Modus vermeidet die Erstellung wegstehender Suffixe. Wenn man eine explizit-only-Konversation erweitert, bleiben die früheren Markierungen erhalten, damit spätere Anfragen die gespeicherten Präfixe finden können.
  • Behalten Sie den ursprünglichen Toolkatalog unverändert. Verwenden Sie allowed_tools, um zu bestimmen, welche Tools aufgerufen werden dürfen. Fügen Sie bekannte Definitionen mit additional_tools hinzu, oder entdecken Sie sie über den namenssprechenden Client-Seite-Teil tool_search. Wählen Sie ein stabiles Toolprofil, wenn unterschiedliche Agent-Rollen verschiedene Kataloge benötigen.
  • Überprüfen Sie die Größe und Lebensdauer des Präfixes. Ein kachelbares Präfix muss mindestens 1.024 Tokens enthalten. Kacheltare Präfixe sind nach ihrer letzten Schreibung oder erfolgreicher Wiederverwendung für mindestens 30 Minuten noch wieder verwendbar.
  • Warme gemeinsame Inhalte vor dem Start der Hilfsmittel. Markieren Sie den gemeinsamen Präfix in den Warm-up- und Hilfsmittelanfragen, einschließlich beim Einsatz des impliziten Modus. Beenden Sie die Warm-up-Anfrage, bevor die parallelen Aufrufe gestartet werden.
  • Halten Sie die Cache-Schlüssel innerhalb jedes Teilungsgruppen stabil. Anfragen, die ein Präfix wieder verwenden sollen, müssen den gleichen Schlüssel verwenden. Unterschiedliche Schlüssel können das Kontoverfolgungssystem zwischen Kunden oder Benutzern unterscheiden.
  • Messen die Einsparungen im gesamten Workflow. Die Caching-Schreiben kosten 1,25 Mal mehr als der normale Eingangswert. Die Preise hängen vom Modell ab. Begleiten Sie die Schreibkosten mit den Einsparungen bei der Lesung – nutzen Sie die Anwendungsverbrauchsdaten während der Entwicklung und die Überwachungs- sowie Abrechnungsdaten im Produktionsbetrieb.

Aufgewacht am 3. Februar

Bill Murray entkommt dem Groundhog-Day-Tag nur einmal, wenn er die gleichen Fehler nicht mehr wiederholt und beginnt, das, was er eines Tages gelernt hat, jeden Tag mitzunehmen. Die Agenten kommen auf ähnliche, wenn auch weniger romantische Weise an ihr Ziel: indem sie den Anfang ihrer Prompt-Datei buchstäblich stabil halten und bei der wachsenden Historie automatische oder explizite Cache-Grenzen verwenden.

In diesem Artikel haben wir erklärt, wie gemeinsame Tools und Anleitungen in die Speicherung gelagert werden können, wie der Cache über mehrere Agent-Aufrufe erweitert werden kann und wie die Wiederverwendung bei der Hinzufügung von Tools, dem Start von Hilfsmitteln oder dem Beginn neuer Sitzungen erhalten bleibt. Das gemeinsame Präfix sollte stabil bleiben, und neue Informationen sollten hinzugefügt werden, während der Workflow weiterentwickelt wird. Für wachsende Gespräche wird impliziter Speicherung verwendet, für gemeinsames Inhalt werden explizite Punkte verwendet. Sie können beides kombinieren, oder im Fall eines ungewöhnlichen Suffixes nur die explizite Methode verwenden. Vergleichen Sie Lesen- und Schreibvorgänge, den Gesamtkostenaufbau und die Latenzzeit, um herauszufinden, was am besten für Ihren Agent funktioniert. Um diese Muster anzuwenden, folgen Sie der Amazon Bedrock-Prompt-Caching-Dokumentation für OpenAI-Modelle und prüfen Sie die Verfügbarkeit der Modelle nach AWS-Region und Endpunkt. Beginnen Sie mit einem einzigen Workflow und messen Sie die Einsparungen, während die Gespräche weiterhin stattfinden.

 


Über den Autor

Originalquelle

AWS Machine Learning

Hinweise zum Inhalt

Originalveröffentlichung und Rechte liegen bei der Quelle.

Maschinelle Übersetzung · Original beachten