장기 메모리를 위한 구조화된 메타데이터
Amazon Bedrock AgentCore 메모리의 메타데이터 필터링을 사용하면 장기 메모리 레코드에 구조화된 속성을 추가할 수 있습니다. 이러한 속성을 사용하여 검색 중에 반환되는 레코드의 범위를 좁힐 수 있습니다. 네임스페이스는 이미 기본 엔터티(사용자, 테넌트, 환자, 클라이언트)별로 메모리를 격리합니다. 그러나 단일 네임스페이스 내에서 광범위한 의미 체계 검색은 의미가 가까운 모든 것을 반환합니다. 메타데이터 필터링을 사용하면 특정 속성 값과 일치하는 결과만 검색할 수 있습니다. 예를 들어 우선순위가 높은 레코드, 특정 부서의 레코드 또는 지정된 시간 범위 내에 생성된 레코드만 검색할 수 있습니다.
메타데이터 필터링을 사용하면 다음을 수행할 수 있습니다.
-
네임스페이스 내 비즈니스 차원(우선순위, 부서, 채널, 시간 범위)별 범위 검색
-
생성 시 이벤트 및 메모리 레코드에 구조화된 메타데이터 연결
-
대규모 언어 모델(LLM)이 메모리 수집 중에 대화 콘텐츠에서 메타데이터를 자동으로 추출하도록 합니다.
-
일관된 필터링을 위해 LLM 추출 값을 특정 값으로 제한
-
RetrieveMemoryRecords또는AND에서 쿼리당 최대 5개의 필터를 결합ListMemoryRecords하고 로직과 함께 적용 -
추가 인덱싱된 키를 선언하지 않고 시스템 생성 타임스탬프(
x-amz-agentcore-memory-createdAt,x-amz-agentcore-memory-updatedAt)를 기준으로 필터링
주제
시작하기
메타데이터 필터링 설정에는 5단계가 포함됩니다.
-
인덱싱된 키와 메타데이터 스키마를 사용하여 메모리 생성 -
-
인덱싱된 키 -
CreateMemory(또는UpdateMemory)를 사용하여 필터링하려는 메타데이터 키를 선언합니다(예: ,priority,channeltags). 메모리당 최대 10개의 인덱싱된 키를 선언할 수 있습니다. 인덱싱된 키는 필터 표현식에서 쿼리할 수 있는 속성을 정의합니다. 인덱싱된 키가 추가되면 제거할 수 없습니다. -
메타데이터 스키마 - 전략
metadataSchema에서를 정의하여 LLM이 대화에서 값을 추출하는 방법을 제어합니다. 스키마는 추출할 키, 이벤트 간 충돌을 해결하는 방법, 적용할 검증 제약 조건을 지정합니다. 메타데이터 스키마는 선택 사항입니다. 메타데이터 스키마가 없는 전략은 메타데이터 추출을 수행하지 않습니다.
-
-
구성 확인 -
GetMemory를 사용하여 인덱싱된 키 및 전략 메타데이터 스키마가 올바르게 설정되었는지 확인합니다. -
메타데이터로 데이터 수집 -
CreateEvent선택적 메타데이터와 함께를 사용하여 이벤트를 보내거나를 사용하여 레코드에 직접 메타데이터를 제공합니다BatchCreateMemoryRecords. 이벤트 기반 수집의 경우 LLM은 결과 메모리 레코드에서 메타데이터를 자동으로 추출하고 채웁니다. 이 추출은 메타데이터가 이벤트에 연결되지 않은 경우에도 전략의 메타데이터 스키마 및 대화 콘텐츠를 기반으로 합니다. -
메타데이터 필터를 사용한 쿼리 -
RetrieveMemoryRecords(사전 필터링을 사용한 의미 체계 검색) 또는ListMemoryRecords(메타데이터 전용 필터링)metadataFilters에서를 사용하여 결과의 범위를 지정합니다. -
시간 경과에 따른 스키마 개선 - 필터링 요구 사항이 증가함에 따라 인덱싱된 새 키를 추가하거나 전략 메타데이터 스키마를 수정합니다.
후속 섹션에서는 각 단계를 자세히 살펴봅니다.
주요 개념
인덱싱된 메타데이터 키
인덱싱된 키는의 메모리 리소스 수준에서 선언됩니다CreateMemory(또는 나중에를 통해 추가됨UpdateMemory). 인덱싱된 키는 빠른 쿼리 필터링에 최적화된 형식으로 저장됩니다. 인덱싱된 키만 ListMemoryRecords 및의에서 쿼리할 수 metadataFilters 있습니다RetrieveMemoryRecords.
다음 예제에서는 두 개의 인덱싱된 키를 선언합니다.
{ "indexedKeys": [ { "key": "priority", "type": "STRING" }, { "key": "tags", "type": "STRINGLIST" } ] }
지원되는 type 값: STRING, STRINGLIST, NUMBER.
키는 일치해야 합니다^[a-zA-Z0-9\s._:/=+@-]*$(최대 128자).
인덱싱된 키를 추가해도 기존 레코드는 채워지지 않습니다. 키가 선언된 후 생성되거나 업데이트된 레코드만 해당 키에 대해 인덱싱됩니다. 시간 경과에 따른 스키마 진화에 대한 자세한 내용은 섹션을 참조하세요5단계: 메타데이터 스키마 개선.
메타데이터 스키마(전략별)
Memory Strategy는 선택적으로 에서 선언된 메타데이터 스키마를 가질 수 있습니다memoryRecordSchema.metadataSchema. 메타데이터 스키마는 메모리 레코드를 생성할 때 대화형 콘텐츠에서 추출할 메타데이터를 LLM에 알려줍니다. 이벤트 기반 추출 중에는 전략의 메타데이터 스키마에 정의된 키만 결과 메모리 레코드에 채워집니다.
스키마의 각 항목은 다음을 정의합니다.
-
key- 메타데이터 키 이름입니다. 이 키도 인덱싱된 키로 선언되면 추출된 값을 필터링할 수 있습니다. 인덱싱된 키가 아닌 경우 값은 여전히 레코드에 채워지고GetMemoryRecord및ListMemoryRecords응답에 표시되지만 필터 표현식에는 사용할 수 없습니다. -
type- 값 유형(STRING,STRINGLIST,NUMBER). -
definition(필수) - 필드가 나타내는 내용에 대한 자연어 설명입니다. 구체적으로 설명하세요. "우선순위" 대신 "고객 영향을 기반으로 우선순위 수준을 작성합니다. 값은 중요(가장 심각)에서 낮음(가장 심각하지 않음)까지 다양합니다.” -
llmExtractionInstruction(선택 사항) - LLM이 값을 추출하거나 해석하는 방법에 대한 추가 지침입니다. 기본 제공LATEST_VALUE(최신 값 유지)을 사용하거나 "비즈니스에 미치는 영향을 기반으로 분류: 프로덕션critical에 영향을 미치는 서비스 중단, 성능high저하,medium기능 요청,low설명서 또는 미용 문제에 사용"과 같은 사용자 지정 자연어 지침을 제공할 수 있습니다. -
validation(선택 사항) - LLM의 출력을 제어된 값 집합으로 제한합니다. 검증이 없으면 LLM은 동일한 개념에"HIGH"대해"high", 또는"High"를 생성하여 필터 일치를 깨뜨릴 수 있습니다.
다음 예제에서는 검증이 포함된 메타데이터 스키마 항목을 보여줍니다.
{ "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"] } } } } } ] }
유형별 검증 옵션:
| 유형 | 검증 | 설명 |
|---|---|---|
|
|
|
고정 세트에 대한 제약 조건(최대 10개의 값, 각각 최대 256자, 일치 |
|
|
|
목록 멤버를 고정 세트로 제한(최대 10개 값, 각각 최대 256자, 일치 |
|
|
|
목록의 최대 항목 수(1~5) |
|
|
|
최소 허용 값 |
|
|
|
최대 허용 값 |
결정적 메타데이터(STRICTLY_CONSISTENT 추출 유형)
결정적 메타데이터 키에는 애플리케이션이 이벤트를 생성할 때 이미 알고 있는 값이 포함됩니다. 이러한 값은 수정 없이 결과 메모리 레코드에 정확하게 복사됩니다. department, compliance_level또는 같은 조직 분류자는 LLM에서 추론해서는 agent_id 안 됩니다. LLM 추론은 변동성을 유발합니다. 예를 들어, 한 레코드와 다른 레코드"eng"에서 동일한 대화가 생성될 수 "Engineering" 있습니다.
이러한 키의 경우 메타데이터 스키마 항목STRICTLY_CONSISTENT에서를 extractionType로 설정합니다. 이벤트에 제공된 값은 추출 및 통합을 통해 변경되지 않고 전파됩니다. 해당 키에 대해서는 LLM을 참조하지 않습니다.
다음 JSON은 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" } } } ] }
extractionType를 생략하면 기본값은 입니다LLM_INFERRED.
추출 및 통합 격리
STRICTLY_CONSISTENT 키는 LLM 추론을 건너뛰는 것 이상을 수행합니다. 추출 중에 결정적 값을 기준으로 이벤트를 그룹화합니다. 값이 다른 이벤트는 별도로 처리됩니다. 통합은 동일한 규칙을 따릅니다. 한 값 그룹의 레코드는 다른 그룹의 레코드와 병합되지 않습니다.
다음 Python 예제는 두 개의 결정적 키(department 및 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"} } )
시스템은 모든 결정적 키 값의 정확한 조합을 기준으로 이벤트를 그룹화합니다.
-
이벤트 1과 2는를 공유합니다
department=billing, priority=high. 이들은 함께 추출됩니다. -
이벤트 3은에서 다릅니다
department. 공유에도 불구하고 별도로 추출됩니다priority=high. -
이벤트 4는에서 다릅니다
priority. 공유에도 불구하고 별도로 추출됩니다department=billing.
이벤트를 그룹화하려면 모든 결정적 키 값이 일치해야 합니다. department=billing AND가 있는 쿼리는 긴급 중복 요금 사실만 priority=high 반환합니다. 다른 이벤트는 별도의 파티션에 있습니다. 서로 다른 값 조합의 레코드는 통합 중에 병합되지 않습니다.
제약 조건
| 제약 조건 | 세부 정보 |
|---|---|
|
전략당 최대 결정적 키 |
3 |
|
키 유형 |
|
|
인덱싱해야 함 |
키는 메모리의 에도 선언되어야 합니다. |
|
아니요 |
|
|
지원되는 전략 |
의미 체계, 사용자 기본 설정 및 간헐적 전략(사용자 지정 재정의 포함). 요약 전략에서는 지원되지 않습니다. |
|
누락된 값 |
결정적 키의 값 없이 이벤트가 도착하면 해당 이벤트의 그룹화에서 키가 생략되고 결과 레코드에는 없습니다. |
중요
로 구성된 키를 변경하면 추출 및 통합에 사용되는 그룹화가 STRICTLY_CONSISTENT 변경됩니다. 이전 구성에서 생성된 레코드는 새 구성에서 생성된 레코드와 격리됩니다. 이벤트를 수집하기 전에 결정적 키 구성을 계획합니다.
인덱싱된 키와 스키마 키가 상호 작용하는 방법
인덱싱된 키와 스키마 키 간의 관계에 따라 메타데이터의 동작 방식이 결정됩니다.
-
스키마에서 인덱싱 + - 키는 LLM에 의해 추출된 레코드에 채워지며 쿼리 표현식에서 필터링할 수 있습니다. 이는 추출 및 필터링하려는 키에 대한 가장 일반적인 구성입니다.
-
스키마에 인덱싱 + 없음 - 이벤트 기반 추출 중에 키가 레코드에 채워지지 않습니다. 이 키의 필터는 추출된 레코드에 대한 결과를 반환하지 않습니다. 이러한 키를 채우려면 배치 APIs(
BatchCreateMemoryRecords또는BatchUpdateMemoryRecords)를 사용합니다. -
스키마 + 인덱싱되지 않음 - LLM은 레코드의 값을 추출하고 채우며 및
GetMemoryRecordListMemoryRecords응답에 표시됩니다. 그러나 필터 표현식에는 사용할 수 없습니다. 이는 인덱싱된 키 예산을 사용하지 않고 다운스트림 소비를 위해 레코드를 보강summary_notes하는sentiment또는와 같은 메타데이터인 컨텍스트 보강에 유용합니다.
메타데이터가 이벤트에서 메모리 레코드로 흐르는 방식
이벤트 메타데이터는 stringValue 항목만 허용합니다. 메모리 레코드는 추출 중에 LLM에 의해 채워지거나 배치 APIs를 통해 직접 제공되는 stringValuestringListValue, 및 numberValue 유형을 지원합니다. dateTimeValue 유형은 시스템 생성 필드(x-amz-agentcore-memory-createdAt 및 )용으로 예약되어 있습니다x-amz-agentcore-memory-updatedAt. 전략의에 정의된 키만 추출된 레코드에 채워metadataSchema집니다. 스키마에 없는 이벤트 메타데이터 키는 무시됩니다. 항목 제한은 섹션을 참조하세요할당량.
시스템 생성 메타데이터
모든 메모리 레코드에는 동일한 필터 연산자로 쿼리할 수 있는 이러한 시스템 필드가 들어 있습니다.
| Field | 유형 | 설명 |
|---|---|---|
|
|
|
메모리 레코드의 유형 |
|
|
|
레코드 생성 타임스탬프 |
|
|
|
마지막 업데이트 타임스탬프 기록 |
인덱싱된 키로 선언할 필요는 없습니다. 항상 필터링에 사용할 수 있습니다. 이러한 시스템 생성 dateTimeValue 필드는 BEFORE 및 AFTER 연산자를 지원하므로 날짜/시간 인덱싱된 키를 선언할 필요 없이 시간 범위 쿼리를 사용할 수 있습니다.
사전 조건
메타데이터 필터링을 구성하기 전에 다음이 있는지 확인합니다.
-
CreateMemory, ,UpdateMemory, ,CreateEvent, 및를 호출할 수 있는 권한이 있는 AWS 계정ListMemoryRecordsRetrieveMemoryRecordsBatchCreateMemoryRecordsBatchUpdateMemoryRecords -
Amazon Bedrock AgentCore 액세스
-
에이전트에게 가장 필요한 3~5개의 필터 차원에 대한 명확한 보기(부서, 우선순위, 리전, 프로젝트 등)
1단계: 인덱싱된 키와 메타데이터 스키마를 사용하여 메모리 생성
다음은 인덱싱된 키 5개와 메타데이터 스키마가 있는 고객 지원 메모리를 생성합니다. priority, agent_type및는 전략의 메타데이터 스키마에 정의되어 있습니다. LLMsentiment은 대화 콘텐츠에서 해당 값을 추출합니다. sentiment는 스키마에 있지만 인덱싱된 키로 선언되지는 않습니다. LLM은 대화에서 값을 추출하여 레코드에 채우지만 필터 표현식에는 사용할 수 없습니다. tags (STRINGLIST), channel (STRING) 및 ticket_id (STRING)는 인덱싱된 키로 선언되지만 스키마에는 없습니다. 이벤트 기반 추출 중에는 채워지지 않지만 배치 APIs를 통해 제공할 수 있습니다.
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"] } } } } } ] } } } ]'
2단계: 구성 확인
GetMemory를 사용하여 인덱싱된 키 및 메타데이터 스키마가 수락되었는지 확인합니다.
aws bedrock-agentcore-control get-memory --memory-id "<memory-id>"
3단계: 메타데이터로 데이터 수집
메타데이터를 메모리 레코드로 가져오는 두 가지 경로가 있습니다.
이벤트 기반 수집
생성 시 stringValue 메타데이터를 이벤트에 연결합니다. LLM은 전략의 메타데이터 스키마를 사용하여 결과 메모리 레코드에서 메타데이터를 추출하고 채웁니다. 전략의에 정의된 키만 결과 레코드에 채워metadataSchema집니다. 스키마에 없는 이벤트 메타데이터 키는 추출 중에 무시됩니다.
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."}}} ]'
이 예제에서 priority는 전략의에 metadataSchema있으므로 값이 메모리 레코드로 전파됩니다. channel 및 ticket_id는 스키마에 없으므로 추출 중에 무시됩니다. 또한 LLM은 대화 콘텐츠"frustrated"에서 agent_type ( 에스컬레이션을 "specialist" 기반으로 할 수 있음) 및 sentiment ()를 유추합니다. 이러한 스키마 키는 이벤트 메타데이터로 제공되지 않았더라도 채워집니다.
대화 콘텐츠에서 암시적 메타데이터 추출
스키마 키가 값을 생성하는 데는 이벤트 메타데이터가 필요하지 않습니다. 스키마 키에 원본 이벤트에 일치하는 메타데이터가 없는 경우 LLM은 전적으로 대화 콘텐츠에서 값을 도출합니다. 키의 definition 및를 사용하여 값을 llmExtractionInstruction 결정합니다. 이는 호출자가 이벤트 생성 시 제공할 필요 없이 대화 자체에만 존재하는 차원에 유용합니다.
1단계의 동일한 고객 지원 메모리를 사용하면 다음 이벤트에 메타데이터가 전혀 없습니다.
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."}}} ]'
LLM은 이벤트 메타데이터로 제공되지 않았sentiment더라도 대화 콘텐츠를 분석하고 추출된 메모리 레코드의 세 스키마 키 priority, 및 agent_type를 모두 채웁니다.
{ "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"} } }
검증 규칙은 여전히 적용됩니다. 값이 이벤트 메타데이터에서 왔는지 콘텐츠 추론에서 왔는지에 관계없이 LLM의 출력이 지정된 허용 값으로 제한됩니다.
LLM이 이벤트 간 충돌을 해결하는 방법
세션의 여러 이벤트가 동일한 메타데이터 키에 대해 서로 다른 값을 갖는 경우 LLM은를 사용합니다llmExtractionInstruction. 이렇게 하면 결과 메모리 레코드에 유지할 값이 결정됩니다.
예를 들어 첫 번째 이벤트에가 priority: "low" 있고 이후 이벤트가 로 에스컬레이션되는 지원 세션을 가정해 보겠습니다priority: "critical". LLM은 지침에 따라이 문제를 해결합니다.
-
LATEST_VALUE(기본 제공) - LLM은 최신 값을 유지합니다. 이 경우 메모리 레코드는를 가져옵니다priority: "critical". -
사용자 지정 지침 - 도메인별 로직을 표현할 수 있습니다. 예를 들어 “세션 중에 보고된 가장 높은 심각도 유지”는 도 생성
"critical"하지만 다른 이유로 인해 최신 심각도뿐만 아니라 가장 높은 심각도입니다.
또 다른 예: agent_type "가장 특수한 에이전트 유형을 선호합니다. 계층 구조: 전문가 > tier3 > tier2 > tier1 > bot", 세션이 봇으로 시작하고 tier2 에이전트로 에스컬레이션하면 메모리 레코드가를 가져옵니다agent_type: "tier2".
결정적 메타데이터 수집
로 구성된 키는 다른 수집 경로를 STRICTLY_CONSISTENT 따릅니다. 이벤트에 제공하는 값은 결과 레코드에 있는 값입니다. LLM 추론과 충돌 해결은 없습니다.
AgentCore 메모리는 추출 전에 결정적 키 값을 기준으로 이벤트를 그룹화합니다. 예를 들어 태그가 지정된 이벤트department: "engineering"는 태그가 지정된 이벤트와 별도로 처리됩니다department: "finance".
통합은 이러한 그룹 내에서 작동합니다. 가 있는 레코드는 레이블이 지정된 레코드와 병합compliance_level: "hipaa"되지 않습니다compliance_level: "standard". 따라서 다음과 같은 경우에 결정론적 키가 이상적입니다.
-
규정 준수 격리 - 규정 준수 수준이 다른 레코드는 서로 섞이지 않습니다.
-
조직 라우팅 - 교차 오염이 없는 부서 범위 검색.
-
다중 테넌트 하위 필터링 - 테넌트별 속성은 제공된 대로 정확하게 보존됩니다.
이벤트에 결정적 키에 대한 값이 없는 경우 결과 레코드에 키가 없습니다.
직접 쓰기 경로(BatchCreateMemoryRecords 및 BatchUpdateMemoryRecords)는 추출을 우회합니다. STRICTLY_CONSISTENT 추출 유형은 영향을 미치지 않습니다. 해당 APIs에 대해 이미 하고 있는 것처럼 메타데이터를 직접 제공합니다.
배치 APIs 사용한 직접 레코드 생성
지식 기반 가져오기, 자체 관리형 전략 또는 사전 처리된 콘텐츠의 경우 BatchCreateMemoryRecords (또는 BatchUpdateMemoryRecords)를 사용하여 메타데이터를 명시적으로 제공합니다. 이렇게 하면 LLM 추출이 완전히 우회되어 호출자가 메타데이터 값을 제어합니다.
배치 생성 레코드에서 메타데이터를 처리하는 방법은를 제공하는지 여부에 따라 달라집니다memoryStrategyId.
-
사용
memoryStrategyId- 서비스는 해당 전략의에 대해 입력 메타데이터를 필터링합니다memoryRecordSchema. 스키마에 정의된 키만 레코드에 저장됩니다. 스키마에 없는 인덱싱된 키를 포함한 다른 모든 키는 자동으로 삭제됩니다. 이렇게 하면 스키마 적용 일관성이 제공되므로 일괄 생성된 레코드가 이벤트 기반 추출로 생성된 레코드와 동일한 메타데이터 셰이프를 가질 수 있습니다. -
없음
memoryStrategyId- 서비스는 모든 메타데이터 키를 레코드의 페이로드에 있는 그대로 저장합니다. 여기에는 인덱싱된 키, 전략 스키마에 있는 키, 둘 다 없는 키가 포함됩니다. 그러나 인덱싱된 키만 필터링할 수 있습니다. 인덱싱되지 않은 키를 필터링하려고 하면가 반환됩니다ValidationException. 인덱싱되지 않은 키는GetMemoryRecord및ListMemoryRecords응답에 계속 표시됩니다.
다음 예제에서는를 사용하지 않고 레코드를 생성memoryStrategyId하여 제공된 모든 메타데이터를 저장합니다.
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"} } }]'
스키마 일관성을 적용하려면를 포함합니다memoryStrategyId. 이 경우 해당 전략의에 있는 키만 유지됩니다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"} } }]'
두 번째 예에서 전략의 스키마가 , priority agent_type및 만 정의하는 경우 sentimentchannel는 저장된 레코드에서 자동으로 삭제됩니다.
BatchUpdateMemoryRecords를 사용하여 레코드 업데이트
BatchUpdateMemoryRecords는와 동일한 memoryStrategyId 메타데이터 필터링 동작을 따릅니다BatchCreateMemoryRecords. 다음 예시에서는 기존 레코드의 콘텐츠와 메타데이터를 업데이트합니다.
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"} } }]'
4단계: 메타데이터 필터를 사용한 쿼리
메타데이터 필터는 벡터 유사성 검색이 실행되기 전에 적용됩니다(사전 필터링). 이렇게 하면 후보 세트가 먼저 줄어듭니다. 따라서 KNN(K-Nearest Neighbor) 검색은 더 작고 관련성이 높은 하위 집합에서 작동합니다.
Filter 구조
모든 필터는 { left, operator, right } 표현식입니다.
{ "left": { "metadataKey": "priority" }, "operator": "EQUALS_TO", "right": { "metadataValue": { "stringValue": "high" } } }
쿼리당 최대 5개의 필터를 결합할 수 있습니다. 여러 필터가 AND 로직과 함께 적용됩니다.
지원되는 연산자
| 연산자 | 올바른 값이 필요합니다. | 함께 작동 | 설명 |
|---|---|---|---|
|
|
예 |
문자열, 숫자 |
정확히 일치합니다. |
|
|
예 |
문자열 목록 |
STRINGLIST의 요소에 지정된 문자열이 정확히 일치하는 것으로 포함된 레코드를 반환합니다. |
|
|
아니요 |
모든 유형 |
키가 레코드에 있음 |
|
|
아니요 |
모든 유형 |
키가 레코드에 없습니다. |
|
|
예( |
NUMBER |
숫자 초과 비교 |
|
|
예( |
NUMBER |
숫자greater-than-or-equal 비교 |
|
|
예( |
NUMBER |
숫자 보다 작음 비교 |
|
|
예( |
NUMBER |
숫자less-than-or-equal 비교 |
|
|
예( |
dateTimeValue |
타임스탬프가 지정된 값보다 이전임 |
|
|
예( |
dateTimeValue |
타임스탬프가 지정된 값 이후임 |
참고:의 이벤트 메타데이터 필터는 EXISTS, NOT_EXISTS및 EQUALS_TO만 ListEvents 지원합니다stringValue.
메타데이터 필터로 검색(시맨틱 검색 + 사전 필터)
에서 RetrieveMemoryRecordsmetadataFilters는 내부에 중첩됩니다searchCriteria. 다음 예제에서는 의미 체계 검색이 "결제 문제"와 일치하기 전에 올해의 우선순위가 높은 레코드로 결과의 범위를 지정합니다.
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"}} } ] }'
사용자 지정 메타데이터 필터를 시스템 생성 타임스탬프와 결합하면 유사성 검색이 실행되기 전에 비즈니스 우선 순위와 최신성이라는 두 가지 차원을 따라 후보 세트를 압축합니다.
메타데이터 필터가 있는 목록(시맨틱 검색 없음)
ListMemoryRecords는 의미 체계 검색 없이 메타데이터 필터링을 제공합니다. 이는 고객의 우선순위가 높은 모든 레코드를 나열하거나 특정 날짜 이후에 생성된 모든 레코드를 가져오는 등 특정 메타데이터 기준과 일치하는 레코드를 열거해야 하는 경우에 유용합니다.
에서 ListMemoryRecordsmetadataFilters는 최상위 파라미터입니다.
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"}} } ]'
여러 필터 결합
이 쿼리는 특정 클라이언트 네임스페이스 내에서 2026년 Q3 주식 논의로 검색 범위를 지정합니다.
{ "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"}} } ] }
타임스탬프의 필터 값은 UTC(ISO 8601 형식)여야 합니다. 이 서비스는 비교 전에 저장된 모든 타임스탬프를 UTC로 정규화하므로 항상 UTC로 필터 값을 표현합니다.
5단계: 메타데이터 스키마 개선
AgentCore 메모리는 스키마 진화를 지원하므로 필요에 따라 메타데이터 구성을 조정할 수 있습니다.
인덱싱된 키 추가
언제든지 메모리에 새 인덱싱된 키를 추가할 수 있습니다.
aws bedrock-agentcore-control update-memory \ --memory-id "<memory-id>" \ --add-indexed-keys '[ {"key": "customer_segment", "type": "STRING"} ]'
수신 이벤트 및 메모리 레코드에 새 키를 즉시 사용할 수 있습니다. 기존 레코드는 백필되지 않습니다. 새 레코드 또는 업데이트된 레코드에만 새 키가 포함됩니다. 기존 데이터에 대한 필터링 기능의 우발적 손실을 방지하는 이전에 인덱싱된 키는 제거할 수 없습니다.
전략의 메타데이터 스키마 수정
전략의 메타데이터 스키마에서 항목을 자유롭게 추가, 제거 또는 업데이트할 수 있습니다. 이렇게 하면 LLM이 향후 대화에서 추출하는 메타데이터가 제어됩니다.
예를 들어 기존 전략에 새 resolution_type 필드를 추가하려면:
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"] } } } } } ] } } ] }'
LLM이 더 이상 해당 필드를 추출하지 않도록 하려면 전략의 메타데이터 스키마에서 키를 제거할 수도 있습니다. 스키마 항목을 제거하면 새 레코드에 대한 추출이 중지되지만 기존 레코드에 이미 있는 메타데이터에는 영향을 주지 않습니다.
기존 메모리 레코드는 새 LLM 추출 필드를 소급하여 수신하지 않습니다. 그러나 일반 메모리 수명 주기 동안 이전 메모리를 최신 메모리와 통합하면 현재 스키마를 사용하여 통합 레코드가 다시 추출되고 새 메타데이터 필드가 포함됩니다.
할당량
| Resource | Limit |
|---|---|
|
메모리당 인덱싱된 키 |
10 |
|
전략당 STRICTLY_CONSISTENT 키 |
3 |
|
전략당 메타데이터 스키마 항목 |
20 |
|
메모리 레코드 메타데이터 항목(사용자 제공) |
20 |
|
쿼리당 필터 수 |
5 |
|
|
10 |
|
|
5 |
|
|
각 1,000자 |
|
메타데이터 키 길이 |
128자 |
|
|
256자 |
|
|
64자 |
모범 사례
-
검색 품질에 직접적인 영향을 미치는 3~5개의 필터 차원으로 시작합니다. 인덱싱된 각 필드는 스토리지 인프라 용량을 사용하며 10키 제한은 이를 반영합니다. 검색 품질에 직접적인 영향을 미치는 3~5개의 키로 시작하고 구체적인 요구 사항이 발생하면 더 추가합니다.
-
명확하고 구체적인
definition문자열을 작성합니다. 는 필드가 나타내는 내용을definition설명합니다. "티켓의 우선 순위" 대신 "고객의 영향을 기반으로 우선 순위 수준을 작성합니다. 값은 중요(가장 심각)에서 낮음(가장 심각하지 않음)까지 다양합니다.” 세부 추출 로직llmExtractionInstruction에를 사용합니다. -
를 사용하여 LLM 출력을 제한합니다
validation.allowedValues. 검증이 없으면 LLM은 동일한 개념에"HIGH"대해"high", 또는"High"를 생성하여 필터 일치를 깨뜨릴 수 있습니다. -
도메인 의미 체계와 일치하는 충돌 해결 규칙을 선택합니다.
LATEST_VALUE는 안전한 기본값이지만 에스컬레이션 워크플로agent_type와 같은 필드의 경우 가장 높은 값을 유지하는 사용자 지정 명령이 더 정확합니다. -
대화 콘텐츠의 경우 이벤트 기반 경로를 선호합니다. LLM이 추출 및 충돌 해결을 처리하도록 합니다. 올바른 메타데이터 값을 이미 알고 있는 대량 가져오기를 위해 배치 APIs를 예약합니다.
-
전략 수준에서 스키마를 계획합니다. 각 전략에는 고유한가 있을 수
metadataSchema있으므로 서로 다른 전략이 동일한 키를 다르게 추출하고 처리할 수 있습니다. 의미 체계 전략은 사용자 지정 추출 지침을 사용하여 대화 컨텍스트에서 우선 순위를 분류하는 반면, 요약 전략은 요약별 메타데이터에 맞게 조정된 다른 정의를 사용할 수 있습니다. -
배치로 생성된 레코드에
memoryStrategyId대해를 의도적으로 사용합니다.memoryStrategyId를 포함하면 서비스는 입력 메타데이터를 해당 전략 스키마의 키로만 필터링합니다. 다른 모든 키는 자동으로 삭제됩니다. 이를 생략하면 페이로드의 모든 메타데이터가 있는 그대로 저장됩니다. 사용 사례에 따라 선택: 추출 생성 레코드와 일치해야 하는 레코드의 스키마 적용 일관성 또는 메타데이터를 외부에서 관리하는 대량 가져오기에 대한 전체 제어. -
컨텍스트 보강에 인덱싱되지 않은 스키마 키를 사용합니다. 모든 메타데이터 키를 필터링할 필요는 없습니다. 인덱싱된 키로 선언되지 않은 스키마 키는 여전히 추출된 레코드에 채워지고 가져오기/목록 응답에 표시됩니다. 필터 표현식에는 사용할 수 없습니다. 이는 인덱싱된 키 예산을 사용하지 않고 다운스트림 소비를 위해 레코드를 보강
summary_notes하는sentiment또는와 같은 메타데이터에 유용합니다. -
이미 알고 있는 값에 대해 결정적 추출을 사용합니다. 일부 키는
department,tenant_tier또는와 같은 고정된 조직 속성을 나타냅니다compliance_scope. 애플리케이션에 이벤트 생성 시 이러한 값이 있는 경우 이를 로 구성합니다STRICTLY_CONSISTENT. 모든 이벤트에 값을 제공합니다. 이렇게 하면 레코드의 정확한 값이 보장되고 LLM 추출에서 도입할 수 있는 일관되지 않은 표현(예:"eng"대"Engineering")이 제거됩니다. 감정 또는 주제와 같이 대화 콘텐츠에서 추론해야 하는 차원에LLM_INFERRED대해를 예약합니다. -
결정론적 키 슬롯을 조기에 계획합니다. 각
STRICTLY_CONSISTENT키는 인덱싱된 키 슬롯 10개 중 하나를 사용합니다. 인덱싱된 키는 추가한 후에는 제거할 수 없습니다. 결정적 메타데이터를 사용하려는 경우 슬롯을 예약합니다.
피해야 할 안티 패턴
-
설명이나 전체 이름과 같이 카디널리티가 높은 자유 텍스트 필드를 인덱싱하지 마십시오. 유용한 필터 경계를 제공하지 않고 인덱스를 부풀립니다.
-
모든 상호 작용에서 변경되는 값에 메타데이터를 사용하지 마세요. 메타데이터는 안정적이거나 느리게 변화하는 속성에 가장 효과적입니다.
-
테넌트 격리를 위해 메타데이터에만 의존하지 마세요. 네임스페이스 격리가 없는
tenant_id메타데이터 필드는 누락된 필터를 구분하는 security-through-convention 모델입니다. 에는 네임스페이스를 사용하고who, 및what에는 메타데이터를 사용합니다whenhow urgent. -
정확해야 하는 값에는 LLM 추출을 사용하지 마십시오. 키에 알려진 특정 값(예:
department또는ticket_id)이 있어야 하는 경우STRICTLY_CONSISTENT추출을 사용하거나 배치 APIs를 통해 제공합니다. LLM 추출은 동일한 개념의 변형을 생성할 수 있습니다.