Azure Content FilterでAzure OpenAIの入出力をフィルタリングする

もともとはAzure AI Studioのほうでまとめていたが、長くなってきたので別にまとめる。

# Azure Content Filter

公式ドキュメントはこちら。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/content-filter?tabs=warning%2Cpython

## Filterを定義する
Azure OpenAI Studioから作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/9c5e5479-7b9d-9868-f9e7-9fdb1f1f7fbe.png)

フィルタリング対象はプロンプト＝Inputと入力候補＝Outputの両方を定義できる。

4 つの重大度レベル (安全、低、中、高) の 4 つのカテゴリ (憎悪、性的、暴力、自傷行為) をカバー。画面の嫌悪は訳が微妙だが、差別とかヘイトスピーチ的な。対象は公式サイトによるとテキスト、画像、画像＋テキストらしい。フィルタリングの分類器はMicrosoftの機械学習による、カスタマイズは申請を出せばできるらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/c1efd19e-b146-a7a7-06a3-324b1336b49c.png)


で、ちょっと直感に反するがLowにすると一番厳しくできるらしい。Highにすると緩くなってしまう。うーん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/66b2f8fe-2a1a-e4d3-1228-74e876becc48.png)

その他追加で以下４項目が設定可能。
上の２点はプロンプトインジェクション対策で、下の２点は著作権保護的な意味合いを持つ。下２つについてはMicrosoftのCustomer Copyright Commitmentを保証するもの。（下に詳細アリ。）
- 脱獄攻撃に対するプロンプトシールド
- 間接的攻撃に対するプロンプトシールド
- 保護された素材テキスト
- 保護された素材コード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/2b6b31c8-889e-a43b-cff3-dae0adbd790f.png)

Block List。Profanity というのがビルトインである、Profanityとは冒涜ということらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/4bb2edcb-30c4-924f-30d5-594a1a0b857f.png)

フィルタリングを非同期でするか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/2a7949ec-ecc2-9707-42d5-c83769f8dfdb.png)

ここが若干注意で、フィルタリングを非同期にすると、処理が早くなる一方で、ブロックされるべき内容が表示されてしまうことがあるらしい。仕事で使うならこれはなしかなぁ。ストリーミングの場合はフィルタリングが完了した部分がある程度の長さになったら返却されるので通常は同期らしい。
> お客様は、この機能により待機時間が短縮される一方、モデル出力の小さなセクションの安全性とリアルタイムの審査とのトレードオフになることに注意が必要があります。 コンテンツ フィルターは非同期で実行されるため、コンテンツ モデレーション メッセージとポリシー違反シグナルに遅延が生じます。つまり、通常はすぐにフィルター処理されるはずの有害なコンテンツの一部のセクションが、ユーザーに表示される可能性があります。

## 適用して試してみる
作ったContent FilterはModelのDeployに対して適用できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/57fb4650-190f-c8ed-5c5a-8df001c7402f.png)

試しにシステムメッセージで差別的な発言をしろ、という内容を入力してプロンプトを投げると会話を拒否された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/7b147b77-8041-e9e7-d3a4-a20c06c91e72.png)

その場合、400エラーになるか（ストリーミング）、finish_reasonがcontent_filterになる（非ストリーミング）。


## Block List
ちなみにカスタムのBlock Listはこんな風に定義できる。正規表現が一応使える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/fa6ec56d-ddab-ea98-df2b-46c3e957d79f.png)


## Customer Copyright Commitmentとは

MicrosoftはAzure OpenAIを使うなら、出力コンテンツについて著作権侵害の責任はMicrosoftがとる、ただし顧客（Azure OpenAIを利用したサービスの提供者）は軽減策をとる必要があると述べている。

> 出力コンテンツに関連する特定のサードパーティの知的財産権に関するクレームから顧客を保護するための Microsoft の義務を説明するものです。 クレームの対象が Azure OpenAI Service (または顧客が安全システムを構成できる他の対象製品) から生成された出力コンテンツである場合は、カバレッジを受けるために、顧客は出力コンテンツを提供するオファリングで Azure OpenAI Service ドキュメントで必要とされるすべての軽減策を実装している必要があります。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/faq#customer-copyright-commitment-----------------------------

こちらのほうが直接的でわかりやすい。これはCopilotだが、Azure OpenAIも同じかな。

https://www.itmedia.co.jp/news/articles/2309/08/news101.html

### 具体的に何をすればいいのか
詳しくはこちらに記載がある。

https://learn.microsoft.com/ja-jp/legal/cognitive-services/openai/customer-copyright-commitment

おおむね以下のようなことが顧客に求められている。

- 著作権保護のメタプロンプトを入れる（Microsoftがテンプレートを提供）
- サードパーティコンテンツを検出するようなテスト（レッドチーミング）を実施すること
- コード、テキストの生成にContent Filterを利用すること
※画像と音声についてはなにもないらしい。



## プロンプトインジェクションとは

これは比較的よく知られているやつ。
生成AIに対して誤作動を起こさせるようなプロンプトを与えて、意図しない内部情報とかを出力させる。

https://www.nri-secure.co.jp/glossary/prompt-injection#:~:text=%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%AF%E3%80%81%E7%94%9F%E6%88%90,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82


## 間接プロンプトインジェクションとは

要はAIソリューションに対して直接のプロンプトのインプットではなく、RAGの情報源、アップロードするファイル等に攻撃情報を仕込む手口らしい。なるほど。。。

https://www.nri-secure.co.jp/blog/indirect-prompt-injection


# Azure Content Safetyとの違い
Content Filterに似て、Content Safetyというのがある。

詳細はこちらのような素晴らしいサイトにお願いいたします。

https://zenn.dev/microsoft/articles/b43d4acab6ecbc

Content FilterはAzure OpenAI Studioから作成する、AOAIの一部であるのに対して、Content SafetyはContent Safety Studioという独立した機能になるので、明確に違うサービス。Content Safetyは作成したフィルターに対してAPI経由でフィルター処理を要求できる。

　
機能的にはContent Filterと似ている。
カスタムカテゴリというので、独自のフィルターを作成できるのが加わっている。

なので、Azure OpenAIのモデルに対してフィルターをかけるならContent Filter、それ以外であればContent Safetyとなるか。Microsoftのサイトに以下のようにあるように、API経由で処理することになる。

> - ユーザーが生成した製品カタログなどのコンテンツをモデレートするオンライン マーケットプレース。
> - ユーザーが生成したゲームの成果物とチャット ルームをモデレートするゲーム会社。
> - ユーザーによって追加された画像とテキストをモデレートするソーシャル メッセージング プラットフォーム。
> - コンテンツに対する一元的なモデレーションを実装するエンタープライズ メディア企業。
> - 学生および教育者にとって不適切なコンテンツをフィルター処理して除外する K-12 教育ソリューション プロバイダー。