הסבר על הגדרות הבטיחות ואיך משנים אותן

המודלים של 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 מסנן הבטיחות של הקטגוריה הזו מושבת לגמרי. לא מתבצעת חסימה אוטומטית ולא מוחזרים מטא-נתונים של דירוג בטיחות. כל התוכן מותר



איך בודקים את סיווגי הבטיחות ומטפלים בתוכן חסום

אפשר לחסום תוכן בשני שלבים במהלך בקשה:

  1. ‫Prompt blocked (PromptFeedback): הנחיית הקלט הפרה את מסנני הבטיחות לפני שהמודל יצר פלט כלשהו. לא מוחזרות תשובות מועמדות.

  2. 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, אבל אפשר להשתמש בה גם למשימות סיווג (למשל, כשרוצים שהמודל ישתמש בתוויות או בתגים ספציפיים).