تعمق في مصنفات السلامة

معايير ومقارنة المصنفات

3 دقيقة للقراءة

اختيار مصنف السلامة المناسب يتطلب فهم مقايضات الأداء في العالم الحقيقي. يوفر هذا الدرس مقارنات معيارية لتوجيه قرارات الإنتاج.

نظرة عامة على المعايير

المصنف درجة F1 الدقة الاستدعاء التأخير (GPU) الذاكرة
LlamaGuard 3 1B 0.81 0.79 0.83 50-100 مللي ثانية 2GB
LlamaGuard 3 8B 0.87 0.86 0.88 200-400 مللي ثانية 16GB
ShieldGemma 2B 0.81 0.82 0.80 30-60 مللي ثانية 4GB
ShieldGemma 9B 0.84 0.85 0.83 80-150 مللي ثانية 18GB
ShieldGemma 27B 0.88 0.89 0.87 200-400 مللي ثانية 54GB
toxic-bert 0.85 0.83 0.87 15-30 مللي ثانية 0.4GB
Detoxify (original) 0.89 0.87 0.91 100-200 مللي ثانية 1.3GB

المصدر: المعايير مستمدة من إصدارات النماذج الرسمية وتقييمات المجتمع (2024-2025).

الأداء حسب فئة الضرر

تتفوق المصنفات المختلفة في أنواع ضرر مختلفة:

CATEGORY_PERFORMANCE = {
    "hate_speech": {
        "best": "ShieldGemma 27B",
        "runner_up": "LlamaGuard 3 8B",
        "notes": "ShieldGemma مدرب على بيانات خطاب كراهية أوسع"
    },
    "violence": {
        "best": "LlamaGuard 3 8B",
        "runner_up": "ShieldGemma 27B",
        "notes": "LlamaGuard لديه فئات عنف دقيقة"
    },
    "sexual_content": {
        "best": "LlamaGuard 3 8B",
        "runner_up": "ShieldGemma 9B",
        "notes": "LlamaGuard يميز بين الصريح والموحي"
    },
    "self_harm": {
        "best": "Detoxify",
        "runner_up": "LlamaGuard 3 8B",
        "notes": "Detoxify مدرب على بيانات منع الانتحار"
    },
    "prompt_injection": {
        "best": "مصنف مخصص",
        "runner_up": "LlamaGuard 3 8B",
        "notes": "المصنفات العامة تفوت الهجمات المشفرة"
    }
}

مقايضة التأخير مقابل الدقة

import matplotlib.pyplot as plt

def plot_tradeoff():
    """تصور مقايضة التأخير مقابل الدقة."""
    classifiers = [
        ("toxic-bert", 22, 0.85),
        ("ShieldGemma 2B", 45, 0.81),
        ("LlamaGuard 3 1B", 75, 0.81),
        ("ShieldGemma 9B", 115, 0.84),
        ("Detoxify", 150, 0.89),
        ("LlamaGuard 3 8B", 300, 0.87),
        ("ShieldGemma 27B", 300, 0.88),
    ]

    names, latencies, accuracies = zip(*classifiers)

    plt.figure(figsize=(10, 6))
    plt.scatter(latencies, accuracies, s=100)

    for name, lat, acc in classifiers:
        plt.annotate(name, (lat, acc), textcoords="offset points",
                     xytext=(5, 5), fontsize=9)

    plt.xlabel("التأخير (مللي ثانية)")
    plt.ylabel("درجة F1")
    plt.title("مقايضات مصنفات السلامة")
    plt.grid(True, alpha=0.3)

    # تمييز المنطقة المثلى
    plt.axhline(y=0.85, color='g', linestyle='--', alpha=0.5, label='دقة جيدة')
    plt.axvline(x=100, color='r', linestyle='--', alpha=0.5, label='عتبة السرعة')

    plt.legend()
    return plt

استراتيجية التصنيف المتدرج

بناءً على المعايير، نفذ نهجاً متدرجاً:

from enum import Enum
from dataclasses import dataclass
from typing import Optional
import time

class ClassifierTier(Enum):
    FAST = "fast"        # < 50 مللي ثانية
    BALANCED = "balanced" # 50-200 مللي ثانية
    THOROUGH = "thorough" # > 200 مللي ثانية

@dataclass
class TieredResult:
    decision: str
    confidence: float
    tier_used: ClassifierTier
    latency_ms: float
    escalated: bool = False

class TieredClassifier:
    """نظام تصنيف متدرج للإنتاج."""

    def __init__(self):
        # تحميل كسول لكفاءة الذاكرة
        self._fast = None
        self._balanced = None
        self._thorough = None

    @property
    def fast(self):
        if self._fast is None:
            from transformers import pipeline
            self._fast = pipeline(
                "text-classification",
                model="martin-ha/toxic-comment-model"
            )
        return self._fast

    @property
    def balanced(self):
        if self._balanced is None:
            self._balanced = ShieldGemmaClassifier(model_size="9b")
        return self._balanced

    @property
    def thorough(self):
        if self._thorough is None:
            self._thorough = LlamaGuard3Classifier(model_size="8B")
        return self._thorough

    def classify(
        self,
        content: str,
        confidence_threshold: float = 0.85
    ) -> TieredResult:
        """
        التصنيف مع تصعيد المستوى التلقائي.

        الاستراتيجية:
        1. المستوى السريع أولاً (toxic-bert)
        2. إذا كان غير مؤكد (0.15 < score < 0.85)، تصعيد للمتوازن
        3. إذا ظل غير مؤكد، تصعيد للشامل
        """
        start = time.time()

        # المستوى 1: سريع
        fast_result = self.fast(content)[0]
        fast_score = fast_result["score"]
        fast_label = fast_result["label"]

        # ثقة عالية - إرجاع فوري
        if fast_score > confidence_threshold:
            return TieredResult(
                decision="unsafe" if fast_label == "toxic" else "safe",
                confidence=fast_score,
                tier_used=ClassifierTier.FAST,
                latency_ms=(time.time() - start) * 1000
            )

        # ثقة منخفضة على آمن - أيضاً إرجاع
        if fast_label == "non-toxic" and fast_score > confidence_threshold:
            return TieredResult(
                decision="safe",
                confidence=fast_score,
                tier_used=ClassifierTier.FAST,
                latency_ms=(time.time() - start) * 1000
            )

        # المستوى 2: متوازن (ShieldGemma)
        balanced_result = self.balanced.classify_all(content)
        max_harmful = max(
            r["probability"] for r in balanced_result.values()
        )

        if max_harmful > confidence_threshold or max_harmful < (1 - confidence_threshold):
            return TieredResult(
                decision="unsafe" if max_harmful > 0.5 else "safe",
                confidence=max_harmful if max_harmful > 0.5 else 1 - max_harmful,
                tier_used=ClassifierTier.BALANCED,
                latency_ms=(time.time() - start) * 1000,
                escalated=True
            )

        # المستوى 3: شامل (LlamaGuard 8B)
        decision, categories = self.thorough.classify(content)

        return TieredResult(
            decision=decision,
            confidence=0.9,  # LlamaGuard لا يُرجع ثقة
            tier_used=ClassifierTier.THOROUGH,
            latency_ms=(time.time() - start) * 1000,
            escalated=True
        )

# الاستخدام
classifier = TieredClassifier()
result = classifier.classify("كيف أتعلم برمجة Python؟")
print(f"القرار: {result.decision}، المستوى: {result.tier_used.value}")

اختيار المصنف المناسب

السيناريو المصنف الموصى به السبب
API عالي الحجم toxic-bert + LlamaGuard 1B السرعة حاسمة، تصعيد غير المؤكد
قائمة الإشراف LlamaGuard 3 8B دقة للمراجعة البشرية
دردشة فورية ShieldGemma 2B تأخير منخفض، احتمالية جيدة
امتثال المؤسسات LlamaGuard 3 8B تسجيل فئات دقيق
الحافة/الجوال ShieldGemma 2B أصغر نموذج دقيق
أقصى دقة ShieldGemma 27B أفضل درجات معيارية

تحليل التكلفة

CLASSIFIER_COSTS = {
    # بافتراض تكاليف استضافة GPU
    "toxic-bert": {
        "gpu": "T4",
        "hourly_cost": 0.35,
        "throughput_per_hour": 120000,
        "cost_per_1k": 0.003
    },
    "LlamaGuard 3 1B": {
        "gpu": "T4",
        "hourly_cost": 0.35,
        "throughput_per_hour": 36000,
        "cost_per_1k": 0.01
    },
    "LlamaGuard 3 8B": {
        "gpu": "A10G",
        "hourly_cost": 1.00,
        "throughput_per_hour": 9000,
        "cost_per_1k": 0.11
    },
    "ShieldGemma 27B": {
        "gpu": "A100",
        "hourly_cost": 3.00,
        "throughput_per_hour": 9000,
        "cost_per_1k": 0.33
    }
}

def calculate_monthly_cost(
    daily_requests: int,
    classifier: str,
    escalation_rate: float = 0.15
) -> dict:
    """حساب تكاليف التصنيف الشهرية مع النهج المتدرج."""
    costs = CLASSIFIER_COSTS[classifier]
    monthly_requests = daily_requests * 30

    base_cost = (monthly_requests / 1000) * costs["cost_per_1k"]

    # إضافة تكاليف التصعيد إذا كان يستخدم النهج المتدرج
    if escalation_rate > 0:
        escalated = monthly_requests * escalation_rate
        escalation_cost = (escalated / 1000) * CLASSIFIER_COSTS["LlamaGuard 3 8B"]["cost_per_1k"]
        total = base_cost + escalation_cost
    else:
        total = base_cost

    return {
        "base_cost": base_cost,
        "escalation_cost": escalation_cost if escalation_rate > 0 else 0,
        "total_monthly": total
    }

رؤية إنتاجية: النهج المتدرج عادةً يقلل التكاليف بنسبة 60-70% مقارنة بتشغيل المصنف الأكثر دقة على كل طلب، مع الحفاظ على 95%+ من الدقة.

التالي: تخصيص تصنيفات السلامة لحالة استخدامك المحددة. :::

اختبار

الوحدة 3: تعمق في مصنفات السلامة

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.