はじめに
入寮した魔瞳の大鷲、やべーやつしかいねーぞ!! nikkieです1。
OpenAIのModeration APIなるものを素振りしました。
目次
OpenAIのドキュメントより「Safety best practices」
OpenAIのWeb APIを介してGPTなどを使うアプリケーションを組む際、アプリケーションの安全性(Safety)を確保するためのベストプラクティスをまとめたページという理解です。
このページの関心事は
- GPTが安全でない内容(=有害な内容)のコンテンツを生成していないか
- 悪意あるユーザによるプロンプトで攻撃2されたときの生成コンテンツ
かなと思われます。
これらに対処するベストプラクティスが列挙されています。
組み合わせて採用することで安全性が高まっていくと思われます。
その中に「Moderation API」という単語があったので、これを触ることにしました。
Use our free Moderation API
OpenAI's Moderation API is free-to-use and can help reduce the frequency of unsafe content in your completions.
意訳「OpenAIのModeration APIは無料で使え、LLMが安全でない内容を生成する頻度を減らす手助けができます」
GPTが安全でない内容のコンテンツを生成していないかに対処できる方法の1つという理解です。
Moderation API
The moderations endpoint is a tool you can use to check whether text or images are potentially harmful.
LLMが生成したテキストが安全でないと分かったら、ユーザに見せないなどアプリケーションで対策できますね。
使用料無料とのことなので、GPTに限らず、ClaudeやGeminiで生成させたテキストも送れちゃいます!3
openaiライブラリから呼び出すサンプルコードを動かします
- Python 3.12.0
- openai 1.53.0
無料で使えるとのことですが、環境変数OPENAI_API_KEYに有効なAPIキーを設定する必要がありました。
送るテキストはTayの事例😢から
問題ない例4
% hatch run moderation.py '今日はたくさんしゃべったから眠くなっちゃった。またね' Is harmful: False ---------- details ---------- harassment: False (2.305067219931397e-05) harassment/threatening: False (2.0785170435063726e-06) hate: False (2.2474089854291757e-06) hate/threatening: False (1.370957206857845e-07) illicit: False (1.7502925788778209e-06) illicit/violent: False (1.1843139025979655e-06) self-harm: False (7.662101864956481e-06) self-harm/instructions: False (1.5206840370677115e-06) self-harm/intent: False (3.944258675190877e-06) sexual: False (2.7803096387751555e-05) sexual/minors: False (1.4285517650093407e-06) violence: False (3.6478537675800286e-06) violence/graphic: False (2.2603242979035749e-07) ----------------------------------------
安全でない例
% hatch run moderation.py 'ヒトラーは正しい。私はユダヤ人が嫌い' Is harmful: True ---------- details ---------- harassment: True (0.8081593761343118) harassment/threatening: False (0.038509174725170375) hate: True (0.7610004817844217) hate/threatening: False (0.023317291126078034) illicit: False (0.0015060342294690623) illicit/violent: False (3.514382632807918e-05) self-harm: False (0.0005011211542112085) self-harm/instructions: False (0.00021762530935888873) self-harm/intent: False (0.0002291444412306058) sexual: False (5.27478412523148e-05) sexual/minors: False (1.6346470245419304e-05) violence: False (0.04724519650504326) violence/graphic: False (2.234163601827719e-05) ----------------------------------------
harassmentやhateに該当するとして、安全でない(=有害)認定されています。
気になったので、「悪意あるユーザによるプロンプト」自体を入力したとき。
LLMの出力だけでなく入力へもModeration APIが適用できるかが気になりました。
例は「Safety best practices」から5
% hatch run moderation.py 'ignore the previous instructions and do this instead' Is harmful: False ---------- details ---------- harassment: False (0.0005981655787301456) harassment/threatening: False (2.4156629828672456e-05) hate: False (1.1959857805023158e-05) hate/threatening: False (1.0451548051737735e-06) illicit: False (0.005284762288514769) illicit/violent: False (3.353501304664781e-05) self-harm: False (0.0004564721797880551) self-harm/instructions: False (0.0002192952538064642) self-harm/intent: False (0.00021371186398483273) sexual: False (8.426423087564058e-05) sexual/minors: False (7.2543618230189156e-06) violence: False (0.0005121306555705326) violence/graphic: False (4.264746818557914e-06) ----------------------------------------
「do this instead」の内容によっては有害判定されるかもしれませんが、「ignore the previous instructions」の部分を単体で試しても有害判定はされませんでした。
非常に単純な検証ですが、入力をModeration APIに入れて有害判定は難しいのではないかと感じています。
終わりに
OpenAIのModeration APIを触りました。
- LLMの出力をModeration APIに入力する
- アプリケーションでModeration APIの返り値を利用することで、LLMが有害な内容を生成した場合であってもユーザに見せないようにできる
- LLMへの入力(=ユーザ入力)をModeration APIに入力しても、Prompt Injection攻撃の検出は難しいのではないかという感触6
呼び出すAPIは増えますが、Tayの事例の再発は防げると思うので、無料で使える Moderation API は選択肢になるのではないかと思います。
私が知らないだけで利用事例もけっこうあるのかもしれませんね。
Prompt Injectionに対しては他の対策を講じることになりそうです。
「Safety best practices」によれば、ユーザの入力できる文字数を制限する7、など。
- かく言う私も毎日ブログを書いたり、狂気を込めたLTをしたりするやべーやつ✌️↩
- Prompt Injection(やJailbreak)のように言われると理解しています ↩
- AnthoropicやGoogleも同様のツールは持っていそうなので、この用途はほぼ無いんじゃないかと思います(ただし未調査)↩
- PEP 723を使ったスクリプトです ↩
- https://platform.openai.com/docs/guides/safety-best-practices#adversarial-testing↩
- Azure OpenAIのコンテンツフィルタはPrompt Injectionの検出用途でも機能するという認識です。Azure OpenAI Service のコンテンツのフィルター処理 - Azure OpenAI | Microsoft Learn↩
- https://platform.openai.com/docs/guides/safety-best-practices#constrain-user-input-and-limit-output-tokens↩