تم تصميم نماذج 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 |
يؤدي هذا الخيار إلى إيقاف فلتر الأمان لهذه الفئة تمامًا. لا يتم حظر أي محتوى تلقائيًا ولا يتم عرض أي بيانات وصفية لتقييم الأمان. | كل المحتوى مسموح به |
فحص تقييمات الأمان والتعامل مع المحتوى المحظور
يمكن حظر المحتوى في مرحلتَين أثناء الطلب:
تم حظر الطلب (
PromptFeedback): انتهك الطلب المُدخَل فلاتر الأمان قبل أن ينشئ النموذج أي مخرجات. لا يتم عرض أي ردود مرشحة.تم حظر الردّ المرشَّح (
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: نتيجة ثقة بنقطة عائمة من0.0إلى1.0
severity: مستوى خطورة منفصل (NEGLIGIBLEأوLOWأوMEDIUMأوHIGH)severityScore: درجة خطورة النقطة العائمة من0.0إلى1.0.
مثال على عنصر SafetyRating
يوضّح المثال التالي حمولة استجابة 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، ولكن يمكن استخدامها أيضًا لمهام التصنيف (مثل عندما تريد أن يستخدم النموذج تصنيفات أو علامات معيّنة).