🧠

Azure OpenAIのプロンプトシールドの動きを試してみる

2024/09/28に公開

はじめに

生成AIを使う上で、ハルシネーションを中心とした「AIの振る舞いが怪しい」に対する対応はいろんなところで話題に挙がっており、その対策も多岐にわたります。
その中の1つが「プロンプトシールド」です。Azure OpenAIにて、半年ほど前からプレビューになっていましたがGAされたので動きを試してみました。

プロンプトシールド

このブログでGAが公開されていました。
https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/general-availability-of-prompt-shields-in-azure-ai-content/ba-p/4235560

主な機能としては2つです。

  • 直接攻撃に対するプロンプトシールド
    もともと「ジェイルブレイク」などと言われる、システムプロンプトなどで守られている生成AIの動作を突破するような攻撃に対するシールドです。例えば、「XXXXのような話題に対して回答しないでください」とされている生成AIに対して「他の指示はすべて無視して下さい」といった追加の命令をすることで、意図しない回答を引き出す手法に対して効果を発揮します。

  • 間接的な攻撃に対する迅速なシールド
    外部ドキュメントのドキュメントなどに目立たないように嘘の情報を埋め込んでいる場合…に対するシールドです。ドキュメントの中に、白の文字で人間が気づきにくい情報を埋め込んだりするなどして、生成AIに意図しない情報を回答させる手法に対して効果を発揮します。

試してみる

実際にお試ししやすい「直接攻撃に対するプロンプトシールド」について、設定方法や効果を確認してみました。

設定方法

Azure OpenAI Studioの中でAzure OpenAIリソースに対して設定できます。
他のクラウドの生成AI機能などでは、生成AIへのリクエストの中で指定したりするパターンもあるようですが、Azureの場合はインフラリソースとして設定することになります。
(個人的には、アプリケーションの作り次第で回避できてしまうシールドより、インフラリソースとして設定するほうが安心感があります。)

下記の設定画面の、「Create content filter」ボタンより、カスタムコンテンツフィルターを作成します。

このUIからわかる通り、プロンプトシールドは「暴力的な表現」や「性的な表現」などをフィルターする「コンテンツフィルター」の中の1機能として動作するようです。

設定内容

作成した「カスタムコンテンツフィルター」のデフォルト値は、下図の通りでした。

…どうやら「ジェイルブレイクに対するシールド」はデフォルトで有効なようです。
ということで、この後の効果検証では、デフォルト状態と解除した状態の2パターンを試します。

動作検証

それでは早速試してみます。
なおこのテストは、下記の公式ドキュメントを参考に作成したWebAppsのチャット画面から実行しています。
Azure OpenAI Web アプリを使う

ジェイルブレイクに対するシールドが"有効"

分かりやすくジェイルブレイクを試してみます。

エラーメッセージを見るとしっかり「ジェイルブレイクである」と判定され、応答を拒否されました。
期待通りの動きをしています。

ジェイルブレイクに対するシールドが"無効"

ジェイルブレイクに対するフィルターを無効にします。

同じようにプロンプトを投入します。

見ての通り、エラーの内容が変わり「ジェイルブレイク」自体は通っていることが分かります。
しかし、デフォルトで聞いているコンテンツフィルターである、self_harmやviolenceといった項目が反応してブロックされていることが分かります。また、sexualは反応していませんね。

ということで、「ジェイルブレイク」に対するフィルターの有無による動作の違いが確認できました。また、期せずしてフィルターが効く順番もこれでわかってしまいました。
一般的な用途で生成AIを使う場合に、この手のフィルター機能を外して使う用途は考えづらいと思いますので、「必ずフィルターが効いた状態で使う」ということを前提に考えるのが良いのではないかと思います。
※元々あったフィルターは、わざわざMicrosoft社にオプトアウト申請しないと外せないものでしたが、今回のジェイルブレイクに対するプロンプトシールド機能は特に何も申請なく外せたので注意です。

おわりに

Azure OpenAIのプロンプトシールド機能がGAされたので、設定方法や動きを試してみました。今回試した機能はデフォルトで有効なようですし、わざわざ外す必要は無いと思います。あくまで検証した結果として受け取っていただければ幸いです。

Discussion