Metadati strutturati per memorie a lungo termine
Il filtraggio dei metadati in Amazon Bedrock AgentCore Memory consente di aggiungere attributi strutturati ai record di memoria a lungo termine. Puoi utilizzare questi attributi per restringere i record restituiti durante il recupero. I namespace isolano già le memorie per entità principale (utente, tenant, paziente, cliente). Tuttavia, all'interno di un unico namespace, un'ampia ricerca semantica restituisce tutto ciò che ha un significato simile. Con il filtraggio dei metadati, puoi recuperare solo i risultati che corrispondono a valori di attributi specifici. Ad esempio, è possibile recuperare solo i record ad alta priorità, solo i record di un particolare reparto o solo i record creati in un determinato intervallo di tempo.
Con il filtraggio dei metadati, puoi:
-
Recupero degli ambiti per dimensioni aziendali (priorità, reparto, canale, intervallo di tempo) all'interno di un namespace
-
Allega metadati strutturati agli eventi e ai record di memoria al momento della creazione
-
Fai in modo che il Large Language Model (LLM) estragga automaticamente i metadati dai contenuti conversazionali durante l'acquisizione della memoria
-
Limita i valori a valori specifici per un filtraggio coerente LLM-extracted
-
Combina fino a 5 filtri per query su
RetrieveMemoryRecordsoListMemoryRecords, applicati con logicaAND -
Filtra in base ai timestamp generati dal sistema (
x-amz-agentcore-memory-createdAt,x-amz-agentcore-memory-updatedAt) senza dichiarare chiavi indicizzate aggiuntive
Argomenti
Nozioni di base
L'impostazione del filtro dei metadati prevede cinque passaggi:
-
Crea la tua memoria con chiavi indicizzate e uno schema di metadati:
-
Chiavi indicizzate: utilizzate
CreateMemory(oUpdateMemory) per dichiarare le chiavi dei metadati su cui filtrare (ad esempio,,).prioritychanneltagsPuoi dichiarare fino a 10 chiavi indicizzate per memoria. Le chiavi indicizzate definiscono quali attributi possono essere interrogati nelle espressioni di filtro. Una volta aggiunta, una chiave indicizzata non può essere rimossa. -
Schema di metadati: definisci una
metadataSchemastrategia per controllare come l'LLM estrae i valori dalle conversazioni. Lo schema specifica quali chiavi estrarre, come risolvere i conflitti tra gli eventi e quali vincoli di convalida applicare. Uno schema di metadati è facoltativo: le strategie senza uno non eseguono l'estrazione dei metadati.
-
-
Verifica della configurazione: utilizzalo
GetMemoryper confermare che le chiavi indicizzate e gli schemi di metadati strategici siano configurati correttamente. -
Inserisci dati con metadati: invia eventi utilizzando
CreateEventmetadati opzionali o fornisci i metadati direttamente sui record utilizzando.BatchCreateMemoryRecordsPer l'ingestione basata sugli eventi, l'LLM estrae e popola automaticamente i metadati nei record di memoria risultanti. Questa estrazione si basa sullo schema dei metadati della strategia e sul contenuto della conversazione, anche quando nessun metadato è associato agli eventi. -
Interrogazione con filtri per i metadati: utilizza
metadataFiltersonRetrieveMemoryRecords(ricerca semantica con prefiltro) oListMemoryRecords(filtro solo per i metadati) per definire i risultati. -
Evolvi lo schema nel tempo: aggiungi nuove chiavi indicizzate o modifica gli schemi di metadati strategici man mano che le tue esigenze di filtraggio crescono.
Le sezioni successive illustrano in dettaglio ogni passaggio.
Concetti chiave
Chiavi di metadati indicizzate
Le chiavi indicizzate vengono dichiarate a livello di risorsa di memoria in CreateMemory (o aggiunte successivamente tramite). UpdateMemory Le chiavi indicizzate vengono archiviate in un formato ottimizzato per il filtraggio rapido delle query. Solo le chiavi indicizzate possono essere interrogate in on and. metadataFilters ListMemoryRecords RetrieveMemoryRecords
L'esempio seguente dichiara due chiavi indicizzate:
{ "indexedKeys": [ { "key": "priority", "type": "STRING" }, { "key": "tags", "type": "STRINGLIST" } ] }
typeValori supportati:STRING,,. STRINGLIST NUMBER
Le chiavi devono corrispondere ^[a-zA-Z0-9\s._:/=+@-]*$ (max 128 caratteri).
L'aggiunta di una chiave indicizzata non riempie i record esistenti. Solo i record creati o aggiornati dopo la dichiarazione della chiave vengono indicizzati per quella chiave. Per ulteriori dettagli sull'evoluzione dello schema nel tempo, consulta. Fase 5: Evolvi lo schema dei metadati
Schema di metadati (per strategia)
La strategia di memoria può facoltativamente avere uno schema di metadati dichiarato in. memoryRecordSchema.metadataSchema Lo schema dei metadati indica all'LLM quali metadati estrarre dal contenuto conversazionale durante la generazione di record di memoria. Solo le chiavi definite nello schema dei metadati della strategia vengono inserite nei record di memoria risultanti durante l'estrazione basata sugli eventi.
Ogni voce dello schema definisce:
-
key— Il nome della chiave dei metadati. Se questa chiave viene dichiarata anche come chiave indicizzata, il valore estratto è filtrabile. Se non è una chiave indicizzata, il valore viene comunque inserito nel record e visibile nelleListMemoryRecordsrisposte, ma non può essereGetMemoryRecordutilizzato nelle espressioni di filtro. -
type— Il tipo di valore (STRING,,STRINGLIST).NUMBER -
definition(obbligatorio) — Una descrizione in linguaggio naturale di ciò che rappresenta il campo. Sii specifico: anziché «La priorità», scrivi «Emetti il livello di priorità in base all'impatto sul cliente». I valori vanno da critici (più gravi) a bassi (meno gravi)». -
llmExtractionInstruction(opzionale) — Guida aggiuntiva su come l'LLM deve estrarre o risolvere i valori. È possibile utilizzare la funzionalità integrataLATEST_VALUE(mantiene il valore più recente) o fornire istruzioni personalizzate in linguaggio naturale come «Classificazione in base all'impatto aziendale: utilizzocriticalper interruzioni del servizio che influiscono sulla produzione, per prestazioni ridotte,highper richieste di funzionalità,mediumper documentazione o problemi estetici».low -
validation(opzionale) — Vincola l'output del LLM a un insieme controllato di valori. Senza convalida, l'LLM può produrre"High", o"HIGH"per lo stesso concetto"high", interrompere la corrispondenza dei filtri.
L'esempio seguente mostra una voce dello schema di metadati con convalida:
{ "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"] } } } } } ] }
Opzioni di convalida per tipo:
| Tipo | Validation | Description |
|---|---|---|
|
|
|
Limita a un set fisso (massimo 10 valori, massimo 256 caratteri ciascuno, corrispondenti) |
|
|
|
Limita i membri dell'elenco a un set fisso (massimo 10 valori, ciascuno massimo 256 caratteri, corrispondenti) |
|
|
|
Numero massimo di elementi nell'elenco (1—5) |
|
|
|
Valore minimo consentito |
|
|
|
Valore massimo consentito |
Metadati deterministici (tipo di estrazione STRICTLY_CONSISTENT)
Le chiavi di metadati deterministiche contengono valori che l'applicazione conosce già durante la creazione di un evento. Questi valori vengono copiati esattamente nei record di memoria risultanti senza modifiche. I classificatori organizzativi comedepartment, o non agent_id dovrebberocompliance_level, essere dedotti dal LLM. L'inferenza LLM introduce la variabilità. Ad esempio, la stessa conversazione può produrre risultati "eng" su un disco e su un altro. "Engineering"
Per queste chiavi, impostate su extractionType STRICTLY_CONSISTENT nella voce dello schema dei metadati. Il valore fornito nell'evento si propaga invariato attraverso l'estrazione e il consolidamento. L'LLM non viene consultato per quella chiave.
Il seguente codice JSON mostra uno schema di metadati con entrambi STRICTLY_CONSISTENT i tipi di estrazione: LLM_INFERRED
{ "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" } } } ] }
Quando si ometteextractionType, l'impostazione predefinita è. LLM_INFERRED
Estrazione e consolidamento, isolamento
STRICTLY_CONSISTENTle chiavi fanno molto di più che saltare l'inferenza LLM. Raggruppano gli eventi in base ai loro valori deterministici durante l'estrazione. Gli eventi con valori diversi vengono elaborati separatamente. Il consolidamento segue la stessa regola. I record di un gruppo di valori non si fondono mai con i record di un altro gruppo.
Il seguente esempio di Python mostra una sessione di supporto con due chiavi deterministiche (departmente): priority
# 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"} } )
Il sistema raggruppa gli eventi in base alla combinazione esatta di tutti i valori chiave deterministici:
-
Gli eventi 1 e 2 condividono
department=billing, priority=high. Vengono estratti insieme. -
L'evento 3 differisce in.
departmentViene estratto separatamente, nonostante la condivisione.priority=high -
L'evento 4 differisce in.
priorityViene estratto separatamente, nonostante la condivisione.department=billing
Tutti i valori chiave deterministici devono corrispondere affinché gli eventi possano essere raggruppati. Una query con department=billing AND priority=high restituisce solo i dati urgenti relativi all'addebito duplicato. Gli altri eventi si trovano in partizioni separate. I record di diverse combinazioni di valori non si uniscono mai durante il consolidamento.
Vincoli
| Vincolo | Dettaglio |
|---|---|
|
Numero massimo di chiavi deterministiche per strategia |
3 |
|
Tipo di chiavi |
Deve essere |
|
Deve essere indicizzato |
La chiave deve essere dichiarata anche nella memoria |
|
No |
|
|
Strategie supportate |
Strategie semantiche, relative alle preferenze dell'utente e a episodi (incluse le sostituzioni personalizzate). Non supportato nelle strategie di riepilogo. |
|
Valori mancanti |
Se un evento arriva senza un valore per una chiave deterministica, la chiave viene omessa dal raggruppamento per quell'evento e assente nel record risultante. |
Importante
La modifica delle chiavi configurate come STRICTLY_CONSISTENT modifica il raggruppamento utilizzato per l'estrazione e il consolidamento. I record creati con la configurazione precedente vengono isolati dai record creati con la nuova configurazione. Pianifica la configurazione delle chiavi deterministiche prima di importare gli eventi.
Come interagiscono le chiavi indicizzate e le chiavi dello schema
La relazione tra chiavi indicizzate e chiavi dello schema determina il comportamento dei metadati:
-
Indicizzata + nello schema: la chiave viene inserita nei record estratti dal LLM ed è filtrabile nelle espressioni di query. Questa è la configurazione più comune per le chiavi che si desidera estrarre e filtrare.
-
Indicizzato + non incluso nello schema: la chiave non viene inserita nei record durante l'estrazione basata sugli eventi. I filtri su questa chiave non restituiscono risultati per i record estratti. Per compilare queste chiavi, usa le API Batch (
BatchCreateMemoryRecordsoBatchUpdateMemoryRecords). -
Nello schema + non indicizzato: l'LLM estrae e compila il valore nei record ed è visibile nelle risposte.
GetMemoryRecordListMemoryRecordsTuttavia, non può essere utilizzato nelle espressioni di filtro. Ciò è utile per l'arricchimento del contesto: metadati similisentimentosummary_notesche arricchiscono il record per il consumo a valle senza consumare il budget chiave indicizzato.
In che modo i metadati fluiscono dagli eventi ai record di memoria
I metadati degli eventi accettano solo stringValue voci. Supporto stringValue e numberValue tipi di record di memoria: popolati dall'LLM durante l'estrazione o forniti direttamente tramite le API Batch. stringListValue Il dateTimeValue tipo è riservato ai campi generati dal sistema (e). x-amz-agentcore-memory-createdAt x-amz-agentcore-memory-updatedAt Solo le chiavi definite nelle strategie metadataSchema vengono inserite nei record estratti, mentre le chiavi dei metadati degli eventi non presenti nello schema vengono ignorate. Per i limiti di ingresso, vedi. Quote
System-generated metadati
Ogni record di memoria contiene questi campi di sistema, interrogabili con gli stessi operatori di filtro:
| Campo | Tipo | Description |
|---|---|---|
|
|
|
Il tipo di record di memoria |
|
|
|
Timestamp di creazione del record |
|
|
|
Registra il timestamp dell'ultimo aggiornamento |
Non è necessario dichiararle come chiavi indicizzate: sono sempre disponibili per il filtraggio. Questi dateTimeValue campi generati dal sistema supportano AFTER gli operatori BEFORE e consentono di eseguire interrogazioni in intervalli di tempo senza richiedere la dichiarazione di chiavi indicizzate con data e ora.
Prerequisiti
Prima di configurare il filtraggio dei metadati, verifica di disporre di:
-
Un AWS account con le autorizzazioni per chiamare
CreateMemory,,,UpdateMemory,CreateEvent, eListMemoryRecordsRetrieveMemoryRecordsBatchCreateMemoryRecordsBatchUpdateMemoryRecords -
Accesso ad Amazon Bedrock AgentCore
-
Una visione chiara delle 3-5 dimensioni del filtro di cui il tuo agente ha più bisogno (reparto, priorità, regione, progetto e così via)
Fase 1: Creare una memoria con chiavi indicizzate e uno schema di metadati
Quanto segue crea una memoria per l'assistenza clienti con cinque chiavi indicizzate e uno schema di metadati. priorityagent_type, e sentiment sono definiti nello schema dei metadati della strategia: l'LLM estrae i loro valori dal contenuto della conversazione. Si noti che sentiment è presente nello schema ma non è dichiarato come chiave indicizzata: l'LLM ricava il suo valore dalle conversazioni e lo inserisce nei record, ma non può essere utilizzato nelle espressioni di filtro. tags(STRINGLIST), channel (STRING) e ticket_id (STRING) sono dichiarate come chiavi indicizzate ma non fanno parte dello schema: non vengono compilate durante l'estrazione basata sugli eventi ma possono essere fornite tramite le API Batch.
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"] } } } } } ] } } } ]'
Fase 2: Verificare la configurazione
Utilizza GetMemory per confermare che le chiavi indicizzate e lo schema dei metadati sono stati accettati:
aws bedrock-agentcore-control get-memory --memory-id "<memory-id>"
Fase 3: Inserimento di dati con metadati
Esistono due modi per inserire i metadati nei record di memoria.
Event-driven ingestione
Allega stringValue i metadati agli eventi al momento della creazione. L'LLM utilizza lo schema di metadati della strategia per estrarre e popolare i metadati nei record di memoria risultanti. Solo le chiavi definite nella strategia metadataSchema vengono inserite nei record risultanti: le chiavi dei metadati degli eventi non presenti nello schema vengono ignorate durante l'estrazione.
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 questo esempio, priority è nella strategiametadataSchema, quindi il suo valore si propaga al record di memoria. channele non ticket_id sono nello schema, quindi vengono ignorati durante l'estrazione. L'LLM deduce anche agent_type (probabilmente in "specialist" base all'escalation) e sentiment (probabilmente"frustrated") dal contenuto della conversazione: queste chiavi dello schema vengono compilate anche se non sono state fornite come metadati degli eventi.
Estrazione implicita dei metadati dal contenuto della conversazione
I metadati degli eventi non sono necessari affinché le chiavi dello schema producano valori. Quando una chiave dello schema non ha metadati corrispondenti sugli eventi di origine, LLM ricava il valore interamente dal contenuto della conversazione. Utilizza i tasti definition e per determinare il valorellmExtractionInstruction. Ciò è utile per le dimensioni che esistono solo nella conversazione stessa, senza richiedere ai chiamanti di fornirle al momento della creazione dell'evento.
Utilizzando la stessa memoria di assistenza clienti della Fase 1, il seguente evento non contiene affatto metadati:
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."}}} ]'
L'LLM analizza il contenuto della conversazione e inserisce tutte e tre le chiavi dello schema nel record di memoria estratto: priorityagent_type, e sentiment — anche se nessuna è stata fornita come metadata dell'evento:
{ "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"} } }
Le regole di convalida sono ancora valide: l'output del LLM è vincolato ai valori consentiti specificati indipendentemente dal fatto che il valore provenga dai metadati degli eventi o dall'inferenza del contenuto.
In che modo l'LLM risolve i conflitti tra eventi
Quando più eventi in una sessione hanno valori diversi per la stessa chiave di metadati, LLM utilizza il. llmExtractionInstruction Ciò determina quale valore conservare nel record di memoria risultante.
Ad esempio, si consideri una sessione di supporto in cui si verifica il primo evento priority: "low" e a cui si aggiunge un evento successivo. priority: "critical" L'LLM risolve questo problema in base alle istruzioni:
-
LATEST_VALUE(integrato): l'LLM mantiene il valore più recente. In questo caso, il record di memoria diventapriority: "critical". -
Istruzioni personalizzate: è possibile esprimere la logica specifica del dominio. Ad esempio, l'opzione «Mantieni segnalata la massima severità durante la sessione» genererebbe anche
"critical"risultati, ma per un motivo diverso: si tratta della gravità massima, non solo della più recente.
Un altro esempio: perché agent_type con l'istruzione «Preferisci il tipo di agente più specializzato». Gerarchia: specialist > tier3 > tier2 > tier1 > bot», se una sessione inizia con un bot e passa a un agente tier2, il record di memoria viene ripristinato. agent_type: "tier2"
Inserimento deterministico di metadati
Le chiavi configurate STRICTLY_CONSISTENT seguono un percorso di ingestione diverso. Il valore fornito per l'evento è il valore che viene inserito nel record risultante. Non esiste alcuna inferenza LLM e nessuna risoluzione dei conflitti.
AgentCore La memoria raggruppa gli eventi in base ai loro valori chiave deterministici prima dell'estrazione. Ad esempio, gli eventi etichettati department: "engineering" vengono elaborati separatamente dagli eventi etichettatidepartment: "finance".
Il consolidamento opera all'interno di questi gruppi. Un record che non si fonde compliance_level: "hipaa" mai con un record etichettato. compliance_level: "standard" Ciò rende le chiavi deterministiche ideali per:
-
Isolamento della conformità: i record con diversi livelli di conformità non si mescolano mai.
-
Routing organizzativo: Department-scoped recupero senza contaminazione incrociata.
-
Multi-tenant filtro secondario: gli attributi vengono conservati esattamente come forniti Tenant-specific .
Se un evento non ha alcun valore per una chiave deterministica, la chiave è assente nel record risultante.
I percorsi di scrittura diretta (BatchCreateMemoryRecordseBatchUpdateMemoryRecords) ignorano l'estrazione. Il tipo STRICTLY_CONSISTENT di estrazione non ha alcun effetto su di essi. Fornisci i metadati direttamente come già fai per quelle API.
Creazione diretta di record con API Batch
Per le importazioni da knowledge base, le strategie autogestite o i contenuti preelaborati, utilizza BatchCreateMemoryRecords (o) fornisci i metadati in modo esplicito. BatchUpdateMemoryRecords Ciò ignora completamente l'estrazione LLM: il chiamante controlla i valori dei metadati.
Il modo in cui i metadati vengono gestiti sui record creati in batch dipende dal fatto che si fornisca o meno un: memoryStrategyId
-
Con
memoryStrategyId: il servizio filtra i metadati di input in base a quelli di quella strategia.memoryRecordSchemaNel record vengono memorizzate solo le chiavi definite nello schema. Tutte le altre chiavi, incluse le chiavi indicizzate non incluse nello schema, vengono eliminate automaticamente. Ciò garantisce la coerenza imposta dallo schema, garantendo che i record creati in batch abbiano la stessa forma di metadati dei record prodotti dall'estrazione basata sugli eventi. -
Senza
memoryStrategyId: il servizio archivia tutte le chiavi di metadati nel payload così come sono nel record. Ciò include le chiavi indicizzate, le chiavi che si trovano in uno schema di strategia e le chiavi che non lo sono né l'una né l'altra. Tuttavia, solo le chiavi indicizzate sono filtrabili: il tentativo di filtrare in base a una chiave non indicizzata restituisce un.ValidationExceptionNon-indexed le chiavi sono ancora visibili nelle risposte e.GetMemoryRecordListMemoryRecords
L'esempio seguente crea un record senza memoryStrategyId memorizzare tutti i metadati forniti:
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"} } }]'
Per imporre la coerenza dello schema, includi. memoryStrategyId In questo caso, memoryRecordSchema vengono mantenute solo le chiavi presenti in quella strategia:
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"} } }]'
Nel secondo esempio, se lo schema della strategia definisce solopriority, e agent_typesentiment, allora channel viene eliminato silenziosamente dal record archiviato.
Aggiornamento dei record con BatchUpdateMemoryRecords
BatchUpdateMemoryRecordssegue lo stesso comportamento di filtraggio memoryStrategyId dei metadati di. BatchCreateMemoryRecords L'esempio seguente aggiorna il contenuto e i metadati di un record esistente:
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"} } }]'
Fase 4: Interrogazione con filtri per i metadati
I filtri per i metadati vengono applicati prima dell'esecuzione della ricerca per similarità vettoriale (prefiltraggio). Ciò riduce innanzitutto il set di candidati. Di conseguenza, la ricerca dei K-nearest vicini (KNN) opera su un sottoinsieme più piccolo e pertinente.
Struttura filtro
Ogni filtro è un'espressione: { left, operator, right }
{ "left": { "metadataKey": "priority" }, "operator": "EQUALS_TO", "right": { "metadataValue": { "stringValue": "high" } } }
È possibile combinare fino a 5 filtri per query. I filtri multipli vengono applicati con AND logica.
Operatori supportati
| Operatore | È richiesto il giusto valore | Funziona con | Description |
|---|---|---|---|
|
|
Sì |
STRINGA, NUMERO |
Corrispondenza esatta. |
|
|
Sì |
LISTA DI STRINGHE |
Restituisce i record in cui qualsiasi elemento in STRINGLIST contiene la stringa data come corrispondenza esatta. |
|
|
No |
Tutti i tipi |
La chiave è presente nel disco |
|
|
No |
Tutti i tipi |
La chiave è assente dal record |
|
|
Sì ( |
NUMBER |
Un valore numerico superiore al confronto |
|
|
Sì ( |
NUMBER |
Confronto numerico maggiore o uguale |
|
|
Sì ( |
NUMBER |
Confronto numerico inferiore a |
|
|
Sì ( |
NUMBER |
Confronto numerico minore o uguale |
|
|
Sì ( |
data TimeValue |
Il timestamp è precedente al valore specificato |
|
|
Sì ( |
data TimeValue |
Il timestamp è dopo il valore specificato |
Nota: i metadati degli eventi vengono filtrati solo sul ListEvents supporto EXISTS NOT_EXISTSEQUALS_TO, e e solo. stringValue
Recupera con filtri per i metadati (ricerca semantica + prefiltro)
AttivoRetrieveMemoryRecords, metadataFilters è annidato all'interno. searchCriteria L'esempio seguente analizza i risultati in base ai record ad alta priorità dell'anno in corso prima che la ricerca semantica corrisponda ai «problemi di fatturazione»:
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"}} } ] }'
La combinazione di un filtro di metadati personalizzato con un timestamp generato dal sistema compatta il set di candidati in base a due dimensioni, priorità aziendale e attualità, prima che venga eseguita la ricerca per analogia.
Elenco con filtri per i metadati (nessuna ricerca semantica)
ListMemoryRecordsfornisce il filtraggio dei metadati senza ricerca semantica. Ciò è utile quando è necessario enumerare i record che soddisfano criteri di metadati specifici, ad esempio elencando tutti i record ad alta priorità per un cliente o recuperando tutti i record creati dopo una data specifica.
ListMemoryRecordsOn, è un parametro di primo livello: metadataFilters
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"}} } ]'
Combinazione di più filtri
Questa interrogazione analizza le discussioni sulle azioni del terzo trimestre 2026 all'interno di uno specifico namespace del cliente:
{ "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"}} } ] }
I valori del filtro per i timestamp devono essere in UTC (formato ISO 8601). Il servizio normalizza tutti i timestamp memorizzati in UTC prima del confronto, quindi esprimi sempre i valori del filtro in UTC.
Fase 5: Evolvi lo schema dei metadati
AgentCore La memoria supporta l'evoluzione dello schema in modo da poter adattare la configurazione dei metadati al variare delle esigenze.
Aggiungi chiavi indicizzate
Puoi aggiungere nuove chiavi indicizzate a una memoria in qualsiasi momento:
aws bedrock-agentcore-control update-memory \ --memory-id "<memory-id>" \ --add-indexed-keys '[ {"key": "customer_segment", "type": "STRING"} ]'
Le nuove chiavi diventano immediatamente disponibili per gli eventi in arrivo e i record di memoria. I record esistenti non vengono riempiti: solo i record nuovi o aggiornati contengono la nuova chiave. Non è possibile rimuovere una chiave precedentemente indicizzata, il che impedisce la perdita accidentale della capacità di filtraggio sui dati esistenti.
Modifica lo schema dei metadati di una strategia
Puoi aggiungere, rimuovere o aggiornare liberamente le voci nello schema di metadati di una strategia. Questo controlla quali metadati l'LLM estrae dalle conversazioni future.
Ad esempio, per aggiungere un nuovo resolution_type campo a una strategia esistente:
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"] } } } } } ] } } ] }'
Puoi anche rimuovere una chiave dallo schema di metadati di una strategia se non desideri più che l'LLM estragga quel campo. La rimozione di una voce dello schema interrompe l'estrazione di nuovi record ma non influisce sui metadati già presenti nei record esistenti.
I record di memoria esistenti non ricevono retroattivamente nuovi LLM-extracted campi. Tuttavia, quando le memorie più vecchie vengono consolidate con quelle più recenti durante il normale ciclo di vita della memoria, il record consolidato viene riestratto utilizzando lo schema corrente e includerà i nuovi campi di metadati.
Quote
| Risorsa | Limite |
|---|---|
|
Chiavi indicizzate per memoria |
10 |
|
Chiavi STRICTLY_CONSISTENT per strategia |
3 |
|
Voci dello schema di metadati per strategia |
20 |
|
Voci di metadati dei record di memoria (fornite dall'utente) |
20 |
|
Filtri per query |
5 |
|
|
10 |
|
|
5 |
|
|
1000 caratteri ciascuno |
|
Lunghezza della chiave dei metadati |
128 caratteri |
|
|
256 caratteri |
|
lunghezza per |
64 caratteri |
Best practice
-
Inizia con 3-5 dimensioni del filtro che influiscono direttamente sulla qualità del recupero. Ogni campo indicizzato consuma la capacità dell'infrastruttura di storage e il limite di 10 tasti riflette questo aspetto. Inizia con tre o cinque chiavi che influiscono direttamente sulla qualità del recupero e aggiungine altre man mano che si presentano esigenze concrete.
-
Scrivi stringhe chiare e specifiche
definition.definitionDescrive cosa rappresenta il campo. Invece di «La priorità del ticket», scrivi «Livello di priorità dell'emissione in base all'impatto sul cliente». I valori vanno da critici (più gravi) a bassi (meno gravi).» UtilizzarellmExtractionInstructionper una logica di estrazione dettagliata. -
Limita l'output LLM con.
validation.allowedValuesSenza convalida, l'LLM può produrre"High", o"HIGH"per lo stesso concetto"high", interrompere la corrispondenza dei filtri. -
Scegli regole di risoluzione dei conflitti che corrispondano alla semantica del dominio.
LATEST_VALUEè un'impostazione predefinita sicura, ma per campi comeagent_typein un flusso di lavoro con escalation, un'istruzione personalizzata che mantiene il valore più alto è più corretta. -
Preferisci il percorso basato sugli eventi per i contenuti conversazionali. Lascia che sia l'LLM a gestire l'estrazione e la risoluzione dei conflitti. Riserva le API Batch per le importazioni di massa in cui conosci già i valori corretti dei metadati.
-
Pianifica gli schemi a livello di strategia. Ogni strategia può avere le proprie
metadataSchema, che consentono a strategie diverse di estrarre e gestire le stesse chiavi in modo diverso. Una strategia semantica potrebbe utilizzare istruzioni di estrazione personalizzate per classificare la priorità dal contesto della conversazione, mentre una strategia di riepilogo potrebbe utilizzare una definizione diversa adattata ai metadati specifici del riepilogo. -
Sii intenzionale con i record creati in batch.
memoryStrategyIdQuando li includimemoryStrategyId, il servizio filtra i metadati di input solo in base alle chiavi dello schema di quella strategia: tutte le altre chiavi vengono eliminate automaticamente. Quando lo ometti, tutti i metadati nel payload vengono archiviati così come sono. Scegli in base al tuo caso d'uso: coerenza applicata dallo schema per i record che devono corrispondere ai record prodotti dall'estrazione o controllo completo per le importazioni di massa in cui gestisci i metadati esternamente. -
Utilizza chiavi dello schema non indicizzate per l'arricchimento del contesto. Non tutte le chiavi di metadati devono essere filtrabili. Le chiavi dello schema che non sono dichiarate come chiavi indicizzate vengono comunque inserite nei record estratti e sono visibili nelle get/list risposte, semplicemente non possono essere utilizzate nelle espressioni di filtro. Ciò è utile per metadati come
sentimentosummary_notesche arricchiscono il record per il consumo a valle senza consumare il budget chiave indicizzato. -
Utilizzate l'estrazione deterministica per valori che già conoscete. Alcune chiavi rappresentano attributi organizzativi fissi come
departmenttenant_tier, ocompliance_scope. Se l'applicazione ha questi valori al momento della creazione dell'evento, configurali comeSTRICTLY_CONSISTENT. Fornisci il valore di ogni evento. Ciò garantisce valori esatti sui record e rimuove le rappresentazioni incoerenti (come"eng"vs."Engineering") che l'estrazione LLM può introdurre. RiservaLLM_INFERREDalle dimensioni che devono essere desunte dal contenuto della conversazione, come il sentimento o l'argomento. -
Pianifica in anticipo gli slot chiave deterministici. Ogni
STRICTLY_CONSISTENTchiave utilizza uno dei 10 slot a chiave indicizzata. Le chiavi indicizzate non possono essere rimosse una volta aggiunte. Riserva gli slot se prevedi di utilizzare metadati deterministici.
Anti-patterns da evitare
-
Non indicizzate campi di testo libero ad alta cardinalità come descrizioni o nomi completi: gonfiano l'indice senza fornire utili limiti di filtro.
-
Non utilizzate i metadati per valori che cambiano a ogni interazione: i metadati sono più efficaci per attributi stabili o che cambiano lentamente.
-
Non affidatevi solo ai metadati per l'isolamento dei tenant. Un campo di
tenant_idmetadati senza isolamento dello spazio dei nomi è un modello basato sulla sicurezza tramite convenzioni che interrompe qualsiasi filtro mancato. Utilizza i namespace per, e i metadati per, e.whowhatwhenhow urgent -
Non utilizzare l'estrazione LLM per valori che devono essere esatti. Se una chiave deve contenere un valore specifico e noto (come
departmentoticket_id), usa l'STRICTLY_CONSISTENTestrazione o forniscila tramite le API Batch. L'estrazione LLM può produrre variazioni dello stesso concetto.