המודלים של Gemini מתוכננים לתת עדיפות לבטיחות. עם זאת, הם עדיין יכולים ליצור תשובות מזיקות, במיוחד אם ההנחיה שניתנה להם היא מפורשת. כדי לשפר את הבטיחות ולצמצם את הסיכוי לשימוש לרעה, אתם יכולים להגדיר מסנני בטיחות שיחסמו תשובות שעלולות להיות מזיקות.
יש שתי שכבות של אמצעי הגנה:
אמצעי הגנה מובנים:
- כל המודלים של Gemini כוללים אמצעי הגנה מובנים מפני פגיעות חמורות (כמו ניצול ילדים, התקפות סייבר ונשק מסוכן).
- אמצעי ההגנה האלה תמיד פעילים, מיושמים באופן אוטומטי על כל ההנחיות והתשובות, ואי אפשר לשנות או להשבית אותם.
מסנני בטיחות שניתנים להגדרה:
- Gemini API מספק מסנני בטיחות נוספים שניתנים להגדרה, שאותם אתם מגדירים באמצעות הגדרות הבטיחות באפליקציה.
- ההגדרות האלה מאפשרות לכם לקבוע את סף החסימה של תוכן בארבע קטגוריות עיקריות של פגיעה: הטרדה, דברי שטנה, תוכן מיני בוטה ותוכן מסוכן.
מושגי בטיחות חשובים
כשעובדים עם בטיחות במודלים של Gemini, חשוב להבין כמה מושגים:
הגדרות בטיחות: ההגדרות שאתם קובעים בקוד של האפליקציה, שמציינות אילו קטגוריות של פגיעה צריך לנטר ובאיזה סף צריך לחסום תוכן.
מסנני בטיחות: מסווגים בצד השרת שמעריכים הנחיות ותשובות של המודל בהתאם למאפייני הבטיחות של Google. המסננים חוסמים תוכן בהתאם להגדרות הבטיחות שקבעתם.
דירוגי בטיחות: המטא-נתונים של ההערכה שהמודל מחזיר באובייקט התגובה. הדירוגים מציינים את הסבירות והחומרה של הנזק הפוטנציאלי שזוהה בכל קטגוריית נזק.
מודלים נתמכים
gemini-4-argon-
gemini-3.8-flash(והגרסאות הישנות יותרgemini-3.7-flash,gemini-3.6-flashו-gemini-3.5-flash) -
gemini-3.5-flash-lite(והגרסה הישנה יותר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)
היכולת הזו נתמכת גם במודל gemini-3.1-pro-preview ובמודלים Gemini 2.5 לשימוש כללי וליצירת תמונות (שהם מודלים שהוצאו משימוש).
קביעת הגדרות הבטיחות באפליקציה
|
כדי לראות תוכן וקוד שספציפיים לספק, לוחצים על הספק Gemini API בדף הזה. |
אתם יכולים לקבוע את הגדרות הבטיחות כשאתם מאתחלים מכונה של GenerativeModel. ההגדרות נשמרות כל עוד המופע של המודל קיים.
בהמשך הדף מפורט מידע על קטגוריות הפגיעה הזמינות ועל ערכי הסף שאפשר להגדיר לכל קטגוריה.
Swift
מגדירים את SafetySetting כשיוצרים מכונה של 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
מגדירים את SafetySetting כשיוצרים מכונה של 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
מגדירים את SafetySetting כשיוצרים מכונה של 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
מגדירים את SafetySetting כשיוצרים מכונה של 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
מגדירים את SafetySetting כשיוצרים מכונה של 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
מגדירים את SafetySetting כשיוצרים מכונה של 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
);
// ...
קטגוריות זמינות של פגיעה
מסנני הבטיחות בודקים את ההנחיות ואת התשובות של המודל לפי קטגוריות הפגיעה הבאות, שאפשר להגדיר:
| קטגוריית הנזק | תיאור |
|---|---|
HARM_CATEGORY_HARASSMENT |
תגובות שליליות, מאיימות, מפחידות, פוגעניות או בריוניות שמכוונות כלפי אדם או זהות. |
HARM_CATEGORY_HATE_SPEECH |
תוכן שתוקף, משפיל, מקדם שנאה או מסית לאלימות נגד אנשים פרטיים או קבוצות על סמך מאפיינים מוגנים (כמו גזע, מוצא אתני, דת, מוגבלות, גיל, לאום, רקע צבאי, נטייה מינית או זהות מגדרית). |
HARM_CATEGORY_SEXUALLY_EXPLICIT |
מכיל אזכורים של מעשים מיניים, פורנוגרפיה או תוכן ארוטי וגס אחר. |
HARM_CATEGORY_DANGEROUS_CONTENT |
מקדם, מאפשר, מעודד או מספק הוראות לביצוע פעולות מזיקות, שירותים ומוצרים לא חוקיים, נשק, פגיעה עצמית או פעילויות מסוכנות. |
HARM_CATEGORY_CIVIC_INTEGRITY |
תוכן שעלול להטעות מצביעים או לפגוע בתהליכים אזרחיים ובתהליכי בחירות. (התכונה נתמכת בדגמים ובאזורים נבחרים). |
מסנני בטיחות שלא ניתנים להגדרה
בנוסף לקטגוריות שאפשר להגדיר, כל הבקשות עוברות דרך מסננים ברמת המערכת שאי אפשר לשנות:
תוכן ויזואלי של התעללות מינית בילדים (CSAM) או תוכן אסור: הנחיות או תשובות שסומנו כמכילות תוכן אסור נחסמות באופן מיידי (
PROHIBITED_CONTENT).פרטים אישיים מזהים בעלי רגישות גבוהה (SPII): תשובות שעלולות לחשוף מידע אישי רגיש (כמו מספרי חשבונות בנק או מספרי תעודות זהות) נחסמות (
SPII).
הגדרת ערכי סף
לכל קטגוריית פגיעה שרוצים לשלוט בה באפליקציה, צריך להגדיר סף. אם התוכן שנבדק מגיע לסף הזה או חורג ממנו, התוכן נחסם.
איך פועלת הערכת הבטיחות: סבירות לעומת חומרה
מסנני הבטיחות בודקים את התוכן בשני מימדים נפרדים:
הסתברות: רמת הסמך של המודל שהתוכן שייך לקטגוריית פגיעה מסוימת.
חומרה: מידת הנזק הפוטנציאלי שהתוכן עלול לגרום.
לכל מאפיין מוקצית אחת מהרמות הבאות:
NEGLIGIBLE, LOW, MEDIUM או HIGH.
לתוכן יכולה להיות סבירות גבוהה עם רמת חומרה נמוכה (לדוגמה, התלוצצות קומית קלה או עלבונות ידידותיים) או סבירות נמוכה עם רמת חומרה גבוהה (לדוגמה, דיונים רפואיים או היסטוריים שמוזכרת בהם אלימות).
רמות זמינות של סף חסימת פגיעה
אתם יכולים להגדיר את הספים הבאים לקטגוריות הפגיעה שאתם רוצים לשלוט בהן באפליקציה:
| סף | תיאור | רמות מותרות |
|---|---|---|
BLOCK_LOW_AND_ABOVE |
הכי מגביל. התוכן נחסם כשהסבירות (או החומרה) היא LOW, MEDIUM או HIGH.
|
מאפשר רק
NEGLIGIBLE
|
BLOCK_MEDIUM_AND_ABOVE |
הגבלה מתונה. חסימת תוכן כשהסבירות (או החומרה) היא MEDIUM או HIGH.
|
מאפשרת
NEGLIGIBLE ו-LOW |
BLOCK_ONLY_HIGH |
המסנן הפעיל הכי פחות מגביל. חסימת תוכן רק כשהסבירות (או החומרה) היא HIGH.
|
מאפשרת
NEGLIGIBLE, LOW ו-MEDIUM
|
BLOCK_NONE |
החסימה האוטומטית של התגובות מושבתת בקטגוריה הזו. המטא-נתונים של דירוגי הבטיחות עדיין מחושבים ומוחזרים עם התשובה, כדי שהאפליקציה תוכל לבצע ניהול תוכן בהתאמה אישית. | כל התוכן מותר |
OFF |
מסנן הבטיחות של הקטגוריה הזו מושבת לגמרי. לא מתבצעת חסימה אוטומטית ולא מוחזרים מטא-נתונים של דירוג בטיחות. | כל התוכן מותר |
איך בודקים את סיווגי הבטיחות ומטפלים בתוכן חסום
אפשר לחסום תוכן בשני שלבים במהלך בקשה:
Prompt blocked (
PromptFeedback): הנחיית הקלט הפרה את מסנני הבטיחות לפני שהמודל יצר פלט כלשהו. לא מוחזרות תשובות מועמדות.Response candidate blocked (
finishReason == SAFETY): המודל העריך או יצר תשובה אפשרית שחרגה מהסף שהגדרתם. הטקסט שנוצר נמחק או מצונזר.
האובייקט SafetyRating
כל הנחיה או מועמד לתשובה שנבדקים מכילים מערך של אובייקטים מסוג SafetyRating. כל דירוג כולל את הפרטים הבאים:
מאפיינים שזמינים גם ב-Gemini Developer API וגם ב-Agent Platform Gemini API (formerly Vertex AI):
category: הערך שלHarmCategory.
probability: דירוג נפרד (NEGLIGIBLE,LOW,MEDIUMאוHIGH).
blocked: הערךtrueאם הסיווג הספציפי הזה גרם לחסימת התוכן.
מאפיינים נוספים שזמינים ב-Agent Platform Gemini API (formerly Vertex AI):
probabilityScore: ציון מהימנות בנקודה צפה (floating-point) מ-0.0עד1.0.
severity: רמת חומרה נפרדת (NEGLIGIBLE,LOW,MEDIUMאוHIGH).
severityScore: ציון חומרה בנקודה צפה (floating-point) מ-0.0עד1.0.
דוגמה לאובייקט SafetyRating
הדוגמה הבאה ממחישה את המטען הייעודי (payload) של תגובת ה-JSON הגולמית כשמסנני הבטיחות חוסמים מועמד:
{
"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
}
}
זיהוי שגיאות בטיחות בקוד
כשהתוכן נחסם, ערכות ה-SDK של הלקוח מציגות את החסימה כחריגה או כקוד שגיאה, כדי שהאפליקציה תוכל לטפל בה בצורה חלקה.
Swift
אפשר לתפוס את GenerateContentError.promptBlocked או את 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
אפשר לתפוס את PromptBlockedException או לבדוק את 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
אפשר לתפוס את PromptBlockedException או לבדוק את 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
אתם יכולים לבדוק את promptFeedback ואת 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
אתם יכולים לבדוק את promptFeedback ואת 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
אתם יכולים לבדוק את PromptFeedback ואת 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}");
}
שיטות מומלצות לעיצוב אפליקציות בצורה אחראית
הגנה לעומק: מסנני בטיחות הם אמצעי הגנה, לא הוראה. כדי להנחות את הטון וההיקף, שלבו את הגדרות הבטיחות עם הוראות מערכת מפורשות ועיצוב הנחיות ממוקד.
משוב משתמשים אלגנטי: אל תגרמו לקריסה או להצגת מסך ריק כשהתוכן חסום. מזהים את
finishReason == SAFETYאו אתPromptBlockedExceptionומציגים הודעה ידידותית למשתמש, שמסבירה שאי אפשר למלא את הבקשה בהתאם להנחיות בנושא תוכן.שימוש ב-
BLOCK_NONEלניהול תגובות בהתאמה אישית: אם כבר יש לכם תהליך משלכם לניהול תגובות בצד הלקוח או בצד השרת, הגדירו את ערכי הסף ל-BLOCK_NONEכדי לקבל את ה-safetyRatingsשל המודל בלי חסימה אוטומטית, וכך לאפשר לאפליקציה לאכוף כללי מדיניות מותאמים אישית לניהול תגובות.עיון בתנאים ובהגבלות: אם אתם משתמשים בהגדרות פחות מגבילות (
BLOCK_ONLY_HIGHאוBLOCK_NONE), ודאו שהאפליקציה שלכם ממשיכה לעמוד בדרישות של המדיניות בנושא שימוש אסור של Google.
אפשרויות אחרות לשליטה ביצירת תוכן
- מידע נוסף על עיצוב הנחיות כדי להשפיע על המודל ליצור פלט שמתאים לצרכים הספציפיים שלכם.
- להגדיר פרמטרים של המודל כדי לקבוע איך המודל ייצור תשובה, למשל מספר הטוקנים המקסימלי בפלט, הסבירות של טוקנים חוזרים בפלט וכו'.
- להגדיר הוראות מערכת כדי לכוון את ההתנהגות של המודל. התכונה הזו היא כמו הוראות מקדימות שמוסיפים לפני שהמודל נחשף להוראות נוספות ממשתמש הקצה.
- מעבירים סכֵימת תשובה יחד עם ההנחיה כדי לציין סכֵימת פלט ספציפית. התכונה הזו משמשת בעיקר כשרוצים ליצור פלט בפורמט JSON, אבל אפשר להשתמש בה גם למשימות סיווג (למשל, כשרוצים שהמודל ישתמש בתוויות או בתגים ספציפיים).