View a markdown version of this page

Métadonnées structurées pour les mémoires à long terme - Amazon Bedrock AgentCore

Métadonnées structurées pour les mémoires à long terme

Le filtrage des métadonnées dans Amazon Bedrock AgentCore Memory vous permet d'ajouter des attributs structurés à vos enregistrements de mémoire à long terme. Vous pouvez utiliser ces attributs pour affiner les enregistrements renvoyés lors de la récupération. Les espaces de noms isolent déjà les mémoires par entité principale (utilisateur, locataire, patient, client). Cependant, au sein d'un même espace de noms, une recherche sémantique étendue renvoie tout ce qui a un sens proche. Le filtrage des métadonnées vous permet de récupérer uniquement les résultats correspondant à des valeurs d'attributs spécifiques. Par exemple, vous pouvez récupérer uniquement les enregistrements prioritaires, uniquement les enregistrements d'un département en particulier ou uniquement les enregistrements créés dans un intervalle de temps donné.

Grâce au filtrage des métadonnées, vous pouvez :

  • Récupération du périmètre par dimension commerciale (priorité, département, canal, plage de temps) au sein d'un espace de noms

  • Associez des métadonnées structurées aux événements et aux enregistrements de mémoire au moment de leur création

  • Faites en sorte que le modèle de langage étendu (LLM) extrait automatiquement les métadonnées du contenu conversationnel lors de l'ingestion de mémoire

  • Limitez les LLM-extracted valeurs à des valeurs spécifiques pour un filtrage cohérent

  • Combinez jusqu'à 5 filtres par requête sur RetrieveMemoryRecords ouListMemoryRecords, appliqués de manière AND logique

  • Filtrer sur les horodatages générés par le système (x-amz-agentcore-memory-createdAt,x-amz-agentcore-memory-updatedAt) sans déclarer de clés indexées supplémentaires

Prise en main

La configuration du filtrage des métadonnées comprend cinq étapes :

  1. Créez votre mémoire à l'aide de clés indexées et d'un schéma de métadonnées —

    • Clés indexées : utilisez CreateMemory (ouUpdateMemory) pour déclarer les clés de métadonnées sur lesquelles vous souhaitez filtrer (par exemple, prioritychannel,tags). Vous pouvez déclarer jusqu'à 10 clés indexées par mémoire. Les clés indexées définissent les attributs interrogeables dans les expressions de filtre. Une fois qu'une clé indexée est ajoutée, elle ne peut pas être supprimée.

    • Schéma de métadonnées — Définissez une metadataSchema stratégie pour contrôler la manière dont le LLM extrait les valeurs des conversations. Le schéma indique les clés à extraire, la manière de résoudre les conflits entre les événements et les contraintes de validation à appliquer. Un schéma de métadonnées est facultatif ; les stratégies sans schéma ne permettent pas d'extraire les métadonnées.

  2. Vérifiez la configuration : GetMemory à utiliser pour confirmer que vos clés indexées et vos schémas de métadonnées de stratégie sont correctement configurés.

  3. Ingérer des données avec des métadonnées : envoyez des événements à l'aide CreateEvent de métadonnées facultatives, ou fournissez des métadonnées directement sur les enregistrements à l'aide BatchCreateMemoryRecords de. Pour une ingestion pilotée par des événements, le LLM extrait et remplit automatiquement les métadonnées des enregistrements de mémoire qui en résultent. Cette extraction est basée sur le schéma de métadonnées et le contenu de la conversation de la stratégie, même lorsqu'aucune métadonnée n'est attachée aux événements.

  4. Requête avec filtres de métadonnées : utilisez cette metadataFilters option activée RetrieveMemoryRecords (recherche sémantique avec préfiltrage) ou ListMemoryRecords (filtrage des métadonnées uniquement) pour définir les résultats.

  5. Faites évoluer votre schéma au fil du temps : ajoutez de nouvelles clés indexées ou modifiez les schémas de métadonnées de stratégie à mesure que vos besoins de filtrage augmentent.

Les sections suivantes décrivent chaque étape en détail.

Concepts clés

Clés de métadonnées indexées

Les clés indexées sont déclarées au niveau des ressources mémoire dans CreateMemory (ou ajoutées ultérieurement viaUpdateMemory). Les clés indexées sont stockées dans un format optimisé pour un filtrage rapide des requêtes. Seules les clés indexées sont interrogeables dans metadataFilters on et. ListMemoryRecords RetrieveMemoryRecords

L'exemple suivant déclare deux clés indexées :

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

typeValeurs prises en charge :STRING,STRINGLIST,NUMBER.

Les clés doivent correspondre ^[a-zA-Z0-9\s._:/=+@-]*$ (128 caractères maximum).

L'ajout d'une clé indexée ne remplace pas les enregistrements existants. Seuls les enregistrements créés ou mis à jour après la déclaration de la clé sont indexés pour cette clé. Pour plus de détails sur l'évolution de votre schéma au fil du temps, consultezÉtape 5 : Faites évoluer votre schéma de métadonnées.

Schéma de métadonnées (par stratégie)

Memory Strategy peut éventuellement avoir un schéma de métadonnées déclaré dansmemoryRecordSchema.metadataSchema. Le schéma de métadonnées indique au LLM quelles métadonnées extraire du contenu conversationnel lors de la génération d'enregistrements de mémoire. Seules les clés définies dans le schéma de métadonnées de la stratégie sont renseignées sur les enregistrements de mémoire obtenus lors de l'extraction pilotée par les événements.

Chaque entrée du schéma définit :

  • key— Le nom de la clé de métadonnées. Si cette clé est également déclarée comme clé indexée, la valeur extraite est filtrable. S'il ne s'agit pas d'une clé indexée, la valeur est toujours renseignée dans l'enregistrement et visible dans GetMemoryRecord les ListMemoryRecords réponses, mais elle ne peut pas être utilisée dans les expressions de filtre.

  • type— Le type de valeur (STRING,STRINGLIST,NUMBER).

  • definition(obligatoire) — Description en langage naturel de ce que représente le champ. Soyez précis : au lieu de « La priorité », écrivez « Niveau de priorité du problème basé sur l'impact sur le client ». Les valeurs vont de critique (la plus sévère) à faible (la moins sévère). »

  • llmExtractionInstruction(facultatif) — Conseils supplémentaires sur la manière dont le LLM doit extraire ou résoudre les valeurs. Vous pouvez utiliser la fonction intégrée LATEST_VALUE (conserve la valeur la plus récente) ou fournir des instructions personnalisées en langage naturel, telles que « Classer en fonction de l'impact commercial : à utiliser en cas critical d'interruption de service affectant la production, high de dégradation des performances, de demande de fonctionnalités, medium de documentation ou low de problèmes esthétiques ».

  • validation(facultatif) — Limite la sortie du LLM à un ensemble de valeurs contrôlé. Sans validation, le LLM peut produire "High""high", ou "HIGH" pour le même concept, interrompre la correspondance des filtres.

L'exemple suivant montre une entrée de schéma de métadonnées avec validation :

{ "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"] } } } } } ] }

Options de validation par type :

Type Validation Description

STRING

stringValidation.allowedValues

Limiter à un ensemble fixe (10 valeurs maximum, chacune 256 caractères maximum, correspondance^[a-zA-Z0-9\s._:/=+@-]*$)

STRINGLIST

stringListValidation.allowedValues

Limiter les membres de la liste à un ensemble fixe (10 valeurs maximum, chacune 256 caractères maximum, correspondance^[a-zA-Z0-9\s._:/=+@-]*$)

STRINGLIST

stringListValidation.maxItems

Nombre maximum d'éléments dans la liste (1 à 5)

NUMBER

numberValidation.minValue

Valeur minimale autorisée

NUMBER

numberValidation.maxValue

Valeur maximale autorisée

Métadonnées déterministes (type d'extraction STRICTLY_CONSISTENT)

Les clés de métadonnées déterministes contiennent des valeurs que votre application connaît déjà lors de la création d'un événement. Ces valeurs sont copiées exactement dans les enregistrements de mémoire obtenus sans modification. Les classificateurs organisationnels aiment department ou ne agent_id devraient pas être déduits par le LLM. compliance_level L'inférence LLM introduit de la variabilité. Par exemple, la même conversation peut se produire "eng" sur un enregistrement et "Engineering" sur un autre.

Pour ces clés, définissez sur STRICTLY_CONSISTENT dans extractionType l'entrée du schéma de métadonnées. La valeur fournie lors de l'événement se propage telle quelle lors de l'extraction et de la consolidation. Le LLM n'est pas consulté pour cette clé.

Le JSON suivant montre un schéma de métadonnées comprenant à la fois des types LLM_INFERRED d'extraction STRICTLY_CONSISTENT et des types d'extraction :

{ "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" } } } ] }

Lorsque vous omettezextractionType, la valeur par défaut estLLM_INFERRED.

Extraction et consolidation, isolation

STRICTLY_CONSISTENTles clés ne se contentent pas d'ignorer l'inférence LLM. Ils regroupent les événements en fonction de leurs valeurs déterministes lors de l'extraction. Les événements ayant des valeurs différentes sont traités séparément. La consolidation suit la même règle. Les enregistrements d'un groupe de valeurs ne sont jamais fusionnés avec les enregistrements d'un autre groupe.

L'exemple Python suivant montre une session de support avec deux clés déterministes (departmentetpriority) :

# 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"} } )

Le système regroupe les événements selon la combinaison exacte de toutes les valeurs clés déterministes :

  • Les événements 1 et 2 se partagentdepartment=billing, priority=high. Ils sont extraits ensemble.

  • L'événement 3 diffère endepartment. Il est extrait séparément, malgré le partagepriority=high.

  • L'événement 4 diffère enpriority. Il est extrait séparément, malgré le partagedepartment=billing.

Toutes les valeurs clés déterministes doivent correspondre pour que les événements soient regroupés. Une requête avec department=billing AND priority=high renvoie uniquement les faits urgents relatifs à la double accusation. Les autres événements se trouvent dans des partitions séparées. Les enregistrements issus de différentes combinaisons de valeurs ne sont jamais fusionnés lors de la consolidation.

Constaintes

Contrainte Détail

Nombre maximum de clés déterministes par stratégie

3

Type de clé

Doit être STRING

Doit être indexé

La clé doit également être déclarée dans le indexedKeys

Non extractionConfig

STRICTLY_CONSISTENTles clés ne peuvent pas avoir deextractionConfig. La valeur provient de l'événement, et non du LLM.

Stratégies prises en charge

Stratégies sémantiques, de préférence utilisateur et épisodiques (y compris les remplacements personnalisés). Non pris en charge sur les stratégies de synthèse.

Valeurs manquantes

Si un événement arrive sans valeur pour une clé déterministe, la clé est omise du regroupement correspondant à cet événement et absente de l'enregistrement obtenu.

Important

La modification des clés configurées STRICTLY_CONSISTENT modifie le regroupement utilisé pour l'extraction et la consolidation. Les enregistrements créés dans le cadre de la configuration précédente sont isolés des enregistrements créés dans le cadre de la nouvelle configuration. Planifiez la configuration déterministe de vos clés avant d'ingérer des événements.

Comment les clés indexées et les clés de schéma interagissent

La relation entre les clés indexées et les clés de schéma détermine le comportement des métadonnées :

  • Indexé + dans le schéma — La clé est renseignée sur les enregistrements extraits par le LLM et peut être filtrée dans les expressions de requête. Il s'agit de la configuration la plus courante pour les clés que vous souhaitez à la fois extraire et filtrer.

  • Indexé + absent du schéma — La clé n'est pas renseignée sur les enregistrements lors de l'extraction pilotée par des événements. Les filtres appliqués à cette touche ne renvoient aucun résultat pour les enregistrements extraits. Pour renseigner ces clés, utilisez les API Batch (BatchCreateMemoryRecordsouBatchUpdateMemoryRecords).

  • Dans le schéma + non indexé — Le LLM extrait et renseigne la valeur sur les enregistrements, et elle est visible dans GetMemoryRecord les réponses. ListMemoryRecords Toutefois, il ne peut pas être utilisé dans les expressions de filtre. Cela est utile pour l'enrichissement du contexte : des métadonnées telles summary_notes que sentiment ou qui enrichissent l'enregistrement pour une consommation en aval sans consommer votre budget clé indexé.

Comment les métadonnées circulent des événements vers les enregistrements en mémoire

Les métadonnées de l'événement n'acceptent que stringValue les entrées. Support stringValue et numberValue types d'enregistrements en mémoire : renseignés par le LLM lors de l'extraction ou fournis directement via les API Batch. stringListValue Le dateTimeValue type est réservé aux champs générés par le système (x-amz-agentcore-memory-createdAtetx-amz-agentcore-memory-updatedAt). Seules les clés définies dans les stratégies metadataSchema sont renseignées sur les enregistrements extraits ; les clés de métadonnées des événements qui ne figurent pas dans le schéma sont ignorées. Pour les limites d'inscription, voirQuotas.

System-generated métadonnées

Chaque enregistrement de mémoire contient les champs système suivants, interrogeables avec les mêmes opérateurs de filtre :

Champ Type Description

x-amz-agentcore-memory-recordType

stringValue

Type d'enregistrement en mémoire

x-amz-agentcore-memory-createdAt

dateTimeValue

Horodatage de création de l'enregistrement

x-amz-agentcore-memory-updatedAt

dateTimeValue

Enregistrer l'horodatage de la dernière mise à jour

Il n'est pas nécessaire de les déclarer en tant que clés indexées : elles sont toujours disponibles pour le filtrage. Ces dateTimeValue champs générés par le système prennent en charge les AFTER opérateurs BEFORE et permettent d'effectuer des requêtes temporelles sans que vous ayez à déclarer des clés indexées date/heure.

Conditions préalables

Avant de configurer le filtrage des métadonnées, vérifiez que vous disposez des éléments suivants :

  • Un AWS compte autorisé à appelerCreateMemory,UpdateMemory, CreateEventListMemoryRecords,RetrieveMemoryRecords,BatchCreateMemoryRecords, et BatchUpdateMemoryRecords

  • Accès à Amazon Bedrock AgentCore

  • Une vue claire des 3 à 5 dimensions de filtre dont votre agent a le plus besoin (département, priorité, région, projet, etc.)

Étape 1 : Création d'une mémoire avec des clés indexées et un schéma de métadonnées

Ce qui suit crée une mémoire de support client avec cinq clés indexées et un schéma de métadonnées. priorityagent_type, et sentiment sont définis dans le schéma de métadonnées de la stratégie : le LLM extrait leurs valeurs du contenu de la conversation. Notez que cela sentiment figure dans le schéma mais n'est pas déclaré en tant que clé indexée : le LLM tire sa valeur des conversations et la renseigne sur des enregistrements, mais il ne peut pas être utilisé dans des expressions de filtre. tags(STRINGLIST), channel (STRING) et ticket_id (STRING) sont déclarées comme des clés indexées mais ne figurent pas dans le schéma. Elles ne sont pas renseignées lors de l'extraction pilotée par des événements mais peuvent être fournies via les 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"] } } } } } ] } } } ]'

Étape 2 : vérifier la configuration

GetMemoryÀ utiliser pour confirmer que les clés indexées et le schéma de métadonnées ont été acceptés :

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

Étape 3 : Ingérer des données avec des métadonnées

Il existe deux méthodes pour transférer les métadonnées dans les enregistrements en mémoire.

Event-driven ingestion

Attachez stringValue des métadonnées aux événements au moment de leur création. Le LLM utilise le schéma de métadonnées de la stratégie pour extraire et renseigner les métadonnées sur les enregistrements de mémoire obtenus. Seules les clés définies dans les stratégies metadataSchema sont renseignées sur les enregistrements obtenus ; les clés de métadonnées d'événements qui ne figurent pas dans le schéma sont ignorées lors de l'extraction.

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."}}} ]'

Dans cet exemple, priority se trouve dans celui de la stratégiemetadataSchema, de sorte que sa valeur se propage à l'enregistrement en mémoire. channelet ne ticket_id figurent pas dans le schéma, ils sont donc ignorés lors de l'extraction. Le LLM déduit également agent_type (probablement en "specialist" fonction de l'escalade) et sentiment (probablement"frustrated") à partir du contenu de la conversation : ces clés de schéma sont renseignées même si elles n'ont pas été fournies sous forme de métadonnées d'événement.

Extraction de métadonnées implicites à partir du contenu d'une conversation

Les métadonnées des événements ne sont pas requises pour que les clés de schéma produisent des valeurs. Lorsqu'une clé de schéma ne possède aucune métadonnée correspondante sur les événements d'origine, le LLM déduit la valeur entièrement du contenu de la conversation. Il utilise les clés definition et llmExtractionInstruction pour déterminer la valeur. Cela est utile pour les dimensions qui n'existent que dans la conversation elle-même, sans que les appelants aient à les fournir au moment de la création de l'événement.

En utilisant la même mémoire de support client que lors de l'étape 1, l'événement suivant n'a aucune métadonnée :

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."}}} ]'

Le LLM analyse le contenu de la conversation et remplit les trois clés de schéma de l'enregistrement mémoire extrait —priority,agent_type, et sentiment — même si aucune n'a été fournie sous forme de métadonnées d'événement :

{ "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"} } }

Les règles de validation s'appliquent toujours : la sortie du LLM est limitée aux valeurs autorisées que vous avez spécifiées, que la valeur provienne de métadonnées d'événements ou d'une inférence de contenu.

Comment le LLM résout les conflits liés aux événements

Lorsque plusieurs événements d'une session portent des valeurs différentes pour la même clé de métadonnées, le LLM utilise lellmExtractionInstruction. Cela détermine la valeur à conserver dans l'enregistrement mémoire obtenu.

Imaginons, par exemple, une session d'assistance au cours de laquelle le premier événement a priority: "low" atteint le stade. priority: "critical" Le LLM résout ce problème en fonction de l'instruction suivante :

  • LATEST_VALUE(intégré) — Le LLM conserve la valeur la plus récente. Dans ce cas, l'enregistrement en mémoire obtientpriority: "critical".

  • Instructions personnalisées — Vous pouvez exprimer une logique spécifique à un domaine. Par exemple, « Conserver la gravité la plus élevée signalée pendant la session » produirait également"critical", mais pour une autre raison : il s'agit de la gravité la plus élevée, et pas seulement de la plus récente.

Autre exemple : pour agent_type l'instruction « Préférez le type d'agent le plus spécialisé ». Hiérarchie : spécialiste > niveau 3 > niveau 2 > niveau 1 > bot ». Si une session commence par un bot et passe à un agent de niveau 2, l'enregistrement mémoire est enregistré. agent_type: "tier2"

Ingestion déterministe des métadonnées

Les clés configurées STRICTLY_CONSISTENT suivent un chemin d'ingestion différent. La valeur que vous fournissez lors de l'événement est la valeur qui apparaît sur l'enregistrement obtenu. Il n'y a pas d'inférence LLM ni de résolution de conflits.

AgentCore La mémoire regroupe les événements en fonction de leurs valeurs clés déterministes avant l'extraction. Par exemple, les événements balisés department: "engineering" sont traités séparément des événements balisésdepartment: "finance".

La consolidation fonctionne au sein de ces groupes. Un enregistrement qui compliance_level: "hipaa" ne fusionne jamais avec un enregistrement étiquetécompliance_level: "standard". Les clés déterministes sont donc idéales pour :

  • Isolation en matière de conformité : les dossiers présentant des niveaux de conformité différents ne se mélangent jamais.

  • Routage organisationnel - Department-scoped récupération sans contamination croisée.

  • Multi-tenant sous-filtrage : Tenant-specific attributs préservés exactement tels qu'ils ont été fournis.

Si un événement n'a aucune valeur pour une clé déterministe, la clé est absente de l'enregistrement obtenu.

Les chemins d'écriture directe (BatchCreateMemoryRecordsetBatchUpdateMemoryRecords) contournent l'extraction. Le type STRICTLY_CONSISTENT d'extraction n'a aucun effet sur eux. Fournissez des métadonnées directement, comme vous le faites déjà pour ces API.

Création directe d'enregistrements avec les API Batch

Pour les importations de bases de connaissances, les stratégies autogérées ou le contenu prétraité, utilisez BatchCreateMemoryRecords (ouBatchUpdateMemoryRecords) pour fournir des métadonnées de manière explicite. Cela permet de contourner complètement l'extraction du LLM : l'appelant contrôle les valeurs des métadonnées.

La façon dont les métadonnées sont gérées sur les enregistrements créés par lots dépend de la fourniture ou non d'un : memoryStrategyId

  • Avec memoryStrategyId : le service filtre les métadonnées d'entrée par rapport à celles de cette stratégiememoryRecordSchema. Seules les clés définies dans le schéma sont stockées dans l'enregistrement. Toutes les autres clés, y compris les clés indexées ne figurant pas dans le schéma, sont supprimées silencieusement. Cela garantit une cohérence renforcée par le schéma, en garantissant que les enregistrements créés par lots ont la même forme de métadonnées que les enregistrements produits par extraction pilotée par des événements.

  • Sans memoryStrategyId : le service stocke toutes les clés de métadonnées dans la charge utile telles quelles sur l'enregistrement. Cela inclut les clés indexées, les clés figurant dans un schéma de stratégie et les clés qui ne sont ni l'une ni l'autre. Cependant, seules les clés indexées sont filtrables. Toute tentative de filtrage sur une clé non indexée renvoie un. ValidationException Non-indexed les touches sont toujours visibles dans GetMemoryRecord les ListMemoryRecords réponses.

L'exemple suivant crée un enregistrement sans memoryStrategyId stocker toutes les métadonnées fournies :

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"} } }]'

Pour renforcer la cohérence du schéma, incluez lememoryStrategyId. Dans ce cas, seules les clés présentes dans cette stratégie memoryRecordSchema sont conservées :

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"} } }]'

Dans le second exemple, si le schéma de la stratégie définit uniquement priority agent_typesentiment, puis channel est supprimé silencieusement de l'enregistrement stocké.

Mise à jour des enregistrements avec BatchUpdateMemoryRecords

BatchUpdateMemoryRecordssuit le même comportement de filtrage memoryStrategyId des métadonnées queBatchCreateMemoryRecords. L'exemple suivant met à jour le contenu et les métadonnées d'un enregistrement existant :

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"} } }]'

Étape 4 : Requête à l'aide de filtres de métadonnées

Les filtres de métadonnées sont appliqués avant l'exécution de la recherche de similarité vectorielle (préfiltrage). Cela réduit le nombre de candidats sélectionnés en premier. Par conséquent, la recherche de K-nearest voisins (KNN) fonctionne sur un sous-ensemble plus petit et plus pertinent.

Structure Filtre

Chaque filtre est une { left, operator, right } expression :

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

Jusqu'à 5 filtres peuvent être combinés par requête. Plusieurs filtres sont appliqués de manière AND logique.

Opérateurs pris en charge

Opérateur La bonne valeur est requise Fonctionne avec Description

EQUALS_TO

Oui

CHAÎNE, NOMBRE

Correspondance exacte.

CONTAINS

Oui

LISTE DE CHAÎNES

Renvoie les enregistrements où un élément de la STRINGLIST contient la chaîne donnée comme une correspondance exacte.

EXISTS

Non

Tous les types

La clé est présente sur le dossier

NOT_EXISTS

Non

Tous les types

La clé est absente de l'enregistrement

GREATER_THAN

Oui (numberValue)

NOMBRE

Comparaison numérique supérieure à

GREATER_THAN_OR_EQUALS

Oui (numberValue)

NOMBRE

Comparaison numérique supérieure ou égale

LESS_THAN

Oui (numberValue)

NOMBRE

Comparaison numérique inférieure à

LESS_THAN_OR_EQUALS

Oui (numberValue)

NOMBRE

Comparaison numérique inférieure ou égale

BEFORE

Oui (dateTimeValue)

date TimeValue

L'horodatage est antérieur à la valeur donnée

AFTER

Oui (dateTimeValue)

date TimeValue

L'horodatage se situe après la valeur donnée

Remarque : les métadonnées des événements ListEvents filtrent uniquement sur support EXISTSNOT_EXISTS, etEQUALS_TO, et uniquementstringValue.

Récupération à l'aide de filtres de métadonnées (recherche sémantique + préfiltre)

ActivéRetrieveMemoryRecords, metadataFilters est imbriqué à l'intérieursearchCriteria. L'exemple suivant étend les résultats aux enregistrements hautement prioritaires de l'année en cours avant que la recherche sémantique ne corresponde à des « problèmes de facturation » :

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 combinaison d'un filtre de métadonnées personnalisé avec un horodatage généré par le système permet de compacter l'ensemble de candidats selon deux dimensions (priorité commerciale et récence) avant que la recherche de similarité ne soit lancée.

Liste avec filtres de métadonnées (pas de recherche sémantique)

ListMemoryRecordsfournit un filtrage des métadonnées sans recherche sémantique. Cela est utile lorsque vous devez énumérer des enregistrements répondant à des critères de métadonnées spécifiques, par exemple, répertorier tous les enregistrements hautement prioritaires pour un client ou extraire tous les enregistrements créés après une date précise.

ActivéListMemoryRecords, metadataFilters il s'agit d'un paramètre de premier niveau :

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"}} } ]'

Combinaison de plusieurs filtres

Cette requête porte sur les discussions sur les actions du troisième trimestre 2026 au sein d'un espace de noms client spécifique :

{ "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"}} } ] }

Les valeurs de filtre pour les horodatages doivent être au format UTC (format ISO 8601). Le service normalise tous les horodatages enregistrés en UTC avant la comparaison. Exprimez donc toujours les valeurs des filtres en UTC.

Étape 5 : Faites évoluer votre schéma de métadonnées

AgentCore La mémoire prend en charge l'évolution du schéma afin que vous puissiez adapter la configuration de vos métadonnées en fonction de l'évolution de vos besoins.

Ajouter des clés indexées

Vous pouvez ajouter de nouvelles clés indexées à une mémoire à tout moment :

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

Les nouvelles clés sont immédiatement disponibles pour les événements entrants et les enregistrements en mémoire. Les enregistrements existants ne sont pas complétés : seuls les enregistrements nouveaux ou mis à jour portent la nouvelle clé. Vous ne pouvez pas supprimer une clé précédemment indexée, ce qui empêche la perte accidentelle de la capacité de filtrage des données existantes.

Modifier le schéma de métadonnées d'une stratégie

Vous pouvez librement ajouter, supprimer ou mettre à jour des entrées dans le schéma de métadonnées d'une stratégie. Cela contrôle les métadonnées que le LLM extrait des conversations à l'avenir.

Par exemple, pour ajouter un nouveau resolution_type champ à une stratégie existante :

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"] } } } } } ] } } ] }'

Vous pouvez également supprimer une clé du schéma de métadonnées d'une stratégie si vous ne souhaitez plus que le LLM extrait ce champ. La suppression d'une entrée de schéma arrête l'extraction pour les nouveaux enregistrements mais n'affecte pas les métadonnées déjà présentes dans les enregistrements existants.

Les enregistrements de mémoire existants ne reçoivent pas de nouveaux LLM-extracted champs rétroactivement. Toutefois, lorsque les anciennes mémoires sont consolidées avec des mémoires plus récentes au cours du cycle de vie normal de la mémoire, l'enregistrement consolidé est réextrait à l'aide du schéma actuel et inclut les nouveaux champs de métadonnées.

Quotas

Ressource Limite

Clés indexées par mémoire

10

Clés STRICTLY_CONSISTENT par stratégie

3

Entrées de schéma de métadonnées par stratégie

20

Entrées de métadonnées des enregistrements en mémoire (fournies par l'utilisateur)

20

Filtres par requête

5

allowedValuespar règle de validation

10

maxItemspour STRINGLIST validation

5

definition/llmExtractionInstructionlongueur

1000 caractères chacun

Longueur de la clé des métadonnées

128 caractères

stringValuelongueur

256 caractères

durée pour les STRINGLIST membres

64 caractères

Bonnes pratiques

  • Commencez par 3 à 5 dimensions de filtre qui ont un impact direct sur la qualité de récupération. Chaque champ indexé consomme de la capacité de l'infrastructure de stockage, ce que reflète la limite des 10 touches. Commencez par trois à cinq clés qui ont un impact direct sur la qualité de la récupération, et ajoutez-en d'autres au fur et à mesure que des besoins concrets se présentent.

  • Écrivez des definition chaînes claires et spécifiques. definitionDécrit ce que représente le champ. Au lieu de « La priorité du ticket », écrivez « Niveau de priorité du problème en fonction de l'impact sur le client ». Les valeurs vont de critique (la plus sévère) à faible (la moins sévère). » À utiliser llmExtractionInstruction pour une logique d'extraction détaillée.

  • Contraindre la sortie LLM avec. validation.allowedValues Sans validation, le LLM peut produire "High""high", ou "HIGH" pour le même concept, interrompre la correspondance des filtres.

  • Choisissez des règles de résolution des conflits qui correspondent à la sémantique du domaine. LATEST_VALUEest une valeur par défaut sûre, mais pour les champs tels que agent_type dans un flux de travail d'escalade, une instruction personnalisée qui conserve la valeur la plus élevée est plus correcte.

  • Préférez le parcours événementiel pour le contenu conversationnel. Laissez le LLM s'occuper de l'extraction et de la résolution des conflits. Réservez les API Batch pour les importations groupées lorsque vous connaissez déjà les valeurs de métadonnées correctes.

  • Planifiez des schémas au niveau de la stratégie. Chaque stratégie peut avoir la siennemetadataSchema, ce qui permet à différentes stratégies d'extraire et de gérer différemment les mêmes clés. Une stratégie sémantique peut utiliser des instructions d'extraction personnalisées pour classer la priorité à partir du contexte de conversation, tandis qu'une stratégie de synthèse peut utiliser une définition différente adaptée aux métadonnées spécifiques à la synthèse.

  • Soyez intentionnel avec memoryStrategyId aucun enregistrement créé par lots. Lorsque vous incluezmemoryStrategyId, le service filtre les métadonnées d'entrée uniquement sur les clés du schéma de cette stratégie ; toutes les autres clés sont supprimées silencieusement. Lorsque vous l'omettez, toutes les métadonnées de la charge utile sont stockées telles quelles. Choisissez en fonction de votre cas d'utilisation : cohérence imposée par le schéma pour les enregistrements qui doivent correspondre aux enregistrements produits par extraction, ou contrôle total pour les importations en masse lorsque vous gérez les métadonnées en externe.

  • Utilisez des clés de schéma non indexées pour enrichir le contexte. Il n'est pas nécessaire que toutes les clés de métadonnées soient filtrables. Les clés de schéma qui ne sont pas déclarées comme clés indexées sont toujours renseignées sur les enregistrements extraits et visibles dans les get/list réponses. Elles ne peuvent tout simplement pas être utilisées dans les expressions de filtre. Cela est utile pour les métadonnées telles summary_notes que sentiment ou qui enrichissent l'enregistrement pour une consommation en aval sans consommer votre budget clé indexé.

  • Utilisez l'extraction déterministe pour les valeurs que vous connaissez déjà. Certaines clés représentent des attributs organisationnels fixes tels que departmenttenant_tier, oucompliance_scope. Si l'application possède ces valeurs au moment de la création de l'événement, configurez-les comme suitSTRICTLY_CONSISTENT. Indiquez la valeur de chaque événement. Cela garantit des valeurs exactes sur les enregistrements et supprime les représentations incohérentes (telles que "eng" vs."Engineering") que l'extraction LLM peut introduire. Réservez LLM_INFERRED les dimensions qui doivent être déduites du contenu de la conversation, comme le sentiment ou le sujet.

  • Planifiez tôt les emplacements pour clés déterministes. Chaque STRICTLY_CONSISTENT clé utilise l'un des 10 emplacements pour clés indexées. Les clés indexées ne peuvent pas être supprimées une fois ajoutées. Réservez des emplacements si vous prévoyez d'utiliser des métadonnées déterministes.

Anti-patterns pour éviter

  • N'indexez pas les champs de texte libre à cardinalité élevée, tels que les descriptions ou les noms complets, car ils alourdissent l'index sans créer de limites de filtre utiles.

  • N'utilisez pas de métadonnées pour des valeurs qui changent à chaque interaction. Les métadonnées sont particulièrement efficaces pour les attributs stables ou qui changent lentement.

  • Ne vous fiez pas uniquement aux métadonnées pour isoler les locataires. Un champ de tenant_id métadonnées sans isolation d'espace de noms est un modèle de sécurité basé sur des conventions qui interrompt tout filtre oublié. Utilisez des espaces de noms pour lewho, et des métadonnées pour le whatwhen, ethow urgent.

  • N'utilisez pas l'extraction LLM pour des valeurs qui doivent être exactes. Si une clé doit porter une valeur spécifique connue (comme department outicket_id), utilisez l'STRICTLY_CONSISTENTextraction ou fournissez-la via les API Batch. L'extraction du LLM peut produire des variantes du même concept.