View a markdown version of this page

長期記憶體的結構化中繼資料 - Amazon Bedrock AgentCore

長期記憶體的結構化中繼資料

Amazon Bedrock AgentCore 記憶體中的中繼資料篩選可讓您將結構化屬性新增至長期記憶體記錄。您可以使用這些屬性來縮小擷取期間傳回的記錄範圍。命名空間已依主要實體 (使用者、租戶、病患、用戶端) 隔離記憶體。不過,在單一命名空間中,廣泛的語意搜尋會傳回所有接近意義的內容。使用中繼資料篩選,您只能擷取符合特定屬性值的結果。例如,您只能擷取高優先順序的記錄、只擷取特定部門的記錄,或只擷取指定時間範圍內建立的記錄。

透過中繼資料篩選,您可以:

  • 命名空間內依業務維度 (優先順序、部門、管道、時間範圍) 的範圍擷取

  • 在建立時將結構化中繼資料連接至事件和記憶體記錄

  • 讓大型語言模型 (LLM) 在記憶體擷取期間自動從對話內容擷取中繼資料

  • 將 LLM 擷取的值限制為特定值,以進行一致性篩選

  • RetrieveMemoryRecords或 上合併每個查詢最多 5 個篩選條件ListMemoryRecords,並套用AND邏輯

  • 篩選系統產生的時間戳記 (x-amz-agentcore-memory-createdAtx-amz-agentcore-memory-updatedAt),而不宣告其他索引鍵

開始使用

設定中繼資料篩選包含五個步驟:

  1. 使用索引鍵和中繼資料結構描述建立您的記憶體

    • 索引鍵 — 使用 CreateMemory(或 UpdateMemory) 宣告您要篩選的中繼資料金鑰 (例如 prioritychannel、)tags。每個記憶體最多可以宣告 10 個索引鍵。索引鍵定義哪些屬性可在篩選條件表達式中查詢。新增索引鍵後,就無法將其移除。

    • 中繼資料結構描述 — 在策略metadataSchema上定義 ,以控制 LLM 如何從對話中擷取值。結構描述會指定要擷取哪些金鑰、如何解決事件之間的衝突,以及要套用哪些驗證限制。中繼資料結構描述是選用的,沒有中繼資料結構描述的策略不會執行中繼資料擷取。

  2. 驗證組態GetMemory用來確認您的索引鍵和策略中繼資料結構描述設定正確。

  3. 使用中繼資料擷取資料 — 使用 CreateEvent 搭配選用中繼資料傳送事件,或使用 直接在記錄上提供中繼資料BatchCreateMemoryRecords。對於事件驅動擷取,LLM 會自動擷取產生的記憶體記錄並填入中繼資料。此擷取是以策略的中繼資料結構描述和對話內容為基礎,即使沒有中繼資料連接到事件也是如此。

  4. 含中繼資料篩選條件的查詢 — 在 metadataFilters 上使用 RetrieveMemoryRecords(含預先篩選的語意搜尋) 或 ListMemoryRecords(僅限中繼資料篩選) 來範圍結果。

  5. 隨著時間推移您的結構描述:隨著篩選需求的增長,新增索引鍵或修改策略中繼資料結構描述。

後續各節會詳細說明每個步驟。

重要概念

索引中繼資料金鑰

索引鍵會在 中的記憶體資源層級宣告 CreateMemory(或稍後透過 新增UpdateMemory)。索引鍵會以針對快速查詢篩選最佳化的格式儲存。只有索引鍵可在 ListMemoryRecordsmetadataFilters的 中查詢RetrieveMemoryRecords

下列範例宣告兩個索引鍵:

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

支援type的值:STRINGSTRINGLISTNUMBER

金鑰必須相符 ^[a-zA-Z0-9\s._:/=+@-]*$(最多 128 個字元)。

新增索引鍵不會回填現有的記錄。只有宣告金鑰之後建立或更新的記錄,才會針對該金鑰編製索引。如需隨時間發展結構描述的詳細資訊,請參閱 步驟 5:發展中繼資料結構描述

中繼資料結構描述 (每個策略)

記憶體策略可以選擇性地在 中宣告中繼資料結構描述memoryRecordSchema.metadataSchema。中繼資料結構描述會告知 LLM 在產生記憶體記錄時要從對話內容擷取哪些中繼資料。在事件驅動擷取期間,只會在產生的記憶體記錄上填入策略中繼資料結構描述中定義的索引鍵。

結構描述中的每個項目定義:

  • key — 中繼資料金鑰名稱。如果此索引鍵也宣告為索引鍵,則可以篩選擷取的值。如果不是索引鍵,則該值仍會填入記錄並顯示在 GetMemoryRecordListMemoryRecords回應中,但無法在篩選表達式中使用。

  • type — 值類型 (STRINGSTRINGLISTNUMBER)。

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

依類型區分的驗證選項:

Type 驗證 說明

STRING

stringValidation.allowedValues

限制為固定集合 (最多 10 個值,每個值最多 256 個字元,符合 ^[a-zA-Z0-9\s._:/=+@-]*$)

STRINGLIST

stringListValidation.allowedValues

將清單成員限制為固定集合 (最多 10 個值,每個值最多 256 個字元,符合 ^[a-zA-Z0-9\s._:/=+@-]*$)

STRINGLIST

stringListValidation.maxItems

清單中的項目上限 (1–5)

NUMBER

numberValidation.minValue

允許值下限

NUMBER

numberValidation.maxValue

允許值上限

確定性中繼資料 (STRICTLY_CONSISTENT 擷取類型)

確定性中繼資料索引鍵包含應用程式在建立事件時已知的值。這些值會完全複製到產生的記憶體記錄,無需修改。LLM agent_id不應推斷 departmentcompliance_level或 等組織分類器。LLM 推論引入可變性。例如,相同的對話可以在"eng"一個記錄和另一個記錄"Engineering"上產生。

對於這些金鑰,請在中繼資料結構描述項目STRICTLY_CONSISTENT中將 extractionType設定為 。事件上提供的值會透過擷取和合併傳播不變。該金鑰不會參考 LLM。

下列 JSON 顯示同時具有 STRICTLY_CONSISTENTLLM_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 範例顯示具有兩個決定性金鑰 (departmentpriority) 的支援工作階段:

# 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傳回緊急重複收費事實。其他事件位於不同的分割區中。來自不同值組合的記錄絕不會在合併期間合併。

Constraints

限制條件 詳細資訊

每個策略的確定性索引鍵上限

3

Key type

必須為 STRING

必須編製索引

也必須在記憶體的 中宣告金鑰 indexedKeys

extractionConfig

STRICTLY_CONSISTENT 金鑰不能有 extractionConfig。值來自事件,而不是 LLM。

支援的策略

語意、使用者偏好設定和附加策略 (包括自訂覆寫)。摘要策略不支援 。

缺少值

如果事件抵達時沒有決定性索引鍵的值,則會從該事件的分組中省略該索引鍵,並在產生的記錄上不存在。

重要

變更哪些金鑰設定為STRICTLY_CONSISTENT變更用於擷取和合併的分組。在先前組態下建立的記錄會與在新組態下建立的記錄隔離。在擷取事件之前規劃您的決定性金鑰組態。

索引鍵和結構描述金鑰如何互動

索引索引鍵與結構描述索引鍵之間的關係會決定中繼資料的行為:

  • 結構描述中的索引 + — 金鑰由 LLM 填入擷取的記錄上,並且可在查詢表達式中篩選。這是您想要擷取和篩選的金鑰最常見的組態。

  • 已編製索引 + 不在結構描述中 — 在事件驅動擷取期間,金鑰不會填入記錄。此索引鍵的篩選條件不會傳回擷取記錄的結果。若要填入這些金鑰,請使用批次 APIs(BatchCreateMemoryRecordsBatchUpdateMemoryRecords)。

  • 在結構描述中 + 未編製索引 — LLM 會擷取並填入記錄上的值,並且會顯示在 GetMemoryRecordListMemoryRecords回應中。不過,它不能用於篩選條件表達式。這對於內容擴充很有用 — 類似 sentimentsummary_notes的中繼資料可富集記錄以供下游使用,而不會消耗索引鍵預算。

中繼資料如何從事件流向記憶體記錄

事件中繼資料僅接受stringValue項目。記憶體記錄支援 stringValuestringListValuenumberValue類型 — 在擷取期間由 LLM 填入,或透過批次 APIs直接提供。dateTimeValue 類型會保留給系統產生的欄位 (x-amz-agentcore-memory-createdAtx-amz-agentcore-memory-updatedAt)。只有策略 中定義的索引鍵metadataSchema會填入擷取的記錄 - 不會忽略不在結構描述中的事件中繼資料索引鍵。如需項目限制,請參閱 配額

系統產生的中繼資料

每個記憶體記錄都有這些系統欄位,可使用相同的篩選條件運算子進行查詢:

欄位 Type 說明

x-amz-agentcore-memory-recordType

stringValue

記憶體記錄的類型

x-amz-agentcore-memory-createdAt

dateTimeValue

記錄建立時間戳記

x-amz-agentcore-memory-updatedAt

dateTimeValue

記錄上次更新時間戳記

您不需要將這些宣告為索引鍵,它們一律可供篩選。這些系統產生的dateTimeValue欄位支援 BEFOREAFTER運算子,啟用時間範圍查詢,而不需要您宣告日期時間索引鍵。

先決條件

設定中繼資料篩選之前,請確認您已:

  • 具有呼叫 CreateMemoryUpdateMemory、、CreateEventListMemoryRecordsRetrieveMemoryRecordsBatchCreateMemoryRecords和 許可 AWS 的帳戶 BatchUpdateMemoryRecords

  • Amazon Bedrock AgentCore 存取

  • 客服人員最需要的 3-5 個篩選維度的清晰檢視 (部門、優先順序、區域、專案等)

步驟 1:使用索引鍵和中繼資料結構描述建立記憶體

以下內容使用五個索引鍵和中繼資料結構描述來建立客戶支援記憶體。priorityagent_typesentiment 是在策略的中繼資料結構描述中定義 — LLM 會從對話內容中擷取其值。請注意,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,因此其值會傳播至記憶體記錄。 channelticket_id 不在結構描述中,因此在擷取期間會予以忽略。LLM 也會從對話內容推斷 agent_type(可能"specialist"根據呈報) 和 sentiment(可能 "frustrated"),即使這些結構描述金鑰未作為事件中繼資料提供,也會填入這些結構描述金鑰。

從對話內容擷取隱含中繼資料

結構描述索引鍵不需要事件中繼資料,即可產生值。當結構描述金鑰在原始事件上沒有相符的中繼資料時,LLM 會完全從對話內容衍生該值。它使用金鑰的 definitionllmExtractionInstruction來判斷值。這對於僅存在於對話本身的維度很有用,而無需呼叫者在事件建立時提供它們。

使用步驟 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 會分析對話內容,並在擷取的記憶體記錄 priority、 和 上填入所有三個結構描述索引鍵agent_typesentiment即使沒有提供做為事件中繼資料:

{ "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使用「偏好最專業化的代理程式類型」指令的 。階層:專家 > 第 3 層 > 第 2 層 > 第 1 層 > 機器人",如果工作階段從機器人開始並升級到第 2 層代理程式,則記憶體記錄會取得 agent_type: "tier2"

確定性中繼資料擷取

設定為 的金鑰STRICTLY_CONSISTENT遵循不同的擷取路徑。您在事件上提供的值是落在產生的記錄上的值。沒有 LLM 推論,也沒有衝突解決方法。

AgentCore 記憶體會依事件的決定性索引鍵值來分組事件。例如,標記的事件department: "engineering"會與標記 的事件分開處理department: "finance"

合併在這些群組中運作。具有 的記錄compliance_level: "hipaa"絕不會與標記為 的記錄合併compliance_level: "standard"。這使得確定性金鑰非常適合:

  • 合規隔離 - 具有不同合規層級的記錄絕不會混合。

  • 組織路由 - 無交叉污染的部門範圍擷取。

  • 多租用戶子篩選 - 租用戶特定的屬性會完全按照提供的保留。

如果事件沒有決定性索引鍵的值,則產生的記錄上沒有索引鍵。

直接寫入路徑 (BatchCreateMemoryRecordsBatchUpdateMemoryRecords) 繞過擷取。STRICTLY_CONSISTENT 擷取類型對它們沒有影響。如同您為這些 APIs所做的,直接提供中繼資料。

使用批次 APIs建立直接記錄

對於知識庫匯入、自我管理策略或預先處理的內容,請使用 BatchCreateMemoryRecords(或 BatchUpdateMemoryRecords) 明確提供中繼資料。這完全略過 LLM 擷取 — 發起人控制中繼資料值。

在批次建立的記錄上處理中繼資料的方式,取決於您是否提供 memoryStrategyId

  • 使用 memoryStrategyId — 服務會根據該策略的 篩選輸入中繼資料memoryRecordSchema。只有結構描述中定義的索引鍵會儲存在記錄中。所有其他索引鍵 — 包括不在結構描述中的索引鍵 — 都會無提示地捨棄。這可為您提供結構描述強制執行的一致性,確保批次建立的記錄具有與事件驅動擷取所產生的記錄相同的中繼資料形狀。

  • 不使用 memoryStrategyId — 服務會依原樣在記錄中存放承載中的所有中繼資料金鑰。這包括索引的索引鍵、策略結構描述中的索引鍵,以及兩者皆非的索引鍵。不過,只有索引鍵可篩選 - 嘗試篩選非索引鍵會傳回 ValidationException。未索引的索引鍵仍會顯示在 GetMemoryRecordListMemoryRecords回應中。

下列範例會建立不含 的記錄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"} } }]'

在第二個範例中,如果策略的結構描述只定義 priorityagent_typesentimentchannel則會從儲存的記錄無提示地捨棄 。

使用 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:使用中繼資料篩選條件進行查詢

中繼資料篩選條件會在向量相似性搜尋執行 (預先篩選) 之前套用。這會先減少候選集。因此,K 近鄰 (KNN) 搜尋會在更小、更相關的子集上運作。

Filter 結構

每個篩選條件都是表達{ left, operator, right }式:

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

每個查詢最多可合併 5 個篩選條件。使用AND邏輯套用多個篩選條件。

支援的運算子

運算子 所需的右值 使用 說明

EQUALS_TO

STRING、NUMBER

完全相符。

CONTAINS

字串清單

傳回 STRINGLIST 中任何元素包含指定字串作為完全相符的記錄。

EXISTS

所有類型

金鑰存在於記錄中

NOT_EXISTS

所有類型

記錄中沒有金鑰

GREATER_THAN

是 (numberValue)

NUMBER

大於比較的數值

GREATER_THAN_OR_EQUALS

是 (numberValue)

NUMBER

greater-than-or-equal數值比較

LESS_THAN

是 (numberValue)

NUMBER

小於比較的數值

LESS_THAN_OR_EQUALS

是 (numberValue)

NUMBER

less-than-or-equal的數值比較

BEFORE

是 (dateTimeValue)

dateTimeValue

時間戳記在給定值之前

AFTER

是 (dateTimeValue)

dateTimeValue

時間戳記在給定值之後

注意: 上的事件中繼資料篩選條件僅ListEvents支援 EXISTSNOT_EXISTSEQUALS_TO,僅支援 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 擷取欄位。不過,在正常記憶體生命週期內,當較舊的記憶體與較新的記憶體合併時,會使用目前的結構描述重新擷取合併的記錄,並將包含新的中繼資料欄位。

配額

資源 限制

每個記憶體的索引鍵

10

每個策略的 STRICTLY_CONSISTENT 金鑰

3

每個策略的中繼資料結構描述項目

20

記憶體記錄中繼資料項目 (使用者提供)

20

每個查詢的篩選條件

5

allowedValues 每個驗證規則

10

maxItems 用於STRINGLIST驗證

5

definition / llmExtractionInstruction 長度

每個 1000 個字元

中繼資料金鑰長度

128 個字元

stringValue 長度

256 個字元

STRINGLIST 成員的長度

64 個字元

最佳實務

  • 從直接影響擷取品質的 3-5 個篩選條件維度開始。每個索引欄位都會使用儲存基礎設施容量,而 10 鍵限制會反映這一點。從三到五個直接影響擷取品質的索引鍵開始,並在出現具體需求時新增更多索引鍵。

  • 寫入清晰的特定definition字串。definition 說明 欄位所代表的內容。而不是「票證的優先順序」,而是撰寫「根據客戶影響的發行優先順序層級。值的範圍從嚴重 (最嚴重) 到低 (最不嚴重)。」 使用 llmExtractionInstruction以取得詳細的擷取邏輯。

  • 使用 限制 LLM 輸出validation.allowedValues如果沒有驗證,LLM "High"可能會"HIGH"針對相同的概念產生 "high"、 或 ,中斷篩選條件比對。

  • 選擇符合網域語意的衝突解析規則。 LATEST_VALUE 是安全的預設值,但對於提升工作流程agent_type中的 等欄位,保留最資深值的自訂指令更為正確。

  • 偏好對話內容的事件驅動路徑。讓 LLM 處理擷取和衝突解決。為您已知道正確中繼資料值的大量匯入保留批次 APIs。

  • 在策略層級規劃結構描述。每個策略都可以有自己的 metadataSchema,允許不同的策略以不同的方式擷取和處理相同的金鑰。語意策略可能會使用自訂擷取指示來分類對話內容的優先順序,而摘要策略可能會使用針對摘要特定中繼資料調校的不同定義。

  • 在批次建立的記錄memoryStrategyId上刻意使用 。當您包含 時memoryStrategyId,服務只會篩選輸入中繼資料到該策略結構描述中的索引鍵 — 所有其他索引鍵都會無提示地捨棄。當您省略它時,承載中的所有中繼資料都會依原狀存放。根據您的使用案例選擇:應符合擷取產生記錄之記錄的結構描述強制執行一致性,或對您外部管理中繼資料的大量匯入進行完全控制。

  • 使用非索引結構描述索引鍵進行內容擴充。並非每個中繼資料金鑰都需要可篩選。未宣告為索引鍵的結構描述索引鍵仍會填入擷取的記錄,並在取得/清單回應中顯示,但無法在篩選表達式中使用。這對於 sentiment或 等中繼資料很有用summary_notes,這些中繼資料可充實記錄以供下游使用,而不會消耗索引鍵預算。

  • 針對您已知道的值使用決定性擷取。有些索引鍵代表固定的組織屬性department,例如 tenant_tier、 或 compliance_scope。如果應用程式在事件建立時具有這些值,請將它們設定為 STRICTLY_CONSISTENT。在每個事件上提供 值。這可保證記錄的確切值,並移除 LLM 擷取可能引進的不一致表示法 (例如 "eng""Engineering")。LLM_INFERRED 預留必須從對話內容推斷的維度,例如情緒或主題。

  • 及早規劃決定性金鑰槽。每個STRICTLY_CONSISTENT索引鍵使用 10 個索引鍵插槽的其中一個。新增索引鍵後就無法移除。如果您打算使用確定性中繼資料,請預留位置。

要避免的反模式

  • 請勿編製描述或全名等高基數自由文字欄位的索引,它們會在沒有提供實用篩選條件邊界的情況下膨脹索引。

  • 請勿將中繼資料用於每次互動時變更的值,中繼資料對於穩定或緩慢變更的屬性最有效。

  • 請勿單獨依賴中繼資料進行租戶隔離。沒有命名空間隔離的tenant_id中繼資料欄位是一種security-through-convention模式,會在任何遺漏的篩選條件上中斷。使用 的命名空間who,以及 whatwhen和 的中繼資料how urgent

  • 請勿將 LLM 擷取用於必須確切的值。如果金鑰必須攜帶特定的已知值 (例如 departmentticket_id),請使用STRICTLY_CONSISTENT擷取或透過批次 APIs提供。LLM 擷取可能會產生相同概念的變化。