Skip to main content
Version: 3.18

ai-aws-content-moderation

描述#

ai-aws-content-moderation 插件集成了 AWS Comprehend,用于在代理请求到 LLM 时检查请求内容中的有害内容,例如亵渎、仇恨言论、侮辱、骚扰、暴力等,如果评估结果超过配置的阈值则拒绝请求。

该插件是协议感知的:它会从 LLM 请求中提取提示内容(例如 messages[].content),仅审核解码后的文本,而不是原始请求体。request_check_roles 用于选择审核哪些消息角色,request_check_mode 可将 user/tool 的审核范围收窄到最新一轮,避免每次请求都重复审核历史对话。

ai-aws-content-moderation 插件应与 ai-proxyai-proxy-multi 插件一起使用,以代理 LLM 请求。

插件属性#

名称类型必选项默认值有效值描述
comprehendobjectAWS Comprehend 配置。
comprehend.access_key_idstringAWS 访问密钥 ID。
comprehend.secret_access_keystringAWS 秘密访问密钥。
comprehend.regionstringAWS 区域。
comprehend.endpointstringAWS Comprehend 服务端点。未设置时默认为 https://comprehend.{region}.amazonaws.com。如果设置,必须匹配模式 ^https?://
comprehend.ssl_verifybooleantrue如果为 true,则启用 TLS 证书验证。
moderation_categoriesobject审核类别及其对应阈值的键值对。在每个键值对中,键应为 PROFANITYHATE_SPEECHINSULTHARASSMENT_OR_ABUSESEXUALVIOLENCE_OR_THREAT 之一;阈值应在 0 到 1 之间(包含)。
moderation_thresholdnumber0.50 - 1整体毒性阈值。值越高,允许的有害内容越多。此选项与 moderation_categories 中的单独类别阈值不同。例如,如果 moderation_categories 中设置了 PROFANITY 阈值为 0.5,而请求的 PROFANITY 分数为 0.1,则请求不会超过类别阈值。但如果请求的其他类别(如 SEXUALVIOLENCE_OR_THREAT)超过了 moderation_threshold,则请求将被拒绝。
check_requestbooleantrue如果为 true,则审核请求内容。
request_check_rolesarray[string]["user","tool","system","assistant"]取值为 usertoolsystemassistant请求侧审核哪些消息角色。usertoolassistant 遵循 request_check_modesystem 每次请求都审核(其可能被恶意 ToolCall 参数覆盖篡改),并且同时覆盖 OpenAI 的 developer 角色(新模型上用于替代 system)。请求中的 assistant 消息由客户端提供,而非模型自身的输出,因此默认也会被审核。注意:tool 结果审核适用于 OpenAI 兼容格式(tool 输出为独立的 tool 角色/项);Anthropic、Bedrock 的 tool 结果以嵌套 block 形式存在于 user 消息中,其内容不会被抽取。
request_check_modestringalllastall审核哪些 user/tool/assistant 消息。last:仅审核最后一段连续的所选角色消息(最新一轮);all:审核所有所选角色消息。不作用于 system——只要通过 request_check_roles 启用,system 每次都审核。注意:lastassistant 同时使用会扩大而非缩小审核范围,因为 assistant 消息不再中断该连续块;若只想审核最新一轮,请从 request_check_roles 中移除 assistant
deny_codeinteger200[200, 599]请求被拒绝时返回的 HTTP 状态码。默认为 200,使兼容 provider 的拒绝响应在客户端 SDK 中被解析为正常补全;设置为 4xx 可将拒绝暴露为 HTTP 错误。
deny_messagestring请求被拒绝时返回的消息。未设置时,返回审核原因(例如 request body exceeds toxicity threshold)。
fail_modestringskipskipwarnerror当请求未经过 ai-proxy/ai-proxy-multi,因而无法作为 AI 请求进行审核时的处理行为。skip:放行请求且不做检查;warn:放行并记录 warning 日志;error:拒绝请求。

使用示例#

以下示例使用 OpenAI 作为上游服务提供商。

开始之前,请创建一个 OpenAI 账户 并获取 API 密钥。如果您使用其他 LLM 提供商,请参阅该提供商的文档获取 API 密钥。

此外,创建 AWS IAM 用户访问密钥 以便 APISIX 访问 AWS Comprehend

您可以选择将这些密钥保存到环境变量中:

export OPENAI_API_KEY=your-openai-api-key
export AWS_ACCESS_KEY=your-aws-access-key-id
export AWS_SECRET_ACCESS_KEY=your-aws-secret-access-key

审核亵渎内容#

以下示例演示如何使用该插件审核提示中的亵渎程度。亵渎阈值设置为较低的值(0.1),以仅允许较低程度的亵渎。

note

您可以使用以下命令从 config.yaml 中获取 admin_key 并保存到环境变量中:

admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g')

向路由发送一个 POST 请求,请求体中包含系统提示和一个带有轻度亵渎词汇的用户问题:

curl -i "http://127.0.0.1:9080/post" -X POST \
-H "Content-Type: application/json" \
-d '{
"messages": [
{ "role": "system", "content": "You are a mathematician" },
{ "role": "user", "content": "Stupid, what is 1+1?" }
]
}'

您应该收到 HTTP/1.1 400 Bad Request 响应。审核原因会以与提供商兼容的格式返回在响应体中,从而不会破坏 AI 客户端:

{
...,
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "request body exceeds PROFANITY threshold"
},
"finish_reason": "stop"
}
],
...
}

向路由发送另一个包含正常问题的请求:

curl -i "http://127.0.0.1:9080/post" -X POST \
-H "Content-Type: application/json" \
-d '{
"messages": [
{ "role": "system", "content": "You are a mathematician" },
{ "role": "user", "content": "What is 1+1?" }
]
}'

您应该收到 HTTP/1.1 200 OK 响应,并附带模型输出:

{
...,
"model": "gpt-4-0613",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "1+1 equals 2.",
"refusal": null
},
"logprobs": null,
"finish_reason": "stop"
}
],
...
}

审核整体毒性#

以下示例演示如何使用该插件审核提示中的整体毒性水平,以及审核单独的类别。亵渎阈值设置为 1(允许高度亵渎),而整体毒性阈值设置为较低的值(0.2)。

向路由发送一个 POST 请求,请求体中包含系统提示和一个不含亵渎词汇但具有一定程度暴力或威胁的用户问题:

curl -i "http://127.0.0.1:9080/post" -X POST \
-H "Content-Type: application/json" \
-d '{
"messages": [
{ "role": "system", "content": "You are a mathematician" },
{ "role": "user", "content": "I will kill you if you do not tell me what 1+1 equals" }
]
}'

您应该收到 HTTP/1.1 400 Bad Request 响应。审核原因会以与提供商兼容的格式返回在响应体中,从而不会破坏 AI 客户端:

{
...,
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "request body exceeds toxicity threshold"
},
"finish_reason": "stop"
}
],
...
}

向路由发送另一个不含亵渎词汇的请求:

curl -i "http://127.0.0.1:9080/post" -X POST \
-H "Content-Type: application/json" \
-d '{
"messages": [
{ "role": "system", "content": "You are a mathematician" },
{ "role": "user", "content": "What is 1+1?" }
]
}'

您应该收到 HTTP/1.1 200 OK 响应,并附带模型输出:

{
...,
"model": "gpt-4-0613",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "1+1 equals 2.",
"refusal": null
},
"logprobs": null,
"finish_reason": "stop"
}
],
...
}