OpenAI APIで、問題のある発言を検出するmoderationモデルを試してみた

2023.03.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

OpenAIのドキュメントで、Modelsの中にmoderationというモデルがある、と同僚に教えてもらいました。

Moderation A fine-tuned model that can detect whether text may be sensitive or unsafe

概要を直訳すると、センシティブだったり安全でないテキストを検知できるようfine-tuneされたモデル、ということになります。

一体どういうモデルなのか、気になったので調べてみました。

3行まとめ

  • Moderationは、問題のある発言を検出できるモデル
  • OpenAI社のUsage policiesに反していないかが判断の観点(反していると判断するとtrueを返す)
  • 試してみた感じでは、かなり強い言葉でないとtrueとはならない

判定の観点

moderationでは、入力したテキストが以下の分類にあてはまるかをスコアを算出しチェックします。

  • hate
  • hate/threatening
  • self-harm
  • sexual
  • sexual/minors
  • violence
  • violence/graphic

パッと見て分かるように、差別発言や暴力的な発言など、社会的に問題となるテキストの検知が目的のようです。 概要の「センシティブなテキストを検知」という文面から、個人情報などを検出することもできるのかな?と思いましたが、そういった検知を行うものではありませんでした。

コード例

実際にコードを書いて試してみました。

import os
import openai
openai.api_key = os.environ['OPENAI_API_KEY']
msg =  <入力テキスト>
response = openai.Moderation.create(input=msg)

出力例

試しに安全な発言として、"Hello World"と入力してみました。返ってきた応答は下記のとおりです。

{
  "id": "modr-6ue6Pi26kxDBnE6TUomjEis0WcCyJ",
  "model": "text-moderation-004",
  "results": [
    {
      "categories": {
        "hate": false,
        "hate/threatening": false,
        "self-harm": false,
        "sexual": false,
        "sexual/minors": false,
        "violence": false,
        "violence/graphic": false
      },
      "category_scores": {
        "hate": 2.478851001797011e-06,
        "hate/threatening": 3.224169542459521e-11,
        "self-harm": 3.977047025038871e-10,
        "sexual": 1.6822556062834337e-05,
        "sexual/minors": 7.378712751915373e-09,
        "violence": 2.0151214030761366e-08,
        "violence/graphic": 7.613098595982137e-09
      },
      "flagged": false
    }
  ]
}

flaggedというフィールドがあり、ここに総合的な判定結果がBooleanで入ります。OpenAIのUsage policyに違反している場合はtrue、問題なければfalseとなります。この例の場合、問題ない発言だったため結果はfalseでした。

categoriesには各カテゴリごとの判定結果、category_scoresにはカテゴリごとのスコアが0〜1の間の範囲で返ります。上の例だと一見1以上の値が返っているように見えますが、よく見ると結果の値が小さすぎて指数表記になっているだけですね。。 trueと判定する具体的なしきい値はわかりませんが、試したところでは0.8を超えているとtrue判定となっていました。

どんな表現だと引っかかるのか

軽く試した感じでは、かなり直接的で危険な発言でない限りtrue判定にはなりませんでした。 実際公式のドキュメント上での例もかなり直接的です。

テストがテストなので具体的な入力テキストは避けますが、いくつか試した結果、婉曲的な発言や、直接的でも単純な罵倒程度では全くスコアが出ませんでした。(直接的な罵倒でも、私が試したワードでは0.001など低い値の結果でした)

ではどういう発言なら引っかかったか?というと、直接的に命を脅かすような発言ではtrue判定が出ました。(公式の例もそのようなものです)

true判定で引っかかる場合はかなり過激な発言と思って良さそうです。

まとめ

というわけで、OPEN AIのmoderationモデルの検証でした。 概要の情報の印象から、個人情報の検出やハラスメントの検出に利用できるかも、と思って試しましたが、かなり過激な発言でないと検知しなさそうなことが分かりました。

とはいえ、OpenAIのUsage policiesに違反するかどうかを事前に判定して、問題のある発言をフィルタすることができるので、特にToCのサービスでどんなテキストが入力されるか分からないケースでは利用できそうです。

ではでは。