LLM Guard (by Protect AI) è un security toolkit open-source per applicazioni LLM. Fornisce una libreria di input scanner (applicati al prompt dell”utente prima che raggiunga il modello) e output scanner (applicati alla risposta del modello prima che raggiunga l”utente) che rilevano e mitigano prompt injection, jailbreak, tossicità, leakage di PII, secrets, topic vietati, e altro. Gli scanner possono sanitizzare il contenuto, segnare il rischio, e bloccare richieste non sicure, rendendolo uno strato guardrail pratico per app LLM di produzione.
Installazione
| Metodo | Comando |
|---|
| pip | pip install llm-guard |
| Con ONNX (più veloce) | pip install "llm-guard[onnxruntime]" |
| API server (Docker) | esegui l”immagine ufficiale llm-guard-api |
| First run | scarica i modelli degli scanner (transformers) |
| Verifica | python -c "import llm_guard; print(''ok'')" |
Due Stadi di Scanning
| Stage | Applicato a | Scopo |
|---|
| Input scanner | Il prompt dell”utente | Ferma input malevolo/non sicuro che raggiunge il modello |
| Output scanner | La risposta del modello | Ferma output non sicuro/leaky che raggiunge l”utente |
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")
| Ritorno | Significato |
|---|
sanitized | Il prompt (possibilmente modificato) |
results | Pass/fail per-scanner |
risk | Risk score per-scanner (0–1) |
| Scanner | Rileva |
|---|
PromptInjection | Injection/jailbreak attempts |
Toxicity | Toxic/abusive language |
Secrets | API keys, tokens nel prompt |
Anonymize | PII (redacts, con later de-anonymize) |
BanTopics | Soggetti disallowati |
BanSubstrings / BanCompetitors | Blocklists |
Code | Presence of code / specific languages |
TokenLimit | Oversized prompts |
Language | Unexpected languages |
Scanning dell”Output
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)
Output Scanner
| Scanner | Controlla |
|---|
Sensitive | PII/secrets leaking nella risposta |
NoRefusal | Rileva refusals (quality/guardrail signal) |
Relevance | La risposta effettivamente risponde al prompt |
Toxicity | Toxic output |
Bias | Biased content |
MaliciousURLs | Dangerous links nell”output |
Deanonymize | Ripristina redacted PII per trusted display |
FactualConsistency | La risposta è consistente col contesto |
PII Anonymize / Deanonymize Flow
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)
# ... chiama il modello con safe_prompt ...
final, _, _ = scan_output([Deanonymize(vault)], safe_prompt, model_response)
Il Vault memorizza il mapping così le entità redacted possono essere ripristinate nella risposta finale.
Deployment
| Opzione | Nota |
|---|
| In-process library | Importa e chiama scan_prompt/scan_output |
| API server | llm-guard-api per un language-agnostic gateway |
| ONNX runtime | Faster CPU inference per i modelli scanner |
| Config | Fail-fast, thresholds, e match strategies per scanner |
Workflow Comuni
# Guardrail wrapper intorno a qualsiasi LLM call
def guarded_chat(user_input):
prompt, r_in, _ = scan_prompt(input_scanners, user_input)
if not all(r_in.values()):
return "Richiesta bloccata dalla politica di sicurezza."
resp = call_llm(prompt)
out, r_out, _ = scan_output(output_scanners, prompt, resp)
return out if all(r_out.values()) else "Risposta trattenuta dalla politica di sicurezza."
| Aspetto | LLM Guard | NeMo Guardrails | Garak |
|---|
| Role | Input/output scanner (runtime) | Programmable dialog rails | LLM vulnerability scanner (testing) |
| Focus | Injection, PII, toxicity, secrets | Conversation flow control | Red-teaming/probing |
| When | Nel request path | Nel request path | Pre-deployment testing |
| Best for | Drop-in guardrails | Complex rule-based flows | Finding weaknesses |
Risorse