View a markdown version of this page

使用命名空间指定长期内存组织 - 亚马逊基岩 AgentCore

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用命名空间指定长期内存组织

创建内 AgentCore 存创建 AgentCore 内存时,使用命名空间来指定内存策略的长期内存的逻辑分组位置。每次使用内存策略提取新的长期内存时,它都会保存在您设置的命名空间下。这意味着所有长期内存都限于其特定的命名空间,从而使它们井井有条,并防止与其他用户或会话混淆。您应该使用由正斜杠/分隔的分层格式。这有助于使记忆井井有条。根据需要,您可以根据应用程序的组织需求选择在命名空间的大括号内使用以下预定义变量:

  • ActorId — 确定长期记忆属于谁。

    参与者是指诸如最终用户或 agent/user 组合之类的实体。例如,在编码支持聊天机器人中,演员通常是开发者提问。使用Actor ID可以帮助系统知道内存属于哪个用户,从而使每个用户的数据保持独立和井井有条。

  • StrategyID — 显示正在使用哪种内存策略。该策略标识符是在您创建 AgentCore 内存时自动生成的。

  • 会话ID — 识别内存来自哪个会话或会话。

    会话通常是用户与 AI 代理之间的单一对话或互动时段。它将对话期间发生的所有相关消息和事件分组。

例如,如果您在创建 AgentCore 内存时将以下命名空间定义为策略的输入:

/strategy/{memoryStrategyId}/actor/{actorId}/session/{sessionId}/

创建内存后,这个命名空间可能如下所示:

/strategy/summarization-93483043/actor/actor-9830m2w3/session/session-9330sds8

命名空间可以有不同的粒度级别。以下示例仅使用内置变量:

会话级别的精细化

/strategy/{memoryStrategyId}/actor/{actorId}/session/{sessionId}/

在所有会话中在演员级别上进行精细化处理

/strategy/{memoryStrategyId}/actor/{actorId}/

在策略层面上对各行为体进行精细化处理

/strategy/{memoryStrategyId}/

所有策略均为全球性

/

为了实现更精细的组织,您可以添加自定义命名空间变量来表示其他维度,例如租户、团队或环境。

有关示例代码,请参阅启用长期内存。

自定义命名空间变量

除了内置变量 (actorId,sessionId,memoryStrategyId) 之外,您还可以定义自定义命名空间变量来表示应用程序的独特组织维度,例如公司、组织、团队或环境。使用自定义变量,您可以根据任意层次结构来确定长期记忆的范围,而无需创建重复的策略或重载内置变量。

例如,多租户应用程序可能需要由组织限定的内存:

/org/{orgname}/team/{teamname}/actor/{actorId}/session/{sessionId}/

在使用namespaceKeys参数创建或更新现有内存资源时,您可以定义自定义变量,并在运行时通过CreateEvent操作中的extractionConfig.namespaceVariables字段提供它们的值。

重要

所有自定义命名空间变量的键和值都必须为小写。

定义命名空间密钥

创建或更新内存资源时,使用namespaceKeys参数声明您的自定义变量密钥和可选的验证规则。每个密钥必须:

  • 仅包含小写字母数字字符。

  • 不是内置变量名(actorIdsessionId、或memoryStrategyId)。

  • 长度最多为 32 个字符。

每个内存资源最多可以定义 5 个命名空间密钥,每个命名空间最多可以定义 5 个自定义变量namespaceTemplate。

定义命名空间密钥时请记住以下几点:

  • 您可以定义任何策略都未引用的命名空间密钥来预注册密钥以备将来使用。

  • 单个命名空间密钥可以由多种策略引用。例如,{companyname}可以出现在语义策略和摘要策略中。namespaceTemplate

  • namespaceTemplate无法删除策略当前引用的命名空间密钥。你必须先从策略中删除引用(取消引用密钥),然后将其删除。

对于每个密钥,您可以选择指定限制运行时接受的值的验证规则:

  • 允许的值 -最多 10 个允许值的列表(区分大小写)。值必须以小写字母数字字符开头,并且仅包含小写字母数字字符、连字符和下划线。

  • RegexPattern — 值必须匹配的正则表达式模式(最多 64 个字符)。

当您同时指定allowedValues和时regexPattern,服务会强制执行这两个规则(逻辑AND)。

以下示例显示如何使用自定义命名空间变量和验证创建内存资源:

aws bedrock-agentcore-control create-memory \ --name "MultiTenantAgentMemory" \ --description "Memory for a multi-tenant AI agent" \ --event-expiry-duration 10 \ --memory-strategies '[ { "semanticMemoryStrategy": { "name": "TenantScopedStrategy", "namespaceTemplates": ["/org/{orgname}/team/{teamname}/actor/{actorId}/session/{sessionId}/"] } } ]' \ --namespace-keys '[ {"key": "orgname", "validation": {"allowedValues": ["acme", "globex", "initech"]}}, {"key": "teamname", "validation": {"regexPattern": "^[a-z][a-z0-9-]*$"}} ]'

在运行时提供命名空间值

使用CreateEvent操作创建事件时,在extractionConfig.namespaceVariables字段中传递自定义命名空间变量值:

aws bedrock-agentcore create-event \ --memory-id "MultiTenantAgentMemory-n29sh5ka8r" \ --actor-id "user123" \ --session-id "session67" \ --event-timestamp "$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ")" \ --payload '[ { "conversational": { "content": {"text": "I need help debugging my application."}, "role": "USER" } } ]' \ --extraction-config '{ "namespaceVariables": { "orgname": "acme", "teamname": "engineering" } }'

在长期内存提取期间,该服务会将这些值替换到命名空间模板中。

注意

如果CreateEvent请求中未提供策略引用的自定义命名空间变量,namespaceTemplate则不会对该策略进行命名空间解析。因此,没有针对该策略启动长期内存提取。CreateEvent操作仍然成功,该事件会保留在短期记忆中。

要检测这些故障,请设置供应商日志并监控该NamespaceResolutionFailure指标,该指标的报告维度为:Operation、ResourceStrategyType、,并StrategyId跳过了提取操作。

更新命名空间密钥

当您使用UpdateMemory操作更新命名空间密钥时,该namespaceKeys值将完全替换现有集合。要安全更新,请使用检索当前密钥GetMemory,应用您的更改,然后提交完整列表。

请记住以下限制:

  • 如果您省略了仍被策略引用的密钥namespaceTemplate,则该服务会抛出. ValidationException 必须先从策略中移除密钥,namespaceTemplate然后才能将其从中移除namespaceKeys。

  • 要添加新密钥,请将其与请求中的所有现有密钥一起添加。

# Get the current memory configuration current = control_client.get_memory(memoryId="MultiTenantAgentMemory-n29sh5ka8r") existing_keys = current['memory'].get('namespaceKeys', []) # Add a new key while preserving existing ones existing_keys.append({ 'key': 'category', 'validation': { 'allowedValues': ['backend', 'frontend', 'data'] } }) # Update with the full set control_client.update_memory( memoryId="MultiTenantAgentMemory-n29sh5ka8r", namespaceKeys=existing_keys )

使用 IAM 条件密钥限制写入路径访问

您可以创建 IAM 策略,使用bedrock-agentcore:namespaceVariable/<variableName>条件密钥来控制调用者在创建事件时可以使用哪些自定义命名空间变量值。使用此条件密钥,您可以在写入路径上强制租户隔离。

条件键遵循模式,bedrock-agentcore:namespaceVariable/<key>其中<key>是中定义的命名空间变量名称namespaceKeys。

以下策略仅允许调用者在设置orgname为时创建事件acme,并在设置orgname为时明确拒绝请求globex:

{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowCreateEventForAcme", "Effect": "Allow", "Action": "bedrock-agentcore:CreateEvent", "Resource": "arn:aws:bedrock-agentcore:us-east-1:123456789012:memory/memory_id", "Condition": { "StringEquals": { "bedrock-agentcore:namespaceVariable/orgname": "acme" } } }, { "Sid": "DenyCreateEventForGlobex", "Effect": "Deny", "Action": "bedrock-agentcore:CreateEvent", "Resource": "arn:aws:bedrock-agentcore:us-east-1:123456789012:memory/memory_id", "Condition": { "StringEquals": { "bedrock-agentcore:namespaceVariable/orgname": "globex" } } } ] }

下表显示了 IAM 如何根据策略中是否存在条件密钥以及请求是否提供命名空间变量来评估请求:

政策有条件namespaceVariable吗? 请求提供变量? 结果 Reason

否

否

允许

状况未评估

否

是

允许

多余的上下文键被忽略

是

是(匹配值)

允许

条件满意

是

否

已拒绝

缺少条件密钥,无法满足

是

是(不匹配的值)

已拒绝

条件不满意

使用 IAM 限制读取路径访问权限

您可以创建 IAM 策略,根据您定义的范围(例如参与者、会话和命名空间)限制内存读取访问权限。在 IAM 策略中使用范围作为上下文密钥。

以下策略限制了将内存检索到特定命名空间或特定 NamespacePath 层次结构下的记录的权限。在此示例中,该策略仅允许访问具有精确命名空间的内存,例如summaries/agent1/或具有以下命名空间路径层次结构下命名空间的内存,例如或。summaries/agent1/ summaries/agent1/session1/ summaries/agent1/session2/

{ "Version":"2012-10-17", "Statement": [ { "Sid": "SpecificNamespaceAccess", "Effect": "Allow", "Action": [ "bedrock-agentcore:RetrieveMemoryRecords" ], "Resource": "arn:aws:bedrock-agentcore:us-east-1:123456789012:memory/memory_id", "Condition": { "StringEquals": { "bedrock-agentcore:namespace": "summaries/agent1/" } } }, { "Sid": "SpecificNamespacePathAccess", "Effect": "Allow", "Action": [ "bedrock-agentcore:RetrieveMemoryRecords" ], "Resource": "arn:aws:bedrock-agentcore:us-east-1:123456789012:memory/memory_id", "Condition": { "StringLike": { "bedrock-agentcore:namespacePath": "summaries/agent1/*" } } } ] }
注意

检索 API (ListMemoryRecords,RetrieveMemoryRecords) 需要完全解析的命名空间。此时自定义命名空间变量已被替换,因此现有bedrock-agentcore:namespace和bedrock-agentcore:namespacePath条件键无需额外配置即可覆盖读取路径。