أدوات الحماية (Guardrails)

التحقق من صحة المدخلات/المخرجات وسلامة المحتوى باستخدام adk-guardrail.

نظرة عامة

تقوم أدوات الحماية (Guardrails) بالتحقق من صحة وتحويل مدخلات ومخرجات Agent لضمان السلامة والامتثال والجودة. تعمل بالتوازي مع تنفيذ Agent ويمكنها:

  • حظر المحتوى الضار أو غير ذي الصلة بالموضوع
  • إخفاء معلومات التعريف الشخصية (PII) (رسائل البريد الإلكتروني، أرقام الهواتف، أرقام الضمان الاجتماعي، بطاقات الائتمان)
  • فرض مخطط JSON على المخرجات
  • تحديد طول المحتوى

التثبيت

[dependencies]
adk-guardrail = "0.2.0"

# For JSON schema validation
adk-guardrail = { version = "0.2.0", features = ["schema"] }

المفاهيم الأساسية

GuardrailResult

تعيد كل Guardrail إحدى النتائج الثلاث التالية:

pub enum GuardrailResult {
    Pass,                                    // المحتوى صالح
    Fail { reason: String, severity: Severity },  // تم رفض المحتوى
    Transform { new_content: Content, reason: String },  // تم تعديل المحتوى
}

مستويات الخطورة (Severity Levels)

pub enum Severity {
    Low,      // تحذير فقط، لا يمنع
    Medium,   // يمنع ولكنه يواصل الفحوصات الأخرى
    High,     // يمنع فوراً
    Critical, // يمنع ويفشل بسرعة
}

إخفاء معلومات التعريف الشخصية (PII Redaction)

اكتشاف وإخفاء معلومات التعريف الشخصية تلقائيًا:

use adk_guardrail::{PiiRedactor, PiiType};

// Default: emails, phones, SSNs, credit cards
let redactor = PiiRedactor::new();

// Or select specific types
let redactor = PiiRedactor::with_types(&[
    PiiType::Email,
    PiiType::Phone,
]);

// Direct redaction
let (redacted, found_types) = redactor.redact("Email: test@example.com");
// redacted = "Email: [EMAIL REDACTED]"
// found_types = [PiiType::Email]

أنواع معلومات التعريف الشخصية المدعومة:

النوعالنمطالإخفاء
Emailuser@domain.com[EMAIL REDACTED]
Phone555-123-4567[PHONE REDACTED]
Ssn123-45-6789[SSN REDACTED]
CreditCard4111-1111-1111-1111[CREDIT CARD REDACTED]
IpAddress192.168.1.1[IP REDACTED]

تصفية المحتوى (Content Filtering)

حظر المحتوى الضار أو فرض قيود على الموضوع:

use adk_guardrail::ContentFilter;

// Block harmful content patterns
let filter = ContentFilter::harmful_content();

// Block specific keywords
let filter = ContentFilter::blocked_keywords(vec![
    "forbidden".into(),
    "banned".into(),
]);

// Enforce topic relevance
let filter = ContentFilter::on_topic("cooking", vec![
    "recipe".into(),
    "cook".into(),
    "bake".into(),
]);

// Limit content length
let filter = ContentFilter::max_length(1000);

مرشح المحتوى المخصص (Custom Content Filter)

use adk_guardrail::{ContentFilter, ContentFilterConfig, Severity};

let config = ContentFilterConfig {
    blocked_keywords: vec!["spam".into()],
    required_topics: vec!["rust".into(), "programming".into()],
    max_length: Some(5000),
    min_length: Some(10),
    severity: Severity::High,
};

let filter = ContentFilter::new("custom_filter", config);

التحقق من المخطط (Schema Validation)

فرض مخطط JSON على مخرجات Agent (يتطلب ميزة schema):

use adk_guardrail::SchemaValidator;
use serde_json::json;

let schema = json!({
    "type": "object",
    "properties": {
        "name": { "type": "string" },
        "age": { "type": "integer", "minimum": 0 }
    },
    "required": ["name"]
});

let validator = SchemaValidator::new(&schema)?
    .with_name("user_schema")
    .with_severity(Severity::High);

يقوم المدقق باستخراج JSON من:

  • نص JSON الخام
  • كتل أكواد Markdown (```json ... ```)

GuardrailSet

دمج أدوات حماية متعددة:

use adk_guardrail::{GuardrailSet, ContentFilter, PiiRedactor};

let guardrails = GuardrailSet::new()
    .with(ContentFilter::harmful_content())
    .with(ContentFilter::max_length(5000))
    .with(PiiRedactor::new());

GuardrailExecutor

شغل Guardrails واحصل على نتائج مفصلة:

use adk_guardrail::{GuardrailExecutor, GuardrailSet, PiiRedactor};
use adk_core::Content;

let guardrails = GuardrailSet::new()
    .with(PiiRedactor::new());

let content = Content::new("user")
    .with_text("Contact: test@example.com");

let result = GuardrailExecutor::run(&guardrails, &content).await?;

if result.passed {
    // Use transformed content if available
    let final_content = result.transformed_content.unwrap_or(content);
    println!("اجتاز المحتوى التحقق");
} else {
    for (name, reason, severity) in &result.failures {
        println!("فشل Guardrail '{}': {} ({:?})", name, reason, severity);
    }
}

ExecutionResult

pub struct ExecutionResult {
    pub passed: bool,                              // النجاح/الفشل الكلي
    pub transformed_content: Option<Content>,      // المحتوى المعدل (إن وجد)
    pub failures: Vec<(String, String, Severity)>, // (الاسم، السبب، الخطورة)
}

Custom Guardrails

نفّذ السمة Guardrail:

use adk_guardrail::{Guardrail, GuardrailResult, Severity};
use adk_core::Content;
use async_trait::async_trait;

pub struct ProfanityFilter {
    words: Vec<String>,
}

#[async_trait]
impl Guardrail for ProfanityFilter {
    fn name(&self) -> &str {
        "profanity_filter"
    }

    async fn validate(&self, content: &Content) -> GuardrailResult {
        let text: String = content.parts
            .iter()
            .filter_map(|p| p.text())
            .collect();

        for word in &self.words {
            if text.to_lowercase().contains(word) {
                return GuardrailResult::Fail {
                    reason: format!("Contains profanity: {}", word),
                    severity: Severity::High,
                };
            }
        }

        GuardrailResult::Pass
    }

    // يعمل بالتوازي مع Guardrails الأخرى (الافتراضي: true)
    fn run_parallel(&self) -> bool {
        true
    }

    // يفشل بسرعة عند فشل هذا Guardrail (الافتراضي: true)
    fn fail_fast(&self) -> bool {
        true
    }
}

Integration with Agents

تتكامل Guardrails مع LlmAgentBuilder:

use adk_agent::LlmAgentBuilder;
use adk_guardrail::{GuardrailSet, ContentFilter, PiiRedactor};

let input_guardrails = GuardrailSet::new()
    .with(ContentFilter::harmful_content())
    .with(PiiRedactor::new());

let output_guardrails = GuardrailSet::new()
    .with(SchemaValidator::new(&output_schema)?);

let agent = LlmAgentBuilder::new("assistant")
    .model(model)
    .instruction("You are a helpful assistant.")
    .input_guardrails(input_guardrails)
    .output_guardrails(output_guardrails)
    .build()?;

Execution Flow

إدخال المستخدم
    │
    ▼
┌─────────────────────┐
│  Guardrails الإدخال   │ ← تنقيح PII، تصفية المحتوى
│  (parallel)         │
└─────────────────────┘
    │
    ▼ (تم تحويله أو حظره)
┌─────────────────────┐
│  تنفيذ Agent        │
└─────────────────────┘
    │
    ▼
┌─────────────────────┐
│  Guardrails الإخراج  │ ← التحقق من المخطط، فحوصات السلامة
│  (parallel)         │
└─────────────────────┘
    │
    ▼
الاستجابة النهائية

Examples

# تصفية PII والمحتوى الأساسية
cargo run --example guardrail_basic --features guardrails

# التحقق من مخطط JSON
cargo run --example guardrail_schema --features guardrails

# تكامل Agent الكامل
cargo run --example guardrail_agent --features guardrails

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

الممارسةالوصف
طبقات إجراءات الحمايةاستخدم إجراءات الحماية للمدخلات للسلامة، وللمخرجات للجودة
معلومات التعريف الشخصية (PII) في المدخلاتنقّح معلومات التعريف الشخصية (PII) قبل وصولها إلى النموذج
المخطط في المخرجاتتحقق من صحة المخرجات المهيكلة باستخدام JSON schema
الخطورة المناسبةاستخدم الخطير باعتدال، والمنخفض للتحذيرات
اختبر بدقةإجراءات الحماية هي تعليمات برمجية حرجة للأمان

السابق: ← التحكم في الوصول | التالي: الذاكرة →