Guardrails

Eingabe-/Ausgabevalidierung und Inhaltssicherheit mithilfe von adk-guardrail.

Übersicht

Guardrails validieren und transformieren Agent-Eingaben und -Ausgaben, um Sicherheit, Konformität und Qualität zu gewährleisten. Sie laufen parallel zur Agent-Ausführung und können:

  • Schädliche oder themenfremde Inhalte blockieren
  • PII (E-Mails, Telefonnummern, Sozialversicherungsnummern, Kreditkarten) schwärzen
  • JSON Schema für Ausgaben erzwingen
  • Inhaltslänge begrenzen

Installation

[dependencies]
adk-guardrail = "2.0.0"

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

Kernkonzepte

GuardrailResult

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

PII-Schwärzung

Automatische Erkennung und Schwärzung von persönlich identifizierbaren Informationen:

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 PII-Typen:

TypMusterRedaktion
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

Erzwingen Sie das JSON-Schema für Agenten-Ausgaben (erfordert die schema-Funktion):

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:

  • JSON-Rohtext
  • Markdown-Codeblöcken (```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

Führen Sie Guardrails aus und erhalten Sie detaillierte Ergebnisse:

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 Guardrails

Implementieren Sie das Guardrail Trait:

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 mit Agents

Guardrails integrieren sich mit LlmAgentBuilder:

Konfigurierte Eingabe-Guardrails werden vor der Modellausführung ausgeführt, und konfigurierte Ausgabe-Guardrails werden auf generierte Antworten angewendet, bevor sie 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()?;

Ausführungsfluss

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 Verfahren

PraxisBeschreibung
Guardrails schichtenVerwenden Sie Eingabe-Guardrails für die Sicherheit, Ausgabe-Guardrails für die Qualität
PII bei der EingabePII redigieren, bevor es das Modell erreicht
Schema für die AusgabeValidieren Sie strukturierte Ausgaben mit JSON schema
Angemessene SchwereVerwenden Sie Kritisch sparsam, Niedrig für Warnungen
Gründlich testenGuardrails sind sicherheitskritischer Code

Zurück: ← Zugriffskontrolle | Weiter: Speicher →