2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dify と Azure AI Content Safety プラグインの統合:展開から実装までの完全ガイド

Last updated at Posted at 2025-06-29

著者:ジーチン・ユー、Microsoft ソリューションエンジニア、Dify コミュニティ貢献者

Azure AI Content Safety Container が Dify Marketplace に正式リリースされました。このプラグインは AI アプリケーション向けのコンテンツ審査ツールで、ユーザー入力や AI 生成コンテンツの有害情報を自動検出・フィルタリングし、アプリの安全性を確保します。

1.jpg

主な機能:

  • リアルタイム審査:ワークフロー内でテキストや画像の不適切内容を自動検出
  • 多面的な安全保障:ヘイトスピーチ・暴力・ポルノ・自傷行為など幅広いリスク対応
  • 柔軟な導入方法:ローカルコンテナ化でデータプライバシー遵守が可能
  • カスタム可能な審査ルール:BlockList で特定内容を精密フィルタリング

カスタマーサポートボットやコンテンツ生成アプリなど、あらゆる AI アプリに信頼性を付加します。

1. Azure AI コンテンツセキュリティ

1.1 概要

Azure AI コンテンツセキュリティは、AI サービスとして、ユーザーによる入力や AI 生成の有害コンテンツを検出する機能を備えています。このサービスにはテキストおよび画像 API が含まれ、以下の異なる分析機能を提供します。

table_1.png

1.2 危険カテゴリ

Azure AI Content Safety は、有害コンテンツの4つの異なるカテゴリを識別します。

table_2.png

1.3 深刻度レベル

各危険カテゴリには深刻度レベルが付いており、コンテンツの有害性の程度を示します。0から7の範囲で、数値が大きいほど有害性が高くなります。

  • テキスト:全レベル(0-7)に対応
  • 画像:簡易版レベル(0-7)に対応
  • テキスト付き画像:全レベル(0-7)に対応

1.4 Azure Content Safety Container

Azure AI Content Security 機能を自分の環境で利用し、特定の安全性およびデータ管理要件を満たすためのコンテナがあります。以下に、利用可能な AI Content Safety Container とその機能を示します。

table_3.png

Content Safety Container は、パブリックプレビュー版であり、Microsoft の安定性およびサポート要件を満たしていません。

1.5 価格

Azure AI Content Safety は、2種類のSKUを提供します。Standard SKU は、実際のリクエストに基づいてテキストおよび画像に課金され、Commitment SKU は完全にローカルでデプロイされ、インターネットに接続せずに利用できます。詳細を以下に示します。

SKU 課金タイプ(Meter Type) 価格(Price)
スタンダード(Standard) 1K Images $0.75 USD
スタンダード(Standard) 1K Text Records $0.375 USD
Commitment Tier Image DC 15M Unit 1 ユニット/年 $103883 USD
Commitment Tier Text DC 60M Unit 1 ユニット/年 $207765 USD

1.6 Dify プラグイン

Azure AI Content Safety Container は Dify プラグインとしてパッケージ化され、Dify Marketplace に上場されています。このプラグインは、テキスト(TEXT)と画像(IMAGE)の両方を対象とした審査機能を提供します。最新バージョンv0.0.2は以下の特徴を持っています:

  • 単一のツール内でテキストと画像のコンテンツを同時に審査
  • カスタム API エンドポイントおよびオプションの認証リクエストヘッダーのサポート
  • テキスト審査時に BlockList を活用し、フィルタリング精度を向上
  • API 応答を自動解析し、審査結果の違反の詳細を集約表示
  • 明確なALLOWまたはDENYのチェック結果を出力
  • ニーズに応じた生の JSON 形式のRawResultsを追加出力

5.png

2. デプロイメント

2.1 前提条件

Content Safety Containerを使用する前に、以下の前提条件を満たす必要があります。

  • Azure Global Subscription(Azure グローバルサブスクリプション)
  • Azure 上で標準(S)プライシング層(standard (S) pricing tier)の Content Safety resources を作成

2.2 課金パラメータ

Content Safety Container は Azure に接続されない場合、動作しません。コンテナは常に課金サービスと通信し、課金情報を更新する必要があります。コンテナを起動させるためには、以下の3つの主要なパラメータが必要です。Microsoft ソフトウェアライセンス条項にはaccept値が必要です。加えて、エンドポイントURLとAPIキーも必要です。

オプション(Option) 説明(Description)
Aplikey 請求情報追跡用のコンテンツセキュリティAPI Key(認証とデータセキュリティに使用)
Billing 請求情報追跡用のコンテンツセキュリティのエンドポイント             
Eula このオプションは accept に設定し、コンテナライセンスへの同意を示します

📢 Note
コンテナは約10〜15分ごとに使用量を報告します。許可された時間内に Azure に接続できない場合、コンテナは引き続き動作しますが、サービスは提供されなくなります。
デフォルトでは、10〜15分の間に10回接続を試み、全てが失敗した場合にはリクエストの処理が停止します。

2.3 ホスト要件

ホストは x64 アーキテクチャに基づいており、ローカルのハードウェアまたは仮想環境、あるいは Azure 内の Docker ホスティングサービスを使用できます。以下にテキストおよび画像コンテナ向けの推奨仕様を示します。

推奨CPUコア数(Recommended number of CPU cores) 推奨メモリ(Recommended memory) 注意事項(Notes)
4 16 NVIDIA CUDA が必須(テキスト処理の場合はオプション)
CUDA のバージョンは 11.8 または 12.6 の必要があります。

Content Safety Container は CPU上で実行可能ですが、最良のパフォーマンスを得るためには NVIDIA CUDA が必要です。このコンテナは CUDA 11.8 および 12.6 でテストされ、最低 GPU 仕様は NVIDIA T4、推奨は A100 です。

2.4 ベンチマークパフォーマンス

以下の表は、NVIDIA T4 および A100 を用いた単一 GPU における毎秒リクエスト数(RPS)および遅延指標を示します。但し、同じ GPU を使用してもパフォーマンスは GPU の負担や環境設定によって変動しますので、参考にしてください。

1)テキスト分析
GPU 最大要求処理速度(Max RPS) 最大要求処理速度時の平均遅延
(Average Latency at Max PRS)
T4 130 50.4 ms
A100 360 8.7 ms
2)画像分析
GPU 最大要求処理速度(Max RPS) 最大要求処理速度時の平均遅延
(Average Latency at Max PRS)
T4 15 229 ms
A100 30 799 ms

2.5 インストール手順

📢 Note
以下の操作はすべて Ubuntu 24.04、Security Type: Trusted launch virtual machines に基づいています。

1)NVIDIA Driver のインストール

Azure VM を作成する際に、Trusted launch virtual machines を選択した場合、Ubuntu が提供する ubuntu-drivers ツールを使って NVIDIA ドライバーをインストールする必要があります。

# Secure Boot が有効かどうか確認
mokutil --sb-state

# ubuntu-drivers をインストール
apt update && apt install -y ubuntu-drivers-common

# サーバー向けの利用可能なドライバーのバージョンを確認
ubuntu-drivers list --gpgpu

# ドライバーをインストール(CUDA 12.6 には CUDA Driver ≥560 が必要)
ubuntu-drivers install --gpgpu nvidia:570-server

# ドライバーのバージョンを確認
cat /proc/driver/nvidia/version

# utilsをインストール
apt install nvidia-utils-570-server

# 動作確認
nvidia-smi

# ドライバーを更新し、古いバージョンをクリーンアップ(任意)
ubuntu-drivers install --gpgpu nvidia:575-server
apt install nvidia-utils-575-server
reboot
apt purge nvidia-driver-570 nvidia-kernel-common-570 nvidia-utils-535
2)Dockerのインストール
# システムパッケージリストを更新
apt update

# Dockerをインストール
apt install docker.io -y
3)CUDA Toolkit のインストール

前述の通り、Content Safety Container は CUDA 11.8 および 12.6 でテストされていますので、CUDA 12.6 のインストールを推奨します。手順は以下の通りです:

# DEB パッケージをダウンロード
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb

# NVIDIA 公式リポジトリキーを追加
dpkg -i cuda-keyring_1.1-1_all.deb

# システムパッケージリストを更新
apt update

# 利用可能な Toolkit バージョンを検索
apt search cuda-toolkit

# 指定したバージョンをインストール
apt -y install cuda-toolkit-12-6

# nvcc を PATH に追加
echo 'export PATH=/usr/local/cuda-12.6/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
4)NVIDIA Container Toolkit のインストール

NVIDIA Container Toolkit は、GPU コンテナの構築および実行に必要なライブラリとユーティリティのセットです。

# 公式リポジトリを追加
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# システムパッケージリストを更新
apt update

# インストール
export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
apt-get install -y \
nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}

# Docker を再起動
systemctl restart docker

# 確認
docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi
5)Endpoint および APIKey を取得

Portalパス:Home / Content Safety / / Resource Management / Key and Endpoint

2.jpg

6)Content Safety Container のデプロイ

Microsoft Container Registry で、サポートされているすべてのコンテンツセキュリティテキストおよび画像コンテナのイメージを確認できます。azure-cognitive-services/contentsafety 内にtext-analyzeimage-analyzeという名前で存在しています。

Microsoft Container Registry:https://aka.ms/aacscontainermcr

# Content Safety Container のデプロイ - Text
## CPU マシンにデプロイ(ステップ1-3をスキップ)
export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
apt-get install -y \
nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}

## GPU マシンにデプロイ
docker run -itd -p 5000:5000 \
--gpus all \
--restart always \
mcr.microsoft.com/azure-cognitive-services/contentsafety/text-analyze:latest \
Eula=accept \
Billing="<Endpoint>" \
ApiKey="<ApiKey>"

# Content Safety Container のデプロイ - Image
## Image は GPU マシンにのみデプロイ可能
docker run -itd -p 5000:5000 \
--gpus all \
--restart always \
mcr.microsoft.com/azure-cognitive-services/contentsafety/image-analyze:latest \
Eula=accept \
Billing="<Endpoint>" \
ApiKey="<ApiKey>"
7)ステータスを確認

コンテナが正常に動作しているかを確認する方法はいくつかあります。関連するコンテナの外部 IP アドレス(External IP address)とポートを見つけ、ブラウザを開いて以下の URL を使用し、コンテナが動作しているか確認します。

リクエストURL
(Request URL)
目的
(Purpose)
http://ip_address:5000/ready コンテナがクエリを受け入れる準備状態であることを確認します。
http://ip_address:5000/status コンテナを起動するための API キーが有効かどうかを確認します。
http://ip_address:5000/api-docs/index.html このコンテナはエンドポイント用の完全なドキュメントと「Try it out」機能を提供します。Web ベースの HTML フォームで設定を入力し、コード不要でクエリを実行できます。レスポンス後、必要な HTTP ヘッダーと本文形式を示すCURLコマンド例が提供されます。
  • Text Analyze(テキスト分析)
    3.jpg

  • Image Analyze(画像分析)
    4.jpg

8)BlockList の使用(テキスト分析のみ)

Content Safety Container for Text Analysisは、BlockListというカスタマイズ機能のサポートがあります。この機能を使用してBlockList用語をカスタマイズし、CSVファイルでに管理することも可能です。コンテナでBlockListを使用するには、以下のコマンドを使用します:

BlockList:https://learn.microsoft.com/en-us/azure/ai-services/content-safety/how-to/use-blocklist

# CPUマシンにデプロイ(ステップ1-3をスキップ)
docker run -itd -p 5000:5000 \
-e CUDA_ENABLED=false \
--restart always \
-e BLOCKLIST_DIR=/tmp/blocklist \
-v {/path/on/host}:/tmp/blocklist \
mcr.microsoft.com/azure-cognitive-services/contentsafety/text-analyze:latest \
Eula=accept \
Billing="<Endpoint>" \
ApiKey="<ApiKey>"

# GPUマシンにデプロイ
docker run -itd -p 5000:5000 \
--gpus all \
--restart always \
-e BLOCKLIST_DIR=/tmp/blocklist \
-v {/path/on/host}:/tmp/blocklist \
mcr.microsoft.com/azure-cognitive-services/contentsafety/text-analyze:latest \
Eula=accept \
Billing="<Endpoint>" \
ApiKey="<ApiKey>"

{/path/on/host} をホスト上のブロックリストフォルダーのパスに置き換え、このコマンドでホスト内のブロックリストディレクトリをコンテナのBLOCKLIST_DIR=/tmp/blocklist環境変数としてマウントします。

📢 Note
Content Safety Container for Text Analysis は、ブロックリストに対して正確なマッチング方法を使用します。マッチングプロセスの前に、ブロックリスト内のすべてのアイテムが小文字に変換されます。

3. API 呼び出し

3.1. APICall

1)サンプルコード - REST API

# Text Analyze(テキスト分析)
curl --location --request POST '<endpoint>/contentsafety/text:analyze?api-version=2024-09-01' \
--header 'Ocp-Apim-Subscription-Key: <your_subscription_key>' \
--header 'Content-Type: application/json' \
--data-raw '{
  "text": "I hate you",
  "categories": ["Hate", "Sexual", "SelfHarm", "Violence"],
  "blocklistNames": ["string"],
  "haltOnBlocklistHit": true,
  "outputType": "EightSeverityLevels"
}'

# Image Analyze(画像分析)
curl --location --request POST '<endpoint>/contentsafety/image:analyze?api-version=2024-09-01' \
--header 'Content-Type: application/json' \
--data-raw '{
  "image": {
    "content": "base_64_string"
  },
  "categories": ["Hate", "SelfHarm", "Sexual", "Violence"],
  "outputType": "FourSeverityLevels"
}'

2)パラメータの説明

  • Text Analyze(テキスト分析)
名前(Name) 必須かどうか(Required) 説明(Description) タイプ(Type)
text 必須 チェックする原文。非 ASCII 文字を含むことができます。デフォルトの最大長:10,000文字(長文は必要に応じて自動で分割されます)。 String
categories オプション 有害なカテゴリ(不適切なコンテンツの分類)。指定がない場合はすべての四つのカテゴリを使用します。 String
blocklistNames オプション テキストブロックリストの名前。次の文字のみをサポート:0-9 A-Z a-z - ._~。複数のブロックリストを追加できます。 String
haltOnBlocklistHit オプション trueに設定すると、ブロックリストヒット時に有害コンテンツに対するさらなる分析を中止します。
falseに設定した場合はブロックリストにヒットしたかどうかに関わらずすべての有害コンテンツの分析を実行します。
Boolean
outputType オプション FourSeverityLevelsまたはEightSeverityLevels。出力の重大度は 0/2/4/6 または 0/1/2/3/4/5/6/7 です。 String
  • Image Analyze(画像分析)
名前(Name) 必須かどうか(Required) 説明(Description) タイプ(Type)
content 必須 base64エンコードまたは blob URL 形式で指定できます。両方を指定するとリクエストが拒否されます。画像の最大サイズは 7200x7200 ピクセルで、最大ファイルサイズは 4MB です。画像の最小サイズは 50x50 ピクセルです。 String
categories オプション 有害なカテゴリ(不適切なコンテンツの分類)。指定がない場合はすべての四つのカテゴリを使用します。 String
outputType オプション 画像審査 API はFourSeverityLevelsのみをサポートしており、重大度は4レベルで出力値は 0/2/4/6 のいずれかとなります。 String

3.2. 出力

1)サンプル

# Text Analyze(テキスト分析)
{
  "blocklistsMatch": [
    {
      "blocklistName": "string",
      "blocklistItemId": "string",
      "blocklistItemText": "string"
    }
  ],
  "categoriesAnalysis": [
    {
      "category": "Hate",
      "severity": 2
    },
    {
      "category": "SelfHarm",
      "severity": 0
    },
    {
      "category": "Sexual",
      "severity": 0
    },
    {
      "category": "Violence",
      "severity": 0
    }
  ]
}


# Image Analyze(画像分析)
{
  "categoriesAnalysis": [
    {
      "category": "Hate",
      "severity": 2
    },
    {
      "category": "SelfHarm",
      "severity": 0
    },
    {
      "category": "Sexual",
      "severity": 0
    },
    {
      "category": "Violence",
      "severity": 0
    }
  ]
 }

2)パラメータの説明

名前(Name) 説明(Description) タイプ(Type)
categoriesAnalysis API が予測した各出力クラス。複数のラベルに分類されることがあります(例:テキスト審査モデルへのアップロード時は、ポルノや暴力に分類される場合があります)。 String
Severity 入力コンテンツの重大度が高いほど、この値は高くなります。 Integer

4. Dify の統合

4.1. 前提条件

1)Content Safety Container のデプロイ
Content Safety Container Plugin を使用する前に、前章の手順に従って Content Safety Container が正しく設定され、稼働していることを確認してください。また、プラグインを設定する前に、コンテナが可視化され、API リクエストに正常に応答するかどうかを確認する必要があります。

2)Dify ENV の更新
ユーザーが Dify のチャットボックスに画像を送信すると、sys.filesにその画像にアクセスするための URL が生成されます(各画像に対して 1 つの URL)。Content Safety Container Plugin は、これらの URL にアクセスして画像を取得し、base64 形式に変換した後、画像分析 API に送信してレビューを実施します。したがって、Dify でFILES_URLまたはCONSOLE_API_URLを設定する必要があります。sys.filesの構造は次の通りです:

[
  {
    "dify_model_identity": "__dify__file__",
    "id": null,
    "tenant_id": "7720c6b6-73a5-457f-93a2-66075982fe02",
    "type": "image",
    "transfer_method": "local_file",
    "remote_url": "https://upload.dify.ai/files/xxxxxxxx",
    "related_id": "4763ef42-1bca-44d1-b12b-bee0e841b719",
    "filename": "image_moderation_1.jpg",
    "extension": ".jpg",
    "mime_type": "image/jpeg",
    "size": 39886,
    "url": "https://upload.dify.ai/files/xxxxxxxx"
  }
]

4.2. 設定手順

1)プラグインの取得

Content Safety Container Plugin は、Marketplace、GitHub、またはローカルパッケージファイルを通じてインストールできます。必要に応じて選択してください。ローカルパッケージファイルを使用してインストールする場合、difypkg ファイルが署名されていないため、インストール時にエラーが発生します。この場合、plugin-daemon コンポーネントの設定をFORCE_VERIFYING_SIGNATURE=falseに変更し、チェックをバイパスする必要があります。

Marketplace:https://marketplace.dify.ai/
GitHub:https://github.com/HeyJiqingCode/AzureAIContentSafetyContainer-DifyPlugin.git
Local Package File:https://github.com/HeyJiqingCode/AzureAIContentSafetyContainer-DifyPlugin/blob/dify

2)認証

Dify のナビゲーションページで、[Tools] > [Azure AI Content Safety Container] > [To Authorize] に移動し、API EndpointAPI Version、およびオプションのリクエストヘッダー(例: Azure API Management Subscription Key)を入力します。

4-2.jpg

4-3.jpg

3)ノードの追加

Content Safety Container Plugin は、チャットフローやワークフローで使用でき、テキストおよび画像コンテンツのレビューを同時に行うことができます。新しいチャットフローまたはワークフローを作成し、ツールノードを追加して、Azure AI Content Safety Container のContent Moderationを選択します。設定の例は以下の通りです:

4-4.jpg

API Endpoint: https://xxx.azure-api.net
API Version: 2024-05-01
Custom Header Key: Ocp-Apim-Subscription-Key
Custom Header Value: *******************************
4)パラメータの設定

Content Safety Container Plugin のすべてのパラメータはオプションとして設定されています。バックエンドは、テキストまたは画像コンテンツが渡されたかを自動で検出し、対応する API を呼び出してコンテンツをレビューします。コンテンツが渡されていない場合は、呼び出されません。パラメータの説明は以下の通りです:

  • Text to Analyze:分析するテキストを指定します。Dify システム変数 sys.query を指定可能です。
  • Images to Analyze:分析する画像ファイルを指定します。Dify システム変数 sys.files を指定可能です。
  • Text Blocklist Names:テキスト分析に使用するブロックリスト名。複数の名前はカンマで区切ります。
  • Halt on Blocklist Hit:ブロックリストに一致した場合、テキスト分析を停止するかどうか。false に設定することをお勧めします。

4-5.jpg

📢 注意
検出される画像の最大サイズは 7,200 x 7,200 ピクセル、最小サイズは 50 x 50 ピクセル、個々の画像ファイルのサイズは 4M を超えてはいけません。

4.3. 出力変数

Content Safety Container Pluginは、異なるシナリオのニーズに対応するためのさまざまな出力結果を提供します。具体的には次の通りです:

  • CheckResult:最終検査結果(ALLOWDENY または ERROR)。
  • Details:形式化された違反の詳細。CheckResultDENYの場合のみ出力されます。
  • RawResults:カスタマイズ用の未加工レスポンス。

RawResults の構造の例は以下の通りです:

{
  "text": {
    "blocklistsMatch": [],
    "categoriesAnalysis": [
      {
        "category": "Hate",
        "severity": 6
      }
    ]
  },
  "image": [
    {
      "categoriesAnalysis": [
        {
          "category": "Sexual",
          "severity": 4
        }
      ]
    }
  ]
}

4.4. 効果展示

1)テキストレビュー - 有害カテゴリー検出
4-4-1.jpg

2)画像レビュー - 有害カテゴリー + BlockList検出
4-4-3.jpg
4-4-3-4.jpg

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?