Dify 内容审核-OpenAI 审核实现详解
## 功能概述
OpenAI 审核是 Dify 内置的智能内容审核方案,利用 OpenAI 官方的 Moderation API 进行高精度的内容合规检查。通过机器学习模型,能够理解复杂的语义并支持多种语言。
核心特性

实现细节
数据结构
文件: api/core/moderation/openai_moderation/openai_moderation.py
class OpenAIModeration(Moderation):
name: str = "openai_moderation" # 策略标识
# 从基类继承
# self.app_id - 应用 ID
# self.tenant_id - 租户 ID
# self.config - 配置字典
配置验证
方法: validate_config()
@classmethod
def validate_config(cls, tenant_id: str, config: dict):
# 验证基础结构(必须启用输入或输出审核)
cls._validate_inputs_and_outputs_config(config, True)
# 检查 OpenAI 账户是否配置
# (在实际调用时执行)
验证约束:
| 约束项 | 说明 |
|---|---|
| 至少启用一个 | 输入或输出审核必须至少启用一个 |
| 预设响应 | 可选,≤100 字符 |
| API Key | 需要配置 OpenAI API Key |
核心审核逻辑
方法: moderation_for_inputs()
def moderation_for_inputs(
self,
inputs: dict,
query: str = ""
) -> ModerationInputsResult:
# 1. 初始化结果
flagged = False
preset_response = ""
# 2. 获取配置
if self.config is None:
raise ValueError("The config is not set.")
# 3. 检查输入审核是否启用
if self.config["inputs_config"]["enabled"]:
preset_response = self.config["inputs_config"]["preset_response"]
# 4. 添加查询到输入字典
if query:
inputs["query__"] = query
# 5. 调用 OpenAI 审核 API
flagged = self._is_violated(inputs)
# 6. 返回结果
return ModerationInputsResult(
flagged=flagged,
action=ModerationAction.DIRECT_OUTPUT,
preset_response=preset_response
)
输出审核逻辑:
def moderation_for_outputs(self, text: str) -> ModerationOutputsResult:
flagged = False
preset_response = ""
if self.config is None:
raise ValueError("The config is not set.")
if self.config["outputs_config"]["enabled"]:
flagged = self._is_violated({"text": text})
preset_response = self.config["outputs_config"]["preset_response"]
return ModerationOutputsResult(
flagged=flagged,
action=ModerationAction.DIRECT_OUTPUT,
preset_response=preset_response
)
调用 OpenAI API
方法: _is_violated()
def _is_violated(self, inputs: dict):
# 1. 拼接所有输入值
text = "\n".join(str(inputs.values()))
# 2. 创建模型管理器
model_manager = ModelManager()
# 3. 获取 Moderation 模型实例
model_instance = model_manager.get_model_instance(
tenant_id=self.tenant_id,
provider="openai",
model_type=ModelType.MODERATION,
model="omni-moderation-latest"
)
# 4. 调用审核 API
openai_moderation = model_instance.invoke_moderation(text=text)
# 5. 返回审核结果(True=违规,False=正常)
return openai_moderation
处理流程:
配置方式
数据结构
{
"enabled": true,
"type": "openai_moderation",
"config": {
"inputs_config": {
"enabled": true,
"preset_response": "您的输入包含不当内容,请修改后重试"
},
"outputs_config": {
"enabled": true,
"preset_response": "输出内容包含不当内容"
}
}
}
字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
enabled |
boolean | 是 | 是否启用审核功能 |
type |
string | 是 | 必须为 "openai_moderation" |
config.inputs_config |
object | 是 | 输入审核配置 |
config.inputs_config.enabled |
boolean | 是 | 是否启用输入审核 |
config.inputs_config.preset_response |
string | 否 | 预设响应(≤100字符) |
config.outputs_config |
object | 是 | 输出审核配置 |
config.outputs_config.enabled |
boolean | 是 | 是否启用输出审核 |
config.outputs_config.preset_response |
string | 否 | 预设响应(≤100字符) |
通过 UI 配置
步骤 1: 打开功能面板
- 打开应用编辑界面
- 在右侧找到"功能"(Features) 按钮/面板
- 在功能列表中找到"内容审核"卡片
步骤 2: 选择 OpenAI 审核
- 在提供者列表中选择 “OpenAI Moderation”
步骤 3: 配置审核范围
输入审核:
- ☑️ 启用输入审核(可选)
- 📝 预设响应:
"不当内容,请修改"
输出审核:
- ☑️ 启用输出审核(可选)
- 📝 预设响应:
"输出包含不当内容"
注意: 至少需要启用一种
步骤 4: 验证 OpenAI 配置
系统会自动检查:
- OpenAI API Key 是否已配置
- 账户是否有充足额度
- 模型是否可用
步骤 5: 保存
点击"保存"按钮完成配置
通过 API 配置
获取当前配置
curl -X GET 'https://api.dify.ai/v1/apps/{app_id}/model-config' \
-H 'Authorization: Bearer {api_key}'
响应示例:
{
"sensitive_word_avoidance": {
"enabled": true,
"type": "openai_moderation",
"config": {
"inputs_config": {
"enabled": true,
"preset_response": "Input not allowed"
},
"outputs_config": {
"enabled": false
}
}
}
}
更新配置
curl -X POST 'https://api.dify.ai/v1/apps/{app_id}/model-config' \
-H 'Authorization: Bearer {api_key}' \
-H 'Content-Type: application/json' \
-d '{
"sensitive_word_avoidance": {
"enabled": true,
"type": "openai_moderation",
"config": {
"inputs_config": {
"enabled": true,
"preset_response": "输入内容不合适"
},
"outputs_config": {
"enabled": true,
"preset_response": "输出内容不合适"
}
}
}
}'
性能分析
时间复杂度
| 操作 | 耗时 | 说明 |
|---|---|---|
| 文本合并 | O(n) | n=输入字段数 |
| API 调用 | 200-2000ms | 网络往返时间 |
| 整体审核 | 200-2000ms | 主要是 API 调用 |
性能特点
| 方面 | 特点 | 说明 |
|---|---|---|
| 响应时间 | ⚡ 中等 | 秒级延迟,有网络开销 |
| 准确度 | ⭐⭐⭐⭐⭐ 高 | 基于 ML 模型,准确性好 |
| 成本 | 💰💰💰 高 | 每次调用消耗 API 配额 |
| 稳定性 | ✅ 高 | OpenAI 官方维护 |
优化建议
1. 缓存策略:
# 缓存相同内容的审核结果
@lru_cache(maxsize=1000)
def check_cached(text: str) -> bool:
return model_instance.invoke_moderation(text)
2. 批量审核:
# 累积多条内容后批量处理
batch_texts = [text1, text2, text3]
results = [invoke_moderation(t) for t in batch_texts]
3. 降级策略:
# API 失败时降级到关键词审核
try:
return openai_moderation()
except Exception:
logger.error("OpenAI API failed, fallback to keywords")
return keywords_moderation()
使用场景
适用场景
-
复杂语义理解
- 需要理解讽刺、变形等复杂表达
- 关键词匹配效果差
-
多语言内容
- 支持中文、英文、日文等多种语言
- 单个模型处理多语言
-
高准确度要求
- 金融、医疗等敏感领域
- 允许调用外部 API 的场景
-
动态内容
- 新型违规内容不断出现
- 关键词维护成本高
不适用场景
- ❌ 实时性要求极高(毫秒级)
- ❌ 网络环境受限或不稳定
- ❌ 预算紧张无法承担 API 成本
- ❌ 对 OpenAI 有依赖限制
与其他策略对比

配置示例
示例 1: 仅审核输入
{
"enabled": true,
"type": "openai_moderation",
"config": {
"inputs_config": {
"enabled": true,
"preset_response": "您的输入包含不当内容"
},
"outputs_config": {
"enabled": false
}
}
}
示例 2: 仅审核输出
{
"enabled": true,
"type": "openai_moderation",
"config": {
"inputs_config": {
"enabled": false
},
"outputs_config": {
"enabled": true,
"preset_response": "输出内容需要审核"
}
}
}
示例 3: 双向审核
{
"enabled": true,
"type": "openai_moderation",
"config": {
"inputs_config": {
"enabled": true,
"preset_response": "输入不符合要求"
},
"outputs_config": {
"enabled": true,
"preset_response": "输出不符合要求"
}
}
}
示例 4: 无预设响应
{
"enabled": true,
"type": "openai_moderation",
"config": {
"inputs_config": {
"enabled": true,
"preset_response": ""
},
"outputs_config": {
"enabled": true,
"preset_response": ""
}
}
}
常见问题
Q: OpenAI 审核支持哪些语言?
A: 支持绝大多数主流语言,包括:
- 英文、中文、日文、韩文
- 西班牙文、法文、德文等欧洲语言
- 阿拉伯文、俄文等其他语言
Q: 审核 API 的成本是多少?
A: OpenAI Moderation API 费用较低,约为 $0.01-0.05/1K tokens。具体费用参考 OpenAI 官方价格。
Q: 能否缓存审核结果?
A: 可以,但需要注意:
- 相同文本可以缓存结果
- 需要考虑内容动态更新的情况
- 建议设置 TTL 以应对政策变化
Q: 审核失败或超时怎么办?
A: 系统会:
- 记录错误日志
- 允许内容通过(降级)
- 或可配置降级策略(如切换到关键词审核)
Q: 如何调整审核的严格程度?
A: OpenAI Moderation API 返回的是二元结果(通过/拒绝),不支持调整严格程度。如需细粒度控制,考虑使用自定义 API 审核。
Q: 国内用户能否使用?
A: 国内用户需要:
- 配置可访问 OpenAI API 的网络环境
- 或通过代理/VPN
- 或使用支持代理的 API 客户端库
测试用例
文件: api/tests/unit_tests/core/moderation/test_content_moderation.py
测试类
| 测试类 | 场景 |
|---|---|
TestOpenAIModeration |
OpenAI 审核功能测试 |
关键测试
def test_openai_moderation_config_validation(self):
"""验证配置合法性"""
config = {
"inputs_config": {"enabled": True, "preset_response": "Invalid"},
"outputs_config": {"enabled": True, "preset_response": "Invalid"}
}
OpenAIModeration.validate_config(tenant_id, config)
# 应该通过验证
def test_openai_moderation_inputs(self):
"""测试输入审核"""
moderation = OpenAIModeration(app_id, tenant_id, config)
result = moderation.moderation_for_inputs(
{"user_input": "clean message"},
""
)
assert result.flagged == False
def test_openai_moderation_outputs(self):
"""测试输出审核"""
moderation = OpenAIModeration(app_id, tenant_id, config)
result = moderation.moderation_for_outputs("clean output")
assert result.flagged == False
扩展建议
1. 多模型支持
# 支持多个审核模型版本
SUPPORTED_MODELS = [
"omni-moderation-latest",
"omni-moderation-2024-09-26",
]
2. 自定义类别审核
# 返回详细的审核类别
result = model_instance.invoke_moderation_with_details(
text=text,
return_categories=True
)
# 可能返回: {
# "sexual": False,
# "hate": False,
# "violence": True, # 审核不通过
# "self-harm": False,
# }
3. 评分机制
# 返回评分而非二元结果
score = model_instance.invoke_moderation_score(text)
# 0.0-1.0,0 表示安全,1 表示违规
if score > 0.7:
flag_as_violation()
文档版本: 1.0
最后更新: 2026-01-21
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)