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.
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-argongemini-3.8-flash(oraz starsze modelegemini-3.7-flash,gemini-3.6-flashigemini-3.5-flash)gemini-3.5-flash-lite(oraz starsze wersjegemini-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:
Prompt zablokowany (
PromptFeedback): prompt wejściowy naruszył filtry bezpieczeństwa, zanim model wygenerował jakiekolwiek dane wyjściowe. Nie są zwracane żadne odpowiedzi.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: ocenianyHarmCategory.probability: ocena dyskretna (NEGLIGIBLE,LOW,MEDIUMlubHIGH).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 od0.0do1.0.severity: dyskretny poziom ważności (NEGLIGIBLE,LOW,MEDIUMlubHIGH).severityScore: wynik ważności w reprezentacji zmiennoprzecinkowej od0.0do1.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 == SAFETYlubPromptBlockedExceptioni 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_NONEdo niestandardowego moderowania: jeśli masz już własny potok moderowania po stronie klienta lub po stronie serwera, ustaw progi naBLOCK_NONE, aby otrzymywaćsafetyRatingsmodelu 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_HIGHlubBLOCK_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).