共用方式為


適用于 Python 的 Azure AI 內容安全 用戶端程式庫 - 1.0.0 版

Azure AI 內容安全會在應用程式和服務中偵測有害的使用者產生和 AI 產生的內容。 內容安全性包含文字和影像 API,可讓您偵測有害的資料:

  • 文字分析 API:使用多重嚴重性層級掃描文字中是否有性內容、暴力、暴力和自我傷害。
  • 影像分析 API:使用多重嚴重性層級掃描影像中是否有性內容、暴力、暴力和自我傷害。
  • 文本封鎖清單管理 API:預設 AI 分類器足以滿足大部分的內容安全性需求;不過,您可能需要篩選使用案例特有的字詞。 您可以建立要與文字 API 搭配使用之條款的封鎖清單。

文件

有各種檔可協助您開始使用

開始使用

Prerequisites

安裝套件

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_IDAZURE_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。