View a markdown version of this page

Metadatos estructurados para memorias a largo plazo - Base amazónica AgentCore

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Metadatos estructurados para memorias a largo plazo

El filtrado de metadatos de Amazon Bedrock AgentCore Memory le permite añadir atributos estructurados a sus registros de memoria a largo plazo. Puede usar esos atributos para restringir los registros que se devuelven durante la recuperación. Los espacios de nombres ya aíslan las memorias por entidad principal (usuario, inquilino, paciente, cliente). Sin embargo, dentro de un único espacio de nombres, una búsqueda semántica amplia devuelve todo lo que tiene un significado similar. Con el filtrado de metadatos, solo puedes recuperar los resultados que coincidan con valores de atributos específicos. Por ejemplo, puede recuperar solo los registros de alta prioridad, solo los registros de un departamento en particular o solo los registros creados dentro de un intervalo de tiempo determinado.

Con el filtrado de metadatos, puede:

  • Recuperación del alcance por dimensiones empresariales (prioridad, departamento, canal, intervalo de tiempo) dentro de un espacio de nombres

  • Adjunte metadatos estructurados a los eventos y los registros de memoria en el momento de la creación

  • Haga que el modelo de lenguaje de gran tamaño (LLM) extraiga automáticamente los metadatos del contenido conversacional durante la ingesta de memoria

  • Restrinja LLM-extracted los valores a valores específicos para lograr un filtrado uniforme

  • Combine hasta 5 filtros por consulta en RetrieveMemoryRecords oListMemoryRecords, aplicados con lógica AND

  • Filtre según las marcas de tiempo generadas por el sistema (x-amz-agentcore-memory-createdAt,x-amz-agentcore-memory-updatedAt) sin declarar claves indexadas adicionales

Introducción

La configuración del filtrado de metadatos implica cinco pasos:

  1. Cree su memoria con claves indexadas y un esquema de metadatos:

    • Claves indexadas: CreateMemory utilízalas (oUpdateMemory) para declarar las claves de metadatos por las que quieres filtrar (por ejemplo,, prioritychannel,tags). Puedes declarar hasta 10 claves indexadas por memoria. Las claves indexadas definen qué atributos se pueden consultar en las expresiones de filtro. Una vez que se agrega una clave indexada, no se puede eliminar.

    • Esquema de metadatos: metadataSchema defina una estrategia para controlar cómo el LLM extrae los valores de las conversaciones. El esquema especifica qué claves extraer, cómo resolver los conflictos entre eventos y qué restricciones de validación se deben aplicar. Un esquema de metadatos es opcional; las estrategias sin uno no extraen los metadatos.

  2. Verifique la configuración: utilícelo GetMemory para confirmar que las claves indexadas y los esquemas de metadatos de la estrategia están configurados correctamente.

  3. Agregue metadatos durante la ingestión: envíe eventos o envíe contenido directamente con metadatos opcionalesIngestData, o suministre los metadatos directamente a los registros utilizandoCreateEvent. BatchCreateMemoryRecords Para la ingestión (CreateEventyIngestData) basada en la extracción, el LLM extrae y rellena automáticamente los metadatos de los registros de memoria resultantes. Esta extracción se basa en el esquema de metadatos de la estrategia y en el contenido enviado, incluso cuando no se adjunte ningún metadato.

  4. Consulta con filtros de metadatos: utilízala metadataFilters activada RetrieveMemoryRecords (búsqueda semántica con prefiltrado) o ListMemoryRecords (filtrado solo de metadatos) para determinar el alcance de los resultados.

  5. Haga evolucionar su esquema con el tiempo: añada nuevas claves indexadas o modifique los esquemas de metadatos de la estrategia a medida que aumenten sus necesidades de filtrado.

En las secciones siguientes se describe cada paso en detalle.

Conceptos clave

Claves de metadatos indexadas

Las claves indexadas se declaran a nivel de recurso de memoria en CreateMemory (o se agregan más adelante). UpdateMemory Las claves indexadas se almacenan en un formato optimizado para un filtrado rápido de las consultas. Solo se pueden consultar las claves indexadas en y. metadataFilters ListMemoryRecords RetrieveMemoryRecords

En el siguiente ejemplo, se declaran dos claves indexadas:

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

typeValores admitidos:STRING,STRINGLIST,NUMBER.

Las claves deben coincidir ^[a-zA-Z0-9\s._:/=+@-]*$ (máximo 128 caracteres).

La adición de una clave indexada no rellena los registros existentes. Solo los registros creados o actualizados después de declarar la clave se indexan para esa clave. Para obtener más información sobre la evolución de su esquema a lo largo del tiempo, consultePaso 5: Evoluciona tu esquema de metadatos.

Esquema de metadatos (por estrategia)

La estrategia de memoria puede tener, de forma opcional, un esquema de metadatos declarado enmemoryRecordSchema.metadataSchema. El esquema de metadatos indica al LLM qué metadatos extraer del contenido conversacional al generar registros de memoria. Durante la extracción basada en eventos, solo las claves definidas en el esquema de metadatos de la estrategia se rellenan en los registros de memoria resultantes.

Cada entrada del esquema define:

  • key— El nombre de la clave de metadatos. Si esta clave también se declara como clave indexada, el valor extraído se puede filtrar. Si no se trata de una clave indexada, el valor sigue rellenándose en el registro y es visible en las ListMemoryRecords respuestas GetMemoryRecord y, sin embargo, no se puede usar en las expresiones de filtro.

  • type— El tipo de valor (STRING,STRINGLIST,NUMBER).

  • definition(obligatorio): una descripción en lenguaje natural de lo que representa el campo. Sé específico: en lugar de «La prioridad», escribe «El nivel de prioridad del problema» en función del impacto en los clientes. Los valores van desde críticos (los más graves) hasta bajos (los menos graves)».

  • llmExtractionInstruction(opcional): orientación adicional sobre cómo el LLM debe extraer o resolver los valores. Puedes usar la opción integrada LATEST_VALUE (conserva el valor más reciente) o dar instrucciones personalizadas en lenguaje natural, como «Clasifica en función del impacto empresarial: critical úsalo en caso de interrupciones del servicio que afecten a la producción, en caso de disminución del rendimiento, high medium de solicitudes de funciones o de documentación o problemas low estéticos».

  • validation(opcional): restringe la salida del LLM a un conjunto controlado de valores. Sin validación, el LLM puede producir"High", o "HIGH" para el mismo concepto"high", romper la coincidencia de filtros.

El siguiente ejemplo muestra una entrada de esquema de metadatos con validación:

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

Opciones de validación por tipo:

Tipo Validación Description (Descripción)

STRING

stringValidation.allowedValues

Restringir a un conjunto fijo (máximo de 10 valores, 256 caracteres como máximo cada uno, coincidentes^[a-zA-Z0-9\s._:/=+@-]*$)

STRINGLIST

stringListValidation.allowedValues

Restringir los miembros de la lista a un conjunto fijo (máximo de 10 valores, 256 caracteres cada uno, coincidencia) ^[a-zA-Z0-9\s._:/=+@-]*$

STRINGLIST

stringListValidation.maxItems

Número máximo de elementos de la lista (de 1 a 5)

NUMBER

numberValidation.minValue

Valor mínimo permitido

NUMBER

numberValidation.maxValue

Valor máximo permitido

Metadatos deterministas (tipo de extracción STRICTLY_CONSISTENT)

Las claves de metadatos deterministas contienen valores que la aplicación ya conoce al crear un evento. Estos valores se copian exactamente en los registros de memoria resultantes sin modificarlos. Los clasificadores organizacionales son similares department o no agent_id deberían inferirse del LLM. compliance_level La inferencia del LLM introduce variabilidad. Por ejemplo, la misma conversación puede producirse "eng" en un registro y "Engineering" en otro.

Para estas claves, extractionType establézcalas STRICTLY_CONSISTENT en en la entrada del esquema de metadatos. El valor proporcionado en el evento se propaga sin cambios durante la extracción y la consolidación. No se consulta al LLM para obtener esa clave.

El siguiente JSON muestra un esquema de metadatos con ambos tipos STRICTLY_CONSISTENT de LLM_INFERRED extracción:

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

Cuando se omiteextractionType, el valor predeterminado esLLM_INFERRED.

Aislamiento de extracción y consolidación

STRICTLY_CONSISTENTlas claves hacen más que omitir la inferencia de un LLM. Agrupan los eventos por sus valores deterministas durante la extracción. Los eventos con valores diferentes se procesan por separado. La consolidación sigue la misma regla. Los registros de un grupo de valores nunca se combinan con los registros de otro grupo.

El siguiente ejemplo de Python muestra una sesión de soporte con dos claves deterministas (departmentypriority):

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

El sistema agrupa los eventos según la combinación exacta de todos los valores clave deterministas:

  • Los eventos 1 y 2 compartendepartment=billing, priority=high. Se extraen juntos.

  • El evento 3 difiere endepartment. Se extrae por separado, a pesar de compartirlopriority=high.

  • El evento 4 difiere enpriority. Se extrae por separado, a pesar de compartirlodepartment=billing.

Todos los valores clave deterministas deben coincidir para que los eventos se agrupen. Una consulta con department=billing AND solo priority=high devuelve los datos urgentes de los cargos duplicados. Los demás eventos están en particiones separadas. Los registros de diferentes combinaciones de valores nunca se combinan durante la consolidación.

Restricciones

Restricción Detalle

Número máximo de claves deterministas por estrategia

3

Tipo de clave

Debe ser STRING

Debe estar indexado

La clave también debe declararse en la memoria indexedKeys

No extractionConfig

STRICTLY_CONSISTENTlas llaves no pueden tener unextractionConfig. El valor proviene del evento, no del LLM.

Estrategias compatibles

Estrategias semánticas, de preferencias del usuario y episódicas (incluidas las anulaciones personalizadas). No se admite en estrategias resumidas.

Valores faltantes

Si un evento llega sin un valor para una clave determinista, la clave se omite en la agrupación de ese evento y no aparece en el registro resultante.

importante

Si se cambia la forma en que se configuran las claves, se STRICTLY_CONSISTENT cambia la agrupación utilizada para la extracción y la consolidación. Los registros creados con la configuración anterior se aíslan de los registros creados con la nueva configuración. Planifique la configuración de claves deterministas antes de ingerir eventos.

Cómo interactúan las claves indexadas y las claves de esquema

La relación entre las claves indexadas y las claves de esquema determina el comportamiento de los metadatos:

  • Indexado (+) en el esquema: la clave se rellena en los registros extraídos por el LLM y se puede filtrar en las expresiones de consulta. Esta es la configuración más común para las claves que desea extraer y filtrar.

  • Indexada o no está en el esquema: la clave no se rellena en los registros durante la extracción basada en eventos. Los filtros de esta clave no devuelven ningún resultado para los registros extraídos. Para rellenar estas claves, usa las API de Batch (BatchCreateMemoryRecordsoBatchUpdateMemoryRecords).

  • En el esquema + no está indexado: el LLM extrae y rellena el valor de los registros, y está visible en las respuestas. GetMemoryRecord ListMemoryRecords Sin embargo, no se puede usar en expresiones de filtro. Esto es útil para enriquecer el contexto, es decir, metadatos similares sentiment o summary_notes que enriquecen el registro para el consumo posterior sin consumir el presupuesto clave indexado.

Cómo fluyen los metadatos de los eventos a los registros de memoria

Los metadatos de los eventos solo aceptan stringValue entradas. Los registros stringValuestringListValue, el soporte y los numberValue tipos de memoria los rellena el LLM durante la extracción o los suministra directamente a través de las API de procesamiento por lotes. El dateTimeValue tipo está reservado para los campos generados por el sistema (x-amz-agentcore-memory-createdAty). x-amz-agentcore-memory-updatedAt En los registros extraídos solo se metadataSchema rellenan las claves definidas en la estrategia; las claves de metadatos de los eventos que no figuran en el esquema se ignoran. Para conocer los límites de entrada, consulteCuotas.

System-generated metadatos

Todos los registros de memoria contienen los siguientes campos del sistema, que se pueden consultar con los mismos operadores de filtro:

Campo Tipo Description (Descripción)

x-amz-agentcore-memory-recordType

stringValue

El tipo de registro de memoria

x-amz-agentcore-memory-createdAt

dateTimeValue

Marca de tiempo de creación del registro

x-amz-agentcore-memory-updatedAt

dateTimeValue

Registra la marca de tiempo de la última actualización

No es necesario declararlas como claves indexadas, ya que siempre están disponibles para filtrarlas. Estos dateTimeValue campos generados por el sistema admiten AFTER operadores tipo BEFORE Y, por lo tanto, permiten realizar consultas por intervalos de tiempo sin necesidad de declarar claves indexadas de fecha y hora.

Requisitos previos

Antes de configurar el filtrado de metadatos, compruebe que tiene:

  • Una AWS cuenta con permisos para llamar a CreateMemory UpdateMemoryCreateEvent,IngestData,ListMemoryRecords,RetrieveMemoryRecords,BatchCreateMemoryRecords, y BatchUpdateMemoryRecords

  • Acceso a Amazon Bedrock AgentCore

  • Una visión clara de las 3 a 5 dimensiones del filtro que más necesita su agente (departamento, prioridad, región, proyecto, etc.)

Paso 1: Cree una memoria con claves indexadas y un esquema de metadatos

A continuación, se crea una memoria de soporte al cliente con cinco claves indexadas y un esquema de metadatos. priorityagent_type, y sentiment se definen en el esquema de metadatos de la estrategia: el LLM extrae sus valores del contenido de la conversación. Tenga en cuenta que sentiment está en el esquema pero no se declara como una clave indexada: el LLM obtiene su valor de las conversaciones y lo rellena en los registros, pero no se puede usar en expresiones de filtro. tags(STRINGLIST), channel (STRING) y ticket_id (STRING) se declaran como claves indexadas, pero no están en el esquema; no se rellenan durante la extracción basada en eventos, sino que se pueden proporcionar mediante las API por lotes.

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

Paso 2: Verificar la configuración

GetMemoryUtilícelo para confirmar que se han aceptado las claves indexadas y el esquema de metadatos:

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

Paso 3: Agregue metadatos durante la ingestión

Hay dos maneras de incorporar los metadatos a los registros de memoria. En el caso de la ingestión (CreateEventoIngestData) basada en la extracción, el LLM rellena los metadatos de los registros que extrae. Con la creación directa de registros (BatchCreateMemoryRecordsoBatchUpdateMemoryRecords), los metadatos se suministran de forma explícita.

Event-driven ingestión

Adjunte stringValue metadatos a los eventos en el momento de la creación. El LLM utiliza el esquema de metadatos de la estrategia para extraer y completar los metadatos de los registros de memoria resultantes. En los registros resultantes solo se metadataSchema rellenan las claves definidas en la estrategia; las claves de metadatos de los eventos que no figuran en el esquema se ignoran durante la extracción.

nota

IngestDataacepta las mismas metadata y alimenta la misma canalización de extracción, por lo que los metadatos se comportan de forma idéntica a. CreateEvent La diferencia es que no IngestData retiene un evento a corto plazo.

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

En este ejemplo, priority está en la estrategiametadataSchema, por lo que su valor se propaga al registro de memoria. channely no ticket_id están en el esquema, por lo que se ignoran durante la extracción. El LLM también deduce agent_type (probablemente "specialist" basándose en el escalamiento) y sentiment (probablemente"frustrated") del contenido de la conversación: estas claves de esquema se rellenan aunque no se hayan proporcionado como metadatos del evento.

Extracción implícita de metadatos del contenido de la conversación

Los metadatos de los eventos no son necesarios para que las claves de esquema generen valores. Cuando una clave de esquema no tiene metadatos coincidentes en los eventos de origen, el LLM obtiene el valor por completo del contenido de la conversación. Utiliza las claves definition y llmExtractionInstruction para determinar el valor. Esto es útil para las dimensiones que solo existen en la conversación en sí, sin necesidad de que las personas que llaman las proporcionen en el momento de crear el evento.

Al utilizar la misma memoria de atención al cliente utilizada en el paso 1, el siguiente evento no contiene ningún tipo de metadatos:

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

El LLM analiza el contenido de la conversación y rellena las tres claves de esquema del registro de memoria extraído (priority, y)agent_type, aunque no se proporcionó ninguna como metadato del 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"} } }

Las reglas de validación aún se aplican: los resultados del LLM se limitan a los valores permitidos que especifiques, independientemente de si el valor proviene de los metadatos del evento o de la inferencia del contenido.

Cómo resuelve el LLM los conflictos entre eventos

Cuando varios eventos de una sesión contienen valores diferentes para la misma clave de metadatos, el LLM utiliza el. llmExtractionInstruction Esto determina qué valor se debe conservar en el registro de memoria resultante.

Por ejemplo, piense en una sesión de soporte en la que el primer evento tenga lugar priority: "low" y otro posterior se intensifique. priority: "critical" El LLM resuelve este problema basándose en la siguiente instrucción:

  • LATEST_VALUE(integrado): el LLM conserva el valor más reciente. En este caso, el registro de memoria se quedapriority: "critical".

  • Instrucciones personalizadas: puede expresar la lógica específica de un dominio. Por ejemplo, la frase «Mantener informada de la gravedad más alta durante la sesión» también sería buena"critical", pero por otro motivo: se trata de la gravedad más alta, no solo de la más reciente.

Otro ejemplo: agent_type con la instrucción «Prefiere el tipo de agente más especializado». Jerarquía: especialista > nivel 3 > nivel 2 > nivel 1 > bot». Si una sesión comienza con un bot y se convierte en un agente de nivel 2, se conserva el registro de memoria. agent_type: "tier2"

Ingestión determinista de metadatos

Las claves configuradas para STRICTLY_CONSISTENT seguir una ruta de ingesta diferente. El valor que proporciones en el evento es el valor que aparece en el registro resultante. No hay ninguna inferencia de LLM ni resolución de conflictos.

AgentCore La memoria agrupa los eventos según sus valores clave deterministas antes de la extracción. Por ejemplo, los eventos etiquetados department: "engineering" se procesan por separado de los eventos etiquetadosdepartment: "finance".

La consolidación opera dentro de estos grupos. Un registro que compliance_level: "hipaa" nunca se fusiona con un registro etiquetadocompliance_level: "standard". Esto hace que las claves deterministas sean ideales para:

  • Aislamiento del cumplimiento: los registros con diferentes niveles de cumplimiento nunca se mezclan.

  • Enrutamiento organizacional: Department-scoped recuperación sin contaminación cruzada.

  • Multi-tenant subfiltrado: los Tenant-specific atributos se conservan exactamente como se suministraron.

Si un evento no tiene ningún valor para una clave determinista, la clave no aparece en el registro resultante.

Las rutas de escritura directa (BatchCreateMemoryRecordsyBatchUpdateMemoryRecords) evitan la extracción. El tipo STRICTLY_CONSISTENT de extracción no tiene ningún efecto sobre ellas. Proporcione los metadatos directamente como ya lo hace para esas API.

Creación directa de registros con las API por lotes

En el caso de las importaciones de bases de conocimiento, las estrategias de autogestión o el contenido preprocesado, utilice BatchCreateMemoryRecords (oBatchUpdateMemoryRecords) para proporcionar metadatos de forma explícita. Esto evita por completo la extracción de LLM: la persona que llama controla los valores de los metadatos.

La forma en que se gestionan los metadatos en los registros creados por lotes depende de si se proporciona un: memoryStrategyId

  • Con memoryStrategyId: el servicio filtra los metadatos de entrada comparándolos con los de esa estrategia. memoryRecordSchema En el registro solo se almacenan las claves definidas en el esquema. Todas las demás claves, incluidas las claves indexadas que no están en el esquema, se eliminan de forma silenciosa. De este modo, se consigue la coherencia impuesta por el esquema y se garantiza que los registros creados por lotes tengan la misma forma de metadatos que los registros producidos mediante la extracción basada en eventos.

  • Sin memoryStrategyId: el servicio almacena todas las claves de metadatos en la carga útil tal como están en el registro. Esto incluye las claves que están indexadas, las claves que están en un esquema de estrategia y las claves que no lo están. Sin embargo, solo se pueden filtrar las claves indexadas; al intentar filtrar por una clave no indexada, se devuelve un. ValidationException Non-indexed las claves siguen siendo visibles en y en las respuestas. GetMemoryRecord ListMemoryRecords

En el siguiente ejemplomemoryStrategyId, se crea un registro sin almacenar todos los metadatos proporcionados:

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

Para garantizar la coherencia del esquema, incluyamemoryStrategyId. En este caso, solo se conservan las claves presentes en esa estrategia: memoryRecordSchema

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

En el segundo ejemplo, si el esquema de la estrategia solo define y priority agent_typesentiment, luego channel se elimina silenciosamente del registro almacenado.

Actualización de registros con BatchUpdateMemoryRecords

BatchUpdateMemoryRecordssigue el mismo comportamiento de filtrado de memoryStrategyId metadatos queBatchCreateMemoryRecords. El siguiente ejemplo actualiza el contenido y los metadatos de un registro existente:

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

Paso 4: Consulta con filtros de metadatos

Los filtros de metadatos se aplican antes de que se ejecute la búsqueda por similitud vectorial (prefiltrado). Esto reduce primero el conjunto de candidatos. Como resultado, la búsqueda de K-nearest vecinos (KNN) se realiza en un subconjunto más pequeño y relevante.

Estructura Filter

Cada filtro es una { left, operator, right } expresión:

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

Se pueden combinar hasta 5 filtros por consulta. Se aplican varios filtros con AND lógica.

Operadores admitidos

Operador Se requiere un valor correcto Funciona con Description (Descripción)

EQUALS_TO

Sí

CADENA, NÚMERO

Coincidencia exacta.

CONTAINS

Sí

LISTA DE CADENAS

Devuelve los registros en los que cualquier elemento de la STRINGLIST contiene la cadena dada como una coincidencia exacta.

EXISTS

No

Todos los tipos

La clave está presente en el registro

NOT_EXISTS

No

Todos los tipos

La clave no aparece en el registro

GREATER_THAN

Sí (numberValue)

NUMBER

El valor numérico es mayor que el de la comparación

GREATER_THAN_OR_EQUALS

Sí (numberValue)

NUMBER

Comparación numérica mayor o igual

LESS_THAN

Sí (numberValue)

NUMBER

Comparación numérica inferior a

LESS_THAN_OR_EQUALS

Sí (numberValue)

NUMBER

Comparación numérica inferior o igual

BEFORE

Sí (dateTimeValue)

fecha TimeValue

La marca de tiempo es anterior al valor dado

AFTER

Sí (dateTimeValue)

fecha TimeValue

La marca de tiempo es posterior al valor dado

Nota: Los metadatos de los eventos solo se ListEvents filtran en función de la compatibilidad EXISTS NOT_EXISTSEQUALS_TO, y y únicamente. stringValue

Recupera con filtros de metadatos (búsqueda semántica y prefiltro)

ActivadoRetrieveMemoryRecords, metadataFilters está anidado en su interior. searchCriteria En el siguiente ejemplo, los resultados se clasifican en registros de alta prioridad del año en curso antes de que la búsqueda semántica coincida con los «problemas de facturación»:

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

Al combinar un filtro de metadatos personalizado con una marca de tiempo generada por el sistema, se compacta el conjunto de candidatos en dos dimensiones (prioridad empresarial y actualidad) antes de que se ejecute la búsqueda por similitud.

Lista con filtros de metadatos (sin búsqueda semántica)

ListMemoryRecordsproporciona filtrado de metadatos sin búsqueda semántica. Esto resulta útil cuando necesita enumerar los registros que coinciden con criterios de metadatos específicos, por ejemplo, enumerar todos los registros de alta prioridad de un cliente o extraer todos los registros creados después de una fecha específica.

ActivadoListMemoryRecords, metadataFilters es un parámetro de nivel superior:

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

Combinación de varios filtros

Esta consulta permite acceder a las discusiones sobre renta variable del tercer trimestre de 2026 dentro de un espacio de nombres de cliente específico:

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

Los valores de filtro para las marcas de tiempo deben estar en UTC (formato ISO 8601). El servicio normaliza todas las marcas de tiempo almacenadas a UTC antes de compararlas, por lo que siempre debes expresar los valores de los filtros en UTC.

Paso 5: Evoluciona tu esquema de metadatos

AgentCore La memoria permite la evolución del esquema para que pueda adaptar la configuración de los metadatos a medida que cambien sus necesidades.

Agregue claves indexadas

Puede añadir nuevas claves indexadas a una memoria en cualquier momento:

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

Las nuevas claves están disponibles de inmediato para los eventos entrantes y los registros de memoria. Los registros existentes no se rellenan; solo los registros nuevos o actualizados contienen la nueva clave. No puede eliminar una clave previamente indexada, lo que evita la pérdida accidental de la capacidad de filtrado de los datos existentes.

Modifique el esquema de metadatos de una estrategia

Puedes añadir, eliminar o actualizar entradas libremente en el esquema de metadatos de una estrategia. Esto controla qué metadatos extrae el LLM de las conversaciones futuras.

Por ejemplo, para añadir un resolution_type campo nuevo a una estrategia existente:

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

También puedes eliminar una clave del esquema de metadatos de una estrategia si ya no quieres que el LLM extraiga ese campo. La eliminación de una entrada del esquema detiene la extracción de nuevos registros, pero no afecta a los metadatos que ya se encuentran en los registros existentes.

Los registros de memoria existentes no reciben LLM-extracted campos nuevos de forma retroactiva. Sin embargo, cuando las memorias antiguas se consolidan con las más nuevas durante el ciclo de vida normal de la memoria, el registro consolidado se vuelve a extraer con el esquema actual e incluirá los nuevos campos de metadatos.

Cuotas

Recurso Límite

Claves indexadas por memoria

10

Claves STRICTLY_CONSISTENT por estrategia

3

Entradas del esquema de metadatos por estrategia

20

Entradas de metadatos del registro de memoria (suministradas por el usuario)

20

Filtros por consulta

5

allowedValuespor regla de validación

10

maxItemspara la STRINGLIST validación

5

definition/llmExtractionInstructionlongitud

1000 caracteres cada uno

Longitud de la clave de metadatos

128 caracteres

stringValuelongitud

256 caracteres

longitud para STRINGLIST los miembros

64 caracteres

Prácticas recomendadas

  • Comience con entre 3 y 5 dimensiones de filtro que afecten directamente a la calidad de la recuperación. Cada campo indexado consume la capacidad de la infraestructura de almacenamiento, y el límite de 10 claves lo refleja. Comience con tres a cinco claves que tengan un impacto directo en la calidad de la recuperación y añada más a medida que surjan necesidades concretas.

  • Escriba definition cadenas claras y específicas. definitionDescribe lo que representa el campo. En lugar de «La prioridad del ticket», escribe «El nivel de prioridad del problema se basa en el impacto en los clientes». Los valores van desde críticos (los más graves) hasta bajos (los menos graves)». Úselo llmExtractionInstruction para una lógica de extracción detallada.

  • Restrinja la salida de LLM con. validation.allowedValues Sin validación, el LLM puede producir "High""high", o "HIGH" para el mismo concepto, romper la coincidencia de filtros.

  • Elija reglas de resolución de conflictos que coincidan con la semántica de los dominios. LATEST_VALUEes un valor predeterminado seguro, pero para campos como agent_type los de un flujo de trabajo escalado, es más correcta una instrucción personalizada que conserve el valor más antiguo.

  • Prefiere la vía basada en eventos para el contenido conversacional. Deje que el LLM se encargue de la extracción y la resolución de conflictos. Reserve las API por lotes para las importaciones masivas en las que ya conozca los valores de metadatos correctos.

  • Planifica los esquemas a nivel de estrategia. Cada estrategia puede tener la suya propiametadataSchema, lo que permite que diferentes estrategias extraigan y manejen las mismas claves de manera diferente. Una estrategia semántica puede usar instrucciones de extracción personalizadas para clasificar la prioridad a partir del contexto de la conversación, mientras que una estrategia de resumen puede usar una definición diferente ajustada a los metadatos específicos de la resumición.

  • Sea intencional con memoryStrategyId los registros no creados por lotes. Cuando incluyesmemoryStrategyId, el servicio filtra los metadatos de entrada para incluir solo las claves del esquema de esa estrategia; todas las demás claves se eliminan de forma silenciosa. Si lo omites, todos los metadatos de la carga útil se almacenan tal cual. Elige según tu caso práctico: coherencia impuesta por el esquema para los registros que deben coincidir con los registros producidos por la extracción, o control total para las importaciones masivas, en las que administras los metadatos de forma externa.

  • Usa claves de esquema no indexadas para enriquecer el contexto. No es necesario filtrar todas las claves de metadatos. Las claves de esquema que no se declaran como claves indexadas se siguen rellenando en los registros extraídos y son visibles en get/list las respuestas; simplemente, no se pueden usar en las expresiones de filtro. Esto es útil para metadatos como sentiment los summary_notes que enriquecen el registro para el consumo posterior sin consumir el presupuesto de las claves indexadas.

  • Usa la extracción determinista para los valores que ya conoces. Algunas claves representan atributos organizativos fijosdepartment, comotenant_tier, ocompliance_scope. Si la aplicación tiene estos valores en el momento de la creación del evento, configúralos comoSTRICTLY_CONSISTENT. Proporcione el valor de cada evento. Esto garantiza los valores exactos de los registros y elimina las representaciones incoherentes (por ejemplo, "eng" frente a"Engineering") que puede introducir la extracción de LLM. Resérvalo LLM_INFERRED para las dimensiones que deben deducirse del contenido de una conversación, como el sentimiento o el tema.

  • Planifica con antelación los espacios clave deterministas. Cada STRICTLY_CONSISTENT llave usa una de las 10 ranuras para claves indexadas. Las claves indexadas no se pueden eliminar una vez añadidas. Reserva espacios si planeas usar metadatos deterministas.

Anti-patterns para evitar

  • No indexe los campos de texto libre con un alto contenido de cardinalidad, como las descripciones o los nombres completos, ya que sobrecargan el índice y no proporcionan límites de filtro útiles.

  • No utilices metadatos para los valores que cambian en cada interacción; los metadatos son más eficaces para los atributos estables o que cambian lentamente.

  • No confíe únicamente en los metadatos para aislar a los inquilinos. Un campo de tenant_id metadatos sin aislamiento del espacio de nombres es un modelo de seguridad basado en convenciones que se interrumpe si se pierde cualquier filtro. Utilice espacios de nombres para, y metadatos parawho, y. what when how urgent

  • No utilice la extracción de LLM para valores que deben ser exactos. Si una clave debe contener un valor específico y conocido (como department oticket_id), utilice la STRICTLY_CONSISTENT extracción o suminístrelo a través de las API de Batch. La extracción de LLM puede producir variaciones del mismo concepto.