Didacticiel : implémenter des garde-fous sur un service de modèle avec des politiques de service
Bêta
Cette fonctionnalité est en Bêta. Les administrateurs de compte peuvent gérer l'accès à cette fonctionnalité depuis la console de compte de la page **Aperçus**. Consultez Gérer les aperçus Databricks.
Ce tutoriel explique comment implémenter des garde-fous sur un service de modèle, de deux manières complémentaires. Sur Databricks, vous implémentez des garde-fous avec des politiques de service. Un service de modèle peut desservir un modèle hébergé par Databricks ou un fournisseur **externe** tel qu'OpenAI, Anthropic ou Google, et vous les gérez tous deux de la même manière :
- Stratégies de service intégrées (garde-fous) : vérifications gérées et fournies par Databricks pour les risques courants tels que les PII, les contenus dangereux, les tentatives d'évasion de sécurité et les hallucinations. Vous en attachez un en le sélectionnant dans l'interface utilisateur, sans code à écrire.
- Stratégies de service personnalisées : fonctions SQL que vous écrivez pour des règles spécifiques à votre organisation, telles qu'un nom de code de projet confidentiel ou un modèle de réponse interdit.
Pour les concepts de politique de service, les garde-fous intégrés et la référence complète de création, consultez Politiques de service pour les actifs sécurisables d'IA, Créer et attacher une politique de service, et Référence des fonctions de politique de service.
Vous les attachez tous deux de la même manière, à partir de la **tab Policies** d'un service de modèle dans l'interface utilisateur d'Unity AI Gateway, et vous pouvez les mélanger. Databricks évalue chacun à deux moments : **ON CALL** (avant qu'il n'appelle le modèle) et **ON RESULT** (après que le modèle a répondu). Dans l'interface utilisateur, vous sélectionnez la phase lorsque vous attachez la politique. Une politique personnalisée peut également se limiter à une seule phase en se basant sur event:type.
Scénario : Votre équipe expose un LLM via un Model Service (main.default.team_chat) que les applications et les agents appellent. Vous souhaitez bloquer les informations personnelles identifiables (PII) avec un garde-fou géré, bloquer toute invite mentionnant un projet confidentiel et bloquer les réponses contenant un Link non sécurisé, le tout sans modifier le code de l'application.
À la fin de ce didacticiel, vous aurez :
- Un garde-fou PII intégré sur le service.
- Une politique de demande personnalisée qui bloque un nom de code confidentiel À LA DEMANDE.
- Une politique de réponse personnalisée qui bloque les Link non sécurisés au niveau de ON RESULT.
- Les trois sont attachés et vérifiés à partir du playground du service de modèle.
Prérequis
- Un Workspace activé pour Unity Catalog. Consultez Se familiariser avec Unity Catalog.
- L'aperçu de Unity AI Gateway est activé pour votre compte. Consultez Gérer les aperçus Databricks.
- Un service de modèle pour gouverner, et
EXECUTEdessus afin que vous puissiez tester. Pour en créer un, consultez Créer et gérer des services de modèles. Ce tutoriel utilisemain.default.team_chat. MANAGEsur le Service de modèle, pour attacher des politiques.CREATE FUNCTIONsur le schéma où vous créez les fonctions de politique personnalisées (main.governancedans ce tutoriel).- Pour le garde-fou intégré : le modèle d'évaluateur qui exécute la vérification du garde-fou (le juge LLM) est présélectionné, donc aucune configuration n'est nécessaire. Si vous sélectionnez un évaluateur différent sous Options avancées , vous avez besoin de
CAN_QUERYdessus.
Étape 1 : Appliquer un garde-fou intégré
Les garde-fous intégrés sont des vérifications de juge LLM gérées. Vous en sélectionnez un dans le menu **Type de garde-fou** ; le service de modèle d'évaluation qui exécute la vérification (le juge LLM) est présélectionné pour vous. Les garde-fous disponibles sont :
- Blocage des PII (
system.ai.block_pii) : refuse le contenu qui contient des PII. - Contenu dangereux (
system.ai.block_unsafe_content) : refuse le contenu dangereux ou nuisible. - Jailbreak (
system.ai.block_jailbreak) : refuse les tentatives d'injection de prompt et de jailbreak (requêtes uniquement). - Hallucination (
system.ai.block_hallucination) : refuse les réponses hallucinées (réponses uniquement).
Associez le garde-fou PII à votre service de modèle :
- Dans la barre latérale du workspace, cliquez sur AI Gateway .
- Dans l'onglet **Modèles**, sélectionnez votre service de modèle
main.default.team_chat(). - Ouvrez l'onglet Politiques , puis cliquez sur Nouvelle politique .
- Saisissez un **nom**, tel
block-piique. - Sous Appliqué à , maintenez Tous les utilisateurs du compte , ou définissez la portée de la politique à des principaux spécifiques.
- Sous Type de garde-fou , sélectionnez Blocage des PII .
- Définissez Rang sur
1. Le rang détermine l'ordre d'évaluation : le rang le plus bas s'exécute en premier sur la requête et en dernier sur la réponse. - Sous Phase , sélectionnez à la fois garde-fous d'entrée (avant le modèle) et garde-fous de sortie (après le modèle) , afin que le garde-fou s'exécute sur les requêtes et les réponses.
- Cliquez sur Créer une politique .
Le garde-fou utilise un service de modèle d'évaluateur présélectionné (le juge LLM qui exécute la vérification). Pour utiliser un modèle différent, développez Options avancées avant de créer la politique ; vous avez besoin de CAN_QUERY sur le modèle que vous sélectionnez.
Après avoir attaché ou modifié une politique sur un service de modèle, laissez un court instant pour que la modification prenne effet avant de tester. Pendant la version bêta, la propagation peut prendre quelques minutes.
Étape 2 : ajoutez une politique de requête personnalisée
Les garde-fous couvrent les risques courants. Pour une règle spécifique à votre organisation, rédigez une politique personnalisée. Une politique personnalisée est une UDF SQL qui prend (event VARIANT) et renvoie une décision ; lisez le texte du message de event:context.message, une projection indépendante de l'API du dernier message utilisateur ou assistant.
Cette politique refuse toute demande qui mentionne un nom de code de projet confidentiel. La vérification event:type::string = 'request' le limite à ON CALL :
CREATE OR REPLACE FUNCTION main.governance.block_confidential_codename(
event VARIANT
)
RETURNS VARIANT
LANGUAGE SQL
RETURN
CASE
WHEN event:type::string = 'request'
AND contains(lower(event:context.message::string), 'project aurora')
THEN to_variant_object(named_struct('result', 'DENY', 'reason', 'Requests about confidential projects are not permitted.'))
ELSE to_variant_object(named_struct('result', 'ALLOW', 'reason', ''))
END;
contains et lower font partie du sous-ensemble SQL pris en charge dans les corps de stratégie. Pour la liste complète et les règles d'écriture d'une fonction de stratégie, consultez la référence des fonctions de stratégie de service.
Attachez la fonction en tant que politique personnalisée, limitée à la phase de requête :
- Sous l'tab Policies du service de modèle, cliquez sur New policy et entrez un Name , tel que
block-codename. - Sous **Type de garde-fou**, sélectionnez **Personnalisé**.
- Cliquez sur Fonction personnalisée , puis sur Sélectionner la fonction , et sélectionnez
main.governance.block_confidential_codename. - Sous Phase , sélectionnez uniquement Garde-fous d'entrée (Avant le modèle) , car il s'agit d'une politique de requête.
- Définissez le **rang** sur, puis cliquez sur **Créer une
10politique**.
Étape 3 : Ajouter une stratégie de réponse personnalisée
Un modèle peut également renvoyer du contenu que vous ne souhaitez pas faire passer. Cette politique refuse une réponse qui contient un Link non sécurisé (une URL http:// ou un URI javascript:). La vérification event:type::string = 'response' le limite à ON RESULT, de sorte qu'un utilisateur qui ne fait que mentionner ces schémas dans une invite ne le déclenche pas à l'entrée :
CREATE OR REPLACE FUNCTION main.governance.block_unsafe_links(
event VARIANT
)
RETURNS VARIANT
LANGUAGE SQL
RETURN
CASE
WHEN event:type::string = 'response'
AND (contains(lower(event:context.message::string), 'http://')
OR contains(lower(event:context.message::string), 'javascript:'))
THEN to_variant_object(named_struct('result', 'DENY', 'reason', 'Response contained an insecure link and was blocked by policy.'))
ELSE to_variant_object(named_struct('result', 'ALLOW', 'reason', ''))
END;
Associez la fonction en tant que stratégie personnalisée, dont la portée est limitée à la phase de réponse :
- Dans l'onglet **tab**, cliquez sur **Nouvelle stratégie** et saisissez un **Nom**, tel
block-unsafe-linksque. - Dans Type de garde-fou , sélectionnez Personnalisé , puis sélectionnez
main.governance.block_unsafe_linkssous Fonction personnalisée . - Sous Phase , sélectionnez uniquement Garde-fous de sortie (après le modèle) , car il s'agit d'une politique de réponse.
- Définissez le **rang** sur, puis cliquez sur **Créer une
20politique**.
Étape 4 : Vérifier
Les trois politiques apparaissent maintenant dans l'onglet Policies du service. Utilisez le playground pour confirmer que chacun se déclenche :
- Sur la page du service de modèle, cliquez sur **Discuter dans Terrain de jeux**.
- Envoyez une invite qui contient des PII, comme
My SSN is 123-45-6789, store it.Le garde-fou PII bloque la requête et vous recevez une erreur structurée. - Envoyer
Tell me about Project Aurora.La politique de demande la bloque avec la raison : Les demandes concernant des projets confidentiels ne sont pas autorisées. - Envoyez une invite qui fait que le modèle renvoie un
http://Link. La politique de réponse la bloque au niveau du résultat pour la raison suivante : La réponse contenait un Link non sécurisé et a été bloquée par la politique. - Envoyez une invite ordinaire. Cela renvoie une complétion normale.
Pour tester le service à partir de vos propres applications ou scripts, consultez Interroger des services de modèle.
Nettoyer
Une fois que vous avez terminé, supprimez les politiques dans l'onglet **Politiques** : ouvrez chaque politique que vous avez créée et supprimez-la. Ensuite, supprimez éventuellement les fonctions personnalisées :
DROP FUNCTION IF EXISTS main.governance.block_confidential_codename;
DROP FUNCTION IF EXISTS main.governance.block_unsafe_links;