حواجز الحماية

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

نظرة عامة

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

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

التثبيت

[dependencies]
adk-guardrail = "2.0.0"

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

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

GuardrailResult

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

pub enum GuardrailResult {
    Pass,                                    // Content is valid
    Fail { reason: String, severity: Severity },  // Content rejected
    Transform { new_content: Content, reason: String },  // Content modified
}

مستويات الخطورة

pub enum Severity {
    Low,      // Warning only, doesn't block
    Medium,   // Blocks but continues other checks
    High,     // Blocks immediately
    Critical, // Blocks and fails fast
}

تنقيح معلومات التعريف الشخصية (PII)

اكتشاف معلومات التعريف الشخصية (PII) وتنقيحها تلقائيًا:

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]

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

النوعالنمطالتنقيح
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]

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

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

use adk_guardrail::ContentFilter;

// Block harmful content patterns (developer-friendly: excludes "hack"/"exploit")
let filter = ContentFilter::harmful_content();

// Strict variant that also blocks "hack" and "exploit"
let filter = ContentFilter::harmful_content_strict();

// 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);

مرشح المحتوى المخصص

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);

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

فرض مخطط 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

Combine multiple guardrails:

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

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

GuardrailExecutor

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

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!("Content passed validation");
} else {
    for (name, reason, severity) in &result.failures {
        println!("Guardrail '{}' failed: {} ({:?})", name, reason, severity);
    }
}

ExecutionResult

pub struct ExecutionResult {
    pub passed: bool,                              // Overall pass/fail
    pub transformed_content: Option<Content>,      // Modified content (if any)
    pub failures: Vec<(String, String, Severity)>, // (name, reason, severity)
}

حواجز حماية مخصصة

نفّذ السمة 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
    }

    // Run in parallel with other guardrails (default: true)
    fn run_parallel(&self) -> bool {
        true
    }

    // Fail fast on this guardrail's failure (default: true)
    fn fail_fast(&self) -> bool {
        true
    }
}

التكامل مع الوكلاء

تتكامل حواجز الحماية مع 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()?;

تدفق التنفيذ

User Input
    │
    ▼
┌─────────────────────┐
│  Input Guardrails   │ ← PII redaction, content filtering
│  (parallel)         │
└─────────────────────┘
    │
    ▼ (transformed or blocked)
┌─────────────────────┐
│  Agent Execution    │
└─────────────────────┘
    │
    ▼
┌─────────────────────┐
│  Output Guardrails  │ ← Schema validation, safety checks
│  (parallel)         │
└─────────────────────┘
    │
    ▼
Final Response

أمثلة

cargo check -p adk-guardrail
cargo check -p adk-rust --no-default-features --features guardrail

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

الممارسةالوصف
طبقات الحمايةاستخدم حواجز الحماية للمدخلات للسلامة، وللمخرجات للجودة
PII على الإدخالتنقيح PII قبل أن يصل إلى النموذج
مخطط الإخراجالتحقق من صحة المخرجات المهيكلة باستخدام مخطط JSON
الخطورة المناسبةاستخدم الخطورة القصوى باعتدال، والخطورة المنخفضة للتحذيرات
اختبر بدقةGuardrails هي تعليمات برمجية بالغة الأهمية للأمان

السابق: ← Access Control | التالي: Memory →

حواجز الحماية - وثائق ADK-Rust | ADK-Rust