Python 用Azure AI Content Safety クライアント ライブラリ - バージョン 1.0.0
Azure AI Content Safetyは、アプリケーションやサービス内の有害なユーザー生成コンテンツと AI 生成コンテンツを検出します。 Content Safety には、有害な素材を検出できるテキスト API と画像 API が含まれています。
- テキスト分析 API: 複数の重大度レベルで、性的コンテンツ、暴力、憎悪、自傷行為のテキストをスキャンします。
- 画像分析 API: 複数の重大度レベルで、性的コンテンツ、暴力、憎悪、自傷行為の画像をスキャンします。
- テキスト ブロックリスト管理 API: 既定の AI 分類子は、ほとんどのコンテンツの安全性のニーズに十分です。ただし、ユース ケースに固有の用語を確認する必要がある場合があります。 Text API で使用する用語のブロックリストを作成できます。
ドキュメント
作業の開始に役立つさまざまなドキュメントが用意されています
作業の開始
前提条件
- このパッケージを使用するには、Python 3.7 以降が必要です。
- このパッケージを使用するには 、Azure サブスクリプション が必要です。
- Azure AI Content Safety リソースは、既存のリソースがない場合は、新しいリソースを作成できます。
パッケージをインストールする
pip install azure-ai-contentsafety
クライアントを認証する
エンドポイントを取得する
Azure AI Content Safety サービス リソースのエンドポイントは、Azure Portal または Azure CLI を使用して確認できます。
# Get the endpoint for the Azure AI Content Safety service resource
az cognitiveservices account show --name "resource-name" --resource-group "resource-group-name" --query "properties.endpoint"
API キーを使用して ContentSafetyClient/BlocklistClient を作成する
パラメーターとして API キーを credential
使用するには。
手順 1: API キーを取得します。 API キーは 、Azure Portal で、または次の Azure CLI コマンドを実行して見つけることができます。
az cognitiveservices account keys list --name "<resource-name>" --resource-group "<resource-group-name>"
手順 2: キーを文字列として の
AzureKeyCredential
インスタンスに渡します。from azure.core.credentials import AzureKeyCredential from azure.ai.contentsafety import ContentSafetyClient, BlocklistClient endpoint = "https://<my-custom-subdomain>.cognitiveservices.azure.com/" credential = AzureKeyCredential("<api_key>") content_safety_client = ContentSafetyClient(endpoint, credential) blocklist_client = BlocklistClient(endpoint, credential)
MICROSOFT ENTRA ID トークン資格情報を使用して ContentSafetyClient/BlocklistClient を作成する
手順 1: リソースのMicrosoft Entra ID を有効にします。 リソースのMicrosoft Entra ID を有効にする手順については、このドキュメント「Microsoft Entra ID で認証する」を参照してください。
主要な手順は次のとおりです。
- カスタム サブドメインを使用してリソースを作成します。
- サービス プリンシパルを作成し、Cognitive Services ユーザー ロールを割り当てます。
手順 2: Microsoft Entra アプリケーションのクライアント ID、テナント ID、およびクライアント シークレットの値を環境変数として設定します。
AZURE_CLIENT_ID
AZURE_TENANT_ID
AZURE_CLIENT_SECRET
DefaultAzureCredential では、これらの環境変数の値が使用されます。
from azure.identity import DefaultAzureCredential from azure.ai.contentsafety import ContentSafetyClient, BlocklistClient endpoint = "https://<my-custom-subdomain>.cognitiveservices.azure.com/" credential = DefaultAzureCredential() content_safety_client = ContentSafetyClient(endpoint, credential) blocklist_client = BlocklistClient(endpoint, credential)
主要な概念
利用可能な機能
このサービスからは、さまざまな種類の分析を使用できます。 次の表は、現在使用できる API を説明したものです。
機能 | 説明 |
---|---|
テキスト分析 API | 複数の重大度レベルで、性的コンテンツ、暴力、憎悪、自傷行為のテキストをスキャンします。 |
Image Analysis API | 複数の重大度レベルで、性的コンテンツ、暴力、憎悪、自傷行為の画像をスキャンします。 |
テキスト ブロックリスト管理 API | 既定の AI 分類子は、ほとんどのコンテンツの安全性のニーズに十分です。 ただし、ユース ケースに固有の用語を確認する必要がある場合があります。 Text API で使用する用語のブロックリストを作成できます。 |
危害カテゴリ
Content Safety により、不快なコンテンツの 4 つの異なるカテゴリが認識されます。
カテゴリ | 説明 |
---|---|
増悪 | 憎悪と公平性に関連する害は、人種、民族、国籍、性同一性と表現、性的指向、宗教、移民状態、能力状態、個人の外観、体格など、これらのグループの特定の差別化属性に基づいて、人またはアイデンティティグループを参照して、悲観的または差別的な言葉を攻撃または使用するコンテンツを指します。 |
性的 | 性的表現は、解剖学的な臓器や性器、ロマンチックな関係、性的または愛情的な言葉で描かれた行為、妊娠、身体的な性的行為、自分の意志、売春、ポルノ、虐待に対する暴行や強制性的暴力行為として描かれた行為を含む。 |
暴力 | 暴力とは、人や何かを傷つけたり、傷つけたり、損害を与えたり、殺したりすることを意図した物理的な行為に関連する言葉を表します。は、武器、銃、およびメーカー、協会、法律などの関連エンティティについて説明します。 |
自傷行為 | 自傷行為とは、意図的に身体を傷つけたり、傷つけたり、身体を傷つけたり、自分を殺したりする行為に関連する言葉です。 |
分類には複数のラベルを付けることができます。 たとえば、テキスト サンプルがテキスト モデレーション モデルを通過すると、性的コンテンツと暴力の両方として分類される可能性があります。
セキュリティ レベル
サービスで適用されるすべての危害カテゴリには、重大度レベルも含まれます。 重大度レベルは、フラグが設定されたコンテンツを表示した結果の重大度を示すためのものです。
テキスト: テキスト モデルの現在のバージョンでは、完全な 0 から 7 の重大度スケールがサポートされています。 既定では、応答は 4 つの値 (0、2、4、6) を出力します。 隣接する 2 つの各レベルは、1 つのレベルにマップされます。 ユーザーは request で "outputType" を使用し、"EightSeverityLevels" として設定して、出力で 0,1,2,3,4,5,6,7 の 8 つの値を取得できます。 詳細については、 テキスト コンテンツの重要度レベルの定義を 参照できます。
- [0,1] -> 0
- [2,3] -> 2
- [4,5] -> 4
- [6,7] -> 6
イメージ: イメージ モデルの現在のバージョンでは、完全な 0 から 7 の重大度スケールのトリミングされたバージョンがサポートされています。 分類子は重大度 0、2、4、および 6 のみを返します。各 2 つの隣接するレベルは、1 つのレベルにマップされます。 詳細については、 イメージ コンテンツの重大度レベルの定義を 参照できます。
- [0,1] -> 0
- [2,3] -> 2
- [4,5] -> 4
- [6,7] -> 6
テキスト ブロックリストの管理
テキスト ブロックリストを管理するには、次の操作がサポートされています。
- ブロックリストを作成または変更する
- すべてのブロックリストを一覧表示する
- blocklistName でブロックリストを取得する
- ブロックリストに blocklistItems を追加する
- ブロックリストから blocklistItems を削除する
- ブロックリスト内のすべての blocklistItem を blocklistName で一覧表示する
- blocklistItemId と blocklistName を使用してブロックリスト内の blocklistItem を取得する
- ブロックリストとそのすべての blocklistItems を削除する
テキストを分析するときに使用するブロックリストを設定すると、返された応答からブロックリストの一致結果を取得できます。
例
次のセクションでは、次のような最も一般的な Content Safety サービス タスクをカバーするいくつかのコード スニペットを示します。
ここで使用するデータについては、 サンプル データ を参照してください。 その他のサンプルについては、 サンプルを参照してください。
テキストを分析する
ブロックリストなしでテキストを分析する
import os
from azure.ai.contentsafety import ContentSafetyClient
from azure.ai.contentsafety.models import TextCategory
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import HttpResponseError
from azure.ai.contentsafety.models import AnalyzeTextOptions
key = os.environ["CONTENT_SAFETY_KEY"]
endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
# Create a Content Safety client
client = ContentSafetyClient(endpoint, AzureKeyCredential(key))
# Construct a request
request = AnalyzeTextOptions(text="You are an idiot")
# Analyze text
try:
response = client.analyze_text(request)
except HttpResponseError as e:
print("Analyze text failed.")
if e.error:
print(f"Error code: {e.error.code}")
print(f"Error message: {e.error.message}")
raise
print(e)
raise
hate_result = next(item for item in response.categories_analysis if item.category == TextCategory.HATE)
self_harm_result = next(item for item in response.categories_analysis if item.category == TextCategory.SELF_HARM)
sexual_result = next(item for item in response.categories_analysis if item.category == TextCategory.SEXUAL)
violence_result = next(item for item in response.categories_analysis if item.category == TextCategory.VIOLENCE)
if hate_result:
print(f"Hate severity: {hate_result.severity}")
if self_harm_result:
print(f"SelfHarm severity: {self_harm_result.severity}")
if sexual_result:
print(f"Sexual severity: {sexual_result.severity}")
if violence_result:
print(f"Violence severity: {violence_result.severity}")
ブロックリストを使用してテキストを分析する
import os
from azure.ai.contentsafety import ContentSafetyClient
from azure.core.credentials import AzureKeyCredential
from azure.ai.contentsafety.models import AnalyzeTextOptions
from azure.core.exceptions import HttpResponseError
key = os.environ["CONTENT_SAFETY_KEY"]
endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
# Create a Content Safety client
client = ContentSafetyClient(endpoint, AzureKeyCredential(key))
blocklist_name = "TestBlocklist"
input_text = "I h*te you and I want to k*ll you."
try:
# After you edit your blocklist, it usually takes effect in 5 minutes, please wait some time before analyzing with blocklist after editing.
analysis_result = client.analyze_text(
AnalyzeTextOptions(text=input_text, blocklist_names=[blocklist_name], halt_on_blocklist_hit=False)
)
if analysis_result and analysis_result.blocklists_match:
print("\nBlocklist match results: ")
for match_result in analysis_result.blocklists_match:
print(
f"BlocklistName: {match_result.blocklist_name}, BlockItemId: {match_result.blocklist_item_id}, "
f"BlockItemText: {match_result.blocklist_item_text}"
)
except HttpResponseError as e:
print("\nAnalyze text failed: ")
if e.error:
print(f"Error code: {e.error.code}")
print(f"Error message: {e.error.message}")
raise
print(e)
raise
画像を分析する
import os
from azure.ai.contentsafety import ContentSafetyClient
from azure.ai.contentsafety.models import ImageCategory
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import HttpResponseError
from azure.ai.contentsafety.models import AnalyzeImageOptions, ImageData
key = os.environ["CONTENT_SAFETY_KEY"]
endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
image_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./sample_data/image.jpg"))
# Create a Content Safety client
client = ContentSafetyClient(endpoint, AzureKeyCredential(key))
# Build request
with open(image_path, "rb") as file:
request = AnalyzeImageOptions(image=ImageData(content=file.read()))
# Analyze image
try:
response = client.analyze_image(request)
except HttpResponseError as e:
print("Analyze image failed.")
if e.error:
print(f"Error code: {e.error.code}")
print(f"Error message: {e.error.message}")
raise
print(e)
raise
hate_result = next(item for item in response.categories_analysis if item.category == ImageCategory.HATE)
self_harm_result = next(item for item in response.categories_analysis if item.category == ImageCategory.SELF_HARM)
sexual_result = next(item for item in response.categories_analysis if item.category == ImageCategory.SEXUAL)
violence_result = next(item for item in response.categories_analysis if item.category == ImageCategory.VIOLENCE)
if hate_result:
print(f"Hate severity: {hate_result.severity}")
if self_harm_result:
print(f"SelfHarm severity: {self_harm_result.severity}")
if sexual_result:
print(f"Sexual severity: {sexual_result.severity}")
if violence_result:
print(f"Violence severity: {violence_result.severity}")
テキスト ブロックリストを管理する
テキスト ブロックリストを作成または更新する
import os
from azure.ai.contentsafety import BlocklistClient
from azure.ai.contentsafety.models import TextBlocklist
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import HttpResponseError
key = os.environ["CONTENT_SAFETY_KEY"]
endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
# Create a Blocklist client
client = BlocklistClient(endpoint, AzureKeyCredential(key))
blocklist_name = "TestBlocklist"
blocklist_description = "Test blocklist management."
try:
blocklist = client.create_or_update_text_blocklist(
blocklist_name=blocklist_name,
options=TextBlocklist(blocklist_name=blocklist_name, description=blocklist_description),
)
if blocklist:
print("\nBlocklist created or updated: ")
print(f"Name: {blocklist.blocklist_name}, Description: {blocklist.description}")
except HttpResponseError as e:
print("\nCreate or update text blocklist failed: ")
if e.error:
print(f"Error code: {e.error.code}")
print(f"Error message: {e.error.message}")
raise
print(e)
raise
テキスト ブロックリストを一覧表示する
import os
from azure.ai.contentsafety import BlocklistClient
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import HttpResponseError
key = os.environ["CONTENT_SAFETY_KEY"]
endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
# Create a Blocklist client
client = BlocklistClient(endpoint, AzureKeyCredential(key))
try:
blocklists = client.list_text_blocklists()
if blocklists:
print("\nList blocklists: ")
for blocklist in blocklists:
print(f"Name: {blocklist.blocklist_name}, Description: {blocklist.description}")
except HttpResponseError as e:
print("\nList text blocklists failed: ")
if e.error:
print(f"Error code: {e.error.code}")
print(f"Error message: {e.error.message}")
raise
print(e)
raise
テキスト ブロックリストを取得する
import os
from azure.ai.contentsafety import BlocklistClient
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import HttpResponseError
key = os.environ["CONTENT_SAFETY_KEY"]
endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
# Create a Blocklist client
client = BlocklistClient(endpoint, AzureKeyCredential(key))
blocklist_name = "TestBlocklist"
try:
blocklist = client.get_text_blocklist(blocklist_name=blocklist_name)
if blocklist:
print("\nGet blocklist: ")
print(f"Name: {blocklist.blocklist_name}, Description: {blocklist.description}")
except HttpResponseError as e:
print("\nGet text blocklist failed: ")
if e.error:
print(f"Error code: {e.error.code}")
print(f"Error message: {e.error.message}")
raise
print(e)
raise
テキスト ブロックリストを削除する
import os
from azure.ai.contentsafety import BlocklistClient
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import HttpResponseError
key = os.environ["CONTENT_SAFETY_KEY"]
endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
# Create a Blocklist client
client = BlocklistClient(endpoint, AzureKeyCredential(key))
blocklist_name = "TestBlocklist"
try:
client.delete_text_blocklist(blocklist_name=blocklist_name)
print(f"\nDeleted blocklist: {blocklist_name}")
except HttpResponseError as e:
print("\nDelete blocklist failed:")
if e.error:
print(f"Error code: {e.error.code}")
print(f"Error message: {e.error.message}")
raise
print(e)
raise
blockItems を追加する
import os
from azure.ai.contentsafety import BlocklistClient
from azure.ai.contentsafety.models import AddOrUpdateTextBlocklistItemsOptions, TextBlocklistItem
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import HttpResponseError
key = os.environ["CONTENT_SAFETY_KEY"]
endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
# Create a Blocklist client
client = BlocklistClient(endpoint, AzureKeyCredential(key))
blocklist_name = "TestBlocklist"
block_item_text_1 = "k*ll"
block_item_text_2 = "h*te"
block_items = [TextBlocklistItem(text=block_item_text_1), TextBlocklistItem(text=block_item_text_2)]
try:
result = client.add_or_update_blocklist_items(
blocklist_name=blocklist_name, options=AddOrUpdateTextBlocklistItemsOptions(blocklist_items=block_items)
)
for block_item in result.blocklist_items:
print(
f"BlockItemId: {block_item.blocklist_item_id}, Text: {block_item.text}, Description: {block_item.description}"
)
except HttpResponseError as e:
print("\nAdd block items failed: ")
if e.error:
print(f"Error code: {e.error.code}")
print(f"Error message: {e.error.message}")
raise
print(e)
raise
blockItems を一覧表示する
import os
from azure.ai.contentsafety import BlocklistClient
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import HttpResponseError
key = os.environ["CONTENT_SAFETY_KEY"]
endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
# Create a Blocklist client
client = BlocklistClient(endpoint, AzureKeyCredential(key))
blocklist_name = "TestBlocklist"
try:
block_items = client.list_text_blocklist_items(blocklist_name=blocklist_name)
if block_items:
print("\nList block items: ")
for block_item in block_items:
print(
f"BlockItemId: {block_item.blocklist_item_id}, Text: {block_item.text}, "
f"Description: {block_item.description}"
)
except HttpResponseError as e:
print("\nList block items failed: ")
if e.error:
print(f"Error code: {e.error.code}")
print(f"Error message: {e.error.message}")
raise
print(e)
raise
get blockItem
import os
from azure.ai.contentsafety import BlocklistClient
from azure.core.credentials import AzureKeyCredential
from azure.ai.contentsafety.models import TextBlocklistItem, AddOrUpdateTextBlocklistItemsOptions
from azure.core.exceptions import HttpResponseError
key = os.environ["CONTENT_SAFETY_KEY"]
endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
# Create a Blocklist client
client = BlocklistClient(endpoint, AzureKeyCredential(key))
blocklist_name = "TestBlocklist"
block_item_text_1 = "k*ll"
try:
# Add a blockItem
add_result = client.add_or_update_blocklist_items(
blocklist_name=blocklist_name,
options=AddOrUpdateTextBlocklistItemsOptions(blocklist_items=[TextBlocklistItem(text=block_item_text_1)]),
)
if not add_result or not add_result.blocklist_items or len(add_result.blocklist_items) <= 0:
raise RuntimeError("BlockItem not created.")
block_item_id = add_result.blocklist_items[0].blocklist_item_id
# Get this blockItem by blockItemId
block_item = client.get_text_blocklist_item(blocklist_name=blocklist_name, blocklist_item_id=block_item_id)
print("\nGet blockitem: ")
print(
f"BlockItemId: {block_item.blocklist_item_id}, Text: {block_item.text}, Description: {block_item.description}"
)
except HttpResponseError as e:
print("\nGet block item failed: ")
if e.error:
print(f"Error code: {e.error.code}")
print(f"Error message: {e.error.message}")
raise
print(e)
raise
blockItems を削除する
import os
from azure.ai.contentsafety import BlocklistClient
from azure.core.credentials import AzureKeyCredential
from azure.ai.contentsafety.models import (
TextBlocklistItem,
AddOrUpdateTextBlocklistItemsOptions,
RemoveTextBlocklistItemsOptions,
)
from azure.core.exceptions import HttpResponseError
key = os.environ["CONTENT_SAFETY_KEY"]
endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
# Create a Blocklist client
client = BlocklistClient(endpoint, AzureKeyCredential(key))
blocklist_name = "TestBlocklist"
block_item_text_1 = "k*ll"
try:
# Add a blockItem
add_result = client.add_or_update_blocklist_items(
blocklist_name=blocklist_name,
options=AddOrUpdateTextBlocklistItemsOptions(blocklist_items=[TextBlocklistItem(text=block_item_text_1)]),
)
if not add_result or not add_result.blocklist_items or len(add_result.blocklist_items) <= 0:
raise RuntimeError("BlockItem not created.")
block_item_id = add_result.blocklist_items[0].blocklist_item_id
# Remove this blockItem by blockItemId
client.remove_blocklist_items(
blocklist_name=blocklist_name, options=RemoveTextBlocklistItemsOptions(blocklist_item_ids=[block_item_id])
)
print(f"\nRemoved blockItem: {add_result.blocklist_items[0].blocklist_item_id}")
except HttpResponseError as e:
print("\nRemove block item failed: ")
if e.error:
print(f"Error code: {e.error.code}")
print(f"Error message: {e.error.message}")
raise
print(e)
raise
トラブルシューティング
全般
クライアント ライブラリAzure AI Content Safety、Azure Core で定義されている例外が発生します。 エラー コードは次のように定義されます。
エラー コード | 考えられる原因 | 推奨事項 |
---|---|---|
InvalidRequestBody | 要求本文の 1 つ以上のフィールドが API 定義と一致しません。 | 1. API 呼び出しで指定した API バージョンを確認します。 2. 選択した API バージョンに対応する API 定義を確認します。 |
InvalidResourceName | URL で指定したリソース名が、ブロックリスト名、ブロックリスト用語 ID などの要件を満たしていません。 | 1. API 呼び出しで指定した API バージョンを確認します。 2. API 定義に従って、指定された名前に無効な文字があるかどうかを確認します。 |
ResourceNotFound | URL で指定したリソース (ブロックリスト名など) が、存在しない可能性があります。 | 1. API 呼び出しで指定した API バージョンを確認します。 2. URL に指定したリソースの存在をダブルチェックします。 |
InternalError | サーバー側で予期しない状況がいくつかトリガーされました。 | 1. しばらくしてから数回再試行し、問題が再度発生するかどうかを確認します。 2. この問題が解決しない場合は、Azure サポートにお問い合わせください。 |
ServerBusy | サーバー側で要求を一時的に処理できません。 | 1. しばらくしてから数回再試行し、問題が再度発生するかどうかを確認します。 2. この問題が解決しない場合は、Azure サポートにお問い合わせください。 |
TooManyRequests | 現在の RPS が現在の SKU のクォータを超えました。 | 1. 価格テーブルを確認して、RPS クォータを把握します。 2. QPS の追加が必要な場合は、Azure サポートにお問い合わせください。 |
ログの記録
このライブラリでは、ログ記録に標準 のログ ライブラリが使用されます。
HTTP セッション (URL、ヘッダーなど) に関する基本情報は、レベルで INFO
ログに記録されます。
要求/応答本文や未処理ヘッダーなど、詳細なDEBUG
レベルのログ記録は、クライアントで有効にすることも、キーワード (keyword)引数を使用してlogging_enable
操作ごとに有効にすることもできます。
SDK ログに関する完全なドキュメントと例 については、こちらを参照してください。
オプションの構成
省略可能なキーワード (keyword)引数は、クライアントと操作ごとのレベルで渡すことができます。 azure-core リファレンス ドキュメント では、再試行、ログ記録、トランスポート プロトコルなどの使用可能な構成について説明しています。
次の手順
その他のドキュメント
Azure Content Safety の詳細なドキュメントについては、docs.microsoft.com に関するAzure AI Content Safetyを参照してください。
共同作成
このプロジェクトでは、共同作成と提案を歓迎しています。 ほとんどの共同作成では、共同作成者使用許諾契約書 (CLA) にご同意いただき、ご自身の共同作成内容を使用する権利を Microsoft に供与する権利をお持ちであり、かつ実際に供与することを宣言していただく必要があります。 詳細については、 https://cla.microsoft.com を参照してください。
pull request を送信すると、CLA を提供して PR (ラベル、コメントなど) を適宜装飾する必要があるかどうかを CLA ボットが自動的に決定します。 ボットによって提供される手順にそのまま従ってください。 この操作は、Microsoft の CLA を使用するすべてのリポジトリについて、1 回だけ行う必要があります。
このプロジェクトでは、Microsoft オープン ソースの倫理規定を採用しています。 詳細については、「倫理規定の FAQ」をご覧ください。追加の質問やコメントがある場合は opencode@microsoft.com にお問い合わせください。
Azure SDK for Python