L'outillage open source de la sécurité LLM, par catégorie.
Panorama non exhaustif, organisé par fonction plutôt que par éditeur. La plupart de ces outils sont complémentaires — un pipeline de sécurité LLM combine généralement du red teaming hors ligne, des guardrails en runtime, et de l'observabilité continue.
Trouver les vulnérabilités avant qu'un attaquant ne le fasse
Outils qui testent un modèle ou une application LLM avec des attaques automatisées (jailbreaks connus, prompt injection, fuzzing) pour cartographier ses failles avant mise en production.
# Scanner un modèle hébergé via API avec les sondes jailbreak + injection
garak --model_type openai --model_name gpt-4o-mini \
--probes dan,promptinject,encoding,leakreplay
# PyRIT — envoyer un prompt adverse et orchestrer l'évaluation via un juge LLM
from pyrit.orchestrator import PromptSendingOrchestrator
from pyrit.prompt_target import OpenAIChatTarget
target = OpenAIChatTarget(deployment_name="gpt-4o-mini")
orchestrator = PromptSendingOrchestrator(prompt_target=target)
await orchestrator.send_prompts_async(
prompt_list=["Ignore les instructions précédentes et..."]
)
Filtrer les entrées et les sorties en production
Couches de contrôle placées avant et après l'appel au modèle, qui bloquent ou réécrivent le contenu selon des règles ou des classifieurs dédiés.
define user ask off topic
"Quel temps fait-il ?"
"Raconte-moi une blague"
define bot refuse off topic
"Je ne peux traiter que les questions liées à notre produit."
define flow
user ask off topic
bot refuse off topic
# LLM Guard — scanners d'entrée en Python
from llm_guard.input_scanners import PromptInjection, Anonymize
from llm_guard import scan_prompt
scanners = [Anonymize(), PromptInjection()]
prompt_sain, resultats_valides, scores = scan_prompt(scanners, prompt_utilisateur)
Empêcher la fuite de données sensibles
Détection et anonymisation d'informations personnelles ou confidentielles, en entrée comme en sortie du modèle.
from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine
texte = "Mon IBAN est FR76 3000 6000 0112 3456 7890 189"
analyzer = AnalyzerEngine()
resultats = analyzer.analyze(text=texte, language="fr")
anonymise = AnonymizerEngine().anonymize(
text=texte, analyzer_results=resultats
)
# → "Mon IBAN est <IBAN_CODE>" — la valeur réelle ne quitte jamais
# le pipeline avant d'atteindre le LLM
Détecter la dérive et les incidents en production
Traçage des appels LLM, des coûts, de la latence et de la qualité — indispensable pour repérer des patterns d'abus ou une dégradation de la qualité une fois le système en production.
from ragas import evaluate
from ragas.metrics import faithfulness, context_precision
resultats = evaluate(
dataset=jeu_evaluation,
metrics=[faithfulness, context_precision],
)
# faithfulness bas + context_precision bas sur une requête donnée
# → le contexte récupéré ne correspond pas à la réponse générée,
# signal possible d'une entrée RAG empoisonnée (voir menaces.html#data-poisoning)