安全和内容过滤器

Google 的生成式 AI 模型(例如 Gemini 2.5 Flash)旨在优先考虑安全性。不过,它们仍可能会生成有害的回答,尤其是在明确提示的情况下。为了进一步提高安全性并尽量减少滥用情况,您可以配置内容过滤器来屏蔽可能有害的回答。

本页介绍了每种安全和内容过滤条件类型,并概述了关键安全概念。对于可配置的内容过滤器,它会向您介绍如何配置每个危害类别的屏蔽阈值,以控制提示和回答的屏蔽频率。 我们还提供了示例来演示如何对可配置的内容过滤条件进行编程。

安全和内容过滤器可作为屏障,防止有害输出,但不会直接影响模型的行为。如需详细了解模型可操控性,请参阅系统安全说明

不安全的提示

Vertex AI 中的 Gemini API 提供以下 enum 代码之一,以说明提示遭拒的原因:

枚举 过滤条件类型 说明
PROHIBITED_CONTENT 不可配置的安全过滤条件 系统屏蔽了此提示,因为其中包含禁止的内容(通常是 CSAM),因此被标记。
BLOCKED_REASON_UNSPECIFIED 不适用 未指定屏蔽该提示的原因。
OTHER 不适用 此枚举指的是阻止提示的所有其他原因。请注意,Vertex AI 中的 Gemini API 不支持所有语言。如需查看受支持的语言列表,请参阅 Gemini 语言支持

如需了解详情,请参阅 BlockedReason

以下是 Gemini API in Vertex AI 输出示例,其中提示因包含 PROHIBITED_CONTENT 而被屏蔽:

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

不安全的回答

以下过滤器可以检测并屏蔽可能不安全的回答:

  • 不可配置的安全过滤器,用于屏蔽儿童性虐待内容 (CSAM) 和个人可识别信息 (PII)。
  • 可配置的内容过滤器,可根据危害类别列表及其用户配置的屏蔽阈值来屏蔽不安全的内容。您可以根据自己的用例和业务情况,为每种危害配置屏蔽阈值。如需了解详情,请参阅可配置的内容过滤器
  • 引文过滤器,用于提供来源材料的引文。如需了解详情,请参阅引用过滤器

LLM 以文本单元(称为词元)的形式生成回答。模型会在达到自然停止点或某个过滤器屏蔽响应时停止生成词元。Vertex AI 中的 Gemini API 提供以下 enum 代码之一来解释token生成停止的原因:

枚举 过滤条件类型 说明
STOP 不适用 此枚举表示模型已到达自然停止点或提供的停止序列。
MAX_TOKENS 不适用 由于模型达到了请求中指定的词元数量上限,因此词元生成操作已停止。
SAFETY 可配置的内容过滤器 由于回答因有害内容而被标记,因此 token 生成操作已停止。
RECITATION 引用过滤器 由于可能存在重复内容,因此 token 生成操作已停止。
SPII 不可配置的安全过滤条件 由于回答因敏感的个人身份信息 (SPII) 内容而被标记,因此词元生成操作已停止。
PROHIBITED_CONTENT 不可配置的安全过滤条件 由于回答因包含禁止的内容(通常是 CSAM)而被标记,因此词元生成操作已停止。
FINISH_REASON_UNSPECIFIED 不适用 未指定完成原因。
OTHER 不适用 此枚举指的是停止生成词元的所有其他原因。请注意,并非所有语言都支持词元生成。如需查看受支持的语言列表,请参阅 Gemini 语言支持

如需了解详情,请参阅 FinishReason

如果过滤条件阻止回答,则会使回答的 Candidate.content 字段失效。它不会向模型提供任何反馈。

可配置的内容过滤器

内容过滤器会根据一系列危害来评估内容。对于每个危害类别,内容过滤器会根据内容有害的可能性分配一个得分,并根据有害内容的严重程度分配另一个得分。

可配置的内容过滤器没有独立于模型版本的版本控制。Google 不会更新之前发布的模型版本的可配置内容过滤器。不过,它可能会更新模型的未来版本的可配置内容过滤器。

危害类别

内容过滤器会根据以下危害类别评估内容:

危害类别 定义
仇恨言论 针对身份和/或受保护属性的负面或有害评论。
骚扰 针对其他人的威胁、恐吓、欺凌或辱骂性评论。
露骨色情内容 包含对性行为或其他淫秽内容的引用。
危险内容 宣传或允许访问有害商品、服务和活动。

概率得分和严重程度得分的比较

概率安全得分反映了模型回答与相应危害相关联的可能性。其关联置信度分数介于 0.01.0 之间,四舍五入到小数点后一位。置信度分数会细分为四个置信度级别:NEGLIGIBLELOWMEDIUMHIGH

严重程度得分反映了模型回答可能的危害程度。它具有关联的严重程度得分,范围介于 0.01.0 之间,四舍五入到小数点后一位。严重程度得分被细分为四个等级:NEGLIGIBLELOWMEDIUMHIGH

内容可能具有较低的概率分数和较高的严重性分数,或者可能具有高概率分数和低严重程度分数。

内容过滤条件配置选项

您可以使用 Vertex AI 中的 Gemini API 或 Google Cloud 控制台来配置内容过滤条件。

Vertex AI 中的 Gemini API

Vertex AI 中的 Gemini API 提供了两种“伤害屏蔽”方法:

  • SEVERITY:此方法同时使用可能性得分和严重程度得分。
  • PROBABILITY:此方法仅使用概率得分。

默认方法为 SEVERITY。对于 gemini-1.5-flashgemini-1.5-pro 之前的模型,默认方法为 PROBABILITY。如需了解详情,请参阅 HarmBlockMethod API 参考文档

Gemini API in Vertex AI 提供以下“伤害屏蔽”阈值:

  • BLOCK_LOW_AND_ABOVE:当概率得分或严重程度得分为 LOWMEDIUMHIGH 时屏蔽。
  • BLOCK_MEDIUM_AND_ABOVE:当概率得分或严重程度得分为 MEDIUMHIGH 时屏蔽。
  • BLOCK_ONLY_HIGH:当概率得分或严重程度得分为 HIGH 时屏蔽。
  • HARM_BLOCK_THRESHOLD_UNSPECIFIED:使用默认阈值进行屏蔽。
  • OFF:不会屏蔽自动回答,也不会返回元数据。对于 gemini-2.5-flash 及后续模型,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 时屏蔽。

例如,如果您将“危险内容”类别的屏蔽设置设为屏蔽少部分,则系统会屏蔽包含危险内容概率较高的所有部分。允许任何包含危险内容概率较低的部分。

如需设置阈值,请参阅以下步骤:

  1. 在 Google Cloud 控制台的 Vertex AI 部分中,进入 Vertex AI Studio 页面。

    进入 Vertex AI Studio

  2. 创建新提示下,点击任意按钮以打开提示设计页面。

  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 配置内容过滤条件:

Python

安装

pip install --upgrade google-genai

如需了解详情,请参阅 SDK 参考文档

设置环境变量以将 Gen AI SDK 与 Vertex AI 搭配使用:

# 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

Go

了解如何安装或更新 Go

如需了解详情,请参阅 SDK 参考文档

设置环境变量以将 Gen AI SDK 与 Vertex AI 搭配使用:

# 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

import (
	"context"
	"fmt"
	"io"

	"google.golang.org/genai"
)

// generateTextWithSafety shows how to apply safety settings to a text generation request.
func generateTextWithSafety(w io.Writer) error {
	ctx := context.Background()

	client, err := genai.NewClient(ctx, &genai.ClientConfig{
		HTTPOptions: genai.HTTPOptions{APIVersion: "v1"},
	})
	if err != nil {
		return fmt.Errorf("failed to create genai client: %w", err)
	}

	systemInstruction := &genai.Content{
		Parts: []*genai.Part{
			{Text: "Be as mean as possible."},
		},
		Role: "user",
	}

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

	safetySettings := []*genai.SafetySetting{
		{Category: genai.HarmCategoryDangerousContent, Threshold: genai.HarmBlockThresholdBlockLowAndAbove},
		{Category: genai.HarmCategoryHarassment, Threshold: genai.HarmBlockThresholdBlockLowAndAbove},
		{Category: genai.HarmCategoryHateSpeech, Threshold: genai.HarmBlockThresholdBlockLowAndAbove},
		{Category: genai.HarmCategorySexuallyExplicit, Threshold: genai.HarmBlockThresholdBlockLowAndAbove},
	}

	config := &genai.GenerateContentConfig{
		SystemInstruction: systemInstruction,
		SafetySettings:    safetySettings,
	}
	modelName := "gemini-2.5-flash"
	resp, err := client.Models.GenerateContent(ctx, modelName,
		[]*genai.Content{{Parts: []*genai.Part{{Text: prompt}}, Role: "user"}},
		config,
	)
	if err != nil {
		return fmt.Errorf("failed to generate content: %w", err)
	}

	fmt.Fprintln(w, resp.Text())

	if len(resp.Candidates) > 0 {
		fmt.Fprintln(w, "Finish Reason:", resp.Candidates[0].FinishReason)

		for _, rating := range resp.Candidates[0].SafetyRatings {
			fmt.Fprintf(w, "\nCategory: %v\nIs Blocked: %v\nProbability: %v\nProbability Score: %v\nSeverity: %v\nSeverity Score: %v\n",
				rating.Category,
				rating.Blocked,
				rating.Probability,
				rating.ProbabilityScore,
				rating.Severity,
				rating.SeverityScore,
			)
		}
	}

	// Example response:
	// Category: HARM_CATEGORY_HATE_SPEECH
	// Is Blocked: false
	// Probability: NEGLIGIBLE
	// Probability Score: 8.996795e-06
	// Severity: HARM_SEVERITY_NEGLIGIBLE
	// Severity Score: 0.04771039
	//
	// Category: HARM_CATEGORY_DANGEROUS_CONTENT
	// Is Blocked: false
	// Probability: NEGLIGIBLE
	// Probability Score: 2.2431707e-06
	// Severity: HARM_SEVERITY_NEGLIGIBLE
	// Severity Score: 0
	//
	// Category: HARM_CATEGORY_HARASSMENT
	// Is Blocked: false
	// Probability: NEGLIGIBLE
	// Probability Score: 0.00026123362
	// Severity: HARM_SEVERITY_NEGLIGIBLE
	// Severity Score: 0.022358216
	//
	// Category: HARM_CATEGORY_SEXUALLY_EXPLICIT
	// Is Blocked: false
	// Probability: NEGLIGIBLE
	// Probability Score: 6.1352006e-07
	// Severity: HARM_SEVERITY_NEGLIGIBLE
	// Severity Score: 0.020111412

	return nil
}

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.5-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.5-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 会尝试将您引导至热门来源。如果此类功能引用了代码库,则引用中还可能提及适用的开源许可。您须负责遵守所有许可要求。

如需了解引用过滤条件的元数据,请参阅过滤条件 API 参考文档

最佳做法

虽然内容过滤器有助于防止出现不安全内容,但偶尔也会屏蔽良性内容或漏掉有害内容。Gemini 2.5 Flash 等高级模型即使没有过滤器也能生成安全的回答。测试不同的过滤器设置,在确保安全性和允许适当内容之间找到合适的平衡点。

后续步骤