Modèle / jeu de données
guardrails-ai/guardrails avatar
guardrails-ai/guardrails

guardrails-ai : valider les entrées et les sorties d'un LLM sans changer de modèle

Adding guardrails to large language models.

7 418 étoiles699 forksPythonApache-2.0

En bref

De quoi s’agit-il ?
Guardrails est un cadre Python sous Apache-2.0 qui enchaîne des validateurs sur les entrées et les sorties d'un modèle, et qui sait aussi produire des données structurées. La mécanique est claire, la distribution des validateurs est en train de changer, et c'est ce point qu'il faut vérifier avant d'adopter.
À qui s’adresse-t-il ?
Adoptez Guardrails si vous avez besoin de faire échouer explicitement une réponse de LLM sur une règle vérifiable (format, liste de concurrents, toxicité) et que vous acceptez d'écrire ou d'installer un validateur par règle. Évitez-le si vous cherchez une protection générale contre les injections de prompt : le README ne présente que des validateurs ciblés, et un Guard vide ne protège de rien.
Puis-je l’utiliser commercialement ?
Oui. Apache-2.0 est une licence permissive : vous pouvez utiliser, modifier et vendre un logiciel qui en dépend, à condition de conserver les mentions de droit d’auteur et de licence.
Est-il encore maintenu ?
Oui. Les derniers commits datent d’il y a 3 jours.
En quel langage est-il écrit ?
Principalement Python, d’après les statistiques de langage de GitHub.

Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 15 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.

ANALYSE OPEN SOURCE APPROFONDIE

Le problème traité : rendre une réponse de LLM vérifiable, pas seulement plausible

Un LLM produit du texte qui a l'air correct. C'est insuffisant dès qu'une réponse alimente un système en aval : un numéro de téléphone mal formé, une mention d'un concurrent dans un message client, une phrase toxique dans un chatbot public. Guardrails se place exactement à cet endroit. Le README décrit deux fonctions : exécuter des Input/Output Guards qui détectent, quantifient et atténuent certains types de risques, et générer des données structurées à partir d'un LLM.

Le public visé est donc l'ingénieur qui écrit une application Python autour d'un modèle et qui veut transformer une contrainte métier en échec explicite plutôt qu'en relecture manuelle. Ce n'est pas un outil de prompt engineering, ni un routeur de modèles. C'est une couche de contrôle qui s'insère entre votre code et la réponse du modèle, et qui décide si cette réponse passe ou non.

Un Guard est une liste ordonnée de validateurs avec une politique d'échec

L'objet central est Guard. On le construit en appelant .use() avec un ou plusieurs validateurs, chacun recevant une action à exécuter en cas d'échec. Le README montre OnFailAction.EXCEPTION, qui lève une erreur et interrompt le flux.

La composition est le point intéressant : les validateurs s'empilent et leurs messages d'erreur se cumulent. Dans l'exemple du README, un Guard combine CompetitorCheck et ToxicLanguage, et l'échec des deux produit un message unique qui liste d'abord les concurrents trouvés, puis les phrases jugées toxiques. Vous obtenez donc un diagnostic agrégé, pas seulement un booléen. Cela compte en production : un message d'erreur qui nomme la règle violée est directement exploitable dans les logs.

Le second usage est la génération structurée. On définit un modèle Pydantic, ici une classe Pet avec pet_type et name, puis on appelle Guard.for_pydantic(output_class=Pet, prompt=prompt). Le README explique que deux méthodes sont utilisées en interne : le function calling pour les modèles qui le supportent, et l'ajout du schéma attendu directement dans le prompt pour les autres. Le choix est donc délégué au cadre, pas à vous. C'est pratique, mais cela signifie que le comportement réel dépend du modèle choisi, et le README ne détaille pas comment cette bascule est décidée.

Installation : configure, puis un paquet de validateur par règle

La mise en route tient en deux commandes. D'abord le paquet principal et la configuration du CLI :

pip install guardrails-ai guardrails configure

Ensuite, chaque validateur s'installe séparément depuis le Hub. Le README donne :

pip install guardrails-ai-regex-match pip install guardrails-ai-competitor-check guardrails-ai-toxic-language

Le code d'utilisation suit la même séparation. L'import se fait depuis le paquet du validateur, pas depuis guardrails :

from guardrails import Guard, OnFailAction from guardrails_ai.regex_match import RegexMatch

guard = Guard().use( RegexMatch, regex="\(?\d{3}\)?-? *\d{3}-? *-?\d{4}", on_fail=OnFailAction.EXCEPTION )

Notez que RegexMatch est passé comme classe avec ses arguments, tandis que CompetitorCheck est instancié avant d'être passé à .use(). Les deux formes apparaissent dans le README, ce qui suggère une tolérance du cadre, mais je n'ai pas de confirmation sur l'équivalence exacte des deux écritures.

Le second exemple illustre le seuil : ToxicLanguage(threshold=0.5, validation_method="sentence"). Le paramètre validation_method indique que la toxicité est évaluée phrase par phrase, ce qui explique que le message d'erreur cite la phrase fautive plutôt que le document entier.

La migration des validateurs vers PyPI est le vrai risque de calendrier

Le README annonce une rupture : les validateurs passent à des paquets PyPI standard installés avec pip, et Guardrails arrête son inférence distante hébergée. Une date de coupure est donnée, le 25 août 2026, avec un lien de migration vers le ticket 1560 du dépôt.

Cette annonce est plus importante que n'importe quel détail d'API pour qui évalue le projet aujourd'hui. Les exemples d'installation du README utilisent déjà la forme cible, guardrails-ai-regex-match, mais le texte précise que le mouvement est en cours. Autrement dit, une application écrite contre une version antérieure peut dépendre d'un mécanisme d'inférence qui disparaît. Le coût de maintenance ne se situe donc pas dans le code de votre Guard, qui est court, mais dans la chaîne de dépendances : chaque validateur est un paquet distinct, avec sa propre cadence de publication.

La dernière version publiée listée est v0.11.0, datée du 14 août 2026, après v0.10.2 en juin et v0.10.0 en avril. Le rythme observé sur ces trois versions est d'environ un mois et demi à deux mois. Je ne peux pas en déduire la stabilité de l'API au-delà de ce que les notes de version disent, et je ne les ai pas.

Ce que le cadre ne fait pas, et quand il devient le mauvais outil

Guardrails ne juge pas la véracité. Aucun des exemples fournis ne vérifie qu'une affirmation est exacte : CompetitorCheck cherche des noms dans une liste, RegexMatch applique une expression régulière, ToxicLanguage applique un seuil sur un score. Ce sont des règles mécaniques. Si votre problème est qu'un modèle invente des références, le cadre ne vous aide pas directement, il faut écrire un validateur qui fait ce contrôle.

Deuxième limite : le README ne décrit aucun comportement de réessai automatique. OnFailAction.EXCEPTION lève une exception, et l'exemple attrape l'exception pour imprimer le message. Toute stratégie de reprise, de reformulation du prompt ou de repli vers un autre modèle reste à votre charge. Le cadre signale, il ne corrige pas.

Troisième limite, plus structurelle : la protection dépend entièrement des validateurs que vous empilez. Un Guard sans validateur, ou avec un validateur mal paramétré, laisse tout passer. Le seuil de ToxicLanguage est un exemple net : la valeur 0.5 est un choix, et le README ne donne aucune indication sur la manière de le calibrer sur vos données. Poser la mauvaise valeur revient à ne pas filtrer.

Enfin, l'usage de validation_method="sentence" a un coût : découper en phrases multiplie les évaluations par rapport à une évaluation globale. Le README ne publie aucune mesure de latence pour ce mode, et je n'en inventerai pas.

Alternative réelle : la validation par schéma seule, avec Pydantic

Si votre besoin se limite à obtenir une sortie structurée, Pydantic employé directement couvre une partie du terrain sans dépendance supplémentaire. Vous définissez le modèle, vous validez la réponse, et vous levez une erreur si elle ne correspond pas. C'est exactement ce que Guardrails fait dans son exemple Pet, et le README indique lui-même que le modèle est une classe Pydantic.

La différence d'approche est ailleurs. Pydantic vérifie une forme et des types. Guardrails ajoute une couche de contenu : un validateur peut inspecter la valeur d'un champ et la rejeter pour une raison sémantique, comme la présence d'un concurrent ou un score de toxicité. Pydantic ne fera jamais cela, et lui demander l'équivalent signifie écrire des validateurs personnalisés qui finiront par ressembler à ceux du Hub.

L'arbitrage est donc le suivant. Si votre contrainte est un schéma, restez sur Pydantic, vous économisez une dépendance et le mécanisme de sélection entre function calling et injection de schéma dans le prompt. Si votre contrainte porte sur le sens du texte, Guardrails apporte quelque chose que Pydantic n'a pas : un catalogue de validateurs installables et un point d'échec unique.

Licence et coût de mise à jour

Le dépôt est publié sous Apache-2.0, ce qui autorise l'usage commercial et la modification, avec les obligations habituelles de conservation de la notice de licence et d'indication des fichiers modifiés. Je ne donne pas d'avis juridique : la question à poser à votre équipe concerne les validateurs que vous installez, car ce sont des paquets distincts et leur licence n'est pas forcément la même que celle du cadre. Le README ne liste pas les licences des validateurs du Hub.

Sur le coût de mise à jour, le matériel disponible indique trois choses. Le projet n'est pas archivé et la dernière poussée sur main est datée du 8 septembre 2026. Trois versions ont été publiées entre avril et août 2026. Et une migration avec date de coupure est en cours. Les deux premières suggèrent un projet actif, la troisième implique un travail de vérification sur vos dépendances, pas seulement un changement de numéro de version. Le point de contrôle concret est le ticket 1560 du dépôt, cité par le README comme guide de migration.

Conclusion éditoriale

Adoptez Guardrails si vous avez besoin de faire échouer explicitement une réponse de LLM sur une règle vérifiable (format, liste de concurrents, toxicité) et que vous acceptez d'écrire ou d'installer un validateur par règle. Évitez-le si vous cherchez une protection générale contre les injections de prompt : le README ne présente que des validateurs ciblés, et un Guard vide ne protège de rien. Avant de vous engager, vérifiez deux choses concrètes : que les paquets guardrails-ai-* dont vous dépendez sont publiés sur PyPI, et que votre version de guardrails-ai est postérieure à la coupure annoncée du 25 août 2026 pour l'inférence distante.

Sources officielles

  1. guardrails-ai/guardrails on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Notes de la communauté

Notes de la communauté