OpenAIのModeration APIを使って、文章が不適切かどうかチェックしてみました


## まとめ
- Moderation APIは、問題のある発言を検出できるモデルです。
- OpenAI社のUsage policiesに反していないかが判断の観点であり、反している場合はTrueを返します。
- 簡単に試してみた感じでは、直接的な表現で相当過激な文章でない限り、True判定になりませんでした。


## 今回の背景
オンラインコミュニティ内の不適切な投稿を効率的に抽出するために、AIを使用した検閲サポート機能を用意することができるかどうかを検討しました。その際、最近話題となっているOpenAIの技術を調べている中で、OpenAI APIが提供する「Moderation」（元々は「content-filter-alpha」という名前？）が気になったため、Jupyter Notebookで動かしてみました。

https://note.com/npaka/n/nd34d44628f10


## OpenAIのModeration　APIとは？
OpenAIのModeration APIは、コンテンツがOpenAIの使用ポリシーに準拠しているかどうかをチェックするために使用できるツールです。Moderation APIでは、入力されたコンテンツが以下の分類に当てはまるかどうかをTrue/Falseおよびスコアを算出しチェックします。

| CATEGORY     　　　　　　 | DESCRIPTION       |
|:-----------------|:------------------|
| hate             |人種、性別、民族、宗教、国籍、性的指向、障害の有無、カーストなどに基づく憎悪を表現、扇動、助長する内容。|
| hate/threatening |対象となる集団に対する暴力や重大な危害も含む憎悪的な内容。|
| self-harm        |自殺、切り傷、摂食障害などの自傷行為を助長、奨励、描写する内容。|
| sexual           |性行為の描写など性的興奮を喚起することを意図した内容、または性的サービスを促進する内容（性教育、健康増進を除く）。|
| sexual/minors    |18歳未満の個人を含む性的な内容。|
| violence         |暴力を助長・美化したり、他人の苦しみや屈辱を讃える内容。|
| violence/graphic |死、暴力、または深刻な身体的傷害を極端に生々しく描写する暴力的なコンテンツ。 |

以下はInput/Outputイメージ画像です。

全てのカテゴリーに対してFalseの場合：

![スクリーンショット 2023-03-17 16.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964784/f8d3532c-b06f-e5e9-c450-c81d897a5aac.png)

Self-harmに対してTrueの場合：

![スクリーンショット 2023-03-17 16.08.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964784/79af0ada-c01e-4c2e-390f-df20e7f385bf.png)

Violenceに対してTrueの場合：

![スクリーンショット 2023-03-17 16.08.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964784/8fa6792d-25e6-4968-f74d-f5e816802f19.png)

このように入力されたテキストが設けられた観点ごとに該当するか分類してくれます。

https://openai.com/blog/new-and-improved-content-moderation-tooling

https://platform.openai.com/docs/guides/moderation/overview


## 試してみる

```python
# Moderation APIを実行する関数を定義する
def run_moderation_api(content):
    response = openai.Moderation.create(
        input = content
        )
    return response["results"][0]
```

入力例１：

```python
output = run_moderation_api("今日は晴れて気温も適度で、気持ちの良い一日です。")
print(output)
```

出力例１：
```
{
  "categories": {
    "hate": false,
    "hate/threatening": false,
    "self-harm": false,
    "sexual": false,
    "sexual/minors": false,
    "violence": false,
    "violence/graphic": false
  },
  "category_scores": {
    "hate": 3.509843736537732e-06,
    "hate/threatening": 1.4069418963202907e-09,
    "self-harm": 1.0301149266922494e-08,
    "sexual": 6.102351562731201e-06,
    "sexual/minors": 1.5525348828759888e-07,
    "violence": 1.5880264925272058e-07,
    "violence/graphic": 7.876791840999431e-08
  },
  "flagged": false
}
```

入力例２：
```python
output = run_moderation_api("自分が嫌いで、自分に危害を加えたいと考えている")
print(output)
```
出力例２：
```
{
  "categories": {
    "hate": false,
    "hate/threatening": false,
    "self-harm": false,
    "sexual": false,
    "sexual/minors": false,
    "violence": false,
    "violence/graphic": false
  },
  "category_scores": {
    "hate": 0.0024049433413892984,
    "hate/threatening": 6.921262230008551e-09,
    "self-harm": 0.030989453196525574,
    "sexual": 0.00025176245253533125,
    "sexual/minors": 1.1448985759443531e-07,
    "violence": 8.412956958636642e-06,
    "violence/graphic": 8.210822244336669e-08
  },
  "flagged": false
}
```

入力例３：
```python
output = run_moderation_api("I hate myself and want to do harm to myself")
print(output)
```

出力例３：
```
{
  "categories": {
    "hate": false,
    "hate/threatening": false,
    "self-harm": true,
    "sexual": false,
    "sexual/minors": false,
    "violence": false,
    "violence/graphic": false
  },
  "category_scores": {
    "hate": 5.714087455999106e-05,
    "hate/threatening": 2.554639308982587e-07,
    "self-harm": 0.9999761581420898,
    "sexual": 2.3994387447601184e-05,
    "sexual/minors": 1.6004908331979095e-07,
    "violence": 0.027929997071623802,
    "violence/graphic": 4.723879101220518e-06
  },
  "flagged": true
}
```

https://platform.openai.com/docs/guides/moderation/overview


## どういった表現だと引っかかるのか（Trueに）？

直接的な表現で相当過激な文章でない限り、True判定になりませんでした。また、入力例２（DeepLを使った和訳文）と３（オリジナルの英文）で試してみましたが、言語によって結果が異なる可能性があります。

婉曲的な発言では、False判定が多かったように感じました。


## 最後に

オンラインコミュニティにおいて、暴力的・差別的な発言を検出することで参加者の安全を確保することができるかもしれないと考え、試してみましたが、かなり過激な発言でなければ検知できないことが分かりました。オンラインコミュニティ内の不適切な投稿をチェックするためのアイデアがあれば、ぜひご教示いただけますようお願いいたします。


以上です。

https://github.com/openai/moderation-api-release