Omówienie i konfigurowanie ustawień bezpieczeństwa

Modele Gemini zostały zaprojektowane z myślą o bezpieczeństwie. Mogą jednak nadal generować szkodliwe odpowiedzi, zwłaszcza gdy zostaną o to wyraźnie poproszone. Aby jeszcze bardziej zwiększyć bezpieczeństwo i zminimalizować ryzyko nadużyć, możesz skonfigurować filtry bezpieczeństwa, które będą blokować potencjalnie szkodliwe odpowiedzi.

Zapewniamy 2 warstwy zabezpieczeń:

  • Wbudowane podstawowe zabezpieczenia:

    • Wszystkie modele Gemini mają wbudowane zabezpieczenia przed poważnymi zagrożeniami (takimi jak wykorzystywanie dzieci, cyberataki i niebezpieczna broń).
    • Te zabezpieczenia są zawsze aktywne, stosowane automatycznie do wszystkich promptów i odpowiedzi oraz nie można ich modyfikować ani wyłączać.
  • Filtry bezpieczeństwa z możliwością konfiguracji:

    • Gemini API udostępnia dodatkowe filtry bezpieczeństwa z możliwością konfiguracji, które możesz zdefiniować za pomocą ustawień bezpieczeństwa w aplikacji.
    • Te ustawienia pozwalają kontrolować próg, przy którym treści są blokowane, w 4 głównych kategoriach szkodliwych treści: nękanie, wypowiedzi szerzące nienawiść, treści o charakterze jednoznacznie seksualnym i treści niebezpieczne.

Przejdź do przykładowego kodu

Ważne pojęcia dotyczące bezpieczeństwa

Podczas pracy z bezpieczeństwem modeli Gemini warto zapoznać się z kilkoma ważnymi pojęciami:

  • Ustawienia bezpieczeństwa: konfiguracja, którą definiujesz w kodzie aplikacji, określająca, które kategorie szkód mają być monitorowane i przy jakim progu treści mają być blokowane.

  • Filtry bezpieczeństwa: klasyfikatory po stronie serwera, które oceniają prompty i odpowiedzi modelu pod kątem wymiarów bezpieczeństwa Google. Filtry blokują treści na podstawie skonfigurowanych ustawień bezpieczeństwa.

  • Oceny bezpieczeństwa: metadane oceny zwracane przez model w obiekcie odpowiedzi. Oceny wskazują prawdopodobieństwo i poważność potencjalnych szkód wykrytych w każdej kategorii.

Obsługiwane modele

  • gemini-4-argon
  • gemini-3.8-flash (oraz starsze modele gemini-3.7-flash, gemini-3.6-flash i gemini-3.5-flash)
  • gemini-3.5-flash-lite (oraz starsze wersje gemini-3.1-flash-lite)
  • 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)

Tę funkcję obsługuje też model gemini-3.1-pro-preview oraz modele ogólnego zastosowania i generujące obrazy Gemini 2.5 (które zostały wycofane).



Konfigurowanie ustawień bezpieczeństwa w aplikacji

Kliknij dostawcę Gemini API, aby wyświetlić na tej stronie treści i kod dotyczące tego dostawcy.

Ustawienia bezpieczeństwa konfigurujesz w ramach inicjowania instancji GenerativeModel. Konfiguracja jest utrzymywana przez cały okres istnienia tej instancji modelu.

Więcej informacji o dostępnych kategoriach szkód i progach, które możesz ustawić dla każdej kategorii, znajdziesz w dalszej części tej strony.

Swift

Podczas tworzenia instancji GenerativeModel skonfiguruj SafetySetting:


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

Podczas tworzenia instancji GenerativeModel skonfiguruj SafetySetting:


// ...

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

Podczas tworzenia instancji GenerativeModel skonfiguruj SafetySetting:


// ...

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

Podczas tworzenia instancji GenerativeModel skonfiguruj SafetySetting:


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

Podczas tworzenia instancji GenerativeModel skonfiguruj SafetySetting:


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

Skonfiguruj SafetySetting podczas tworzenia instancji 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
);

// ...



Dostępne kategorie szkód

Filtry bezpieczeństwa oceniają prompty i odpowiedzi modelu pod kątem tych konfigurowalnych kategorii szkód:

Kategoria szkody Opis
HARM_CATEGORY_HARASSMENT Negatywne, obraźliwe lub szkodliwe komentarze dotyczące innej osoby lub tożsamości oraz komentarze mające na celu jej dręczenie lub zastraszanie.
HARM_CATEGORY_HATE_SPEECH Treści, które atakują, poniżają, promują nienawiść lub nawołują do przemocy wobec osób lub grup ze względu na cechy chronione (takie jak rasa, pochodzenie etniczne, wyznanie, niepełnosprawność, wiek, narodowość, status weterana, orientacja seksualna lub tożsamość płciowa).
HARM_CATEGORY_SEXUALLY_EXPLICIT Treści zawierające odniesienia do aktów seksualnych, pornografii lub innych lubieżnych i erotycznych treści.
HARM_CATEGORY_DANGEROUS_CONTENT promują, ułatwiają, zachęcają do szkodliwych działań, nielegalnych towarów i usług, broni, samookaleczania lub niebezpiecznych działań albo zawierają instrukcje dotyczące tych kwestii;
HARM_CATEGORY_CIVIC_INTEGRITY Treści, które mogą być wykorzystywane do wprowadzania wyborców w błąd lub podważania procesów obywatelskich i wyborczych. (funkcja obsługiwana w przypadku wybranych modeli i regionów).

Filtry bezpieczeństwa bez możliwości konfiguracji

Oprócz kategorii, które można konfigurować, wszystkie żądania przechodzą przez filtry na poziomie systemu, których nie można dostosować:

  • Materiały przedstawiające wykorzystywanie seksualne dzieci (CSAM) / niedozwolone treści: prompty lub odpowiedzi oznaczone jako niedozwolone treści są natychmiast blokowane (PROHIBITED_CONTENT).

  • Informacje poufne umożliwiające identyfikację: odpowiedzi, które mogą ujawnić poufne dane osobowe (takie jak numery rachunków bankowych lub numery dokumentów tożsamości), są blokowane (SPII).



Określ progi

W przypadku każdej kategorii szkód, którą chcesz kontrolować w aplikacji, musisz ustawić próg. Jeśli oceniane treści osiągną lub przekroczą ten próg, zostaną zablokowane.

Jak działa ocena bezpieczeństwa: prawdopodobieństwo a stopień nasilenia

Filtry bezpieczeństwa oceniają treści pod kątem 2 różnych wymiarów:

  • Prawdopodobieństwo: pewność modelu, że treści należą do danej kategorii szkód.

  • Waga: wielkość lub stopień potencjalnej szkody, jeśli treść jest szkodliwa.

Każdemu wymiarowi przypisany jest jeden z tych poziomów: NEGLIGIBLE, LOW, MEDIUM lub HIGH.

Treści mogą mieć wysokie prawdopodobieństwo i niski poziom ważności (np. łagodne komediowe przekomarzanie się lub przyjacielskie obelgi) albo niskie prawdopodobieństwo i wysoki poziom ważności (np. dyskusje medyczne lub historyczne, w których wspomina się o przemocy).

Dostępne progi blokowania szkodliwych treści

Możesz ustawić dowolne z tych progów dla kategorii szkód, które chcesz kontrolować w aplikacji:

Próg Opis Dozwolone poziomy
BLOCK_LOW_AND_ABOVE Najbardziej restrykcyjny.
Blokuje treści, gdy prawdopodobieństwo (lub waga) jest na poziomie LOW, MEDIUM lub HIGH.
Dozwolone są tylko te znaki: NEGLIGIBLE
BLOCK_MEDIUM_AND_ABOVE Umiarkowane ograniczenia.
Blokuje treści, gdy prawdopodobieństwo (lub waga) jest MEDIUM lub HIGH.
Zezwala na NEGLIGIBLE i LOW
BLOCK_ONLY_HIGH Najmniej restrykcyjny aktywny filtr.
Blokuje treści tylko wtedy, gdy prawdopodobieństwo (lub waga) wynosi HIGH.
Zezwala na NEGLIGIBLE, LOW i MEDIUM
BLOCK_NONE Automatyczne blokowanie odpowiedzi jest wyłączone w tej kategorii. Metadane ocen bezpieczeństwa są nadal obliczane i zwracane wraz z odpowiedzią, dzięki czemu aplikacja może przeprowadzać niestandardową moderację. Wszystkie treści są dozwolone
OFF Całkowicie wyłącza filtr bezpieczeństwa dla tej kategorii. Nie następuje automatyczne blokowanie i nie są zwracane żadne metadane oceny bezpieczeństwa. Wszystkie treści są dozwolone



Sprawdzanie ocen bezpieczeństwa i obsługa zablokowanych treści

Treści mogą być blokowane na 2 etapach żądania:

  1. Prompt zablokowany (PromptFeedback): prompt wejściowy naruszył filtry bezpieczeństwa, zanim model wygenerował jakiekolwiek dane wyjściowe. Nie są zwracane żadne odpowiedzi.

  2. Odpowiedź kandydująca została zablokowana (finishReason == SAFETY): model ocenił lub wygenerował odpowiedź kandydującą, która przekroczyła skonfigurowany próg. Wygenerowany tekst kandydata został usunięty lub zredagowany.

Obiekt SafetyRating

Każdy oceniany prompt lub odpowiedź zawiera tablicę obiektów SafetyRating. Każda ocena zawiera te informacje:

  • Właściwości dostępne zarówno w Gemini Developer API, jak i Agent Platform Gemini API (formerly Vertex AI):

    • category: oceniany HarmCategory.

    • probability: ocena dyskretna (NEGLIGIBLE, LOW, MEDIUM lub HIGH).

    • blocked: true, jeśli ta konkretna ocena spowodowała zablokowanie treści.

  • Dodatkowe właściwości dostępne w przypadku Agent Platform Gemini API (formerly Vertex AI):

    • probabilityScore: wynik ufności w postaci liczby zmiennoprzecinkowej od 0.0 do 1.0.

    • severity: dyskretny poziom ważności (NEGLIGIBLE, LOW, MEDIUM lub HIGH).

    • severityScore: wynik ważności w reprezentacji zmiennoprzecinkowej od 0.0 do 1.0.

Przykładowy obiekt SafetyRating

Poniższy przykład ilustruje nieprzetworzony ładunek odpowiedzi JSON, gdy kandydat jest blokowany przez filtry bezpieczeństwa:

{
  "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
  }
}

Wykrywanie błędów związanych z bezpieczeństwem w kodzie

Gdy treści są blokowane, pakiety SDK klienta wyświetlają blokadę jako wyjątek lub kod błędu, dzięki czemu aplikacja może ją odpowiednio obsłużyć.

Swift

Możesz złapać GenerateContentError.promptBlocked lub 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

Możesz przechwycić PromptBlockedException lub sprawdzić 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

Możesz przechwycić PromptBlockedException lub sprawdzić 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

Możesz sprawdzić promptFeedback i 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

Możesz sprawdzić promptFeedback i 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

Możesz sprawdzić PromptFeedback i 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}");
}



Sprawdzone metody odpowiedzialnego projektowania aplikacji

  • Dogłębna obrona: filtry bezpieczeństwa są zabezpieczeniem, a nie instrukcją. Połącz ustawienia bezpieczeństwa z wyraźnymi instrukcjami systemowymi i ukierunkowanym projektowaniem promptów, aby określić ton i zakres.

  • Odpowiednie powiadomienia dla użytkowników: gdy treści są zablokowane, nie dopuszczaj do awarii aplikacji ani nie wyświetlaj pustego ekranu. Wykrywaj finishReason == SAFETY lub PromptBlockedException i wyświetlaj przyjazny komunikat informujący użytkownika, że nie można spełnić żądania ze względu na wskazówki dotyczące treści.

  • Używanie BLOCK_NONE do niestandardowego moderowania: jeśli masz już własny potok moderowania po stronie klienta lub po stronie serwera, ustaw progi na BLOCK_NONE, aby otrzymywać safetyRatings modelu bez automatycznego blokowania, co pozwoli aplikacji na egzekwowanie niestandardowych zasad moderowania.

  • Zapoznaj się z Warunkami korzystania z usługi: jeśli używasz mniej restrykcyjnych ustawień (BLOCK_ONLY_HIGH lub BLOCK_NONE), upewnij się, że Twoja aplikacja nadal jest zgodna z zasadami Google dotyczącymi niedozwolonych zastosowań.

Inne opcje kontrolowania generowania treści

  • Dowiedz się więcej o projektowaniu promptów, aby móc wpływać na model i generować wyniki dostosowane do Twoich potrzeb.
  • Skonfiguruj parametry modelu, aby kontrolować sposób generowania odpowiedzi przez model, np. maksymalną liczbę tokenów wyjściowych, prawdopodobieństwo powtarzania tokenów wyjściowych itp.
  • Ustaw instrukcje systemowe, aby sterować zachowaniem modelu. Ta funkcja działa jak wprowadzenie, które dodajesz, zanim model otrzyma dalsze instrukcje od użytkownika.
  • Przekaż schemat odpowiedzi wraz z promptem, aby określić konkretny schemat wyjściowy. Ta funkcja jest najczęściej używana podczas generowania danych wyjściowych w formacie JSON, ale można jej też używać do zadań klasyfikacji (np. gdy chcesz, aby model używał określonych etykiet lub tagów).