Schutzmechanismen

Validierung von Ein- und Ausgaben sowie Inhaltssicherheit mit adk-guardrail.

Übersicht

Schutzmechanismen validieren und transformieren Agent-Eingaben und -Ausgaben, um Sicherheit, Compliance und Qualität zu gewährleisten. Sie werden parallel zur Agent-Ausführung ausgeführt und können:

  • Schädliche oder themenfremde Inhalte blockieren
  • Personenbezogene Daten schwärzen (E-Mail-Adressen, Telefonnummern, Sozialversicherungsnummern, Kreditkartennummern)
  • Das JSON-Schema für Ausgaben erzwingen
  • Die Inhaltslänge begrenzen

Installation

[dependencies]
adk-guardrail = "2.1.0"

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

Zentrale Konzepte

GuardrailResult

Jeder Schutzmechanismus gibt eines von drei Ergebnissen zurück:

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

Schweregrade

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

Schwärzung personenbezogener Daten

Personenbezogene Daten automatisch erkennen und schwärzen:

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]

Unterstützte Arten personenbezogener Daten:

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]

Inhaltsfilterung

Schädliche Inhalte blockieren oder Themenbeschränkungen durchsetzen:

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

Benutzerdefinierter Inhaltsfilter

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-Validierung

Das JSON-Schema für Agentenausgaben durchsetzen (erfordert das schema-Feature):

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

Der Validator extrahiert JSON aus:

  • Rohtext von JSON
  • Markdown-Codeblöcken (```json ... ```)

GuardrailSet

Mehrere Schutzmechanismen kombinieren:

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

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

GuardrailExecutor

Schutzmechanismen ausführen und detaillierte Ergebnisse abrufen:

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

Benutzerdefinierte Schutzmechanismen

Das Guardrail-Trait implementieren:

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
    }
}

Integration in Agents

Schutzmechanismen lassen sich in LlmAgentBuilder integrieren:

Konfigurierte Eingabeschutzmechanismen werden vor der Modellausführung ausgeführt, und konfigurierte Ausgabeschutzmechanismen werden auf generierte Antworten angewendet, bevor diese an den Aufrufer zurückgegeben werden.

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

Ablauf der Ausführung

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

Beispiele

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

Bewährte Vorgehensweisen

VorgehensweiseBeschreibung
Schutzmaßnahmen auf SchichtenVerwenden Sie Eingabeschutzmaßnahmen für die Sicherheit und Ausgabeschutzmaßnahmen für die Qualität
Personenbezogene Daten in der EingabePersonenbezogene Daten entfernen, bevor sie das Modell erreichen
Schema bei der AusgabeStrukturierte Ausgaben mit dem JSON-Schema validieren
Angemessene SchwereKritisch sparsam verwenden, Niedrig für Warnungen
Gründlich testenGuardrails sind sicherheitskritischer Code

Zurück: ← Zugriffskontrolle | Weiter: Speicher →

Schutzmechanismen - ADK-Rust Dokumentation | ADK-Rust