安全性和內容篩選器

Google 的生成式 AI 模型 (例如 Gemini 2.0 Flash) 一律預設為優先考量安全,不過,他們仍可能產生有害的回覆,尤其是在收到明確提示時。為進一步提升安全性並盡量減少濫用行為,您可以設定內容篩選器來封鎖可能有害的回覆。

本頁面說明各項安全性和內容篩選器類型,並概略說明重要安全性概念。針對可設定的內容篩選器,說明如何設定各項有害類別的封鎖門檻,以控管提示和回應遭封鎖的頻率。

安全和內容篩選器可做為防火牆,防止有害的輸出內容,但不會直接影響模型的行為。如要進一步瞭解模型可控性,請參閱「系統安全性指示」。

不安全的提示

Vertex AI 中的 Gemini API 會提供下列 enum 代碼之一,說明提示遭到拒絕的原因:

列舉 篩選器類型 說明
PROHIBITED_CONTENT 無法設定的安全篩選器 提示含有禁止內容 (通常是兒童性剝削與虐待),因此遭到封鎖。
BLOCKED_REASON_UNSPECIFIED 不適用 封鎖提示的原因不明。
OTHER 不適用 這個列舉是指封鎖提示的所有其他原因。請注意,Vertex AI 的 Gemini API 不支援所有語言。如需支援語言清單,請參閱 Gemini 語言支援

詳情請參閱「BlockedReason」。

以下是 Vertex AI 輸出內容中,當提示因含有 PROHIBITED_CONTENT 而遭到封鎖時,Gemini API 的範例:

{
  "promptFeedback": {
    "blockReason": "PROHIBITED_CONTENT"
  },
  "usageMetadata": {
    "promptTokenCount": 7,
    "totalTokenCount": 7
  }
}

不安全的回應

下列篩選器可偵測並封鎖可能不安全的回覆:

  • 無法設定的安全篩選器,可封鎖兒少性虐待內容 (CSAM) 和個人識別資訊 (PII)。
  • 可設定的內容篩選器:根據有害類別清單和使用者設定的封鎖門檻,封鎖不安全的內容。您可以根據用途和業務需求,為每項有害內容設定封鎖門檻。詳情請參閱「可設定的內容篩選器」。
  • 引文篩選器:提供來源資料的引文。詳情請參閱「引文篩選器」。

大型語言模型會以稱為「符元」的文字單位產生回覆。模型會在達到自然停頓點或某個篩選器封鎖回應時停止產生符記。Vertex AI 中的 Gemini API 會提供下列 enum 代碼之一,說明為何停止產生符記:

列舉 篩選器類型 說明
STOP 不適用 這個列舉值表示模型已到達自然停頓點或提供的停頓序列。
MAX_TOKENS 不適用 符記產生作業已停止,因為模型已達到要求中指定的符記數量上限。
SAFETY 可設定的內容篩選器 回應遭標示為有害內容,因此停止產生權杖。
RECITATION 引文篩選器 權杖產生作業因可能的朗誦而停止。
SPII 無法設定的安全篩選器 回覆內容含有具敏感性的個人識別資訊 (SPII),因此停止產生權杖。
PROHIBITED_CONTENT 無法設定的安全篩選器 回應遭標示為含有禁止內容 (通常是兒童性剝削內容),因此停止產生權杖。
FINISH_REASON_UNSPECIFIED 不適用 未指定結束原因。
OTHER 不適用 這個列舉會參照停止產生符記的所有其他原因。請注意,系統僅支援部分語言的符記產生作業。如需支援語言清單,請參閱 Gemini 語言支援

詳情請參閱「FinishReason」。

如果篩選器封鎖回應,就會使回應的 Candidate.content 欄位失效。不會向模型提供任何意見回饋。

可設定的內容篩選器

內容篩選器會根據有害內容清單評估內容。針對每個有害類別,內容篩選器會根據內容有害的機率,以及有害內容的嚴重程度,分別給予一項分數。

可設定的內容篩選器不具備與模型版本無關的版本管理功能。Google 不會為先前發布的模型版本更新可設定的內容篩選器。不過,它可能會更新可設定的內容篩選器,以便用於日後的模型版本。

有害類別

內容篩選器會根據下列危害類別評估內容:

有害類別 定義
仇恨言論 針對特定身分和/或受保護特質發表負面或有害言論
騷擾 針對他人發表含有恐嚇、霸凌、辱罵或惡意意圖的言論。
情色露骨內容 提及性行為或其他猥褻情事的內容。
危險內容 宣傳有害商品、服務與活動,或是提供接觸管道。

機率分數和嚴重性分數的比較

probability 安全分數反映模型回應與相應危害相關的可能性。相關聯的可信度分數介於 0.01.0 之間,並四捨五入至小數點後一位。可信度分數會以離散方式分為四個可信度層級:NEGLIGIBLELOWMEDIUMHIGH

嚴重程度分數反映模型回應可能造成的危害程度。相關的嚴重性分數介於 0.01.0 之間,四捨五入至小數點後一位。嚴重性分數會以離散方式分為四個層級:NEGLIGIBLELOWMEDIUMHIGH

內容可能有低機率分數和高嚴重程度分數,或是高機率分數和低嚴重程度分數。

如何設定內容篩選器

您可以使用 Vertex AI 中的 Gemini API 或 Google Cloud 控制台來設定內容篩選器。

Vertex AI 中的 Gemini API

Vertex AI 中的 Gemini API 提供兩種「harm block」方法:

  • 嚴重性:此方法會同時使用機率和嚴重性分數。
  • 機率:這個方法只會使用機率分數。

預設方法為 SEVERITY。對於 gemini-1.5-flashgemini-1.5-pro 以外的舊型號,預設方法為 PROBABILITY。如需更多資訊,請參閱 HarmBlockMethod API 參考資料

Vertex AI 中的 Gemini API 提供下列「危害阻斷」門檻:

  • BLOCK_LOW_AND_ABOVE:當機率分數或嚴重性分數為 LOWMEDIUMHIGH 時,就會封鎖。
  • BLOCK_MEDIUM_AND_ABOVE:當機率分數或嚴重性分數為 MEDIUMHIGH 時,系統會封鎖。
  • BLOCK_ONLY_HIGH:當機率分數或嚴重性分數為 HIGH 時,就會封鎖。
  • HARM_BLOCK_THRESHOLD_UNSPECIFIED:使用預設門檻封鎖。
  • OFF:系統不會封鎖自動回覆,也不會傳回中繼資料。對於 gemini-2.0-flash-001 和後續模型,OFF 是預設值。
  • BLOCK_NONEBLOCK_NONE 設定會移除自動回應封鎖功能。您可以改為使用傳回的分數來設定自己的內容規範。這是受限欄位,並非所有 GA 模式版本的使用者都能存取。

舉例來說,以下 Python 程式碼示範如何將危險內容類別的危害封鎖門檻設為 BLOCK_ONLY_HIGH

generative_models.SafetySetting(
  category=generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
  threshold=generative_models.HarmBlockThreshold.BLOCK_ONLY_HIGH,
),

這樣就能封鎖大部分歸類為危險內容的內容。如需更多資訊,請參閱 HarmBlockThreshold API 參考資料

如需 Python、Node.js、Java、Go、C# 和 REST 的端對端範例,請參閱「內容篩選器設定範例」。

Google Cloud 控制台

您可以透過 Google Cloud 控制台為每個內容屬性設定門檻。內容篩選器只會使用機率分數。無法使用嚴重性分數。

Google Cloud 主控台提供下列門檻值:

  • 關閉 (預設):不封鎖自動回覆。
  • 封鎖極少數內容:當機率分數為 HIGH 時封鎖。
  • 部分封鎖:當機率分數為 MEDIUMHIGH 時封鎖。
  • 封鎖多數內容:當機率分數為 LOWMEDIUMHIGH 時,就封鎖內容。

舉例來說,如果您將危險內容類別的封鎖設定設為「封鎖的內容不多」,系統就會封鎖所有機率高為危險內容的內容。允許任何機率較低的內容。預設門檻為 Block some

如要設定門檻,請參閱下列步驟:

  1. 在 Google Cloud 控制台的 Vertex AI 專區中,前往「Vertex AI Studio」頁面。

    前往 Vertex AI Studio

  2. 在「Create a new prompt」(建立新提示) 下方,點選任一按鈕即可開啟提示設計頁面。

  3. 按一下「安全設定」

    系統會開啟「安全設定」對話方塊視窗。

  4. 針對每個有害類別,設定所需的門檻值。

  5. 按一下 [儲存]

回應遭到可設定內容篩選器封鎖的輸出內容範例

以下是 Vertex AI 輸出內容中,當回覆因含有危險內容而遭到可設定內容篩選器封鎖時,Gemini API 的示例:

{
  "candidates": [{
    "finishReason": "SAFETY",
    "safetyRatings": [{
      "category": "HARM_CATEGORY_HATE_SPEECH",
      "probability": "NEGLIGIBLE",
      "probabilityScore": 0.11027937,
      "severity": "HARM_SEVERITY_LOW",
      "severityScore": 0.28487435
    }, {
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "probability": "HIGH",
      "blocked": true,
      "probabilityScore": 0.95422274,
      "severity": "HARM_SEVERITY_MEDIUM",
      "severityScore": 0.43398145
    }, {
      "category": "HARM_CATEGORY_HARASSMENT",
      "probability": "NEGLIGIBLE",
      "probabilityScore": 0.11085559,
      "severity": "HARM_SEVERITY_NEGLIGIBLE",
      "severityScore": 0.19027223
    }, {
      "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
      "probability": "NEGLIGIBLE",
      "probabilityScore": 0.22901751,
      "severity": "HARM_SEVERITY_NEGLIGIBLE",
      "severityScore": 0.09089675
    }]
  }],
  "usageMetadata": {
    "promptTokenCount": 38,
    "totalTokenCount": 38
  }
}

內容篩選器設定範例

以下範例說明如何使用 Vertex AI 中的 Gemini API 設定內容篩選器:

Gen AI SDK for Python

安裝

pip install --upgrade google-genai

詳情請參閱 SDK 參考說明文件

設定環境變數,以便透過 Vertex AI 使用 Gen AI SDK:

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True

from google import genai
from google.genai.types import (
    GenerateContentConfig,
    HarmCategory,
    HarmBlockThreshold,
    HttpOptions,
    SafetySetting,
)

client = genai.Client(http_options=HttpOptions(api_version="v1"))

system_instruction = "Be as mean as possible."

prompt = """
    Write a list of 5 disrespectful things that I might say to the universe after stubbing my toe in the dark.
"""

safety_settings = [
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_HARASSMENT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_HATE_SPEECH,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
]

response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=prompt,
    config=GenerateContentConfig(
        system_instruction=system_instruction,
        safety_settings=safety_settings,
    ),
)

# Response will be `None` if it is blocked.
print(response.text)
# Example response:
#     None

# Finish Reason will be `SAFETY` if it is blocked.
print(response.candidates[0].finish_reason)
# Example response:
#     FinishReason.SAFETY

# For details on all the fields in the response
for each in response.candidates[0].safety_ratings:
    print('\nCategory: ', str(each.category))
    print('Is Blocked:', True if each.blocked else False)
    print('Probability: ', each.probability)
    print('Probability Score: ', each.probability_score)
    print('Severity:', each.severity)
    print('Severity Score:', each.severity_score)
# Example response:
#
#     Category:  HarmCategory.HARM_CATEGORY_HATE_SPEECH
#     Is Blocked: False
#     Probability:  HarmProbability.NEGLIGIBLE
#     Probability Score:  2.547714e-05
#     Severity: HarmSeverity.HARM_SEVERITY_NEGLIGIBLE
#     Severity Score: None
#
#     Category:  HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT
#     Is Blocked: False
#     Probability:  HarmProbability.NEGLIGIBLE
#     Probability Score:  3.6103818e-06
#     Severity: HarmSeverity.HARM_SEVERITY_NEGLIGIBLE
#     Severity Score: None
#
#     Category:  HarmCategory.HARM_CATEGORY_HARASSMENT
#     Is Blocked: True
#     Probability:  HarmProbability.MEDIUM
#     Probability Score:  0.71599233
#     Severity: HarmSeverity.HARM_SEVERITY_MEDIUM
#     Severity Score: 0.30782545
#
#     Category:  HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT
#     Is Blocked: False
#     Probability:  HarmProbability.NEGLIGIBLE
#     Probability Score:  1.5624657e-05
#     Severity: HarmSeverity.HARM_SEVERITY_NEGLIGIBLE
#     Severity Score: None

REST

設定環境後,您可以使用 REST 測試文字提示。以下範例會將要求傳送至發布商模型端點。

使用任何要求資料之前,請先替換以下項目:

  • LOCATION:處理要求的區域。可用的選項包括:

    點選展開可用地區的部分清單

    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID:您的專案 ID
  • MODEL_ID:您要使用的多模態模型的模型 ID,例如 gemini-2.0-flash
  • ROLE:與內容相關聯的對話中角色。即使是單轉使用情境,也必須指定角色。可接受的值包括:
    • USER:指定您傳送的內容。
    • MODEL:指定模型的回覆。
  • TEXT:提示中要納入的文字指示。
  • SAFETY_CATEGORY:要設定安全門檻的安全類別。可接受的值包括:

    按一下展開安全性類別

    • HARM_CATEGORY_SEXUALLY_EXPLICIT
    • HARM_CATEGORY_HATE_SPEECH
    • HARM_CATEGORY_HARASSMENT
    • HARM_CATEGORY_DANGEROUS_CONTENT
  • THRESHOLD:根據機率封鎖可能屬於特定安全類別的回應門檻。可接受的值包括:

    點選展開封鎖門檻

    • BLOCK_NONE
    • BLOCK_ONLY_HIGH
    • BLOCK_MEDIUM_AND_ABOVE (預設)
    • BLOCK_LOW_AND_ABOVE
    BLOCK_LOW_AND_ABOVE 會封鎖最多內容,BLOCK_ONLY_HIGH 則會封鎖最少的內容。

HTTP 方法和網址:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:streamGenerateContent

JSON 要求主體:

{
  "contents": {
    "role": "ROLE",
    "parts": { "text": "TEXT" }
  },
  "safetySettings": {
    "category": "SAFETY_CATEGORY",
    "threshold": "THRESHOLD"
  },
}

如要傳送要求,請選擇以下其中一個選項:

curl

將要求主體儲存在名為 request.json 的檔案中,然後執行下列指令:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:streamGenerateContent"

PowerShell

將要求主體儲存在名為 request.json 的檔案中,然後執行下列指令:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:streamGenerateContent" | Select-Object -Expand Content

您應該會收到類似以下的 JSON 回應。

curl 指令範例

LOCATION="us-central1"
MODEL_ID="gemini-2.0-flash"
PROJECT_ID="test-project"

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:streamGenerateContent -d \
$'{
  "contents": {
    "role": "user",
    "parts": { "text": "Hello!" }
  },
  "safety_settings": [
    {
      "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
      "threshold": "OFF"
    },
    {
      "category": "HARM_CATEGORY_HATE_SPEECH",
      "threshold": "BLOCK_LOW_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_HARASSMENT",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "threshold": "BLOCK_ONLY_HIGH"
    }
  ]
}'

引文篩選器

Vertex AI 的生成式程式碼功能旨在產生原創內容。根據設計,Gemini 會限制完整複製現有內容的可能性。如果 Gemini 功能直接引述網頁的長篇內容,Gemini 會註明出處頁面。

有時相同內容可能會出現在多個網頁上。Gemini 會嘗試指向熱門來源。如果引用來源為程式碼存放區,Gemini 可能也會註明適用的開放原始碼授權。您有責任遵守任何授權規定。

如要瞭解引文篩選器的中繼資料,請參閱 Citation API 參考資料

公民誠信篩選器

公民誠信篩選器會偵測並封鎖提及或與政治選舉和候選人相關的提示。這個篩選器預設為停用。如要開啟,請將 CIVIC_INTEGRITY 的封鎖門檻設為下列任一值。指定的值不會影響結果。

  • BLOCK_LOW_AND_ABOVE
  • BLOCK_MEDIUM_AND_ABOVE
  • BLOCK_ONLY_HIGH

下列 Python 程式碼會說明如何啟用公民誠信篩選器:

  generative_models.SafetySetting(
      category=generative_models.HarmCategory.CIVIC_INTEGRITY,
      threshold=generative_models.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
  ),

如要進一步瞭解公民誠信篩選器,請與 Google Cloud代表聯絡。

最佳做法

雖然內容篩選器有助於防範不安全的內容,但有時可能會封鎖無害內容,或遺漏有害內容。Gemini 2.0 Flash 等進階模型的設計目的,就是在沒有篩選器的情況下生成安全的回覆。測試不同的篩選條件設定,在安全性與允許適當內容之間取得平衡。

後續步驟