Tìm hiểu và định cấu hình chế độ cài đặt an toàn

Các mô hình Gemini được thiết kế để ưu tiên sự an toàn. Tuy nhiên, các mô hình này vẫn có thể tạo ra câu trả lời gây hại, đặc biệt là khi được nhắc một cách rõ ràng. Để tăng cường hơn nữa tính an toàn và giảm thiểu việc sử dụng sai mục đích, bạn có thể định cấu hình bộ lọc an toàn để chặn các câu trả lời có thể gây hại.

Có hai lớp bảo vệ an toàn:

  • Các biện pháp bảo vệ cốt lõi được tích hợp sẵn:

    • Tất cả các mô hình Gemini đều có các biện pháp bảo vệ tích hợp sẵn để chống lại các tác hại nghiêm trọng (chẳng hạn như bóc lột trẻ em, tấn công mạng và vũ khí nguy hiểm).
    • Các biện pháp bảo vệ này luôn hoạt động, được áp dụng tự động cho tất cả câu lệnh và câu trả lời, đồng thời không thể sửa đổi hoặc tắt.
  • Bộ lọc an toàn có thể tuỳ chỉnh:

    • Gemini API cung cấp thêm bộ lọc an toàn có thể định cấu hình mà bạn xác định bằng chế độ cài đặt an toàn trong ứng dụng.
    • Các chế độ cài đặt này cho phép bạn kiểm soát ngưỡng chặn nội dung đối với bốn danh mục gây hại chính: Quấy rối, Lời nói hận thù, Nội dung khiêu dâm và Nội dung nguy hiểm.

Chuyển đến mã mẫu

Các khái niệm quan trọng về an toàn

Khi làm việc với tính năng an toàn cho các mô hình Gemini, bạn cần hiểu một số khái niệm quan trọng sau:

  • Chế độ cài đặt an toàn: Cấu hình mà bạn xác định trong mã ứng dụng, chỉ định danh mục gây hại cần theo dõi và ngưỡng chặn nội dung.

  • Bộ lọc an toàn: Các thuật toán phân loại phía máy chủ đánh giá câu lệnh và phản hồi của mô hình theo các khía cạnh an toàn của Google. Bộ lọc chặn nội dung dựa trên chế độ cài đặt an toàn mà bạn đã định cấu hình.

  • Mức phân loại về độ an toàn: Siêu dữ liệu đánh giá do mô hình trả về trong đối tượng phản hồi. Điểm xếp hạng cho biết xác suất và mức độ nghiêm trọng của mối nguy hại tiềm ẩn được phát hiện cho từng danh mục gây hại.

Mô hình được hỗ trợ

  • gemini-4-argon
  • gemini-3.8-flash (và các phiên bản cũ hơn là gemini-3.7-flash, gemini-3.6-flash và gemini-3.5-flash)
  • gemini-3.5-flash-lite (và gemini-3.1-flash-lite cũ hơn)
  • gemini-nano-banana-2.1 (Nano Banana 2.1)
  • gemini-3.1-flash-image (Nano Banana 2)
  • gemini-3.1-flash-lite-image (Nano Banana 2 Lite)
  • gemini-3-pro-image (Nano Banana Pro)

Mô hình gemini-3.1-pro-preview cũng như các mô hình Gemini 2.5 đa năng và tạo hình ảnh (đã ngừng hoạt động) cũng hỗ trợ tính năng này.



Định cấu hình chế độ cài đặt an toàn trong ứng dụng

Nhấp vào nhà cung cấp Gemini API của bạn để xem nội dung và mã dành riêng cho nhà cung cấp trên trang này.

Bạn định cấu hình chế độ cài đặt an toàn trong quá trình khởi chạy một thực thể GenerativeModel. Cấu hình được duy trì trong suốt thời gian hoạt động của thực thể mô hình đó.

Tìm hiểu về các danh mục gây hại hiện có và ngưỡng mà bạn có thể đặt cho từng danh mục ở phần sau của trang này.

Swift

Định cấu hình SafetySetting khi tạo một thực thể GenerativeModel:


import FirebaseAILogic

let safetySettings = [
  SafetySetting(harmCategory: .harassment, threshold: .blockOnlyHigh),
  SafetySetting(harmCategory: .hateSpeech, threshold: .blockMediumAndAbove)
]

// Specify the safety settings as part of creating the `GenerativeModel` instance.
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
  modelName: "GEMINI_MODEL_NAME",
  safetySettings: safetySettings
)

// ...

Kotlin

Định cấu hình SafetySetting khi tạo một thực thể GenerativeModel:


// ...

val safetySettings = listOf(
    SafetySetting(HarmCategory.HARASSMENT, HarmBlockThreshold.ONLY_HIGH),
    SafetySetting(HarmCategory.HATE_SPEECH, HarmBlockThreshold.MEDIUM_AND_ABOVE)
)

// Specify the safety settings as part of creating the `GenerativeModel` instance.
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
    modelName = "GEMINI_MODEL_NAME",
    safetySettings = safetySettings
)

// ...

Java

Định cấu hình SafetySetting khi tạo một thực thể GenerativeModel:


// ...

List safetySettings = List.of(
    new SafetySetting(HarmCategory.HARASSMENT, HarmBlockThreshold.ONLY_HIGH),
    new SafetySetting(HarmCategory.HATE_SPEECH, HarmBlockThreshold.MEDIUM_AND_ABOVE)
);

// Specify the safety settings as part of creating the `GenerativeModel` instance.
GenerativeModelFutures model = GenerativeModelFutures.from(
    FirebaseAI.getInstance(GenerativeBackend.googleAI())
        .generativeModel(
            /* modelName */ "GEMINI_MODEL_NAME",
            /* generationConfig is optional */ null,
            safetySettings
        )
);

// ...

Web

Định cấu hình SafetySetting khi tạo một thực thể GenerativeModel:


import { HarmBlockThreshold, HarmCategory, getAI, getGenerativeModel, GoogleAIBackend } from "firebase/ai";

// ...

const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

const safetySettings = [
  {
    category: HarmCategory.HARM_CATEGORY_HARASSMENT,
    threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
  },
  {
    category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
    threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
  },
];

// Specify the safety settings as part of creating the `GenerativeModel` instance.
const model = getGenerativeModel(ai, {
  model: "GEMINI_MODEL_NAME",
  safetySettings,
});

// ...

Dart

Định cấu hình SafetySetting khi tạo một thực thể GenerativeModel:


import 'package:firebase_ai/firebase_ai.dart';

final safetySettings = [
  SafetySetting(HarmCategory.harassment, HarmBlockThreshold.high),
  SafetySetting(HarmCategory.hateSpeech, HarmBlockThreshold.medium),
];

// Specify the safety settings as part of creating the `GenerativeModel` instance.
final model = FirebaseAI.googleAI().generativeModel(
  model: 'GEMINI_MODEL_NAME',
  safetySettings: safetySettings,
);

// ...

Unity

Định cấu hình SafetySetting khi tạo một thực thể GenerativeModel:


// ...

var safetySettings = new SafetySetting[] {
  new SafetySetting(HarmCategory.Harassment, SafetySetting.HarmBlockThreshold.OnlyHigh),
  new SafetySetting(HarmCategory.HateSpeech, SafetySetting.HarmBlockThreshold.MediumAndAbove)
};

// Specify the safety settings as part of creating the `GenerativeModel` instance.
var ai = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());
var model = ai.GetGenerativeModel(
  modelName: "GEMINI_MODEL_NAME",
  safetySettings: safetySettings
);

// ...



Các danh mục gây hại hiện có

Bộ lọc an toàn đánh giá câu lệnh và phản hồi của mô hình dựa trên các danh mục gây hại có thể định cấu hình sau đây:

Danh mục gây hại Mô tả
HARM_CATEGORY_HARASSMENT Bình luận tiêu cực, đe doạ, hăm doạ, bắt nạt hoặc lăng mạ nhắm đến một cá nhân hoặc danh tính.
HARM_CATEGORY_HATE_SPEECH Nội dung công kích, hạ thấp, kích động thù địch hoặc kích động bạo lực chống lại các cá nhân hoặc nhóm người dựa trên các đặc điểm được bảo vệ (chẳng hạn như chủng tộc, nguồn gốc dân tộc, tôn giáo, tình trạng khuyết tật, độ tuổi, quốc tịch, thân thế cựu chiến binh, khuynh hướng tính dục hoặc bản dạng giới).
HARM_CATEGORY_SEXUALLY_EXPLICIT Chứa nội dung đề cập đến hành vi tình dục, nội dung khiêu dâm hoặc nội dung dâm ô và gợi dục khác.
HARM_CATEGORY_DANGEROUS_CONTENT Cổ xuý, tạo điều kiện, khuyến khích hoặc hướng dẫn thực hiện các hành vi gây hại, hàng hoá và dịch vụ bất hợp pháp, vũ khí, hành vi tự huỷ hoại bản thân hoặc các hoạt động nguy hiểm.
HARM_CATEGORY_CIVIC_INTEGRITY Nội dung có thể được dùng để gây hiểu lầm cho cử tri hoặc phá hoại các quy trình dân sự và bầu cử. (Được hỗ trợ trên một số kiểu máy và ở một số khu vực).

Bộ lọc an toàn không thể tuỳ chỉnh

Ngoài các danh mục có thể định cấu hình, tất cả yêu cầu đều phải vượt qua các bộ lọc cấp hệ thống không thể điều chỉnh:

  • Nội dung xâm hại tình dục trẻ em (CSAM) / Nội dung bị cấm: Câu lệnh hoặc câu trả lời bị gắn cờ là nội dung bị cấm sẽ bị chặn ngay lập tức (PROHIBITED_CONTENT).

  • Thông tin nhạy cảm có thể nhận dạng cá nhân (SPII): Những câu trả lời có nguy cơ làm lộ dữ liệu cá nhân nhạy cảm (chẳng hạn như số tài khoản tài chính hoặc số căn cước quốc gia) sẽ bị chặn (SPII).



Đặt ngưỡng

Đối với mỗi danh mục gây hại mà bạn muốn kiểm soát trong ứng dụng, bạn cần đặt một ngưỡng. Nếu nội dung được đánh giá đạt hoặc vượt ngưỡng đó, thì nội dung đó sẽ bị chặn.

Cách hoạt động của quy trình đánh giá mức độ an toàn: Xác suất so với mức độ nghiêm trọng

Bộ lọc an toàn đánh giá nội dung theo hai khía cạnh riêng biệt:

  • Xác suất: Mức độ tin tưởng của mô hình rằng nội dung thuộc một danh mục gây hại nhất định.

  • Mức độ nghiêm trọng: Mức độ hoặc phạm vi gây hại tiềm ẩn nếu nội dung đó gây hại.

Mỗi phương diện được chỉ định một trong các cấp sau: NEGLIGIBLE, LOW, MEDIUM hoặc HIGH.

Nội dung có thể có xác suất cao nhưng mức độ nghiêm trọng thấp (ví dụ: lời nói đùa nhẹ nhàng hoặc lời lăng mạ thân thiện) hoặc xác suất thấp nhưng mức độ nghiêm trọng cao (ví dụ: cuộc thảo luận về y tế hoặc lịch sử có đề cập đến bạo lực).

Các ngưỡng chặn nội dung gây hại hiện có

Bạn có thể đặt bất kỳ ngưỡng nào sau đây cho các danh mục gây hại mà bạn muốn kiểm soát trong ứng dụng của mình:

Ngưỡng Mô tả Các cấp độ được cho phép
BLOCK_LOW_AND_ABOVE Hạn chế nhất.
Chặn nội dung khi xác suất (hoặc mức độ nghiêm trọng) là LOW, MEDIUM hoặc HIGH.
Chỉ cho phép NEGLIGIBLE
BLOCK_MEDIUM_AND_ABOVE Hạn chế ở mức trung bình.
Chặn nội dung khi xác suất (hoặc mức độ nghiêm trọng) là MEDIUM hoặc HIGH.
Cho phép NEGLIGIBLE và LOW
BLOCK_ONLY_HIGH Bộ lọc đang hoạt động ít hạn chế nhất.
Chỉ chặn nội dung khi xác suất (hoặc mức độ nghiêm trọng) là HIGH.
Cho phép NEGLIGIBLE, LOW và MEDIUM
BLOCK_NONE Tính năng tự động chặn phản hồi bị tắt cho danh mục này. Siêu dữ liệu về điểm xếp hạng an toàn vẫn được tính toán và trả về cùng với phản hồi để ứng dụng của bạn có thể thực hiện quy trình kiểm duyệt tuỳ chỉnh. Cho phép tất cả nội dung
OFF Tắt hoàn toàn bộ lọc an toàn cho danh mục này. Không có hoạt động chặn tự động nào xảy ra và không có siêu dữ liệu về mức độ an toàn nào được trả về. Cho phép tất cả nội dung



Kiểm tra mức phân loại an toàn và xử lý nội dung bị chặn

Nội dung có thể bị chặn ở hai giai đoạn trong một yêu cầu:

  1. Câu lệnh bị chặn (PromptFeedback): Câu lệnh đầu vào vi phạm bộ lọc an toàn trước khi mô hình tạo ra kết quả. Không có câu trả lời nào được trả về.

  2. Đã chặn câu trả lời đề xuất (finishReason == SAFETY): Mô hình đã đánh giá hoặc tạo một câu trả lời đề xuất vượt quá ngưỡng bạn đã định cấu hình. Văn bản đề xuất được tạo sẽ bị xoá hoặc loại bỏ.

Đối tượng SafetyRating

Mỗi câu lệnh hoặc câu trả lời được đánh giá đều chứa một mảng các đối tượng SafetyRating. Mỗi mức phân loại cung cấp những thông tin sau:

  • Các thuộc tính có sẵn cho cả Gemini Developer API và Agent Platform Gemini API (formerly Vertex AI):

    • category: HarmCategory được đánh giá.

    • probability: Điểm xếp hạng riêng biệt (NEGLIGIBLE, LOW, MEDIUM hoặc HIGH).

    • blocked: true nếu mức phân loại cụ thể này khiến nội dung bị chặn.

  • Các thuộc tính khác có trong Agent Platform Gemini API (formerly Vertex AI):

    • probabilityScore: Điểm tin cậy dấu phẩy động từ 0.0 đến 1.0.

    • severity: Mức độ nghiêm trọng riêng biệt (NEGLIGIBLE, LOW, MEDIUM hoặc HIGH).

    • severityScore: Điểm mức độ nghiêm trọng có dấu phẩy động từ 0.0 đến 1.0.

Ví dụ về đối tượng SafetyRating

Ví dụ sau đây minh hoạ tải trọng phản hồi JSON thô khi một đề xuất bị bộ lọc an toàn chặn:

{
  "candidates": [
    {
      "finishReason": "SAFETY",
      "safetyRatings": [
        {
          "category": "HARM_CATEGORY_HARASSMENT",
          "probability": "NEGLIGIBLE",
          "blocked": false
        },
        {
          "category": "HARM_CATEGORY_HATE_SPEECH",
          "probability": "NEGLIGIBLE",
          "blocked": false
        },
        {
          "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
          "probability": "NEGLIGIBLE",
          "blocked": false
        },
        {
          "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
          "probability": "HIGH",
          "blocked": true
        }
      ]
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 24,
    "totalTokenCount": 24
  }
}

Phát hiện lỗi an toàn trong mã

Khi nội dung bị chặn, SDK ứng dụng sẽ hiển thị lệnh chặn dưới dạng một ngoại lệ hoặc mã lỗi để ứng dụng của bạn có thể xử lý một cách linh hoạt.

Swift

Bạn có thể bắt GenerateContentError.promptBlocked hoặc GenerateContentError.responseStoppedEarly:

do {
  let response = try await model.generateContent("Your prompt here")
  print(response.text ?? "No text generated.")
} catch GenerateContentError.promptBlocked(let response) {
  // The input prompt was blocked
  if let feedback = response.promptFeedback {
    let reason = feedback.blockReason?.rawValue ?? "unknown"
    print("Prompt blocked for reason: \(reason)")
    for rating in feedback.safetyRatings {
      let cat = rating.category.rawValue
      let prob = rating.probability.rawValue
      print("Category: \(cat), probability: \(prob)")
    }
  }
} catch GenerateContentError.responseStoppedEarly(let reason, let response) {
  // Candidate response was blocked or stopped early
  if reason == .safety {
    print("Response blocked due to safety.")
    if let candidate = response.candidates.first {
      for rating in candidate.safetyRatings where rating.blocked {
        print("Blocked by category: \(rating.category.rawValue)")
      }
    }
  }
} catch {
  print("Unexpected error: \(error)")
}

Kotlin

Bạn có thể bắt PromptBlockedException hoặc kiểm tra candidate.finishReason:

try {
  val response = model.generateContent("Your prompt here")
  val candidate = response.candidates.firstOrNull()

  if (candidate?.finishReason == FinishReason.SAFETY) {
    val blockedRating =
      candidate.safetyRatings.firstOrNull { it.blocked }
    println("Response blocked by category: ${blockedRating?.category}")
  } else {
    println(response.text)
  }
} catch (e: PromptBlockedException) {
  val reason = e.response?.promptFeedback?.blockReason
  println("Prompt was blocked: $reason")
} catch (e: Exception) {
  println("Error generating content: ${e.message}")
}

Java

Bạn có thể bắt PromptBlockedException hoặc kiểm tra candidate.getFinishReason():

try {
  GenerateContentResponse response = model.generateContent("Your prompt here").get();
  Candidate candidate = response.getCandidates().isEmpty() ? null : response.getCandidates().get(0);

  if (candidate != null && candidate.getFinishReason() == FinishReason.SAFETY) {
    SafetyRating blockedRating = null;
    for (SafetyRating rating : candidate.getSafetyRatings()) {
      if (Boolean.TRUE.equals(rating.getBlocked())) {
        blockedRating = rating;
        break;
      }
    }
    System.out.println("Response blocked by category: " +
        (blockedRating != null ? blockedRating.getCategory() : "unknown"));
  } else {
    System.out.println(response.getText());
  }
} catch (ExecutionException e) {
  if (e.getCause() instanceof PromptBlockedException) {
    PromptBlockedException pbe = (PromptBlockedException) e.getCause();
    GenerateContentResponse blockedResponse = pbe.getResponse();
    String reason = (blockedResponse != null && blockedResponse.getPromptFeedback() != null)
        ? String.valueOf(blockedResponse.getPromptFeedback().getBlockReason())
        : "unknown";
    System.out.println("Prompt was blocked: " + reason);
  } else {
    System.out.println("Error generating content: " + e.getMessage());
  }
} catch (InterruptedException e) {
  System.out.println("Generation was interrupted: " + e.getMessage());
}

Web

Bạn có thể kiểm tra promptFeedback và candidate.finishReason:

try {
  const response = await model.generateContent("Your prompt here");

  // Check if the prompt was blocked
  if (response.promptFeedback?.blockReason) {
    console.warn(`Prompt blocked: ${response.promptFeedback.blockReason}`);
    return;
  }

  const candidate = response.candidates?.[0];
  if (candidate?.finishReason === "SAFETY") {
    const blockedRating = candidate.safetyRatings?.find((r) => r.blocked);
    console.warn(`Response blocked by category: ${blockedRating?.category}`);
  } else {
    console.log(response.text);
  }
} catch (error) {
  console.error("Error generating content:", error);
}

Dart

Bạn có thể kiểm tra promptFeedback và candidate.finishReason:

try {
  final response = await model.generateContent([Content.text('Your prompt here')]);

  // Check if the prompt was blocked
  if (response.promptFeedback?.blockReason != null) {
    print('Prompt blocked: ${response.promptFeedback?.blockReason}');
    return;
  }

  final candidate = response.candidates.firstOrNull;
  if (candidate?.finishReason == FinishReason.safety) {
    final blockedRating =
        candidate?.safetyRatings?.where((r) => r.isBlocked == true).firstOrNull;
    print('Response blocked by category: ${blockedRating?.category.name}');
  } else {
    print(response.text);
  }
} catch (e) {
  print('Error generating content: $e');
}

Unity

Bạn có thể kiểm tra PromptFeedback và candidate.FinishReason:

try {
  var response = await model.GenerateContentAsync("Your prompt here");

  // Check if the prompt was blocked
  if (response.PromptFeedback?.BlockReason != null) {
    Debug.LogWarning($"Prompt blocked: {response.PromptFeedback.BlockReason}");
    return;
  }

  var candidate = response.Candidates.FirstOrDefault();
  if (candidate?.FinishReason == FinishReason.Safety) {
    var blockedRating = candidate.SafetyRatings?.FirstOrDefault(r => r.Blocked);
    Debug.LogWarning($"Response blocked by category: {blockedRating?.Category}");
  } else {
    Debug.Log(response.Text);
  }
} catch (Exception ex) {
  Debug.LogError($"Error generating content: {ex.Message}");
}



Các phương pháp hay nhất để thiết kế ứng dụng có trách nhiệm

  • Phòng thủ theo chiều sâu: Bộ lọc an toàn là một biện pháp bảo vệ, không phải là một chỉ dẫn. Kết hợp chế độ cài đặt an toàn với chỉ dẫn rõ ràng cho hệ thống và thiết kế câu lệnh có mục tiêu để định hướng giọng điệu và phạm vi.

  • Phản hồi người dùng một cách khéo léo: Không bao giờ gặp sự cố hoặc hiển thị màn hình trống khi nội dung bị chặn. Phát hiện finishReason == SAFETY hoặc PromptBlockedException và hiển thị một thông báo thân thiện cho người dùng biết rằng yêu cầu không thể được thực hiện theo nguyên tắc về nội dung của bạn.

  • Sử dụng BLOCK_NONE để kiểm duyệt tuỳ chỉnh: Nếu bạn đã có quy trình kiểm duyệt phía máy khách hoặc phía máy chủ, hãy đặt ngưỡng thành BLOCK_NONE để nhận safetyRatings của mô hình mà không cần chặn tự động, cho phép ứng dụng của bạn thực thi các chính sách kiểm duyệt tuỳ chỉnh.

  • Xem lại Điều khoản dịch vụ: Nếu bạn sử dụng các chế độ cài đặt ít hạn chế hơn (BLOCK_ONLY_HIGH hoặc BLOCK_NONE), hãy đảm bảo ứng dụng của bạn tiếp tục tuân thủ Chính sách về các hành vi bị cấm của Google.

Các lựa chọn khác để kiểm soát việc tạo nội dung

  • Tìm hiểu thêm về thiết kế câu lệnh để có thể tác động đến mô hình nhằm tạo ra kết quả cụ thể theo nhu cầu của bạn.
  • Định cấu hình tham số mô hình để kiểm soát cách mô hình tạo phản hồi, chẳng hạn như số mã thông báo đầu ra tối đa, xác suất mã thông báo đầu ra lặp lại, v.v.
  • Đặt chỉ dẫn hệ thống để điều chỉnh hành vi của mô hình. Tính năng này giống như một chỉ dẫn mở đầu mà bạn thêm vào trước khi mô hình nhận được bất kỳ chỉ dẫn nào khác từ người dùng cuối.
  • Truyền giản đồ phản hồi cùng với câu lệnh để chỉ định một giản đồ đầu ra cụ thể. Tính năng này thường được dùng nhất khi tạo kết quả JSON, nhưng cũng có thể dùng cho các nhiệm vụ phân loại (chẳng hạn như khi bạn muốn mô hình sử dụng các nhãn hoặc thẻ cụ thể).