適用于 Python 的 Azure AI 內容安全 用戶端程式庫 - 1.0.0 版
Azure AI 內容安全會在應用程式和服務中偵測有害的使用者產生和 AI 產生的內容。 內容安全性包含文字和影像 API,可讓您偵測有害的資料:
- 文字分析 API:使用多重嚴重性層級掃描文字中是否有性內容、暴力、暴力和自我傷害。
- 影像分析 API:使用多重嚴重性層級掃描影像中是否有性內容、暴力、暴力和自我傷害。
- 文本封鎖清單管理 API:預設 AI 分類器足以滿足大部分的內容安全性需求;不過,您可能需要篩選使用案例特有的字詞。 您可以建立要與文字 API 搭配使用之條款的封鎖清單。
文件
有各種檔可協助您開始使用
開始使用
Prerequisites
- 需要 Python 3.7 或更新版本才能使用此套件。
- 您需要 Azure 訂 用帳戶才能使用此套件。
- Azure AI 內容安全資源,如果沒有現有的資源,您可以建立新的資源。
安裝套件
pip install azure-ai-contentsafety
驗證用戶端
取得端點
您可以使用Azure 入口網站或 AzureCLI來尋找Azure AI 內容安全服務資源的端點:
# 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 金鑰。 您可以在 Azure 入口網站 中找到 API 金鑰,或執行下列 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識別碼權杖認證建立 ContentSafetyClient/BlocklistClient
步驟 1:為您的資源啟用Microsoft Entra識別碼。 如需啟用資源Microsoft Entra識別碼的步驟,請參閱本檔使用Microsoft Entra識別碼進行驗證。
主要步驟包括:
- 使用自訂子域建立資源。
- 建立服務主體,並將認知服務使用者角色指派給它。
步驟 2:將Microsoft Entra應用程式的用戶端識別碼、租使用者識別碼和用戶端密碼的值設定為環境變數:
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。
功能 | Description |
---|---|
文字分析 API | 掃描文字,以取得具有多重嚴重性層級的性內容、暴力、暴力和自我傷害。 |
影像分析 API | 掃描影像中是否有具有多重嚴重性層級的性內容、暴力、暴力、暴力和自我傷害。 |
文字封鎖清單管理 API | 預設 AI 分類器就足以滿足大部分的內容安全性需求。 不過,您可能需要篩選使用案例特有的字詞。 您可以建立要與文字 API 搭配使用之條款的封鎖清單。 |
傷害類別
內容安全性可辨識四種不同的令人反感內容類別。
類別 | 描述 |
---|---|
仇恨 | 與公平性相關的傷害是指根據這些群組的特定區分屬性來攻擊或使用封閉式或鑒別性語言的任何內容,包括不限於種族、種族、國家/地區、性別身分識別和運算式、性方向、社會、生活狀態、能力狀態、個人外觀和體大小。 |
色情 | 性描述與剖析性生活和疾病相關的語言、動物關係、以暴力或影響詞彙來攻擊、男性、實體性行為,包括針對某一人權力、暴力、男性和濫用的暴力性或強制性犯罪行為。 |
暴力 | 暴力描述與實體動作相關的語言,這些動作旨在傷害、傷害、損害或終止某人或某個專案;描述命令、噴頭和相關實體,例如製造商、關聯、法規等等。 |
自殘 | 自我傷害描述與實體動作相關的語言,這些動作旨在造成傷害、傷害、傷害自己或自行終止。 |
分類可以為多標籤的。 例如,當文字範例通過文字調節模型時,可以同時分類為色情內容和暴力內容。
嚴重性層級
服務套用的每個傷害類別也會隨附嚴重性等級評等。 嚴重性層級旨在指出顯示標記內容結果的嚴重性。
Text:目前版本的文字模型支援完整的 0-7 嚴重性小數位數。 根據預設,回應會輸出 4 個值:0、2、4 和 6。 每個兩個連續的層級都會對應至單一層級。 使用者可以在要求中使用 「outputType」,並將其設定為 「EightSeverityLevels」,以取得輸出中的 8 個值:0,1,2,3,4,5,6,7。 如需詳細資訊,您可以參考 文字內容嚴重性層級定義 。
- [0,1] - > 0
- [2,3] - > 2
- [4,5] - > 4
- [6,7] - > 6
映射:映射模型的目前版本支援完整 0-7 嚴重性小數位數的修剪版本。 分類器只會傳回嚴重性 0、2、4 和 6;每個兩個連續的層級都會對應至單一層級。 如需詳細資訊,您可以參考 影像內容嚴重性層級定義 。
- [0,1] - > 0
- [2,3] - > 2
- [4,5] - > 4
- [6,7] - > 6
文字封鎖清單管理
支援下列作業來管理文本封鎖清單:
- 建立或修改封鎖清單
- 列出所有封鎖清單
- 依 blocklistName 取得封鎖清單
- 將 blocklistItems 新增至封鎖清單
- 從封鎖清單移除 blocklistItems
- 依 blocklistName 列出封鎖清單中的所有 blocklistItems
- 依 blocklistItemId 和 blocklistName 取得封鎖清單中的 blocklistItem
- 刪除封鎖清單及其所有 blocklistItems
您可以在分析文字時設定想要使用的封鎖清單,然後您可以從傳回的回應取得封鎖清單比對結果。
範例
下一節提供數個程式碼片段,涵蓋一些最常見的內容安全服務工作,包括:
如需此處使用的資料 ,請參閱範例資料 。 如需更多範例,請參閱 範例。
分析文字
分析沒有封鎖清單的文字
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
取得 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 內容安全用戶端程式庫將會引發Azure Core中定義的例外狀況。 錯誤碼的定義如下:
錯誤碼 | 可能的原因 | 建議 |
---|---|---|
InvalidRequestBody | 要求本文中的一或多個欄位不符合 API 定義。 | 1. 檢查您在 API 呼叫中指定的 API 版本。 2. 檢查您所選取 API 版本的對應 API 定義。 |
InvalidResourceName | 您在 URL 中指定的資源名稱不符合需求,例如封鎖清單名稱、封鎖清單字詞識別碼等。 | 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
層級記錄,包括要求/回應主體和 未處理的 標頭,都可以在 logging_enable
用戶端上或使用 關鍵字引數來啟用每個作業。
如需完整的 SDK 記錄檔,請參閱 這裡範例。
選用組態
選擇性關鍵字引數可以在用戶端和每個作業層級傳入。 azure 核心 參考檔 說明重試、記錄、傳輸通訊協定等可用的組態。
下一步
其他文件
如需 Azure 內容安全性的詳細資訊檔,請參閱docs.microsoft.com 上的Azure AI 內容安全。
參與
此專案歡迎參與和提供建議。 大部分的參與都要求您同意「參與者授權合約 (CLA)」,宣告您有權且確實授與我們使用投稿的權利。 如需詳細資料,請前往 https://cla.microsoft.com 。
當您提交提取要求時,CLA Bot 會自動判斷您是否需要提供 CLA,並適當地裝飾 PR (例如標籤、註解)。 請遵循 bot 提供的指示。 您只需要使用我們的 CLA 在所有存放庫上執行此動作一次。
此專案採用 Microsoft Open Source Code of Conduct (Microsoft 開放原始碼管理辦法)。 如需詳細資訊,請參閱管理辦法常見問題集,如有其他問題或意見,請連絡 opencode@microsoft.com。