الدرس 15 من 20

معالجة الأخطاء والتعافي

التحقق من المخرجات

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

لا تثق بمخرجات LLM بشكل أعمى. التحقق يضمن أن استجابات الوكيل آمنة ودقيقة ومنسقة بشكل صحيح قبل وصولها للمستخدمين.

طبقات التحقق

استجابة LLM ← فحص التنسيق ← سلامة المحتوى ← التحقق الواقعي ← قواعد العمل ← المستخدم

التحقق من المخطط

تأكد من أن المخرجات تطابق البنية المتوقعة:

from pydantic import BaseModel, validator
from typing import List, Optional

class AgentResponse(BaseModel):
    answer: str
    confidence: float
    sources: List[str]
    tool_calls: Optional[List[dict]] = None

    @validator('confidence')
    def confidence_range(cls, v):
        if not 0 <= v <= 1:
            raise ValueError('الثقة يجب أن تكون بين 0 و 1')
        return v

    @validator('answer')
    def answer_not_empty(cls, v):
        if not v.strip():
            raise ValueError('الإجابة لا يمكن أن تكون فارغة')
        return v

def validate_response(raw_output):
    try:
        return AgentResponse.parse_raw(raw_output)
    except ValidationError as e:
        return {"error": "تنسيق استجابة غير صالح", "details": str(e)}

فحوصات سلامة المحتوى

class ContentValidator:
    def __init__(self):
        self.blocked_patterns = [
            r'\b(password|secret|api[_-]?key)\s*[:=]\s*\S+',
            r'\b\d{16}\b',  # أنماط بطاقات الائتمان
            r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'  # البريد الإلكتروني
        ]

    def check_pii_leakage(self, text):
        """التحقق من كشف البيانات الحساسة عن طريق الخطأ"""
        for pattern in self.blocked_patterns:
            if re.search(pattern, text, re.IGNORECASE):
                return False, "تم اكتشاف بيانات حساسة محتملة"
        return True, None

    def check_harmful_content(self, text):
        """استخدام API الإشراف أو المصنف"""
        result = moderation_api.check(text)
        if result.flagged:
            return False, f"تم تمييز المحتوى: {result.categories}"
        return True, None

الاتساق الواقعي

التحقق من الادعاءات مقابل الحقائق المعروفة:

class FactChecker:
    def __init__(self, knowledge_base):
        self.kb = knowledge_base

    def verify_claims(self, response, context):
        """مقارنة ادعاءات الاستجابة مع سياق المصدر"""
        claims = extract_claims(response)
        verified = []

        for claim in claims:
            # التحقق إذا كان الادعاء مدعوماً بالسياق
            support = self.kb.find_support(claim, context)

            if support.score > 0.8:
                verified.append({"claim": claim, "status": "موثق"})
            elif support.score > 0.5:
                verified.append({"claim": claim, "status": "جزئي"})
            else:
                verified.append({"claim": claim, "status": "غير موثق"})

        return verified

    def add_verification_note(self, response, verification):
        """إضافة ملاحظات التحقق للاستجابة"""
        unverified = [v for v in verification if v["status"] == "غير موثق"]

        if unverified:
            note = f"\n\n⚠️ {len(unverified)} ادعاء(ات) لم يمكن التحقق منها مقابل المصادر."
            return response + note

        return response

التحقق من منطق العمل

class BusinessValidator:
    def __init__(self, rules):
        self.rules = rules

    def validate(self, response, context):
        errors = []

        for rule in self.rules:
            if not rule.check(response, context):
                errors.append(rule.error_message)

        return len(errors) == 0, errors

# قواعد مثال
rules = [
    Rule(
        name="price_sanity",
        check=lambda r, c: not contains_price(r) or price_in_range(r, 0, 10000),
        error_message="السعر خارج النطاق المقبول"
    ),
    Rule(
        name="date_validity",
        check=lambda r, c: not contains_date(r) or date_is_valid(r),
        error_message="تاريخ غير صالح في الاستجابة"
    ),
    Rule(
        name="no_competitors",
        check=lambda r, c: not mentions_competitors(r),
        error_message="الاستجابة تذكر منتجات المنافسين"
    )
]

خط أنابيب التحقق

دمج جميع المدققات:

class ValidationPipeline:
    def __init__(self):
        self.validators = [
            ("schema", SchemaValidator()),
            ("safety", ContentValidator()),
            ("facts", FactChecker(knowledge_base)),
            ("business", BusinessValidator(business_rules))
        ]

    def validate(self, response, context):
        results = {"passed": True, "checks": []}

        for name, validator in self.validators:
            is_valid, details = validator.validate(response, context)

            results["checks"].append({
                "name": name,
                "passed": is_valid,
                "details": details
            })

            if not is_valid:
                results["passed"] = False

        return results

    def process(self, response, context):
        validation = self.validate(response, context)

        if not validation["passed"]:
            # الخيار 1: إعادة التوليد
            # الخيار 2: إرجاع نسخة منقحة
            # الخيار 3: إرجاع مع تحذيرات
            return self.handle_failure(response, validation)

        return response

أفضل الممارسات

تحقق من لماذا
تنسيق المخرج منع أخطاء التحليل
سلامة المحتوى حماية المستخدمين
الدقة الواقعية بناء الثقة
قواعد العمل الحفاظ على الامتثال

التالي: تعلم استراتيجيات التصحيح لأنظمة الوكلاء. :::

اختبار

الوحدة 4: معالجة الأخطاء والتعافي

خذ الاختبار