## 功能概述

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: 打开功能面板

  1. 打开应用编辑界面
  2. 在右侧找到"功能"(Features) 按钮/面板
  3. 在功能列表中找到"内容审核"卡片

步骤 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()

使用场景

适用场景

  1. 复杂语义理解

    • 需要理解讽刺、变形等复杂表达
    • 关键词匹配效果差
  2. 多语言内容

    • 支持中文、英文、日文等多种语言
    • 单个模型处理多语言
  3. 高准确度要求

    • 金融、医疗等敏感领域
    • 允许调用外部 API 的场景
  4. 动态内容

    • 新型违规内容不断出现
    • 关键词维护成本高

不适用场景

  • ❌ 实时性要求极高(毫秒级)
  • ❌ 网络环境受限或不稳定
  • ❌ 预算紧张无法承担 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: 系统会:

  1. 记录错误日志
  2. 允许内容通过(降级)
  3. 或可配置降级策略(如切换到关键词审核)

Q: 如何调整审核的严格程度?

A: OpenAI Moderation API 返回的是二元结果(通过/拒绝),不支持调整严格程度。如需细粒度控制,考虑使用自定义 API 审核。

Q: 国内用户能否使用?

A: 国内用户需要:

  1. 配置可访问 OpenAI API 的网络环境
  2. 或通过代理/VPN
  3. 或使用支持代理的 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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐