Published on

LLM Guard, NeMo Guardrails, Presidio: welcher wofür

Authors

Guardrails für den Unternehmenseinsatz: LLM Guard, NeMo Guardrails und Presidio

TL;DR

Die drei Werkzeuge konkurrieren nicht. Presidio erkennt und maskiert personenbezogene Daten, LLM Guard filtert Eingaben und Ausgaben gegen einen Katalog von Angriffen, NeMo Guardrails steuert, worüber ein Assistent überhaupt spricht. In einer ernsthaften Architektur laufen zwei davon gleichzeitig — und für deutsche Kennzeichen brauchen Sie in jedem Fall eigene Regeln.


Warum der Vergleich meistens falsch gestellt wird

"Wir evaluieren gerade Guardrail-Lösungen" — dieser Satz fällt in fast jedem Plattform-Projekt, und dahinter steckt in der Regel die Annahme, es gehe um eine Auswahl. Das ist der Denkfehler. Die drei Werkzeuge sitzen an verschiedenen Stellen der Kette und lösen verschiedene Probleme.

Ein Bild, das in Gesprächen zuverlässig funktioniert: Presidio ist der Schwärzstift, LLM Guard der Türsteher, NeMo Guardrails der Gesprächsleitfaden. Sie würden auch keinen Türsteher fragen, ob er den Schwärzstift ersetzen kann.

Was sie tatsächlich tun:

PresidioLLM GuardNeMo Guardrails
HerstellerMicrosoftProtect AINVIDIA
LizenzMITMITApache 2.0
KernaufgabePersonenbezogene Daten finden und ersetzenEin- und Ausgaben gegen Angriffsmuster prüfenGesprächsverlauf und Themen steuern
KonfigurationPython, Recognizer-KlassenPython, Scanner-ListeColang, eine eigene Sprache
Antwortet aufDSGVOSicherheitProduktverhalten

Presidio: der Schwärzstift, und seine deutsche Lücke

Presidio besteht aus zwei Teilen. Der Analyzer findet personenbezogene Daten in Text, der Anonymizer ersetzt sie — durch Platzhalter, durch Hashwerte oder durch synthetische Werte. Die Erkennung kombiniert reguläre Ausdrücke, Prüfsummen-Validierung und ein NER-Modell aus spaCy oder Transformers.

Der Standardweg in einer RAG-Kette: Anfrage kommt rein, Presidio maskiert Namen und Kontonummern, das maskierte Ergebnis geht ans Modell, die Antwort wird zurück-demaskiert. Das Modell sieht nie einen Klarnamen.

from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine

analyzer = AnalyzerEngine()
anonymizer = AnonymizerEngine()

text = "Frau Schmidt hat von IBAN DE89370400440532013000 überwiesen."

# Sprache explizit setzen — der Standard ist Englisch
treffer = analyzer.analyze(text=text, language="de",
                           entities=["PERSON", "IBAN_CODE"])
print(anonymizer.anonymize(text=text, analyzer_results=treffer).text)
# Frau <PERSON> hat von IBAN <IBAN_CODE> überwiesen.

Und hier kommt der Punkt, der in englischsprachigen Anleitungen naturgemäß fehlt: Presidio bringt länderspezifische Erkenner für eine ganze Reihe von Ländern mit — US-Sozialversicherungsnummer, britische NHS-Nummer, italienische Steuernummer, spanische NIF. Für Deutschland gibt es keinen eigenen Satz. Was funktioniert, sind die generischen Erkenner: IBAN, E-Mail, Telefonnummer, Kreditkarte, IP-Adresse, Person, Ort, Datum.

Was nicht funktioniert, ohne dass Sie es bauen:

  • Steuerliche Identifikationsnummer (11 Stellen, mit definierter Prüfziffer)
  • Sozialversicherungsnummer (12 Stellen, enthält Geburtsdatum und Anfangsbuchstaben)
  • Personalausweisnummer
  • Krankenversichertennummer (10 Stellen, Buchstabe plus 9 Ziffern)
  • Kfz-Kennzeichen

Für eine Personalakte oder eine Patientenauskunft sind genau das die relevanten Felder. Ein eigener Erkenner ist überschaubar:

from presidio_analyzer import Pattern, PatternRecognizer

# Krankenversichertennummer: ein Buchstabe, neun Ziffern
kvnr = PatternRecognizer(
    supported_entity="DE_KVNR",
    supported_language="de",
    patterns=[Pattern(name="kvnr", regex=r"\b[A-Z]\d{9}\b", score=0.6)],
    context=["versicherten", "kvnr", "krankenkasse"],
)
analyzer.registry.add_recognizer(kvnr)

Der score von 0,6 ist bewusst gewählt: Das Muster allein ist mehrdeutig, erst die Kontextwörter heben die Bewertung an. Wer hier 0,95 einträgt, maskiert bald jede Materialnummer.

Unsere Empfehlung: Planen Sie zwei bis drei Personentage für die Erkenner, die Ihre Branche wirklich braucht, und testen Sie sie gegen echte Dokumente, nicht gegen Beispieldaten. Die Trefferquote auf produktivem Material liegt bei deutschen Fachtexten in der ersten Runde regelmäßig unter 80 Prozent.

LLM Guard: der Türsteher

LLM Guard arbeitet mit Scannern, die vor und nach dem Modell laufen. Auf der Eingangsseite unter anderem PromptInjection, Toxicity, Secrets, BanTopics, TokenLimit, Anonymize. Auf der Ausgangsseite Sensitive, NoRefusal, Relevance, MaliciousURLs, Deanonymize.

from llm_guard import scan_prompt
from llm_guard.input_scanners import PromptInjection, Secrets, TokenLimit

scanners = [PromptInjection(threshold=0.85), Secrets(), TokenLimit(limit=8192)]
bereinigt, ergebnis, risiko = scan_prompt(scanners, benutzereingabe)

if any(nicht_bestanden is False for nicht_bestanden in ergebnis.values()):
    # Nicht durchlassen, aber protokollieren — sonst merken Sie nie,
    # ob Sie zu scharf eingestellt haben
    log.warning("Eingabe blockiert", extra={"scores": risiko})

Der PromptInjection-Scanner nutzt ein Klassifikationsmodell, und das ist gleichzeitig seine Stärke und seine Grenze. Er erkennt bekannte Muster zuverlässig. Er erkennt sie deutlich schlechter, wenn sie auf Deutsch formuliert sind, weil die Trainingsdaten überwiegend englisch sind. Wir haben in Tests gesehen, dass eine wörtlich übersetzte Injektion durchrutscht, die auf Englisch sauber abgefangen wird.

Klare Position dazu: Behandeln Sie LLM Guard als Filter gegen Gelegenheitsangriffe und Unfälle, nicht als Sicherheitsgrenze. Was das für die Architektur bedeutet, steht ausführlich in der Einordnung von Prompt-Injection im Unternehmen.

Der praktisch wertvollste Scanner ist übrigens der unspektakulärste: Secrets. Er findet API-Schlüssel und Zugangsdaten, die Mitarbeiter versehentlich in den Prompt kopieren. Das passiert häufiger als jeder Angriff.

NeMo Guardrails: der Gesprächsleitfaden

NeMo Guardrails setzt eine Ebene höher an. Es geht nicht um Angriffsabwehr, sondern darum, dass ein Assistent im Rahmen bleibt: nicht über Wettbewerber sprechen, keine Rechtsauskunft geben, bei Preisfragen an den Vertrieb verweisen.

Die Konfiguration erfolgt in Colang, einer eigenen Sprache:

define user frage_nach_rechtsberatung
  "Darf ich diesen Vertrag so kündigen?"
  "Ist die Klausel wirksam?"
  "Was sagt das Gesetz dazu?"

define bot verweise_auf_rechtsabteilung
  "Dazu kann ich keine Auskunft geben. Bitte wenden Sie sich an
   die Rechtsabteilung unter recht@ihre-domain.de."

define flow rechtsberatung
  user frage_nach_rechtsberatung
  bot verweise_auf_rechtsabteilung

Die Beispielsätze unter define user sind keine exakten Muster, sondern Anker für einen Ähnlichkeitsvergleich über Embeddings. Drei bis fünf Formulierungen pro Absicht reichen in der Regel.

Der Preis dafür: jede Prüfung kostet Zeit. Bei aktivierten Themen-Rails kommen pro Anfrage zusätzliche Embedding-Berechnungen und teils ein zusätzlicher Modellaufruf dazu. In unseren Messungen sind das je nach Konfiguration 200 bis 800 Millisekunden. Für einen Chat-Assistenten verkraftbar, für einen Verarbeitungsschritt in einer getakteten Kette nicht.

Zweiter Punkt, den wir offen sagen: Colang ist eine Sprache, die niemand sonst kennt. Wer sie einführt, schafft eine Abhängigkeit von der Person, die sie beherrscht. Bei drei Regeln lohnt sich das nicht — die schreiben Sie schneller als Systemanweisung. Ab etwa zwanzig Regeln mit Verzweigungen kippt das Verhältnis.

Wie die drei zusammen laufen

Die Reihenfolge in einer Kette, die wir in Projekten so umsetzen:

  1. Presidio maskiert personenbezogene Daten in der Eingabe
  2. LLM Guard prüft die maskierte Eingabe auf Injektion und Geheimnisse
  3. NeMo Guardrails entscheidet, ob das Thema zulässig ist
  4. → Modell
  5. NeMo Guardrails prüft die Antwort gegen die Ausgaberegeln
  6. LLM Guard prüft auf sensible Inhalte und schädliche Links
  7. Presidio demaskiert für den berechtigten Empfänger

Sieben Schritte sind viel, und die wenigsten Installationen brauchen alle. Die Mindestausstattung für eine Plattform, die mit Kunden- oder Personaldaten arbeitet, sind Schritt 1, 2 und 7. Themen-Rails kommen dazu, wenn der Assistent nach außen sichtbar wird.

Technisch hängt das an einer Stelle: Diese Kette gehört ins Gateway, nicht in jede Anwendung. Sonst haben Sie drei Anwendungen mit drei verschiedenen Regelständen. Wie die Verkettung im Gateway konkret aussieht, steht im Aufbau der Guardrail-Kette hinter LiteLLM.

Häufig gestellte Fragen

Erkennt Presidio deutsche Personalausweis- und Steuernummern?

Nicht von Haus aus. Presidio liefert länderspezifische Erkenner für mehrere Länder mit, für Deutschland aber nur die generischen: IBAN, E-Mail, Telefonnummer, Kreditkarte, IP-Adresse sowie Namen und Orte über das NER-Modell. Steuer-Identifikationsnummer, Sozialversicherungsnummer, Krankenversichertennummer und Kfz-Kennzeichen müssen Sie als eigene Erkenner ergänzen — mit Muster, Kontextwörtern und, wo es sie gibt, Prüfziffernvalidierung.

Was kosten LLM Guard, NeMo Guardrails und Presidio?

Alle drei sind quelloffen und in der Nutzung kostenfrei: Presidio und LLM Guard unter MIT-Lizenz, NeMo Guardrails unter Apache 2.0. Die Kosten entstehen im Betrieb — Rechenzeit für die Klassifikationsmodelle, zusätzliche Latenz und der Aufwand für Regelpflege. Kalkulieren Sie für die Ersteinrichtung einer produktiven Kette fünf bis zehn Personentage.

Reicht ein Guardrail-Werkzeug allein aus?

Für eine reine Datenschutzanforderung reicht Presidio. Für einen öffentlich erreichbaren Assistenten reicht keines allein. Die drei decken verschiedene Risiken ab: Presidio das Datenschutzrisiko, LLM Guard das Angriffsrisiko, NeMo Guardrails das Reputationsrisiko. Welche davon Sie tragen wollen, ist eine Geschäftsentscheidung, keine technische.

Wie viel Latenz kosten Guardrails?

Presidio liegt bei kurzen Texten im Bereich von 30 bis 100 Millisekunden, abhängig vom NER-Modell. LLM Guard mit aktivem Injektions-Scanner kommt auf 100 bis 300 Millisekunden. NeMo Guardrails mit Themen-Rails kostet 200 bis 800 Millisekunden, weil zusätzliche Modellaufrufe dazukommen. In Summe kann eine vollständige Kette die wahrgenommene Antwortzeit spürbar verlängern — messen Sie das, bevor Sie es ausrollen.

Funktionieren die Injektions-Filter auch bei deutschsprachigen Angriffen?

Schlechter als bei englischen. Die Klassifikationsmodelle hinter den gängigen Injektions-Scannern sind überwiegend auf englischen Daten trainiert. Eine wörtlich übersetzte Angriffsformulierung wird in unseren Tests deutlich seltener erkannt als das englische Original. Verlassen Sie sich deshalb nicht auf den Filter als Sicherheitsgrenze, sondern begrenzen Sie, was das Modell überhaupt auslösen kann.


Der nächste Schritt

Beantworten Sie eine Frage, bevor Sie irgendetwas installieren: Welche Daten dürfen das Haus nicht verlassen, und welche Themen darf der Assistent nicht anfassen? Die erste Antwort führt zu Presidio, die zweite zu NeMo Guardrails. Wenn beide Antworten leer bleiben, brauchen Sie noch keine Guardrails — wir schauen uns das gern mit Ihnen an.

📖 Verwandte Artikel

Weitere interessante Beiträge zu ähnlichen Themen