LLM Guard - Cheatsheet Kit de Sécurité LLM
LLM Guard (par Protect AI) est un kit de sécurité open-source pour les applications LLM. Il fournit une bibliothèque de scanners d”entrée (appliqués à la requête de l”utilisateur avant qu”elle n”atteigne le modèle) et de scanners de sortie (appliqués à la réponse du modèle avant qu”elle n”atteigne l”utilisateur) qui détectent et atténuent l”injection de prompt, les jailbreaks, la toxicité, la fuite de données personnelles, les secrets, les sujets interdits et plus encore. Les scanners peuvent nettoyer le contenu, évaluer le risque et bloquer les requêtes non sécurisées, ce qui en fait une couche de protection pratique pour les applications LLM en production.
Installation
| Méthode | Commande |
|---|
| pip | pip install llm-guard |
| Avec ONNX (plus rapide) | pip install "llm-guard[onnxruntime]" |
| Serveur API (Docker) | lancer l”image officielle llm-guard-api |
| Première exécution | télécharge les modèles de scanner (transformers) |
| Vérification | python -c "import llm_guard; print(''ok'')" |
Deux Étapes de Scannage
| Étape | Appliquée à | Objectif |
|---|
| Scanners d”entrée | La requête de l”utilisateur | Arrêter l”entrée malveillante/non sécurisée d”atteindre le modèle |
| Scanners de sortie | La réponse du modèle | Arrêter la sortie non sécurisée/avec fuite d”atteindre l”utilisateur |
Scannage d”Entrée
from llm_guard import scan_prompt
from llm_guard.input_scanners import PromptInjection, Toxicity, Secrets
scanners = [PromptInjection(), Toxicity(), Secrets()]
sanitized, results, risk = scan_prompt(scanners, user_prompt)
if any(not ok for ok in results.values()):
raise ValueError("Unsafe prompt blocked")
| Retour | Signification |
|---|
sanitized | La requête (possiblement modifiée) |
results | Pass/fail par scanner |
risk | Scores de risque par scanner (0–1) |
Scanners d”Entrée
| Scanner | Détecte |
|---|
PromptInjection | Tentatives d”injection/jailbreak |
Toxicity | Langage toxique/abusif |
Secrets | Clés API, tokens dans la requête |
Anonymize | Données personnelles (redacte, avec dé-anonymisation ultérieure) |
BanTopics | Sujets non autorisés |
BanSubstrings / BanCompetitors | Listes de blocage |
Code | Présence de code / langages spécifiques |
TokenLimit | Requêtes surdimensionnées |
Language | Langues inattendues |
Scannage de Sortie
from llm_guard import scan_output
from llm_guard.output_scanners import NoRefusal, Sensitive, Relevance
scanners = [NoRefusal(), Sensitive(), Relevance()]
sanitized_resp, results, risk = scan_output(scanners, prompt, model_response)
Scanners de Sortie
| Scanner | Vérifie |
|---|
Sensitive | Fuite de données personnelles/secrets dans la réponse |
NoRefusal | Détecte les refus (signal de qualité/guardrail) |
Relevance | La réponse répond réellement à la requête |
Toxicity | Sortie toxique |
Bias | Contenu biaisé |
MaliciousURLs | Liens dangereux dans la sortie |
Deanonymize | Restaurer les données personnelles redactées pour l”affichage fiable |
FactualConsistency | La réponse est cohérente avec le contexte |
Flux Anonymize / Deanonymize PII
from llm_guard.input_scanners import Anonymize
from llm_guard.output_scanners import Deanonymize
from llm_guard.vault import Vault
vault = Vault()
safe_prompt, _, _ = scan_prompt([Anonymize(vault)], user_prompt)
# ... appeler le modèle avec safe_prompt ...
final, _, _ = scan_output([Deanonymize(vault)], safe_prompt, model_response)
Le Vault stocke le mapping pour que les entités redactées puissent être restaurées dans la réponse finale.
Déploiement
| Option | Note |
|---|
| Bibliothèque in-process | Importer et appeler scan_prompt/scan_output |
| Serveur API | llm-guard-api pour une passerelle agnostique au langage |
| Runtime ONNX | Inférence CPU plus rapide pour les modèles de scanner |
| Config | Échouer rapidement, seuils et stratégies de correspondance par scanner |
Flux de Travail Courants
# Wrapper guardrail autour de n''importe quel appel LLM
def guarded_chat(user_input):
prompt, r_in, _ = scan_prompt(input_scanners, user_input)
if not all(r_in.values()):
return "Request blocked by safety policy."
resp = call_llm(prompt)
out, r_out, _ = scan_output(output_scanners, prompt, resp)
return out if all(r_out.values()) else "Response withheld by safety policy."
LLM Guard vs Outils Connexes
| Aspect | LLM Guard | NeMo Guardrails | Garak |
|---|
| Rôle | Scanners entrée/sortie (runtime) | Rails de dialogue programmables | Analyseur vulnérabilité LLM (test) |
| Focus | Injection, données personnelles, toxicité, secrets | Contrôle du flux de conversation | Red-teaming/probing |
| Quand | Dans le chemin de la requête | Dans le chemin de la requête | Test pré-déploiement |
| Meilleur pour | Guardrails drop-in | Flux basés sur règles complexes | Trouver les faiblesses |
Ressources