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

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

نظرة عامة

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

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

التثبيت

[dependencies]
adk-guardrail = "2.1.0"

# For JSON schema validation
adk-guardrail = { version = "2.1.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
}

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

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

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]

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

TypePatternRedaction
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 على مخرجات الوكيل (يتطلب ميزة 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

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

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

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

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

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

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