本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
政策中的护栏
本节介绍如何在策略中设置护栏,以便政策的决策取决于请求或响应内容是否包含不安全的材料。内容检查本身由护栏执行,Policy 在评估期间会 AgentCore 调用该护栏。如今,护栏由 A mazon Bedro ck Guardrails 提供支持。
护栏状况列举了三件事:护栏类型、该类型应评估的类别以及要评估的内容。护栏会返回信心分数,您的保单决定如何处理它。
如果您不熟悉政策中的护栏,请从护栏入门开始,这将引导您完成从头到尾的创建过程。有关涵盖 MCP、运行时和每个推理 API 的策略示例,请参阅 Guardra il 策略示例。
护栏状况的基石
中的策略 AgentCore 支持三种护栏类型。每个类别都采用一组类别进行评估,并以不同的方式返回其结果。
-
ContentFilter -
Harmful-content 类别,例如
VIOLENCE或HATE。返回您命名的每个类别的置信度分数,无论内容是否表现出来。 -
PromptAttack -
Prompt-manipulation 类别,例如
JAILBREAK或PROMPT_INJECTION。返回您命名的每个类别的置信度分数。 -
SensitiveInformation -
敏感实体,例如
EMAIL或US_SOCIAL_SECURITY_NUMBER。返回每个找到的实体的检测结果,而不是每个类别的分数,因此它没有每个类别的分数,需要聚合。
有关每种类型接受的类别,请参阅支持的护栏。有关要评估的内容,请参阅将上下文传递给护栏。
置信度分数是介于 0 到 1 之间的小数,表示内容表现出评估属性的强度。您决定如何处理该分数,保单将您的决定作为护栏结果的条件——通常是阈值比较,例如。.confidenceScore.greaterThan(decimal("0.4"))有关阈值和比较运算符,请参阅护栏阈值。
也可以降低各类别的分数,而不是逐个进行比较。聚合是这样做的:maxConfidenceScore()minConfidenceScore()返回分数,同时count()返回检测到的数量并categories()返回检测到的类别集,因此这两个类别不需要阈值。有关完整列表,请参阅聚合。
护栏的区域可用性
下表显示了哪些 Amazon 地区支持策略中的护栏。
| 区域名称 | 政策中的护栏 |
|---|---|
|
美国东部(弗吉尼亚州北部) |
✓ 是的 |
|
美国东部(俄亥俄州) |
✓ 是的 |
|
美国西部(北加利福尼亚) |
否 |
|
美国西部(俄勒冈州) |
✓ 是的 |
|
亚太地区(海得拉巴) |
否 |
|
亚太地区(马来西亚) |
否 |
|
亚太地区(孟买) |
否 |
|
亚太地区(首尔) |
否 |
|
亚太地区(新加坡) |
否 |
|
亚太地区(悉尼) |
✓ 是的 |
|
亚太地区(泰国) |
否 |
|
亚太地区(东京) |
✓ 是的 |
|
加拿大(中部) |
否 |
|
欧洲地区(法兰克福) |
否 |
|
欧洲地区(爱尔兰) |
否 |
|
欧洲地区(伦敦) |
✓ 是的 |
|
欧洲地区(米兰) |
否 |
|
欧洲地区(巴黎) |
否 |
|
欧洲(西班牙) |
否 |
|
欧洲地区(斯德哥尔摩) |
✓ 是的 |
|
南美洲(圣保罗) |
否 |
|
Amazon GovCloud (US-West) |
否 |
开始前的准备工作
在开始之前,您需要正确配置您的 IAM 角色。
Permissions
除了网关已经拥有的 AgentCore 权限bedrock:InvokeGuardrailChecks外,还需要网关的执行角色。有关后者,请参阅 AgentCore IAM 权限中的AgentCore 网关和策略。
中的策略 AgentCore 使用从网关的执行角色派生的前向访问会话 (FAS) 凭据代表您调用 Bedrock Guardrails API,这就是该权限属于该角色的原因。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "bedrock:InvokeGuardrailChecks", "Resource": "arn:aws:bedrock:us-west-2:123456789012:guardrail/abc123" } ] }
支撑的护栏
| 护栏类型 | 实体类型 | 类别 |
|---|---|---|
|
内容筛选条件 |
|
|
|
即时攻击检测 |
|
|
|
敏感信息 |
|
个人身份 — |
|
财务 — |
||
|
政府和健康标识符 — |
||
|
凭据和网络 — |
注意
此表是 Policy in 支持的护栏和类别的当前列表。 AgentCore 创建策略时,该类别之外的类别无法通过验证。特别是,没有ACCOUNT_NUMBER类别——使用US_BANK_ACCOUNT_NUMBER或INTERNATIONAL_BANK_ACCOUNT_NUMBER。
在政策中写护栏
要在政策中设置护栏,您可以将策略编写为代码,也可以用自然语言进行描述。与其他策略一样,使用条件 (when guardrails) 指定效果permit,例如。在条件中,提供要启用的护栏、要评估的类别、要评估的内容以及你想要的分数比较。
护栏定义示例
suppressOutput (principal, action == AgentCore::Action::"<TargetName>___<METHOD>:<uri>", resource == AgentCore::Gateway::"<gateway-arn>") when guardrails { BedrockGuardrails::ContentFilter(["HATE"],[context.output.message])["HATE"] .confidenceScore .greaterThan(decimal("0.2")) };
注意
suppressOutput在工具生成结果后运行,并隐瞒调用者的响应。该工具仍在运行;只有响应被抑制。
suppressOutput仅适用于护栏条件。其状况必须仅包括护栏检查。将这些支票写成when guardrails {…}方块或普通when {…}方块。 suppressOutput不支持标准 Cedar 或temporal {…}条件。
请注意将目标名称与方法和 URI 分开的三个下划线。有关针对完整参考网关的示例,请参阅 G uardrail 策略示例。
创建带有护栏的政策
要创建策略,请将声明放在definition属性的policy字段中。有关更多信息,请参阅创建策略。否则,它会像任何其他策略一样创建。
例
无论使用哪种曲面,都最好使用反向比较将规则表示permit为 a。默认情况下,策略评估是拒绝的,因此只有在分数保持较低时permit才保持的单一策略既可以授予操作又可以对其进行门禁:
permit (principal, action == AgentCore::Action::"RefundTool___process_refund", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-a1b2c3d4e5") when guardrails { BedrockGuardrails::ContentFilter(["VIOLENCE"], [context.input.reason])["VIOLENCE"] .confidenceScore.lessThanOrEqual(decimal("0.4")) };
forbid当你想限制已经存在的权限时使用,比如其他一些策略允许的操作,比如限制其输入值。A forbid 优先于 anypermit,因此它会从现有补助金中减去。就其本身permit而言,它一无所获:默认情况下,该动作会被拒绝,并且从不咨询护栏,因此孤独者forbid需要同伴才能执行相同的动作。
重要
策略验证会分析引擎中设置的整个策略,它无法解释护栏状况。因此,forbid唯一的大门是护栏的A看起来是无条件的,因此,如果引擎中没有其他东西允许该主体、动作和资源,则该集合将被报告为过于严格:. Overly Restrictive: Policy Engine will deny every request for the specified principal (…), action (…)
and resource (…) combination if the policy is added or updated 在默认情况下,--validation-mode FAIL_ON_ANY_FINDINGS该保单被拒绝。无论如何都--validation-mode IGNORE_ALL_FINDINGS要通过创建它。
由于结果是策略集的属性,而不是任何一个语句的属性,因此您是否看到它取决于引擎已经拥有的内容。
拒绝是异步的。通话返回 202CREATING,然后保单以中的原因结清statusReasons,因此请对终端状态进行民意调查,而不是将 CREATE_FAILED 202 视为成功。
有关改用 AgentCore CLI 的端到端演练,请参阅护栏入门。有关每种目标类型的声明,请参阅 Guardrail 策略示例。
指定护栏类型
要选择特定的护栏类型,请使用命名空间: BedrockGuardrails
| 护栏类型 | 护栏功能名称 |
|---|---|
|
内容过滤器 |
|
|
即时攻击 |
|
|
敏感信息 |
|
选择护栏类别
为所选护栏类型选择一个类别(请参阅支撑的护栏)。
例如:BedrockGuardrails::ContentFilter(["HATE"],[context.output.message])
对护栏的影响
要对护栏上的授权请求进行门禁,请使用permit和效果。forbid它们继续控制请求授权。
forbid (principal, action == AgentCore::Action::"<TargetName>___POST:/invocations", resource == AgentCore::Gateway::"<gateway-arn>") when guardrails { BedrockGuardrails::PromptAttack(["PROMPT_INJECTION"], [context.input.prompt])["PROMPT_INJECTION"].confidenceScore.greaterThan(decimal("0.6")) };
要抑制工具、代理或模型的输出,请使用该suppressOutput效果。 suppressOutput对操作返回的数据进行操作。授权操作完成后,它会对照护栏评估输出,并在违反护栏时抑制输出。
suppressOutput (principal, action == AgentCore::Action::"<TargetName>___POST:/invocations", resource == AgentCore::Gateway::"<gateway-arn>") when guardrails { BedrockGuardrails::SensitiveInformation(["US_SOCIAL_SECURITY_NUMBER"], [context.output.text]) .count() > 0 };
重要
有两条规则限制了护栏可以读取请求的哪一边,这两条规则都是在您创建策略时强制执行的。
-
授权效果——
permit或forbid——可能只读context.input.*路径。suppressOutput效果可能是只读context.output.*路径。context.output与permit或一起使用forbid会被拒绝Guardrail '<name>' references 'context.output' but the policy has an authorization effect。 -
单个护栏呼叫不能混合
context.input.*context.output.*路径;一次通话中的每条路径都必须位于同一侧。要筛选请求及其响应,请在同一个suppressOutput策略中编写两个护栏调用,每侧一个。限制是针对每个通话,而不是按策略进行的。
由于策略命名了特定的操作,因此它还必须使用命名特定的网关 ARN。resource ==拒绝让资源不受约束。有关更多信息,请参阅资源特异性要求。
将上下文传递给您的护栏
在护栏条件下,指定数据路径,例如context.input.message,用于标识要从操作的有效载荷中提取的值。护栏评估提取的值。您可以根据请求或响应架构指定一个或多个路径。
例如:[context.input.message, context.input.systemPrompt]
您可以通过以下两种方式之一提供数据路径:
- 字段路径 —
context.input.<field>或context.output.<field> -
当您想要的值是单个字符串(例如工具参数或请求正文的标量字段)时,请使用此选项。字段路径必须解析为字符串;创建策略时,将字段路径指向对象或列表将被拒绝。
- 一个 jsonPath — 一个以开头的字符串文字
$ -
当文本位于列表或字段路径无法到达的对象(对话或内容块列表)中时,请使用此选项。以有效载荷为根编写,不带
context.input.前缀:例如"$.messages[*].content"。JSONPath 作为查询进行评估,因此通配符可以匹配许多值,包括嵌套在不同深度的值。这些匹配项被扁平化为单个文本序列,而不是作为列表保存。
您可以为每个呼叫提供多个数据路径。每个路径都是独立提取的,并作为自己的内容块发送到护栏,因此,要将列表评估为不同的项目,请使用单独的路径而不是一个通配符路径来命名这些项目。
重要
JSONPath 没有方向标记,因此策略的效果决定其方向:suppressOutput读取响应,任何其他效果读取请求。因此,使用 JSONPath 的输出护栏必须是 asuppressOutput,而输入护栏可以是 a forbid 或 a permit — 两者都读取请求。不要在下方的同一个调用中混用 JsonPath 和空context.input.*字段 suppressOutput ——两者暗示相反的方向,请求会被视为附带冲突而被拒绝。
单个 JSONPath 的所有匹配项都连接成一个字符串,它们之间没有分隔字符。这是故意的:分成两个内容块的模式,例如社会安全号码123-后面跟着的社会安全号码45-6789,保持连续并且不能滑过寻找整个模式的探测器。这也意味着来自相邻匹配项的文本一起运行,因此扫描不相关字段的路径可以生成一个不包含单个字段的值。
只要至少有一条其他配置的路径可以解析,则不匹配任何内容的路径都不会起到任何作用。这使您可以在一次调用中命名多个候选形状,用于结构各不相同的有效负载,并且所使用的路径是存在的有效载荷。
警告
创建策略时,JSONPath 未经过验证。与字段路径不同,它既不 AgentCore 检查其语法,也不检查其是否适合您的架构。格式错误的路径,或者命名有效载荷从未发送过的字段的路径,仍然可以到达ACTIVE。评估时会发生什么情况取决于其他问题能否解决。
如果没有配置的数据路径可以解析范围内的任何位置,则评估失败关闭。没有护栏可以运行,因此请求被拒绝Authorization denied: request missing field(s) required for guardrail
evaluation,并命名了它无法解析的路径。正在运行的交通停了下来。遇到此错误时,请先检查 JSONPath。
如果至少有一条已配置的路径确实可以解析,则会跳过包含内容的护栏正常运行和决定,并且只跳过路径未解析的检查。那张支票没有任何作用,也没有提出任何结果,因此在几条工作路径中,一条输入错误的路径会默默地失败,而不是大声失败。
根据应捕获的内容测试每个 JsonPath 护栏,然后从使用 jsonPath 访问数组内的文本中获取路径,而不是从其他 API 改编它们。
有关每个推理 API 路径的示例,请参阅使用 JSONPath 访问数组内的文本。
护栏的阈值
通过内容过滤器和即时攻击检测,护栏会返回置信度分数,该分数是 [0, 1] 范围内的数值,其中 0 表示低置信度,1 表示高置信度。该分数表示护栏检测到违规行为的信心程度。当前可能的分数是离散值 {0.0、0.2、0.4、0.6、0.8、1.0}。
要设置阈值,请向比较运算符提供十进制值,例如greaterThan(decimal("0.4"))。
分数比较运算符
您可以将以下比较运算符应用于confidenceScoremaxConfidenceScore()、或minConfidenceScore():
| 运算符 | 用量 |
|---|---|
|
|
分数 > 阈值 |
|
|
分数 ≥ 阈值 |
|
|
分数 < 阈值 |
|
|
分数 ≤ 阈值 |
您可以在策略中使用聚合来提取和比较护栏返回的分数:
聚合
| 聚合 | 说明 | 示例 |
|---|---|---|
|
|
访问特定类别的置信度分数(十进制 |
|
|
|
所有扫描类别的最大可信度(十进制 |
|
|
|
所有扫描类别的最低置信度(十进制 |
|
|
|
检测到的发现数量(长 |
|
|
|
|
重要
SensitiveInformation需要一种聚合方法,并且不支持按类别编制索引。使用创建策略BedrockGuardrails::SensitiveInformation(["EMAIL"], [context.input.text])["EMAIL"].confidenceScore时,诸如之类的语句会被拒绝Per-category indexing is not supported for
SensitiveInformation。minConfidenceScore()改用count()categories()maxConfidenceScore()、、或。 ContentFilter并PromptAttack支持两种形式。
如何选择阈值
如果在提示创作服务时未指定阈值,则 AgentCore 设置默认值。如果您在没有创作服务帮助的情况下编写策略,则必须提供阈值。
以下默认值经过校准,可为大多数工作负载提供广泛的覆盖范围和可接受的精度:
| 护栏类型 | 默认阈值 |
|---|---|
|
内容过滤器 |
0.2 |
|
即时攻击检测 |
0.4 |
|
敏感信息 |
0.2 |
选择自定义阈值
如果默认阈值不符合您的要求,则可以使用以下方法之一确定工作负载的最佳阈值。
选项 1:根据黄金测试集进行评估
当你有一组精心策划的测试输入并具有明确的预期结果时,请使用这种方法。
-
创建您的策略并将策略引擎模式设置为 LOG_ONLY。
-
通过策略引擎所连接的网关运行您的测试集。
-
查看每次评估的日志。每个日志条目都包括评估的内容和护栏返回的置信度分数。
-
对于每个结果,标注护栏是应该标记内容还是什么都不做(分别为真和假)。
-
使用这些标签,再加上日志中可用的置信度分数,可以在多个阈值下构建混淆矩阵。比较每个阈值的精度和召回率,选择与误报容忍度与错过检测的容忍度一致的值。
选项 2:根据生产流量进行评估
如果您没有预先构建的测试集,并且想要使用真实的流量模式进行校准,请使用此方法。
-
创建您的策略并将策略引擎模式设置为 LOG_ONLY。
-
允许策略引擎评估生产流量。每个日志条目都包括评估的内容和护栏返回的置信度分数。
-
使用 LLM-as-a-judge 将每个记录的结果标记为 true(护栏本应标记内容)或 false(护栏不应该标记内容)。
-
使用这些标签,在多个阈值下构建混淆矩阵。比较每个阈值的精度和召回率,选择与误报容忍度与错过检测的容忍度一致的值。
测试保单中的护栏
AgentCore 提供了多种机制,用于在生产流量上强制使用护栏之前对其进行测试。您可以在策略引擎级别、单个策略级别或两者兼而有之地控制强制执行,从而可以逐步验证护栏行为。有关更多信息,请参阅在 LOG_ONLY 模式下测试策略。
保单中的护栏是如何运作的
您可以在任何网关目标的策略中设置护栏。护栏在以下位置运行:
-
MCP 目标 — 行动
<TargetName>___<ToolName>,通过POST /mcp() JSON-RPCtools/call实现 -
AgentCore 运行时目标 — 操作
<TargetName>___POST:/invocations -
推理目标 — 每个 API 形状一个目标,因此每个 API 只有一个操作:
-
<TargetName>___POST:/v1/chat/completions -
<TargetName>___POST:/v1/responses -
<TargetName>___POST:/v1/messages -
<TargetName>___GET:/v1/models
-
-
HTTP 代理目标 — 操作
<TargetName>___<METHOD>:<uri>
当呼叫到达您的网关时,策略评估器会执行以下操作:
-
匹配范围-确定哪些带有防护的策略适用于此请求
-
提取内容 — 从请求正文中提取由
dataPath(例如context.input.message)指定的字段 -
调用 Bedrock InvokeGuardrailChecks API — 评估内容并将返回的置信度分数注入策略评估上下文中
-
使用护栏分数评估策略 — 将返回的置信度分数与策略中定义的阈值进行比较
-
将决策
ALLOW或DENY带有策略注释的决策返回网关
注意:护栏是不确定的,因此相同的输入可能会导致不同的输出。政策是确定性的;相同的评估环境将始终导致相同的政策决策。
限制
-
不支持正则表达式或模式匹配 — 护栏使用 ML 评分,而不是正则表达式
-
方@@ 块中需要护栏——护栏
when guardrails {…}块里面必须至少定义一个护栏 -
护栏调用无法读取请求的两边,一次调用中的所有数据路径都必须为或
context.input.*。context.output.*suppressOutput策略可以读取双方,但不能从同一个通话中读取 -
Guardrails 是不确定性的 — 相同的内容在单独的通话中可能得分不同,因此接近你阈值的请求可能会被允许一次,下次则被拒绝
-
suppressOutput需要护栏状况——其状况必须仅包括护栏检查。它不支持标准 Cedar 或temporal {…}条件 -
$-jsonPath 数据路径在创建时不会经过验证,也不会检查其语法及其是否适合您的架构。如果它是唯一的路径并且解析为空,则请求将被拒绝而不是被屏蔽,并且拒绝会命名未解析的路径。如果其他路径确实解析了,则会以静默方式跳过未解析的检查。请参阅将上下文传递给您的护栏
注意
在授权效果下(permit或forbid者),您可以将护栏与普通雪松条件合并到一份保单中。 when guardrails { E }等同于一个身体when { E }叫护栏的平原;guardrails标签记录的是意图而不是限制政策。把护栏叫声when和请求或主要条件放进去。unless通过这种方式,单个策略可以包含护栏呼叫、Cedar 条件和时间条件——请参阅将护栏与请求条件相结合以及将时间、护栏和请求条件相结合。
suppressOutput是个例外:其状况必须仅包括护栏检查。有关更多信息,请参阅在策略中编写护栏。