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
RetrieveMemoryRecordsoderListMemoryRecords, angewendet mit LogikAND -
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:
-
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
metadataSchemaeigene 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.
-
-
Konfiguration überprüfen — Verwenden Sie diese Option
GetMemory, um zu überprüfen, ob Ihre indizierten Schlüssel und Strategie-Metadatenschemas korrekt eingerichtet sind. -
Daten mit Metadaten aufnehmen — Senden Sie Ereignisse
CreateEventmithilfe optionaler Metadaten oder stellen Sie Metadaten direkt in Datensätzen bereit.BatchCreateMemoryRecordsBei 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. -
Abfrage mit Metadatenfiltern — Verwenden Sie diese Option
metadataFiltersfürRetrieveMemoryRecords(semantische Suche mit Vorfilterung) oderListMemoryRecords(reine Metadatenfilterung), um die Ergebnisse einzugrenzen. -
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 inGetMemoryRecorddenListMemoryRecordsAntworten 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 verwendenLATEST_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,criticalbei Leistungseinbußen,highbeimediumlowFunktionsanfragen, 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 |
|---|---|---|
|
|
|
Auf einen festen Satz beschränken (max. 10 Werte, jeweils max. 256 Zeichen, |
|
|
|
Beschränken Sie die Listenmitglieder auf einen festen Satz (maximal 10 Werte, jeweils maximal 256 Zeichen, übereinstimmend) |
|
|
|
Max. Anzahl der Elemente in der Liste (1—5) |
|
|
|
Zulässiger Mindestwert |
|
|
|
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=highsich. Sie werden zusammen extrahiert. -
Ereignis 3 unterscheidet sich in
department. Es wird trotz gemeinsamer Nutzung separat extrahiertpriority=high. -
Ereignis 4 unterscheidet sich in
priority. 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 |
|
Muss indexiert sein |
Der Schlüssel muss auch im Speicher deklariert werden |
|
Nein |
|
|
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.
GetMemoryRecordListMemoryRecordsEs kann jedoch nicht in Filterausdrücken verwendet werden. Dies ist nützlich für die Kontextanreicherung, d. h. Metadaten, diesentimentden Datensatz für nachgelagerte Zwecke anreichern, ohnesummary_notesdass 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 |
|---|---|---|
|
|
|
Der Typ des Speicherdatensatzes |
|
|
|
Zeitstempel für die Erstellung des Datensatzes |
|
|
|
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
CreateMemoryUpdateMemoryCreateEvent,ListMemoryRecords,,RetrieveMemoryRecords,BatchCreateMemoryRecords, undBatchUpdateMemoryRecords -
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.memoryRecordSchemaNur 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.ValidationExceptionNon-indexed Schlüssel sind immer noch in den Antworten sichtbar.GetMemoryRecordListMemoryRecords
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 |
|---|---|---|---|
|
|
Ja |
ZEICHENFOLGE, ZAHL |
Exakte Übereinstimmung. |
|
|
Ja |
ZEICHENKETTENLISTE |
Gibt Datensätze zurück, bei denen ein Element in der STRINGLIST die angegebene Zeichenfolge als exakte Übereinstimmung enthält. |
|
|
Nein |
Alle Typen |
Der Schlüssel ist in der Aufzeichnung vorhanden |
|
|
Nein |
Alle Typen |
Der Schlüssel fehlt im Datensatz |
|
|
Ja ( |
NUMBER |
Numerisch größer als Vergleich |
|
|
Ja ( |
NUMBER |
Numerischer Vergleich größer als oder gleich |
|
|
Ja ( |
NUMBER |
Numerischer Vergleich kleiner als |
|
|
Ja ( |
NUMBER |
Numerischer Vergleich kleiner als oder gleich |
|
|
Ja ( |
Datum TimeValue |
Der Zeitstempel liegt vor dem angegebenen Wert |
|
|
Ja ( |
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 |
|
|
10 |
|
|
5 |
|
|
Jeweils 1000 Zeichen |
|
Länge des Metadatenschlüssels |
128 Zeichen |
|
|
256 Zeichen |
|
Länge für |
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
definitionZeichenketten. Dasdefinitionbeschreibt, 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).“ WirdllmExtractionInstructionfür eine detaillierte Extraktionslogik verwendet. -
Beschränken Sie die LLM-Ausgabe mit.
validation.allowedValuesOhne Ü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 wieagent_typein 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 haben
metadataSchema, 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.
memoryStrategyIdWenn 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
sentimentodersummary_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 sichLLM_INFERREDfü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_CONSISTENTSchlü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_idMetadatenfeld 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.whatwhenhow urgent -
Verwenden Sie die LLM-Extraktion nicht für Werte, die exakt sein müssen. Wenn ein Schlüssel einen bestimmten, bekannten Wert (wie
departmentoderticket_id) enthalten muss, verwenden Sie dieSTRICTLY_CONSISTENTExtraktion oder stellen Sie ihn über die Batch-APIs bereit. Die LLM-Extraktion kann zu Variationen desselben Konzepts führen.