View a markdown version of this page

保单中的护栏 - 亚马逊基岩 AgentCore

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

保单中的护栏

本节介绍如何在策略中定义基岩护栏。Bedrock Guardrails 提供可配置的安全措施,可在请求和响应上运行,以确保 AI 应用程序的安全。目前,您可以在策略中定义即时攻击、内容过滤器和敏感信息防护栏。每个护栏必须配置一个类别和一个介于 0 和 1 之间的阈值。

当护栏评估上下文时,它返回介于 0 到 1 之间的置信度分数,表示评估的内容表现出定义属性的置信度(例如)。PROMPT_INJECTION

护栏区域可用性

下表显示了哪些 AWS 地区在政策中支持护栏:

美国东部(弗吉尼亚州北部) 美国东部(俄亥俄州) 美国西部(北加利福尼亚) 美国西部(俄勒冈州) 亚太地区(海得拉巴) 亚太地区(马来西亚) 亚太地区(孟买) 亚太地区(首尔) 亚太地区(新加坡) 亚太地区(悉尼) 亚太地区(泰国) 亚太地区(东京) 加拿大(中部) 欧洲地区(法兰克福) 欧洲地区(爱尔兰) 欧洲地区(伦敦) 欧洲地区(米兰) 欧洲地区(巴黎) 欧洲(西班牙) 欧洲地区(斯德哥尔摩) 南美洲(圣保罗) AWS GovCloud (US-West)

护栏支撑

✓ 是的

✓ 是的

否

✓ 是的

否

否

否

否

否

✓ 是的

否

✓ 是的

否

否

否

✓ 是的

否

否

否

✓ 是的

否

否

开始前的准备工作

在开始之前,您需要正确配置您的 IAM 角色。

Permissions

在与您的策略引擎关联的 AgentCore 网关上配置的网关执行角色必须同时具有基岩 AgentCore 操作和 Bedrock Guardrails 的权限。该bedrock:InvokeGuardrailChecks权限是必需的,因为策略数据平面使用源自网关执行角色的 FAS(前向访问会话)凭证代表您调用 Bedrock Guardrails API。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "bedrock-agentcore:*", "Resource": "*" }, { "Effect": "Allow", "Action": "bedrock:InvokeGuardrailChecks", "Resource": "*" } ] }

支持的护栏

保护措施名称 实体类型 保障类别

内容过滤器

ContentFilter

VIOLENCE, HATE, SEXUAL, MISCONDUCT, INSULTS

即时攻击检测

PromptAttack

JAILBREAK, PROMPT_INJECTION, PROMPT_LEAKAGE

敏感信息

SensitiveInformation

CREDIT_DEBIT_CARD_NUMBER、US_SOCIAL_SECURITY_NUMBER、EMAIL、PHONE、ADDRESS、AWS_ACCESS_KEY、AWS_SECRET_KEY、PASSWORD、IP_ADDRESS、NAMEUSERNAME、和 20 多个

在政策中定义护栏

要在策略中定义护栏,您可以将策略编写为代码,也可以用自然语言描述策略。与您可能已经创建的任何现有策略类似,您需要使用条件 (permit) 来指定效果(例如when guardrails)。在这种情况下,您需要提供要启用的特定护栏保护措施、要使用的防护措施类别、您希望护栏保障措施评估的环境以及置信度分数阈值。

护栏定义示例

suppressOutput (principal, action == AgentCore::Action::"<TARGET_NAME>_<METHOD>:<URI>", resource == AgentCore::Gateway::"<GATEWAY_ARN>") when guardrails { BedrockGuardrails::ContentFilter(["HATE"],[context.output.message])["HATE"] .confidenceScore .greaterThan(decimal("0.2")) };

指定护栏保护装置

要选择特定的保障实体类型,请使用 BedrockGuardrails 命名空间:

Safeguard 护栏功能名称

内容过滤器

BedrockGuardrails::ContentFilter

即时攻击

BedrockGuardrails::PromptAttack

敏感信息

BedrockGuardrails::SensitiveInformation

选择保障类别

为给定保障措施选择一个类别(参见支持的护栏)。

例如 BedrockGuardrails::ContentFilter(["HATE"],[context.output.message])

对护栏的影响

要创建用于授权请求的护栏,请使用permit和forbid效果。它们继续管理请求授权。

forbid (principal, action == AgentCore::Action::"<TargetName>___POST:/invocations", resource) when guardrails { BedrockGuardrails::PromptAttack(["PROMPT_INJECTION"], [context.input.prompt])["PROMPT_INJECTION"].confidenceScore.greaterThan(decimal("0.6")) };

要创建用于抑制工具、代理或模型输出的护栏,请使用效果。suppressOutputsuppressOutput是一种新的效果,它对操作返回的数据起作用。授权操作完成后,它会根据护栏评估输出,并在违反护栏时抑制输出。

suppressOutput (principal, action == AgentCore::Action::"<TargetName>___POST:/invocations", resource) when guardrails { BedrockGuardrails::SensitiveInformation(["US_SOCIAL_SECURITY_NUMBER"], [context.output.text])["US_SOCIAL_SECURITY_NUMBER"] .confidenceScore .greaterThan(decimal("0.5")) };
注意

suppressOutput仅支持护栏策略。其条件必须仅包括用when guardrails {…​}方块或普通when {…​}方块书写的护栏支票。suppressOutput不支持标准 Cedar 或temporal {…​}条件。

将背景信息传递给您的护栏

在策略中定义护栏时,必须指定数据路径(例如context.input.message),用于标识要从操作的负载中提取的值。护栏评估提取的值。您可以根据请求或响应架构指定一条或多条数据路径。

例如 [context.input.message, context.input.systemPrompt]

护栏的阈值

通过内容过滤器和即时攻击检测,护栏会返回置信度分数,该分数是 [0,1] 范围内的数值,其中 0 表示低置信度,1 表示高置信度。分数代表护栏检测违规行为的自信程度。当前可能的分数是离散值 {0、0.2、0.4、0.6、0.8 和 1.0}。

要设置阈值,您需要向比较运算符提供十进制值(例如greaterThan(decimal("0.4")))。

分数比较运算符

您可以将以下比较运算符应用于confidenceScoremaxConfidenceScore()、或中的任何一个minConfidenceScore():

运算符 用量

.greaterThan(decimal("X.X"))

分数 > 阈值

.greaterThanOrEqual(decimal("X.X"))

分数 ≥ 阈值

.lessThan(decimal("X.X"))

分数 < 阈值

.lessThanOrEqual(decimal("X.X"))

分数 ≤ 阈值

您可以在保单中使用聚合来提取和比较护栏返回的分数:

聚合

聚合 说明 示例

[<category>].confidenceScore

访问特定类别的置信度分数(十进制)

["HATE"].confidenceScore

maxConfidenceScore()

所有扫描类别的最大置信度(十进制)

.maxConfidenceScore()

minConfidenceScore()

所有扫描类别的最低置信度(十进制)

.minConfidenceScore()

count()

检测到的发现数量(长)

.count()

如何选择阈值

如果在提示创作服务时未指定阈值,则 AgentCore 设置默认值。如果您在没有创作服务帮助的情况下制定策略,则必须提供阈值。

以下默认值经过校准,以可接受的精度为大多数工作负载提供广泛的覆盖范围:

Safeguard 默认阈值

内容过滤器

0.2

即时攻击检测

0.4

敏感信息

0.2

选择自定义阈值

如果默认阈值不符合您的要求,您可以使用以下方法之一确定工作负载的最佳阈值。

选项 1:对照黄金测试集进行评估

当你有一组经过精心策划的测试输入和明确的预期结果时,请使用这种方法。

  1. 创建策略并将策略引擎模式设置为 LOG_ONLY。

  2. 通过您的策略引擎所连接的网关运行测试集。

  3. 查看每次评估的日志。每个日志条目都包括评估的内容和护栏返回的置信度分数。

  4. 对于每个结果,标明护栏是应该标记内容还是什么都不做(分别是对和错)。

  5. 使用这些标签,结合日志中可用的置信度分数,在多个阈值下生成混淆矩阵。比较每个阈值的精度和召回率,选择与您对误报和漏检的容忍度相一致的值。

选项 2:根据生产流量进行评估

当你没有预建的测试集并且想要使用真实的流量模式进行校准时,请使用这种方法。

  1. 创建策略并将策略引擎模式设置为 LOG_ONLY。

  2. 允许策略引擎评估生产流量。每个日志条目都包括评估的内容和护栏返回的置信度分数。

  3. 使用 LLM-as-a-judge 将每个记录的结果标记为真(护栏应标记内容)或假(护栏不应标记内容)。

  4. 使用这些标签,在多个阈值下建立混淆矩阵。比较每个阈值的精度和召回率,选择与您对误报和漏检的容忍度相一致的值。

在政策中测试护栏

AgentCore 提供了多种机制,用于在生产流量上强制执行护栏策略之前对其进行测试。您可以控制策略引擎级别、单个策略级别或两者兼而有之,从而可以逐步验证护栏行为。有关更多信息,请参阅测试策略。

护栏如何与政策配合使用

护栏策略可以应用于任何网关目标。护栏运行在:* MCP 目标 — POST /mcp (JSON-RPC tools/call) * HTTP 运行时目标 — * HTTP 推POST /<target>/invocations理目标 — POST /inference

当呼叫到达您的网关时,策略评估器将执行以下操作:

  1. 匹配范围 -确定哪些护栏政策适用于此请求

  2. 提取内容 — 从请求正文中提取dataPath(例如context.input.message)指定的字段

  3. 调用 Bedrock InvokeGuardrailChecks API — 评估内容并将返回的置信度分数注入到政策评估上下文中

  4. 使用护栏分数评估策略 -将返回的置信度分数与策略中定义的阈值进行比较

  5. 将决策ALLOW或DENY带有政策注释的决策返回给网关

注意:护栏是不确定的。相同的输入可能导致不同的输出。但是,策略是确定性的,相同的输入将始终产生相同的产出。

政策中护栏的局限性

  • 不支持正则表达式或模式匹配 ——护栏使用机器学习评分,而不是正则表达式

  • 您不能将标准的 Cedar 政策与护栏混为一谈——取而代之 when guardrails {…​} when {…​}

  • 街区中需要护栏 ——护栏when guardrails {…​}块内必须至少定义一个护栏

  • suppressOutput仅支持护栏政策 — 其条件必须仅包含护栏检查,不支持标准 Cedar 或条件 temporal {…​}