View a markdown version of this page

Strukturierte Metadaten für Langzeitgedächtnisse - Amazon Grundgestein AgentCore

Strukturierte Metadaten für Langzeitgedächtnisse

Mit der Metadatenfilterung in Amazon Bedrock AgentCore Memory können Sie Ihren Langzeitspeicherdatensätzen strukturierte Attribute hinzufügen. Sie können diese Attribute verwenden, um einzugrenzen, welche Datensätze beim Abrufen zurückgegeben werden. Namespaces isolieren Speicher bereits nach primärer Entität (Benutzer, Mandant, Patient, Kunde). Innerhalb eines einzigen Namespaces gibt eine breit angelegte semantische Suche jedoch alles zurück, was einer ähnlichen Bedeutung entspricht. Mit der Metadatenfilterung können Sie nur Ergebnisse abrufen, die bestimmten Attributwerten entsprechen. Sie können beispielsweise nur Datensätze mit hoher Priorität, nur Datensätze aus einer bestimmten Abteilung oder nur Datensätze abrufen, die innerhalb eines bestimmten Zeitraums erstellt wurden.

Mit der Metadatenfilterung können Sie:

  • Abrufen des Bereichs nach Geschäftsdimensionen (Priorität, Abteilung, Kanal, Zeitraum) innerhalb eines Namespaces

  • Hängen Sie bei der Erstellung strukturierte Metadaten an Ereignisse und Speicherdatensätze an

  • Lassen Sie das Large Language Model (LLM) bei der Speicheraufnahme automatisch Metadaten aus Konversationsinhalten extrahieren

  • Beschränken Sie die LLM-extracted Werte auf bestimmte Werte, um eine konsistente Filterung zu gewährleisten

  • Kombinieren Sie bis zu 5 Filter pro Abfrage auf RetrieveMemoryRecords oderListMemoryRecords, angewendet mit Logik AND

  • Filtert nach vom System generierten Zeitstempeln (x-amz-agentcore-memory-createdAt,x-amz-agentcore-memory-updatedAt), ohne zusätzliche indizierte Schlüssel zu deklarieren

Erste Schritte

Die Einrichtung der Metadatenfilterung umfasst fünf Schritte:

  1. Erstellen Sie Ihren Speicher mit indizierten Schlüsseln und einem Metadatenschema

    • Indizierte Schlüssel — Verwenden Sie CreateMemory (oderUpdateMemory), um die Metadatenschlüssel zu deklarieren, nach denen Sie filtern möchten (z. B., prioritychannel,tags). Sie können bis zu 10 indizierte Schlüssel pro Speicher deklarieren. Indizierte Schlüssel definieren, welche Attribute in Filterausdrücken abgefragt werden können. Sobald ein indizierter Schlüssel hinzugefügt wurde, kann er nicht mehr entfernt werden.

    • Metadatenschema — Definieren Sie eine metadataSchema eigene Strategie, um zu kontrollieren, wie das LLM Werte aus Konversationen extrahiert. Das Schema gibt an, welche Schlüssel extrahiert werden sollen, wie Konflikte zwischen Ereignissen gelöst werden sollen und welche Validierungsbeschränkungen angewendet werden sollen. Ein Metadatenschema ist optional — Strategien ohne ein Schema führen keine Metadatenextraktion durch.

  2. Konfiguration überprüfen — Verwenden Sie diese OptionGetMemory, um zu überprüfen, ob Ihre indizierten Schlüssel und Strategie-Metadatenschemas korrekt eingerichtet sind.

  3. Daten mit Metadaten aufnehmen — Senden Sie Ereignisse CreateEvent mithilfe optionaler Metadaten oder stellen Sie Metadaten direkt in Datensätzen bereit. BatchCreateMemoryRecords Bei ereignisgesteuerter Erfassung extrahiert das LLM automatisch Metadaten aus den resultierenden Speicherdatensätzen und füllt sie aus. Diese Extraktion basiert auf dem Metadatenschema und dem Konversationsinhalt der Strategie, auch wenn den Ereignissen keine Metadaten angehängt sind.

  4. Abfrage mit Metadatenfiltern — Verwenden Sie diese Option metadataFilters für RetrieveMemoryRecords (semantische Suche mit Vorfilterung) oder ListMemoryRecords (reine Metadatenfilterung), um die Ergebnisse einzugrenzen.

  5. Entwickeln Sie Ihr Schema im Laufe der Zeit weiter — Fügen Sie neue indexierte Schlüssel hinzu oder ändern Sie die Schemata der Strategie-Metadaten, wenn Ihre Filteranforderungen steigen.

In den folgenden Abschnitten werden die einzelnen Schritte im Detail beschrieben.

Die wichtigsten Konzepte

Indizierte Metadatenschlüssel

Indizierte Schlüssel werden auf Speicherressourcenebene in deklariert CreateMemory (oder später überUpdateMemory) hinzugefügt. Indizierte Schlüssel werden in einem Format gespeichert, das für eine schnelle Abfragefilterung optimiert ist. Nur indizierte Schlüssel können in on und abgefragt werden. metadataFilters ListMemoryRecords RetrieveMemoryRecords

Im folgenden Beispiel werden zwei indizierte Schlüssel deklariert:

{ "indexedKeys": [ { "key": "priority", "type": "STRING" }, { "key": "tags", "type": "STRINGLIST" } ] }

Unterstützte type Werte:STRING,,STRINGLIST. NUMBER

Die Schlüssel müssen übereinstimmen ^[a-zA-Z0-9\s._:/=+@-]*$ (max. 128 Zeichen).

Durch das Hinzufügen eines indizierten Schlüssels werden bestehende Datensätze nicht aufgefüllt. Nur Datensätze, die nach der Deklaration des Schlüssels erstellt oder aktualisiert wurden, werden für diesen Schlüssel indexiert. Weitere Informationen zur Weiterentwicklung Ihres Schemas im Laufe der Zeit finden Sie unterSchritt 5: Entwickeln Sie Ihr Metadatenschema.

Metadatenschema (pro Strategie)

Bei Memory Strategy kann optional ein Metadatenschema deklariert memoryRecordSchema.metadataSchema werden. Das Metadatenschema teilt dem LLM mit, welche Metadaten bei der Generierung von Speicherdatensätzen aus Konversationsinhalten extrahiert werden sollen. Bei der ereignisgesteuerten Extraktion werden nur Schlüssel, die im Metadatenschema der Strategie definiert sind, in die resultierenden Speicherdatensätze übernommen.

Jeder Eintrag im Schema definiert:

  • key— Der Name des Metadatenschlüssels. Wenn dieser Schlüssel auch als indizierter Schlüssel deklariert ist, ist der extrahierte Wert filterbar. Wenn es sich nicht um einen indizierten Schlüssel handelt, wird der Wert trotzdem in den Datensatz eingetragen und ist in GetMemoryRecord den ListMemoryRecords Antworten sichtbar, er kann jedoch nicht in Filterausdrücken verwendet werden.

  • type— Der Wertetyp (STRING,STRINGLIST,NUMBER).

  • definition(erforderlich) — Eine Beschreibung dessen, wofür das Feld steht, in natürlicher Sprache. Seien Sie konkret — statt „Die Priorität“ schreiben Sie „Prioritätsstufe des Problems auf der Grundlage der Auswirkungen auf den Kunden“. Die Werte reichen von kritisch (am schwersten) bis niedrig (am wenigsten schwerwiegend).“

  • llmExtractionInstruction(optional) — Zusätzliche Hinweise dazu, wie das LLM Werte extrahieren oder auflösen sollte. Sie können die integrierten Funktionen verwenden LATEST_VALUE (der aktuelle Wert wird beibehalten) oder benutzerdefinierte Anweisungen in natürlicher Sprache bereitstellen, z. B. „Klassifizieren nach geschäftlichen Auswirkungen: Verwendung bei Serviceausfällen, die sich auf die Produktion auswirken, critical bei Leistungseinbußen, high bei medium low Funktionsanfragen, bei Dokumentations- oder kosmetischen Problemen“.

  • validation(optional) — Beschränkt die Ausgabe des LLM auf einen kontrollierten Wertesatz. Ohne Überprüfung kann das LLM — oder "HIGH" für dasselbe Konzept "high" — einen fehlerhaften Filterabgleich erzeugen"High".

Das folgende Beispiel zeigt einen Metadaten-Schemaeintrag mit Validierung:

{ "metadataSchema": [ { "key": "priority", "type": "STRING", "extractionConfig": { "llmExtractionConfig": { "definition": "Issue priority level based on customer impact. Values range from critical (most severe) to low (least severe).", "llmExtractionInstruction": "LATEST_VALUE", "validation": { "stringValidation": { "allowedValues": ["critical", "high", "medium", "low"] } } } } } ] }

Validierungsoptionen nach Typ:

Typ Validierung Description

STRING

stringValidation.allowedValues

Auf einen festen Satz beschränken (max. 10 Werte, jeweils max. 256 Zeichen, ^[a-zA-Z0-9\s._:/=+@-]*$ übereinstimmend)

STRINGLIST

stringListValidation.allowedValues

Beschränken Sie die Listenmitglieder auf einen festen Satz (maximal 10 Werte, jeweils maximal 256 Zeichen, übereinstimmend) ^[a-zA-Z0-9\s._:/=+@-]*$

STRINGLIST

stringListValidation.maxItems

Max. Anzahl der Elemente in der Liste (1—5)

NUMBER

numberValidation.minValue

Zulässiger Mindestwert

NUMBER

numberValidation.maxValue

Maximal zulässiger Wert

Deterministische Metadaten (Extraktionstyp STRICTLY_CONSISTENT)

Deterministische Metadatenschlüssel enthalten Werte, die Ihre Anwendung bereits kennt, wenn sie ein Ereignis erstellt. Diese Werte werden ohne Änderung exakt in die resultierenden Speicherdatensätze kopiert. Organisatorische Klassifikatoren wie departmentcompliance_level, oder agent_id sollten vom LLM nicht abgeleitet werden. Die LLM-Inferenz führt zu Variabilität. Zum Beispiel kann dieselbe Konversation bei einem Datensatz und "eng" "Engineering" bei einem anderen auftreten.

Legen Sie extractionType für diese Schlüssel STRICTLY_CONSISTENT im Metadaten-Schemaeintrag den Wert auf fest. Der für das Ereignis angegebene Wert wird durch Extraktion und Konsolidierung unverändert weitergegeben. Das LLM wird für diesen Schlüssel nicht konsultiert.

Die folgende JSON-Datei zeigt ein Metadatenschema mit beiden STRICTLY_CONSISTENT LLM_INFERRED Extraktionstypen:

{ "metadataSchema": [ { "key": "department", "type": "STRING", "extractionType": "STRICTLY_CONSISTENT" }, { "key": "compliance_level", "type": "STRING", "extractionType": "STRICTLY_CONSISTENT" }, { "key": "topic", "type": "STRING", "extractionType": "LLM_INFERRED", "extractionConfig": { "llmExtractionConfig": { "definition": "Primary topic of the conversation", "llmExtractionInstruction": "Identify the main topic discussed" } } } ] }

Wenn Sie es weglassenextractionType, ist LLM_INFERRED die Standardeinstellung.

Extraktion und Konsolidierung, Isolierung.

STRICTLY_CONSISTENTSchlüssel können mehr, als die LLM-Inferenz zu überspringen. Sie gruppieren Ereignisse während der Extraktion nach ihren deterministischen Werten. Ereignisse mit unterschiedlichen Werten werden separat verarbeitet. Die Konsolidierung folgt derselben Regel. Datensätze aus einer Wertgruppe werden niemals mit Datensätzen aus einer anderen Gruppe zusammengeführt.

Das folgende Python-Beispiel zeigt eine Support-Sitzung mit zwei deterministischen Schlüsseln (departmentundpriority):

# Event 1: high-priority billing inquiry agentcore_client.create_event( memoryId="mem-support-abc123", actorId="customer-123", sessionId="session-escalation-001", payload=[{"conversational": {"role": "USER", "content": {"text": "I'm seeing duplicate charges on my invoice and it's blocking our deployment."}}}], metadata={ "department": {"stringValue": "billing"}, "priority": {"stringValue": "high"} } ) # Event 2: also high-priority billing (same deterministic values as Event 1) agentcore_client.create_event( memoryId="mem-support-abc123", actorId="customer-123", sessionId="session-escalation-001", payload=[{"conversational": {"role": "USER", "content": {"text": "The charges appeared after we upgraded from standard to enterprise tier last week."}}}], metadata={ "department": {"stringValue": "billing"}, "priority": {"stringValue": "high"} } ) # Event 3: high-priority engineering (same priority, different department) agentcore_client.create_event( memoryId="mem-support-abc123", actorId="customer-123", sessionId="session-escalation-001", payload=[{"conversational": {"role": "USER", "content": {"text": "Your team found a provisioning bug that triggered the duplicate charge."}}}], metadata={ "department": {"stringValue": "engineering"}, "priority": {"stringValue": "high"} } ) # Event 4: low-priority billing (same department as Events 1-2, different priority) agentcore_client.create_event( memoryId="mem-support-abc123", actorId="customer-123", sessionId="session-escalation-001", payload=[{"conversational": {"role": "USER", "content": {"text": "Also, can you update the billing contact email on file when you get a chance?"}}}], metadata={ "department": {"stringValue": "billing"}, "priority": {"stringValue": "low"} } )

Das System gruppiert Ereignisse nach der exakten Kombination aller deterministischen Schlüsselwerte:

  • Ereignisse 1 und 2 teilen department=billing, priority=high sich. Sie werden zusammen extrahiert.

  • Ereignis 3 unterscheidet sich indepartment. Es wird trotz gemeinsamer Nutzung separat extrahiertpriority=high.

  • Ereignis 4 unterscheidet sich inpriority. Es wird trotz gemeinsamer Nutzung separat extrahiertdepartment=billing.

Alle deterministischen Schlüsselwerte müssen übereinstimmen, damit Ereignisse gruppiert werden können. Eine Abfrage mit department=billing AND priority=high gibt nur die dringenden Fakten zu doppelten Gebühren zurück. Die anderen Ereignisse befinden sich in separaten Partitionen. Datensätze aus unterschiedlichen Wertekombinationen werden während der Konsolidierung niemals zusammengeführt.

Beschränkungen

Einschränkung Detail

Maximale Anzahl deterministischer Schlüssel pro Strategie

3

Schlüsseltyp

Muss STRING sein.

Muss indexiert sein

Der Schlüssel muss auch im Speicher deklariert werden indexedKeys

Nein extractionConfig

STRICTLY_CONSISTENTSchlüssel können keine habenextractionConfig. Der Wert stammt aus dem Ereignis, nicht aus dem LLM.

Unterstützte Strategien

Semantische, benutzerspezifische und episodische Strategien (einschließlich benutzerdefinierter Überschreibungen). Wird bei Übersichtsstrategien nicht unterstützt.

Fehlende Werte

Wenn ein Ereignis ohne einen Wert für einen deterministischen Schlüssel eintrifft, wird der Schlüssel in der Gruppierung für dieses Ereignis weggelassen und fehlt im resultierenden Datensatz.

Wichtig

Wenn Sie ändern, welche Schlüssel als konfiguriert sind, STRICTLY_CONSISTENT ändert sich auch die Gruppierung, die für die Extraktion und Konsolidierung verwendet wird. Datensätze, die mit der vorherigen Konfiguration erstellt wurden, werden von Datensätzen isoliert, die unter der neuen Konfiguration erstellt wurden. Planen Sie Ihre deterministische Schlüsselkonfiguration, bevor Sie Ereignisse aufnehmen.

Wie interagieren indizierte Schlüssel und Schemaschlüssel

Die Beziehung zwischen indizierten Schlüsseln und Schemaschlüsseln bestimmt, wie sich Metadaten verhalten:

  • Indiziert + im Schema — Der Schlüssel wird in extrahierten Datensätzen vom LLM aufgefüllt und kann in Abfrageausdrücken gefiltert werden. Dies ist die gängigste Konfiguration für Schlüssel, die Sie sowohl extrahieren als auch filtern möchten.

  • Indiziert + nicht im Schema — Der Schlüssel wird bei der ereignisgesteuerten Extraktion nicht in Datensätze eingetragen. Filter für diesen Schlüssel geben keine Ergebnisse für extrahierte Datensätze zurück. Verwenden Sie die Batch-APIs (BatchCreateMemoryRecordsoderBatchUpdateMemoryRecords), um diese Schlüssel aufzufüllen.

  • In Schema + nicht indexiert — Das LLM extrahiert den Wert und füllt ihn in den Datensätzen aus, sodass er in den Antworten sichtbar ist. GetMemoryRecord ListMemoryRecords Es kann jedoch nicht in Filterausdrücken verwendet werden. Dies ist nützlich für die Kontextanreicherung, d. h. Metadaten, die sentiment den Datensatz für nachgelagerte Zwecke anreichern, ohne summary_notes dass Ihr indexiertes Schlüsselbudget aufgebraucht wird.

Wie Metadaten von Ereignissen zu Speicherdatensätzen fließen

Event-Metadaten akzeptieren nur stringValue Einträge. Unterstützung stringValue von Speicherdatensätzen und numberValue Typen — vom LLM während der Extraktion aufgefüllt oder direkt über die Batch-APIs bereitgestellt. stringListValue Der dateTimeValue Typ ist für vom System generierte Felder (x-amz-agentcore-memory-createdAtund) reserviert. x-amz-agentcore-memory-updatedAt Nur Schlüssel, die in den Strategien definiert metadataSchema sind, werden in die extrahierten Datensätze übernommen. Event-Metadatenschlüssel, die nicht im Schema enthalten sind, werden ignoriert. Informationen zu Einreisebeschränkungen finden Sie unterKontingente.

System-generated Metadaten

Jeder Speicherdatensatz enthält diese Systemfelder, die mit denselben Filteroperatoren abgefragt werden können:

Feld Typ Description

x-amz-agentcore-memory-recordType

stringValue

Der Typ des Speicherdatensatzes

x-amz-agentcore-memory-createdAt

dateTimeValue

Zeitstempel für die Erstellung des Datensatzes

x-amz-agentcore-memory-updatedAt

dateTimeValue

Zeitstempel der letzten Aktualisierung des Datensatzes

Sie müssen diese nicht als indizierte Schlüssel deklarieren — sie stehen immer zum Filtern zur Verfügung. Diese vom System generierten dateTimeValue Felder unterstützen AFTER AD-Operatoren BEFORE und ermöglichen Zeitbereichsabfragen, ohne dass Sie indizierte Datetime-Schlüssel deklarieren müssen.

Voraussetzungen

Bevor Sie die Metadatenfilterung konfigurieren, stellen Sie sicher, dass Sie über Folgendes verfügen:

  • Ein AWS Konto mit den Berechtigungen zum Aufrufen von CreateMemory UpdateMemoryCreateEvent,ListMemoryRecords,,RetrieveMemoryRecords,BatchCreateMemoryRecords, und BatchUpdateMemoryRecords

  • Zugriff auf Amazon Bedrock AgentCore

  • Ein klarer Überblick über die 3—5 Filterdimensionen, die Ihr Agent am dringendsten benötigt (Abteilung, Priorität, Region, Projekt usw.)

Schritt 1: Erstellen Sie einen Speicher mit indizierten Schlüsseln und einem Metadatenschema

Im Folgenden wird ein Speicher für den Kundensupport mit fünf indizierten Schlüsseln und einem Metadatenschema erstellt. priorityagent_type, und sentiment sind im Metadatenschema der Strategie definiert — das LLM extrahiert ihre Werte aus dem Konversationsinhalt. Beachten Sie, dass dies zwar im Schema enthalten sentiment ist, aber nicht als indizierter Schlüssel deklariert ist: Das LLM leitet seinen Wert aus Konversationen ab und fügt ihn in Datensätze ein, er kann jedoch nicht in Filterausdrücken verwendet werden. tags(STRINGLIST), channel (STRING) und ticket_id (STRING) werden als indizierte Schlüssel deklariert, sind aber nicht im Schema enthalten — sie werden bei der ereignisgesteuerten Extraktion nicht aufgefüllt, können aber über die Batch-APIs bereitgestellt werden.

aws bedrock-agentcore-control create-memory \ --name "CustomerSupportMemory" \ --event-expiry-duration 30 \ --indexed-keys '[ {"key": "priority", "type": "STRING"}, {"key": "agent_type", "type": "STRING"}, {"key": "tags", "type": "STRINGLIST"}, {"key": "channel", "type": "STRING"}, {"key": "ticket_id", "type": "STRING"} ]' \ --memory-strategies '[ { "semanticMemoryStrategy": { "name": "SupportSemanticStrategy", "description": "Captures support interaction details", "namespaceTemplates": ["support/{actorId}"], "memoryRecordSchema": { "metadataSchema": [ { "key": "priority", "type": "STRING", "extractionConfig": { "llmExtractionConfig": { "definition": "Issue priority level based on customer impact. Values range from critical (most severe) to low (least severe).", "llmExtractionInstruction": "LATEST_VALUE", "validation": { "stringValidation": { "allowedValues": ["critical", "high", "medium", "low"] } } } } }, { "key": "agent_type", "type": "STRING", "extractionConfig": { "llmExtractionConfig": { "definition": "Support agent classification.", "llmExtractionInstruction": "Prefer the most specialized agent type. Hierarchy: specialist > tier3 > tier2 > tier1 > bot." } } }, { "key": "sentiment", "type": "STRING", "extractionConfig": { "llmExtractionConfig": { "definition": "Customer sentiment during the interaction.", "llmExtractionInstruction": "LATEST_VALUE", "validation": { "stringValidation": { "allowedValues": ["positive", "neutral", "negative", "frustrated"] } } } } } ] } } } ]'

Schritt 2: Überprüfen Sie die Konfiguration

Verwenden Sie diese Option, GetMemory um zu bestätigen, dass die indizierten Schlüssel und das Metadatenschema akzeptiert wurden:

aws bedrock-agentcore-control get-memory --memory-id "<memory-id>"

Schritt 3: Daten mit Metadaten aufnehmen

Es gibt zwei Möglichkeiten, Metadaten in Speicherdatensätze zu übertragen.

Event-driven Einnahme

Hängen Sie stringValue Metadaten bei der Erstellung an Ereignisse an. Das LLM verwendet das Metadatenschema der Strategie, um Metadaten aus den resultierenden Speicherdatensätzen zu extrahieren und aufzufüllen. Nur Schlüssel, die in der Strategie definiert metadataSchema sind, werden in den resultierenden Datensätzen aufgefüllt. Event-Metadatenschlüssel, die nicht im Schema enthalten sind, werden bei der Extraktion ignoriert.

aws bedrock-agentcore create-event \ --memory-id "<memory-id>" \ --actor-id "customer-123" \ --session-id "session-001" \ --event-timestamp "$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ")" \ --metadata '{ "priority": {"stringValue": "high"}, "channel": {"stringValue": "email"}, "ticket_id": {"stringValue": "TKT-5001"} }' \ --payload '[ {"conversational": {"role": "USER", "content": {"text": "I have a billing issue that is blocking my production deployment"}}}, {"conversational": {"role": "ASSISTANT", "content": {"text": "I understand this is urgent. Let me escalate to our billing specialist team."}}} ]'

In diesem Beispiel priority ist der Wert in der Strategie enthaltenmetadataSchema, sodass sein Wert auf den Speicherdatensatz übertragen wird. channelund ticket_id sind nicht im Schema enthalten, sodass sie bei der Extraktion ignoriert werden. Das LLM leitet außerdem agent_type (wahrscheinlich "specialist" basierend auf der Eskalation) und sentiment (wahrscheinlich"frustrated") vom Inhalt der Konversation ab — diese Schemaschlüssel werden aufgefüllt, obwohl sie nicht als Event-Metadaten bereitgestellt wurden.

Implizite Extraktion von Metadaten aus Konversationsinhalten

Event-Metadaten sind nicht erforderlich, damit Schemaschlüssel Werte erzeugen. Wenn ein Schemaschlüssel keine passenden Metadaten zu den ursprünglichen Ereignissen enthält, leitet das LLM den Wert vollständig aus dem Konversationsinhalt ab. Es verwendet das definition und des SchlüsselsllmExtractionInstruction, um den Wert zu bestimmen. Dies ist nützlich für Dimensionen, die nur in der Konversation selbst existieren, ohne dass die Anrufer sie bei der Erstellung des Ereignisses angeben müssen.

Unter Verwendung des gleichen Kundensupport-Speichers wie in Schritt 1 hat das folgende Ereignis überhaupt keine Metadaten:

aws bedrock-agentcore create-event \ --memory-id "<memory-id>" \ --actor-id "customer-789" \ --session-id "session-002" \ --event-timestamp "$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ")" \ --payload '[ {"conversational": {"role": "USER", "content": {"text": "My production deployment is down because of a billing hold on our account"}}}, {"conversational": {"role": "ASSISTANT", "content": {"text": "I understand the urgency. Let me connect you with our billing specialist team right away."}}} ]'

Das LLM analysiert den Inhalt der Konversation und füllt alle drei Schemaschlüssel im extrahierten Speicherdatensatz — priorityagent_type, und sentiment — auf, obwohl keine als Ereignismetadaten bereitgestellt wurden:

{ "content": {"text": "Customer reported a production outage caused by a billing hold. Escalated to billing specialist."}, "metadata": { "priority": {"stringValue": "critical"}, "agent_type": {"stringValue": "specialist"}, "sentiment": {"stringValue": "frustrated"} } }

Die Validierungsregeln gelten weiterhin — die Ausgabe des LLM ist auf die von Ihnen angegebenen zulässigen Werte beschränkt, unabhängig davon, ob der Wert aus Ereignismetadaten oder Inhaltsinferenzen stammt.

Wie das LLM ereignisübergreifende Konflikte löst

Wenn mehrere Ereignisse in einer Sitzung unterschiedliche Werte für denselben Metadatenschlüssel enthalten, verwendet das LLM den. llmExtractionInstruction Dies bestimmt, welcher Wert im resultierenden Speicherdatensatz beibehalten werden soll.

Stellen Sie sich zum Beispiel eine Support-Sitzung vor, in der das erste Ereignis stattgefunden hat priority: "low" und ein späteres Ereignis eskaliert. priority: "critical" Das LLM löst dieses Problem auf der Grundlage der folgenden Anweisung:

  • LATEST_VALUE(integriert) — Das LLM behält den neuesten Wert bei. In diesem Fall wird der Speicherdatensatz abgerufenpriority: "critical".

  • Benutzerdefinierte Anweisungen — Sie können domänenspezifische Logik ausdrücken. Ein Beispiel: „Behalte den höchsten Schweregrad bei, der während der Sitzung gemeldet wurde“, würde das auch bedeuten"critical", aber aus einem anderen Grund — es ist der höchste Schweregrad, nicht nur der letzte.

Ein anderes Beispiel: für agent_type mit der Anweisung „Bevorzugen Sie den spezialisiertesten Agententyp. Hierarchie: Spezialist > Tier3 > Tier2 > Tier1 > Bot“, wenn eine Sitzung mit einem Bot beginnt und zu einem Tier2-Agenten eskaliert, wird der Speicherdatensatz abgerufen. agent_type: "tier2"

Deterministische Erfassung von Metadaten

Schlüssel, die so konfiguriert sind, dass sie einem anderen Aufnahmepfad STRICTLY_CONSISTENT folgen. Der Wert, den Sie für das Ereignis angeben, ist der Wert, der im resultierenden Datensatz landet. Es gibt keine LLM-Inferenz und keine Konfliktlösung.

AgentCore Der Speicher gruppiert Ereignisse vor der Extraktion nach ihren deterministischen Schlüsselwerten. Beispielsweise department: "engineering" werden markierte Ereignisse getrennt von department: "finance" markierten Ereignissen verarbeitet.

Die Konsolidierung erfolgt innerhalb dieser Gruppen. Ein Datensatz, der compliance_level: "hipaa" nie mit einem Datensatz mit der Bezeichnung compliance_level: "standard" zusammengeführt wird. Dadurch eignen sich deterministische Schlüssel ideal für:

  • Isolierung von Vorschriften — Aufzeichnungen mit unterschiedlichen Compliance-Stufen vermischen sich niemals.

  • Organisatorische Weiterleitung — Department-scoped Abruf ohne Kreuzkontamination.

  • Multi-tenant Unterfilterung — Tenant-specific Attribute werden exakt so beibehalten, wie sie bereitgestellt wurden.

Wenn ein Ereignis keinen Wert für einen deterministischen Schlüssel hat, fehlt der Schlüssel im resultierenden Datensatz.

Die Direct-Write-Pfade (BatchCreateMemoryRecordsundBatchUpdateMemoryRecords) umgehen die Extraktion. Der STRICTLY_CONSISTENT Extraktionstyp hat keine Auswirkung auf sie. Geben Sie Metadaten direkt ein, wie Sie es bereits für diese APIs tun.

Direkte Datensatzerstellung mit Batch-APIs

Verwenden Sie BatchCreateMemoryRecords (oderBatchUpdateMemoryRecords) für Wissensdatenbank-Importe, selbstverwaltete Strategien oder vorverarbeitete Inhalte, um Metadaten explizit anzugeben. Dadurch wird die LLM-Extraktion vollständig umgangen — der Aufrufer kontrolliert die Metadatenwerte.

Wie Metadaten in stapelweise erstellten Datensätzen behandelt werden, hängt davon ab, ob Sie Folgendes angeben: memoryStrategyId

  • Mit memoryStrategyId — Der Service filtert die Eingabe-Metadaten anhand der Metadaten dieser Strategie. memoryRecordSchema Nur im Schema definierte Schlüssel werden im Datensatz gespeichert. Alle anderen Schlüssel — einschließlich indizierter Schlüssel, die nicht im Schema enthalten sind — werden stillschweigend gelöscht. Dadurch erhalten Sie durch ein Schema erzwungene Konsistenz und stellen sicher, dass stapelweise erstellte Datensätze dieselbe Metadatenform haben wie Datensätze, die durch ereignisgesteuerte Extraktion erstellt wurden.

  • Ohne memoryStrategyId — Der Service speichert alle Metadatenschlüssel in der Nutzlast so, wie sie im Datensatz sind. Dazu gehören Schlüssel, die indexiert sind, Schlüssel, die sich in einem Strategieschema befinden, und Schlüssel, die keines von beiden sind. Allerdings sind nur indizierte Schlüssel filterbar — der Versuch, nach einem nicht indizierten Schlüssel zu filtern, gibt a zurück. ValidationException Non-indexed Schlüssel sind immer noch in den Antworten sichtbar. GetMemoryRecord ListMemoryRecords

Das folgende Beispiel erstellt einen Datensatz ohnememoryStrategyId, wobei alle bereitgestellten Metadaten gespeichert werden:

aws bedrock-agentcore batch-create-memory-records \ --memory-id "<memory-id>" \ --records '[{ "requestIdentifier": "import-001", "namespaces": ["support/customer-456"], "content": {"text": "Customer prefers phone support for urgent billing issues"}, "timestamp": "2026-01-15T10:00:00Z", "metadata": { "priority": {"stringValue": "high"}, "agent_type": {"stringValue": "billing_agent"}, "channel": {"stringValue": "phone"}, "ticket_id": {"stringValue": "TKT-7890"} } }]'

Um die Konsistenz des Schemas zu gewährleisten, fügen Sie den hinzumemoryStrategyId. In diesem Fall werden nur Schlüssel beibehalten, die in diesen Strategien enthalten memoryRecordSchema sind:

aws bedrock-agentcore batch-create-memory-records \ --memory-id "<memory-id>" \ --records '[{ "requestIdentifier": "import-002", "namespaces": ["support/customer-456"], "memoryStrategyId": "<strategy-id>", "content": {"text": "Billing dispute resolved after account credit applied"}, "timestamp": "2026-01-16T14:00:00Z", "metadata": { "priority": {"stringValue": "medium"}, "agent_type": {"stringValue": "billing_agent"}, "channel": {"stringValue": "phone"} } }]'

Im zweiten Beispiel wirdchannel, wenn das Schema der Strategie nur priorityagent_type, undsentiment, definiert, automatisch aus dem gespeicherten Datensatz gelöscht.

Aktualisierung von Datensätzen mit BatchUpdateMemoryRecords

BatchUpdateMemoryRecordsfolgt dem gleichen Verhalten memoryStrategyId beim Filtern von Metadaten wieBatchCreateMemoryRecords. Das folgende Beispiel aktualisiert den Inhalt und die Metadaten eines vorhandenen Datensatzes:

aws bedrock-agentcore batch-update-memory-records \ --memory-id "<memory-id>" \ --records '[{ "memoryRecordId": "<record-id>", "namespaces": ["support/customer-456"], "content": {"text": "Customer prefers phone support for urgent billing issues. Account credit applied."}, "metadata": { "priority": {"stringValue": "critical"}, "agent_type": {"stringValue": "billing_agent"}, "channel": {"stringValue": "phone"} } }]'

Schritt 4: Abfrage mit Metadatenfiltern

Metadatenfilter werden angewendet, bevor die Vektorähnlichkeitssuche ausgeführt wird (Vorfilterung). Dadurch wird zuerst die Kandidatenmenge reduziert. Das hat zur Folge, dass die K-nearest Nachbarsuche (KNN) auf einer kleineren, relevanteren Teilmenge basiert.

Filter-Struktur

Jeder Filter ist ein { left, operator, right } Ausdruck:

{ "left": { "metadataKey": "priority" }, "operator": "EQUALS_TO", "right": { "metadataValue": { "stringValue": "high" } } }

Pro Abfrage können bis zu 5 Filter kombiniert werden. Mehrere Filter werden AND logisch angewendet.

Unterstützte Operatoren

Operator Richtiger Wert erforderlich Funktioniert mit Description

EQUALS_TO

Ja

ZEICHENFOLGE, ZAHL

Exakte Übereinstimmung.

CONTAINS

Ja

ZEICHENKETTENLISTE

Gibt Datensätze zurück, bei denen ein Element in der STRINGLIST die angegebene Zeichenfolge als exakte Übereinstimmung enthält.

EXISTS

Nein

Alle Typen

Der Schlüssel ist in der Aufzeichnung vorhanden

NOT_EXISTS

Nein

Alle Typen

Der Schlüssel fehlt im Datensatz

GREATER_THAN

Ja (numberValue)

NUMBER

Numerisch größer als Vergleich

GREATER_THAN_OR_EQUALS

Ja (numberValue)

NUMBER

Numerischer Vergleich größer als oder gleich

LESS_THAN

Ja (numberValue)

NUMBER

Numerischer Vergleich kleiner als

LESS_THAN_OR_EQUALS

Ja (numberValue)

NUMBER

Numerischer Vergleich kleiner als oder gleich

BEFORE

Ja (dateTimeValue)

Datum TimeValue

Der Zeitstempel liegt vor dem angegebenen Wert

AFTER

Ja (dateTimeValue)

Datum TimeValue

Der Zeitstempel liegt hinter dem angegebenen Wert

Hinweis: Event-Metadatenfilter werden nur ListEvents unterstützt EXISTSNOT_EXISTS, undEQUALS_TO, und nurstringValue.

Mit Metadatenfiltern abrufen (semantische Suche + Vorfilter)

OnRetrieveMemoryRecords, metadataFilters ist im Inneren verschachtelt. searchCriteria Im folgenden Beispiel werden die Ergebnisse auf Datensätze mit hoher Priorität aus dem aktuellen Jahr beschränkt, bevor die semantische Suche mit „Abrechnungsproblemen“ übereinstimmt:

aws bedrock-agentcore retrieve-memory-records \ --memory-id "<memory-id>" \ --namespace "support/customer-123" \ --search-criteria '{ "searchQuery": "billing issues", "topK": 10, "metadataFilters": [ { "left": {"metadataKey": "priority"}, "operator": "EQUALS_TO", "right": {"metadataValue": {"stringValue": "high"}} }, { "left": {"metadataKey": "x-amz-agentcore-memory-createdAt"}, "operator": "AFTER", "right": {"metadataValue": {"dateTimeValue": "2026-01-01T00:00:00Z"}} } ] }'

Durch die Kombination eines benutzerdefinierten Metadatenfilters mit einem vom System generierten Zeitstempel wird die Kandidatengruppe anhand von zwei Dimensionen — Geschäftspriorität und Aktualität — komprimiert, bevor die Ähnlichkeitssuche ausgeführt wird.

Liste mit Metadatenfiltern (keine semantische Suche)

ListMemoryRecordsbietet Metadatenfilterung ohne semantische Suche. Dies ist nützlich, wenn Sie Datensätze auflisten müssen, die bestimmten Metadatenkriterien entsprechen, z. B. um alle Datensätze mit hoher Priorität für einen Kunden aufzulisten oder alle Datensätze abzurufen, die nach einem bestimmten Datum erstellt wurden.

On metadataFilters ist ein ListMemoryRecords Parameter der obersten Ebene:

aws bedrock-agentcore list-memory-records \ --memory-id "<memory-id>" \ --namespace "support/customer-123" \ --metadata-filters '[ { "left": {"metadataKey": "priority"}, "operator": "EQUALS_TO", "right": {"metadataValue": {"stringValue": "high"}} }, { "left": {"metadataKey": "x-amz-agentcore-memory-createdAt"}, "operator": "AFTER", "right": {"metadataValue": {"dateTimeValue": "2026-01-20T00:00:00Z"}} } ]'

Kombination mehrerer Filter

Diese Abfrage bezieht sich auf Aktiendiskussionen im 3. Quartal 2026 innerhalb eines bestimmten Client-Namespaces:

{ "searchQuery": "portfolio rebalancing strategy", "topK": 10, "metadataFilters": [ { "left": {"metadataKey": "asset_class"}, "operator": "EQUALS_TO", "right": {"metadataValue": {"stringValue": "equities"}} }, { "left": {"metadataKey": "x-amz-agentcore-memory-createdAt"}, "operator": "AFTER", "right": {"metadataValue": {"dateTimeValue": "2026-07-01T00:00:00Z"}} }, { "left": {"metadataKey": "x-amz-agentcore-memory-createdAt"}, "operator": "BEFORE", "right": {"metadataValue": {"dateTimeValue": "2026-09-30T23:59:59Z"}} } ] }

Filterwerte für Zeitstempel müssen im UTC-Format (ISO 8601-Format) angegeben werden. Der Dienst normalisiert alle gespeicherten Zeitstempel vor dem Vergleich auf UTC, sodass Filterwerte immer in UTC ausgedrückt werden.

Schritt 5: Entwickeln Sie Ihr Metadatenschema

AgentCore Der Speicher unterstützt die Schemaentwicklung, sodass Sie Ihre Metadatenkonfiguration an sich ändernde Anforderungen anpassen können.

Fügen Sie indizierte Schlüssel hinzu

Sie können einem Speicher jederzeit neue indizierte Schlüssel hinzufügen:

aws bedrock-agentcore-control update-memory \ --memory-id "<memory-id>" \ --add-indexed-keys '[ {"key": "customer_segment", "type": "STRING"} ]'

Neue Schlüssel werden sofort für eingehende Ereignisse und Speicherdatensätze verfügbar. Bestehende Datensätze werden nicht aufgefüllt — nur neue oder aktualisierte Datensätze enthalten den neuen Schlüssel. Sie können einen zuvor indizierten Schlüssel nicht entfernen, wodurch ein versehentlicher Verlust der Filterfähigkeit vorhandener Daten verhindert wird.

Ändern Sie das Metadatenschema einer Strategie

Sie können Einträge im Metadatenschema einer Strategie nach Belieben hinzufügen, entfernen oder aktualisieren. Dadurch wird gesteuert, welche Metadaten das LLM aus zukünftigen Konversationen extrahiert.

Um beispielsweise einer bestehenden Strategie ein neues resolution_type Feld hinzuzufügen:

aws bedrock-agentcore-control update-memory \ --memory-id "<memory-id>" \ --memory-strategies '{ "modifyMemoryStrategies": [ { "memoryStrategyId": "<strategy-id>", "memoryRecordSchema": { "metadataSchema": [ { "key": "resolution_type", "type": "STRING", "extractionConfig": { "llmExtractionConfig": { "definition": "How the customer support issue was resolved", "validation": { "stringValidation": { "allowedValues": ["refund", "replacement", "escalation", "self-resolved"] } } } } } ] } } ] }'

Sie können auch einen Schlüssel aus dem Metadatenschema einer Strategie entfernen, wenn Sie nicht mehr möchten, dass das LLM dieses Feld extrahiert. Durch das Entfernen eines Schemaeintrags wird die Extraktion neuer Datensätze gestoppt, die Metadaten, die sich bereits in vorhandenen Datensätzen befinden, jedoch nicht beeinträchtigt.

Bestehende Speicherdatensätze erhalten nicht rückwirkend neue LLM-extracted Felder. Wenn jedoch ältere Speicher während des normalen Speicherlebenszyklus mit neueren konsolidiert werden, wird der konsolidierte Datensatz unter Verwendung des aktuellen Schemas erneut extrahiert und enthält die neuen Metadatenfelder.

Kontingente

Ressource Limit

Indizierte Schlüssel pro Speicher

10

STRICTLY_CONSISTENTE Schlüssel pro Strategie

3

Metadaten-Schemaeinträge pro Strategie

20

Metadateneinträge für Speicherdatensätze (vom Benutzer bereitgestellt)

20

Filter pro Abfrage

5

allowedValuespro Validierungsregel

10

maxItemszur STRINGLIST Validierung

5

definition/llmExtractionInstructionLänge

Jeweils 1000 Zeichen

Länge des Metadatenschlüssels

128 Zeichen

stringValueLänge

256 Zeichen

Länge für STRINGLIST Mitglieder

64 Zeichen

Bewährte Methoden

  • Beginnen Sie mit 3—5 Filterdimensionen, die sich direkt auf die Abrufqualität auswirken. Jedes indizierte Feld verbraucht Kapazität der Speicherinfrastruktur, und das Limit von 10 Schlüsseln spiegelt dies wider. Beginnen Sie mit drei bis fünf Schlüsseln, die sich direkt auf die Abrufqualität auswirken, und fügen Sie weitere hinzu, wenn sich konkrete Bedürfnisse ergeben.

  • Schreiben Sie klare, spezifische definition Zeichenketten. Das definition beschreibt, wofür das Feld steht. Schreiben Sie statt „Die Priorität des Tickets“ „Prioritätsstufe des Problems auf der Grundlage der Auswirkungen auf den Kunden“. Die Werte reichen von kritisch (am schwersten) bis niedrig (am wenigsten schwerwiegend).“ Wird llmExtractionInstruction für eine detaillierte Extraktionslogik verwendet.

  • Beschränken Sie die LLM-Ausgabe mit. validation.allowedValues Ohne Überprüfung kann das LLM "HIGH" für dasselbe Konzept einen fehlerhaften Filterabgleich erzeugen"High". "high"

  • Wählen Sie Regeln zur Konfliktlösung, die der Domain-Semantik entsprechen. LATEST_VALUEist eine sichere Standardeinstellung, aber für Felder wie agent_type in einem Eskalationsworkflow ist eine benutzerdefinierte Anweisung, die den höchsten Wert beibehält, korrekter.

  • Bevorzugen Sie den ereignisgesteuerten Weg für Konversationsinhalte. Lassen Sie das LLM die Extraktion und Konfliktlösung übernehmen. Reservieren Sie die Batch-APIs für Massenimporte, bei denen Sie die richtigen Metadatenwerte bereits kennen.

  • Planen Sie Schemas auf Strategieebene. Jede Strategie kann ihre eigene habenmetadataSchema, sodass verschiedene Strategien dieselben Schlüssel unterschiedlich extrahieren und verarbeiten können. Bei einer semantischen Strategie können benutzerdefinierte Extraktionsanweisungen verwendet werden, um die Priorität anhand des Konversationskontextes zu klassifizieren, während bei einer Zusammenfassungsstrategie möglicherweise eine andere Definition verwendet wird, die auf zusammenfassungsspezifische Metadaten zugeschnitten ist.

  • Gehen Sie bewusst vor, wenn Sie Datensätze verwenden, die im Stapel erstellt wurden. memoryStrategyId Wenn Sie einschließenmemoryStrategyId, filtert der Service die Eingabe-Metadaten nur nach Schlüsseln im Schema dieser Strategie. Alle anderen Schlüssel werden automatisch gelöscht. Wenn Sie es weglassen, werden alle Metadaten in der Nutzlast unverändert gespeichert. Wählen Sie je nach Anwendungsfall: schemaerzwungene Konsistenz für Datensätze, die mit Datensätzen übereinstimmen sollten, die durch Extraktion erzeugt wurden, oder volle Kontrolle für Massenimporte, bei denen Sie Metadaten extern verwalten.

  • Verwenden Sie nicht indizierte Schemaschlüssel für die Kontextanreicherung. Nicht jeder Metadatenschlüssel muss filterbar sein. Schemaschlüssel, die nicht als indizierte Schlüssel deklariert sind, werden trotzdem in extrahierten Datensätzen aufgefüllt und sind in get/list Antworten sichtbar — sie können nur nicht in Filterausdrücken verwendet werden. Dies ist nützlich für Metadaten wie sentiment odersummary_notes, die den Datensatz für nachgelagerte Zwecke anreichern, ohne dass Ihr Budget für indizierte Schlüssel aufgebraucht wird.

  • Verwenden Sie die deterministische Extraktion für Werte, die Sie bereits kennen. Einige Schlüssel stehen für feste Organisationsattribute wie departmenttenant_tier, odercompliance_scope. Wenn die Anwendung zum Zeitpunkt der Erstellung des Ereignisses über diese Werte verfügt, konfigurieren Sie sie alsSTRICTLY_CONSISTENT. Geben Sie den Wert für jedes Ereignis an. Dadurch werden exakte Werte in Datensätzen garantiert und widersprüchliche Darstellungen (wie z. B. "eng" vs."Engineering"), die durch die LLM-Extraktion entstehen können, vermieden. Reservieren Sie sich LLM_INFERRED für Dimensionen, die aus dem Inhalt der Konversation abgeleitet werden müssen, wie etwa Stimmung oder Thema.

  • Planen Sie frühzeitig deterministische Schlüsselfelder. Jeder STRICTLY_CONSISTENT Schlüssel verwendet einen der 10 indexierten Schlüsselsteckplätze. Indizierte Schlüssel können nicht entfernt werden, sobald sie hinzugefügt wurden. Reservieren Sie Slots, wenn Sie deterministische Metadaten verwenden möchten.

Anti-patterns um zu vermeiden

  • Indexieren Sie keine Freitextfelder mit hoher Kardinalität wie Beschreibungen oder vollständige Namen — sie vergrößern den Index, ohne sinnvolle Filtergrenzen zu bieten.

  • Verwenden Sie Metadaten nicht für Werte, die sich bei jeder Interaktion ändern — Metadaten sind am effektivsten bei stabilen oder sich langsam ändernden Attributen.

  • Verlassen Sie sich bei der Mandantenisolierung nicht allein auf Metadaten. Bei einem tenant_id Metadatenfeld ohne Namespace-Isolierung handelt es sich um ein Sicherheitsmodell, das durch Konventionen abgesichert wird und bei jedem fehlenden Filter nicht funktioniert. Verwenden Sie Namespaces für, und Metadaten fürwho, und. what when how urgent

  • Verwenden Sie die LLM-Extraktion nicht für Werte, die exakt sein müssen. Wenn ein Schlüssel einen bestimmten, bekannten Wert (wie department oderticket_id) enthalten muss, verwenden Sie die STRICTLY_CONSISTENT Extraktion oder stellen Sie ihn über die Batch-APIs bereit. Die LLM-Extraktion kann zu Variationen desselben Konzepts führen.