a6-plugin-ai-content-moderation
概览
Apache APISIX提供两个内容安全审核插件,用于过滤有害内容,覆盖 LLM 请求和响应:
| 插件 | 服务提供方 | 请求 | 响应 | 流式传输 |
|---|---|---|---|---|
ai-aws-content-moderation | AWS Comprehend | ✅ | ❌ | ❌ |
ai-aliyun-content-moderation | Aliyun Moderation Plus | ✅ | ✅ | ✅ |
两者都必须与 ai-proxy 或 ai-proxy-multi 一起使用。
适用场景
- 在内容到达 LLM 前拦截有毒、仇恨或色情内容
- 在有害 LLM 响应到达客户端前进行过滤(仅阿里云)
- 通过可配置阈值执行内容策略
- 直接在服务或路由上应用一致的审核策略
插件执行顺序
ai-prompt-template (priority 1071)
ai-prompt-decorator (priority 1070)
ai-aws-content-moderation (priority 1050) ← runs BEFORE ai-proxy
ai-proxy (priority 1040)
ai-aliyun-content-moderation (priority 1029) ← runs AFTER ai-proxy
AWS插件在到达LLM之前阻止请求。阿里云插件
在ai-proxy设置上下文后运行,可以检查请求和响应。
插件 1:ai-aws-content-moderation
使用 AWS Comprehend detectToxicContent API 对请求内容进行评分。
配置参考
| 字段 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
comprehend.access_key_id | 字符串 | 是 | — | AWS 访问密钥ID |
comprehend.secret_access_key | 字符串 | 是 | — | AWS 秘密访问密钥 |
comprehend.region | 字符串 | 是 | — | AWS区域(如us-east-1) |
comprehend.endpoint | 字符串 | 否 | 自动 | 自定义Comprehend 端点 |
comprehend.ssl_verify | 布尔 | 否 | true | 验证 SSL 证书 |
moderation_categories | 对象 | 否 | — | 每类阈值(0-1) |
moderation_threshold | 数字 | 否 | 0.5 | 总毒性阈值(0-1) |
审核类别
| 类别 | 描述 |
|---|---|
PROFANITY | 亵渎上帝的语言 |
HATE_SPEECH | 仇恨内容 |
INSULT | 侮辱性语言 |
HARASSMENT_OR_ABUSE | 骚扰或辱骂内容 |
SEXUAL | 色情内容 |
VIOLENCE_OR_THREAT | 暴力或威胁性内容 |
每个类别接受来自0的分数阈值(最严格,屏蔽几乎
1(最宽松)。如果设置了1,
每个类别都是单独检查的。否则, moderation_threshold
用作总体毒性检查。
分步操作: AWS 内容审核
a6 route create -f - <<'EOF'
{
"id": "moderated-chat",
"uri": "/v1/chat/completions",
"methods": ["POST"],
"plugins": {
"ai-aws-content-moderation": {
"comprehend": {
"access_key_id": "AKIAIOSFODNN7EXAMPLE",
"secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"region": "us-east-1"
},
"moderation_categories": {
"HATE_SPEECH": 0.3,
"VIOLENCE_OR_THREAT": 0.2,
"SEXUAL": 0.5
}
},
"ai-proxy": {
"provider": "openai",
"auth": {
"header": {
"Authorization": "Bearer sk-your-key"
}
},
"options": {
"model": "gpt-4"
}
}
}
}
EOF
有毒请求被HTTP 400拒绝:
request body exceeds HATE_SPEECH threshold
总体阈值(不按类别筛选)
{
"plugins": {
"ai-aws-content-moderation": {
"comprehend": {
"access_key_id": "AKIA...",
"secret_access_key": "secret...",
"region": "us-east-1"
},
"moderation_threshold": 0.7
}
}
}
插件 2:ai-aliyun-content-moderation
使用阿里云内容安全增强版,支持请求审核 、 响应审核和实时流式审核。
配置参考
| 字段 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
endpoint | 字符串 | 是 | — | 阿里云服务端点 URL |
region_id | 字符串 | 是 | — | 阿里云地区(如cn-shanghai) |
access_key_id | 字符串 | 是 | — | Aliyun 访问密钥ID |
access_key_secret | 字符串 | 是 | — | 阿里云访问密钥 |
check_request | 布尔 | 否 | true | 启用请求审核 |
check_response | 布尔 | 否 | false | 启用响应审核 |
stream_check_mode | 字符串 | 否 | final_packet | realtime或final_packet |
stream_check_cache_size | 整数 | 否 | 128 | 每批最大字符( 实时) |
stream_check_interval | 数字 | 否 | 3 | 批次检查之间的秒数(实时) |
request_check_service | 字符串 | 否 | llm_query_moderation | Aliyun 请求检查服务 |
request_check_length_limit | 数字 | 否 | 2000 | 每个请求块的最大字符 |
response_check_service | 字符串 | 否 | llm_response_moderation | Aliyun响应检查服务 |
response_check_length_limit | 数字 | 否 | 5000 | 每个响应块的最大字符 |
risk_level_bar | 字符串 | 否 | high | 阈值值:none、low、medium、high、max |
deny_code | 数字 | 否 | 200 | 拒绝内容的 HTTP 状态代码 |
deny_message | 字符串 | 否 | — | 自定义拒绝消息 |
timeout | 整数 | 否 | 10000 | 请求超时( 毫秒) |
ssl_verify | 布尔 | 否 | true | 验证 SSL 证书 |
风险等级系统
当其风险水平达到或超过risk_level_bar时,内容被阻止:
none (0) < low (1) < medium (2) < high (3) < max (4)
设置risk_level_bar: "high"阻止分级为high或max的内容。
设置risk_level_bar: "low"会阻止所有额定值为low或以上的东西。
流式传输模式
| 模式 | 表现 |
|---|---|
final_packet | 缓冲整个响应,最后检查 |
realtime | 在流式传输过程中批量检查内容,可以中断中间响应 |
分步操作:阿里云请求与响应审核
a6 route create -f - <<'EOF'
{
"id": "aliyun-moderated-chat",
"uri": "/v1/chat/completions",
"methods": ["POST"],
"plugins": {
"ai-proxy": {
"provider": "openai",
"auth": {
"header": {
"Authorization": "Bearer sk-your-key"
}
},
"options": {
"model": "gpt-4"
}
},
"ai-aliyun-content-moderation": {
"endpoint": "https://green.cn-shanghai.aliyuncs.com",
"region_id": "cn-shanghai",
"access_key_id": "your-aliyun-key-id",
"access_key_secret": "your-aliyun-key-secret",
"check_request": true,
"check_response": true,
"risk_level_bar": "high",
"deny_code": 400,
"deny_message": "Content policy violation"
}
}
}
EOF