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

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

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

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

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

المصنفدرجة F1الدقةالاستدعاءالتأخير (GPU)الذاكرة
LlamaGuard 3 1B0.810.790.8350-100 مللي ثانية2GB
LlamaGuard 3 8B0.870.860.88200-400 مللي ثانية16GB
ShieldGemma 2B0.810.820.8030-60 مللي ثانية4GB
ShieldGemma 9B0.840.850.8380-150 مللي ثانية18GB
ShieldGemma 27B0.880.890.87200-400 مللي ثانية54GB
toxic-bert0.850.830.8715-30 مللي ثانية0.4GB
Detoxify (original)0.890.870.91100-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: تعمق في مصنفات السلامة

خذ الاختبار