Azure AI Content Safety 安全护栏
AISIX 可以调用 Azure AI Content Safety 作为外部安全护栏服务。你可以使用 Prompt Shield 阻断越狱和间接提示词注入,也可以使用 Text Moderation 对内容类别和自定义阻断列表进行评分。
当前 Prompt Shield 集成将待检查文本通过 userPrompt 提交,不单独传入 documents。
本指南将创建 Prompt Shield 安全护栏,验证 AISIX 会阻断类似越狱的提示词,并添加按类别执行的 Text Moderation。
准备工作
请先准备以下内容:
- 阅读安全护栏行为,了解钩子点、执行模式和远程故障处理方式。
- 以下配置路径之一:
- AISIX Enterprise 或 AISIX Cloud,其中包含环境、已接入的网关和具有写权限范围的 Admin Token。对于 AISIX Enterprise,请按照 AISIX Enterprise 快速入门操作。如需申请 AISIX Cloud 访问权限,请联系 API7。
- 加载声明式
resources.yaml文件的开源 AISIX 网关。
- 可以发送 Chat Completions 请求的模型别名和调用方 API Key。
- Azure AI Content Safety 资源端点。
- Azure AI Content Safety 的订阅密钥。
curl。控制面路径还会使用jq。
导出两种配置路径都会使用的网关参数:
# AISIX_PROXY 不含尾部斜杠或端点路径
# 本地快速入门使用 http://127.0.0.1:3000。
export AISIX_PROXY="YOUR_AISIX_GATEWAY_URL"
export AISIX_API_KEY="YOUR_CALLER_API_KEY"
export AISIX_MODEL="gpt-4o-mini"
export AZURE_CONTENT_SAFETY_KEY="YOUR_AZURE_CONTENT_SAFETY_KEY"
创建 Prompt Shield 安全护栏
请选择一种配置路径创建 Prompt Shield 安全护栏,再使用通用验证步骤。
AISIX Enterprise 或 AISIX Cloud
导出控制面连接参数:
# AISIX_CP 包含 /api,且不含尾部斜杠
# 本地私有化部署快速入门使用 http://localhost:8080/api
export AISIX_CP="YOUR_AISIX_CONTROL_PLANE_API_URL"
export AISIX_TOKEN="YOUR_ADMIN_TOKEN"
export ENV_ID="YOUR_ENVIRONMENT_ID"
在环境中创建 Azure Prompt Shield 安全护栏:
GUARDRAIL_ID=$(curl -sS -X POST "$AISIX_CP/environments/$ENV_ID/guardrails" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "prompt-shield",
"enabled": false,
"hook_point": "input",
"fail_open": false,
"enforcement_mode": "block",
"kind": "azure_content_safety",
"config": {
"endpoint": "https://YOUR_RESOURCE.cognitiveservices.azure.com",
"api_key": "'"${AZURE_CONTENT_SAFETY_KEY}"'",
"timeout_ms": 3000
}
}' | jq -r '.guardrail.id')
❶ input 会在 AISIX 发送上游请求前检查调用方请求。参见检查位置。
❷ fail_open: false 表示当 Azure AI Content Safety 调用失败或超时时阻断请求。这是默认值。
❸ enforcement_mode: block 表示拒绝命中的内容。这是默认行为。参见执行模式。
❹ timeout_ms 限制的是每一次调用 Azure AI Content Safety 的完整耗时,从发送请求直到读完整个响应体,而不是整个检查。AISIX 每次调用最多发送 10,000 个字符,并且从不为了满足上限而截断内容:更长的文本会被切分为多个分块,每个分块单独调用一次。这些调用依次执行,分块数量没有上限,也没有整体时限,因此总耗时约为分块数乘以单次调用耗时。下文添加的 Text Moderation 以同样的方式切分文本并应用 timeout_ms。
AISIX 会在配置的端点地址后追加 Prompt Shield API 路径,并随请求发送 Azure 订阅密钥。
该命令会获取安全护栏 ID,下一步用它附加安全护栏。以后也可以使用该 ID 查看、更新或删除资源。
将安全护栏附加到环境,使其应用到环境中的所有流量:
curl -sS -X POST "$AISIX_CP/environments/$ENV_ID/guardrails/$GUARDRAIL_ID/attachments" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"scope_type": "env",
"enabled": true
}'
❶ env Scope 覆盖环境中的每个请求,并省略 scope_id。如需把安全护栏限定到单个资源,请使用 model、api_key 或 team,并提供对应的 scope_id。
Attachment 存在后启用安全护栏:
curl -sS -X PATCH "$AISIX_CP/environments/$ENV_ID/guardrails/$GUARDRAIL_ID" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled": true}'
启用后的配置会自动投射到已接入的网关。
开源 AISIX 网关
在已定义示例模型和调用方 API Key 的资源文件中添加安全护栏。示例从 AZURE_CONTENT_SAFETY_KEY 读取凭证。已经运行的快速入门容器不会继承之后才在主机上导出的变量。
guardrails:
- name: prompt-shield
enabled: true
hook_point: input
fail_open: false
enforcement_mode: block
kind: azure_content_safety
endpoint: https://YOUR_RESOURCE.cognitiveservices.azure.com
api_key: ${AZURE_CONTENT_SAFETY_KEY}
timeout_ms: 3000
guardrail_attachments:
- guardrail_id: prompt-shield
scope_type: env
priority: 100
模型服务提供方字段直接位于安全护栏条目下,而不是 config 下。安全护栏只在 Attachment 指定的范围内生效:请添加 guardrail_attachments 条目引用它,否则它虽然会被加载,但不会检查任何流量。
重新加载或重建网关前,请验证完整文件。扩展开源快速入门时,请按照重新加载资源文件操作,只在验证成功后重建容器,并传入额外凭证变量。