Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
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 singolo namespace, un'ampia ricerca semantica restituisce tutto ciò che ha un significato vicino. Con il filtro 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 determinato reparto o solo i record creati in un determinato intervallo di tempo.
Con il filtro dei metadati, puoi:
-
Recupero dell'ambito in base alle 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'ingestione 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 i timestamp generati dal sistema (
x-amz-agentcore-memory-createdAt,x-amz-agentcore-memory-updatedAt) senza dichiarare chiavi indicizzate aggiuntive
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 di metadati su cui desiderate filtrare (ad esempio,,).prioritychanneltagsÈ possibile dichiarare fino a 10 chiavi indicizzate per memoria. Le chiavi indicizzate definiscono quali attributi sono interrogabili nelle espressioni di filtro. Una volta aggiunta, una chiave indicizzata non può essere rimossa. -
Schema dei metadati: definisci una strategia per controllare
metadataSchemail modo in cui 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 che ne sono prive non eseguono l'estrazione dei metadati.
-
-
Verifica della configurazione:
GetMemoryda utilizzare per confermare che le chiavi indicizzate e gli schemi di metadati della strategia siano impostati correttamente. -
Aggiungi metadati durante l'inserimento: invia eventi utilizzando o invia i contenuti direttamente con
CreateEventIngestData, allegando metadati opzionali; oppure fornisci i metadati direttamente nei record utilizzando.BatchCreateMemoryRecordsPer l'ingestione basata sull'estrazione (eIngestData), l'LLM estraeCreateEvente popola automaticamente i metadati nei record di memoria risultanti. Questa estrazione si basa sullo schema dei metadati della strategia e sul contenuto inviato, anche quando non sono allegati metadati. -
Interrogazione con filtri per metadati: utilizza
metadataFiltersonRetrieveMemoryRecords(ricerca semantica con prefiltro) o (filtro solo metadati) per definire l'ambito dei risultati.ListMemoryRecords -
Fai evolvere il tuo schema nel tempo: aggiungi nuove chiavi indicizzate o modifica gli schemi dei metadati della strategia man mano che le tue esigenze di filtraggio aumentano.
Le sezioni successive illustrano ogni passaggio in dettaglio.
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 un rapido filtraggio delle query. È possibile interrogare solo le chiavi indicizzate in on e. 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._:/=+@-]*$ (massimo 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 maggiori dettagli sull'evoluzione dello schema nel tempo, consulta. Passaggio 5: evolvi lo schema dei metadati
Schema dei metadati (per strategia)
Memory Strategy 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 guidata dagli eventi.
Ogni voce nello 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 è 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: invece di «La priorità», scrivi «Livello di priorità del problema in base all'impatto sui clienti». I valori vanno da critico (il più grave) al basso (il meno grave).» -
llmExtractionInstruction(opzionale) — Indicazioni aggiuntive su come il LLM deve estrarre o risolvere i valori. Puoi utilizzare il valore integratoLATEST_VALUE(mantiene il valore più recente) o fornire istruzioni personalizzate in linguaggio naturale come «Classifica in base all'impatto aziendale: utilizzalo per interruzioni del servizio che influiscono sulla produzione,criticalper prestazioni ridotte,highper richieste di funzionalità,mediumper problemi di documentazione o 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 |
|---|---|---|
|
|
|
Vincola a un set fisso (massimo 10 valori, ciascuno massimo 256 caratteri, corrispondenti) |
|
|
|
Vincola 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. Classificatori organizzativi simili department o non agent_id devono essere dedotti dal LLM. compliance_level L'inferenza LLM introduce la variabilità. Ad esempio, la stessa conversazione può produrre "eng" su un record 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 tramite estrazione e consolidamento. L'LLM non viene consultato per quella chiave.
Il seguente JSON mostra uno schema di metadati con entrambi i tipi di estrazione: STRICTLY_CONSISTENT 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 in 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 sono condivisi
department=billing, priority=high. Vengono estratti insieme. -
L'evento 3 è diverso in.
departmentViene estratto separatamente, nonostante la condivisione.priority=high -
L'evento 4 è diverso in.
priorityViene estratto separatamente, nonostante la condivisione.department=billing
Tutti i valori chiave deterministici devono corrispondere per raggruppare gli eventi. Una ricerca con department=billing AND priority=high restituisce solo i dati di addebito duplicati urgenti. Gli altri eventi si trovano in partizioni separate. I record provenienti da diverse combinazioni di valori non si fondono 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 inoltre essere dichiarata nella memoria |
|
No |
|
|
Strategie supportate |
Strategie semantiche, relative alle preferenze dell'utente ed episodiche (incluse 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 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. Pianificate la configurazione deterministica delle chiavi prima di inserire 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 compilata sui record estratti dal LLM ed è filtrabile nelle espressioni di query. Questa è la configurazione più comune per le chiavi su cui si desidera estrarre e filtrare.
-
Indicizzata + non 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 (
BatchCreateMemoryRecordso).BatchUpdateMemoryRecords -
In schema + not indexed: l'LLM estrae e compila il valore nei record, rendendolo visibile in e nelle risposte.
GetMemoryRecordListMemoryRecordsTuttavia, non può essere utilizzato nelle espressioni di filtro. Ciò è utile per l'arricchimento del contesto: metadati similisentimentosummary_notesche arricchiscono il record relativo al 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 voci. stringValue Supporto stringValue e numberValue tipi di record di memoria: compilati dal 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 nella strategia metadataSchema vengono compilate nei record estratti: le chiavi dei metadati degli eventi non presenti nello schema vengono ignorate. Per i limiti di ingresso, consulta. 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 su intervalli di tempo senza dover dichiarare chiavi indicizzate con data e ora.
Prerequisiti
Prima di configurare il filtro dei metadati, verifica di avere:
-
Un AWS account con autorizzazioni per chiamare
CreateMemory,,,,UpdateMemoryCreateEvent, eIngestDataListMemoryRecordsRetrieveMemoryRecordsBatchCreateMemoryRecordsBatchUpdateMemoryRecords -
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. prioritye sentiment sono definiti nello schema dei metadati della strategia: l'LLM ne estrae i valori dai contenuti delle conversazioni. agent_type Notate che sentiment è presente nello schema ma non è dichiarato come chiave indicizzata: il LLM trae il suo valore dalle conversazioni e lo compila 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 sono presenti nello schema: non vengono popolate 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"] } } } } } ] } } } ]'
Passaggio 2: verifica la configurazione
GetMemoryUsalo 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: Aggiungere i metadati durante l'inserimento
Esistono due modi per inserire i metadati nei record di memoria. Con l'ingestione basata sull'estrazione (CreateEventorIngestData), l'LLM popola i metadati sui record che estrae. Con la creazione diretta dei record (or), fornisci i metadati in modo esplicito. BatchCreateMemoryRecords BatchUpdateMemoryRecords
Event-driven ingestione
Allega i stringValue metadati agli eventi al momento della creazione. L'LLM utilizza lo schema dei metadati della strategia per estrarre e popolare i metadati sui 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.
Nota
IngestDataaccetta lo stesso metadata e alimenta la stessa pipeline di estrazione, quindi i metadati si comportano in modo identico a. CreateEvent La differenza è che IngestData non conserva un evento a breve termine.
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 inoltre 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 di 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, il LLM ricava il valore interamente dal contenuto della conversazione. Utilizza la chiave definition e llmExtractionInstruction per determinare il valore. Ciò è utile per dimensioni che esistono solo nella conversazione stessa, senza che sia necessario che i chiamanti le forniscano 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 compila tutte e tre le chiavi dello schema nel record di memoria estratto (,, e) priorityagent_type, anche se nessuna è stata fornita come metadata dell'eventosentiment:
{ "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 gli eventi
Quando più eventi in una sessione contengono valori diversi per la stessa chiave di metadati, l'LLM utilizza il. llmExtractionInstruction Questo determina quale valore conservare nel record di memoria risultante.
Ad esempio, si consideri una sessione di supporto in cui il primo evento ha luogo priority: "low" e un evento successivo si intensifica fino a. 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 vienepriority: "critical" -
Istruzioni personalizzate: è possibile esprimere la logica specifica del dominio. Ad esempio, «Mantieni la massima severità riportata durante la sessione» produrrebbe anche
"critical", ma per un motivo diverso: si tratta della gravità massima, non solo della più recente.
Un altro esempio: 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 salvato. agent_type: "tier2"
Inserimento di metadati deterministici
Le chiavi configurate STRICTLY_CONSISTENT seguono un percorso di inserimento diverso. Il valore fornito nell'evento è il valore che compare 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 contrassegnati department: "engineering" vengono elaborati separatamente dagli eventi contrassegnatidepartment: "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: recupero senza contaminazione incrociata Department-scoped .
-
Multi-tenant sottofiltro: attributi 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) bypassano l'estrazione. Il tipo STRICTLY_CONSISTENT di estrazione non ha alcun effetto su di essi. Fornisci direttamente i metadati come già fai per quelle API.
Creazione diretta di record con le API Batch
Per le importazioni da knowledge base, le strategie autogestite o i contenuti preelaborati, utilizzate BatchCreateMemoryRecords (o) per fornire metadati in modo esplicito. BatchUpdateMemoryRecords Questo bypassa completamente l'estrazione LLM: il chiamante controlla i valori dei metadati.
Il modo in cui i metadati vengono gestiti nei record creati in batch dipende dal fatto che tu fornisca: memoryStrategyId
-
Con
memoryStrategyId: il servizio filtra i metadati di input in base a quelli di quella strategia.memoryRecordSchemaSolo le chiavi definite nello schema vengono memorizzate nel record. Tutte le altre chiavi, incluse le chiavi indicizzate non incluse nello schema, vengono eliminate silenziosamente. Ciò garantisce una coerenza applicata 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 memorizza tutte le chiavi di metadati nel payload così come sono nel record. Sono incluse le chiavi indicizzate, le chiavi che si trovano in uno schema strategico e le chiavi che non sono nessuna delle due. 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 in e le risposte.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 il. memoryStrategyId In questo caso, memoryRecordSchema vengono conservate 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 solo e priority agent_typesentiment, allora channel viene eliminato silenziosamente dal record archiviato.
Aggiornamento dei record con BatchUpdateMemoryRecords
BatchUpdateMemoryRecordssegue lo stesso comportamento di filtraggio dei memoryStrategyId 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 di metadati
I filtri per i metadati vengono applicati prima dell'esecuzione della ricerca per similarità vettoriale (prefiltro). Questo riduce innanzitutto il set di candidati. Di conseguenza, la ricerca K-nearest vicino (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. Vengono applicati più filtri con AND logica.
Operatori supportati
| Operatore | È richiesto il valore corretto | 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 record |
|
|
No |
Tutti i tipi |
La chiave è assente dal record |
|
|
Sì ( |
NUMBER |
Valore numerico maggiore del confronto |
|
|
Sì ( |
NUMBER |
Confronto numerico maggiore o uguale |
|
|
Sì ( |
NUMBER |
Confronto numerico minore di |
|
|
Sì ( |
NUMBER |
Confronto numerico minore o uguale |
|
|
Sì ( |
data TimeValue |
Il timestamp è precedente al valore dato |
|
|
Sì ( |
data TimeValue |
Il timestamp è successivo al valore specificato |
Nota: i metadati degli eventi vengono filtrati solo in base al ListEvents supporto, e EXISTSNOT_EXISTS, e EQUALS_TO solo. stringValue
Recupera con filtri per i metadati (ricerca semantica + prefiltro)
SìRetrieveMemoryRecords, è annidato all'interno. metadataFilters searchCriteria L'esempio seguente assegna i risultati ai record ad alta priorità dell'anno corrente prima che la ricerca semantica corrisponda a «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 lungo due dimensioni, priorità aziendale e attualità, prima che venga eseguita la ricerca per similarità.
Elenco con filtri per metadati (nessuna ricerca semantica)
ListMemoryRecordsfornisce il filtraggio dei metadati senza ricerca semantica. Ciò è utile quando è necessario enumerare i record che corrispondono a criteri di metadati specifici, ad esempio, elencare tutti i record ad alta priorità per un cliente o estrarre tutti i record creati dopo una data specifica.
Sì, è un parametro di primo livello: ListMemoryRecords 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 query riguarda il recupero delle discussioni azionarie del terzo trimestre 2026 all'interno di uno specifico namespace dei clienti:
{ "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 dei filtri 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 dei filtri in UTC.
Passaggio 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 entrata e i record di memoria. I record esistenti non vengono riempiti nuovamente: solo i record nuovi o aggiornati contengono la nuova chiave. Non è possibile rimuovere una chiave indicizzata in precedenza, il che impedisce la perdita accidentale della capacità di filtraggio sui dati esistenti.
Modificare lo schema dei metadati di una strategia
Puoi aggiungere, rimuovere o aggiornare liberamente le voci nello schema dei metadati di una strategia. Questo controlla quali metadati il 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 dei 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 campi. LLM-extracted Tuttavia, quando le memorie più vecchie vengono consolidate con memorie 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 |
|
Inserimenti dello schema di metadati per strategia |
20 |
|
Voci di metadati dei record di memoria (fornite dall'utente) |
20 |
|
Filtri per interrogazione |
5 |
|
|
10 |
|
|
5 |
|
|
1000 caratteri ciascuno |
|
Lunghezza della chiave dei metadati |
128 caratteri |
|
|
256 caratteri |
|
lunghezza dei |
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 dato. Inizia con tre o cinque chiavi che influiscono direttamente sulla qualità del recupero e aggiungine altre quando 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 basato sull'impatto sui clienti». I valori vanno da critico (il più grave) al basso (il meno grave).» Da utilizzarellmExtractionInstructionper una logica di estrazione dettagliata. -
Vincola l'output LLM con.
validation.allowedValuesSenza convalida, l'LLM può produrre"High""high", o"HIGH"per lo stesso concetto, 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 di escalation, un'istruzione personalizzata che mantiene il valore più elevato è più corretta. -
Preferisci il percorso basato sugli eventi per i contenuti conversazionali. Lascia che l'LLM si occupi dell'estrazione e della risoluzione dei conflitti. Riserva le API Batch per le importazioni in blocco se conosci già i valori corretti dei metadati.
-
Pianifica gli schemi a livello di strategia. Ogni strategia può avere la sua
metadataSchema, consentendo 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 ottimizzata per i metadati specifici del riepilogo. -
memoryStrategyIdSii intenzionale con i record creati in batch. Quando includimemoryStrategyId, il servizio filtra i metadati di input solo sulle chiavi nello schema di quella strategia: tutte le altre chiavi vengono eliminate silenziosamente. 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 in blocco in cui gestisci i metadati esternamente. -
Usa chiavi di 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 sono comunque popolate nei record estratti e visibili nelle get/list risposte: semplicemente non possono essere utilizzate nelle espressioni di filtro. Ciò è utile per metadati simili
sentimentosummary_notesche arricchiscono il record relativo all'utilizzo a valle senza consumare il budget delle chiavi indicizzate. -
Utilizzate l'estrazione deterministica per i 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 per ogni evento. Ciò garantisce valori esatti nei record e rimuove le rappresentazioni incoerenti (ad esempio"eng"vs."Engineering") che l'estrazione LLM può introdurre. Fai attenzioneLLM_INFERREDalle dimensioni che devono essere dedotte 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 per chiavi indicizzate. Le chiavi indicizzate non possono essere rimosse una volta aggiunte. Riserva degli 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 i valori che cambiano a ogni interazione: i metadati sono più efficaci per attributi stabili o che cambiano lentamente.
-
Non affidatevi solo ai metadati per isolare gli inquilini. Un campo di
tenant_idmetadati senza isolamento dello spazio dei nomi è un modello di sicurezza basato su convenzioni che si interrompe in caso di mancato filtro. Usa i namespace per, e i metadati per,, e.whowhatwhenhow urgent -
Non utilizzate l'estrazione LLM per valori che devono essere esatti. Se una chiave deve contenere un valore noto specifico (come
departmentoticket_id), utilizza l'STRICTLY_CONSISTENTestrazione o forniscila tramite le API Batch. L'estrazione LLM può produrre variazioni dello stesso concetto.