Visitez notre guide de modération de contenu pour voir un exemple d’implémentation de modération de contenu utilisant Claude.

Ce guide se concentre sur la modération du contenu généré par les utilisateurs au sein de votre application. Si vous recherchez des conseils sur la modération des interactions avec Claude, veuillez consulter notre guide des garde-fous.

Avant de construire avec Claude

Décider si utiliser Claude pour la modération de contenu

Voici quelques indicateurs clés qui suggèrent d’utiliser un LLM comme Claude plutôt qu’une approche traditionnelle basée sur le ML ou les règles pour la modération de contenu :

Anthropic a formé tous les modèles Claude à être honnêtes, utiles et inoffensifs. Cela peut amener Claude à modérer du contenu jugé particulièrement dangereux (conformément à notre Politique d’utilisation acceptable), indépendamment du prompt utilisé. Par exemple, un site web pour adultes qui souhaite permettre aux utilisateurs de publier du contenu sexuel explicite peut constater que Claude signale toujours le contenu explicite comme nécessitant une modération, même s’ils spécifient dans leur prompt de ne pas modérer le contenu sexuel explicite. Nous recommandons de consulter notre PUA avant de construire une solution de modération.

Générer des exemples de contenu à modérer

Avant de développer une solution de modération de contenu, créez d’abord des exemples de contenu qui devrait être signalé et de contenu qui ne devrait pas l’être. Assurez-vous d’inclure des cas limites et des scénarios difficiles qui peuvent être complexes à gérer efficacement pour un système de modération de contenu. Ensuite, examinez vos exemples pour créer une liste bien définie de catégories de modération. Par exemple, les exemples générés par une plateforme de médias sociaux pourraient inclure :

allowed_user_comments = [
    'Ce film était génial, je l\'ai vraiment apprécié. L\'acteur principal a vraiment tué !',
    'Je déteste les lundis.',
    'C\'est le bon moment pour investir dans l\'or !'
]

disallowed_user_comments = [
    'Supprime ce post maintenant ou tu ferais mieux de te cacher. Je viens pour toi et ta famille.',
    'Évitez les téléphones 5G !! Ils utilisent la 5G pour vous contrôler.',
    'Félicitations ! Vous avez gagné une carte cadeau de 1 000 €. Cliquez ici pour réclamer votre prix !'
]

# Exemples de commentaires d'utilisateurs pour tester la modération de contenu
user_comments = allowed_user_comments + disallowed_user_comments

# Liste des catégories considérées comme dangereuses pour la modération de contenu
unsafe_categories = [
    'Exploitation des enfants',
    'Théories du complot',
    'Haine',
    'Armes indiscriminées', 
    'Propriété intellectuelle',
    'Crimes non violents', 
    'Vie privée',
    'Automutilation',
    'Crimes sexuels',
    'Contenu sexuel',
    'Conseils spécialisés',
    'Crimes violents'
]

La modération efficace de ces exemples nécessite une compréhension nuancée du langage. Dans le commentaire Ce film était génial, je l'ai vraiment apprécié. L'acteur principal a vraiment tué !, le système de modération de contenu doit reconnaître que “tué” est une métaphore, et non une indication de violence réelle. À l’inverse, malgré l’absence de mentions explicites de violence, le commentaire Supprime ce post maintenant ou tu ferais mieux de te cacher. Je viens pour toi et ta famille. devrait être signalé par le système de modération de contenu.

La liste unsafe_categories peut être personnalisée pour répondre à vos besoins spécifiques. Par exemple, si vous souhaitez empêcher les mineurs de créer du contenu sur votre site web, vous pourriez ajouter “Publication par des mineurs” à la liste.


Comment modérer le contenu en utilisant Claude

Sélectionner le bon modèle Claude

Lors de la sélection d’un modèle, il est important de considérer la taille de vos données. Si les coûts sont une préoccupation, un modèle plus petit comme Claude 3 Haiku est un excellent choix en raison de son rapport coût-efficacité. Voici une estimation du coût pour modérer le texte pour une plateforme de médias sociaux qui reçoit un milliard de publications par mois :

  • Taille du contenu

    • Publications par mois : 1 Md
    • Caractères par publication : 100
    • Total des caractères : 100 Md
  • Tokens estimés

    • Tokens d’entrée : 28,6 Md (en supposant 1 token pour 3,5 caractères)
    • Pourcentage de messages signalés : 3%
    • Tokens de sortie par message signalé : 50
    • Total des tokens de sortie : 1,5 Md
  • Coût estimé pour Claude 3 Haiku

    • Coût des tokens d’entrée : 2 860 MTok * 0,25 /MTok=715/MTok = 715
    • Coût des tokens de sortie : 1 500 MTok * 1,25 /MTok=1875/MTok = 1 875
    • Coût mensuel : 715 +1875+ 1 875 = 2 590 $
  • Coût estimé pour Claude 3.7 Sonnet

    • Coût des tokens d’entrée : 2 860 MTok * 3,00 /MTok=8580/MTok = 8 580
    • Coût des tokens de sortie : 1 500 MTok * 15,00 /MTok=22500/MTok = 22 500
    • Coût mensuel : 8 580 +22500+ 22 500 = 31 080 $
Les coûts réels peuvent différer de ces estimations. Ces estimations sont basées sur le prompt mis en évidence dans la section sur le traitement par lots. Les tokens de sortie peuvent être réduits davantage en supprimant le champ explanation de la réponse.

Construire un prompt solide

Pour utiliser Claude pour la modération de contenu, Claude doit comprendre les exigences de modération de votre application. Commençons par écrire un prompt qui vous permet de définir vos besoins en matière de modération :

import anthropic
import json

# Initialiser le client Anthropic
client = anthropic.Anthropic()

def moderate_message(message, unsafe_categories):
    # Convertir la liste des catégories dangereuses en chaîne, avec chaque catégorie sur une nouvelle ligne
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Construire le prompt pour Claude, incluant le message et les catégories dangereuses
    assessment_prompt = f"""
    Déterminez si le message suivant nécessite une modération, 
    en fonction des catégories dangereuses décrites ci-dessous.
    
    Message :
    <message>{message}</message>

    Catégories dangereuses :
    <categories>
    {unsafe_category_str}
    </categories>

    Répondez UNIQUEMENT avec un objet JSON, en utilisant le format ci-dessous :
    {{
    "violation": <Champ booléen indiquant si le message doit être modéré>,
    "categories": [Liste des catégories violées séparées par des virgules],
    "explanation": [Optionnel. À inclure uniquement s'il y a une violation.]
    }}"""

    # Envoyer la requête à Claude pour la modération de contenu
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Utilisation du modèle Haiku pour des coûts plus bas
        max_tokens=200,
        temperature=0,   # Utiliser une température de 0 pour plus de cohérence
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Analyser la réponse JSON de Claude
    assessment = json.loads(response.content[0].text)
    
    # Extraire le statut de violation de l'évaluation
    contains_violation = assessment['violation']
    
    # S'il y a une violation, obtenir les catégories et l'explication ; sinon, utiliser des valeurs par défaut vides
    violated_categories = assessment.get('categories', []) if contains_violation else []
    explanation = assessment.get('explanation') if contains_violation else None
    
    return contains_violation, violated_categories, explanation

# Traiter chaque commentaire et afficher les résultats
for comment in user_comments:
    print(f"\nCommentaire : {comment}")
    violation, violated_categories, explanation = moderate_message(comment, unsafe_categories)
    
    if violation:
        print(f"Catégories violées : {', '.join(violated_categories)}")
        print(f"Explication : {explanation}")
    else:
        print("Aucun problème détecté.")

Dans cet exemple, la fonction moderate_message contient un prompt d’évaluation qui inclut les catégories de contenu dangereux et le message que nous souhaitons évaluer. Le prompt demande à Claude d’évaluer si le message doit être modéré, en fonction des catégories dangereuses que nous avons définies.

L’évaluation du modèle est ensuite analysée pour déterminer s’il y a une violation. S’il y a une violation, Claude renvoie également une liste des catégories violées, ainsi qu’une explication sur la raison pour laquelle le message est dangereux.

Évaluer votre prompt

La modération de contenu est un problème de classification. Ainsi, vous pouvez utiliser les mêmes techniques décrites dans notre guide de classification pour déterminer la précision de votre système de modération de contenu.

Une considération supplémentaire est qu’au lieu de traiter la modération de contenu comme un problème de classification binaire, vous pouvez créer plusieurs catégories pour représenter différents niveaux de risque. La création de plusieurs niveaux de risque vous permet d’ajuster l’agressivité de votre modération. Par exemple, vous pourriez vouloir bloquer automatiquement les requêtes des utilisateurs jugées à haut risque, tandis que les utilisateurs ayant de nombreuses requêtes à risque moyen sont signalés pour un examen humain.

import anthropic
import json

# Initialiser le client Anthropic
client = anthropic.Anthropic()

def assess_risk_level(message, unsafe_categories):
    # Convertir la liste des catégories dangereuses en chaîne, avec chaque catégorie sur une nouvelle ligne
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Construire le prompt pour Claude, incluant le message, les catégories dangereuses et les définitions des niveaux de risque
    assessment_prompt = f"""
    Évaluez le niveau de risque du message suivant nécessitant une modération, 
    en fonction des catégories dangereuses listées ci-dessous.
    
Message :
<message>{message}</message>

Catégories dangereuses :
<categories>
{unsafe_category_str}
</categories>

Attribuez un niveau de risque basé sur votre confiance que le message de l'utilisateur doit être modéré 
selon les catégories dangereuses définies :

0 - Aucun risque
1 - Risque faible
2 - Risque moyen
3 - Risque élevé

Répondez UNIQUEMENT avec un objet JSON, en utilisant le format ci-dessous :
{{
  "risk_level": <Champ numérique indiquant le niveau de risque>,
  "categories": [Liste des catégories violées séparées par des virgules],
  "explanation": <Optionnel. À inclure uniquement si le niveau de risque est supérieur à 0>
}}"""

    # Envoyer la requête à Claude pour l'évaluation des risques
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Utilisation du modèle Haiku pour des coûts plus bas
        max_tokens=200,
        temperature=0,   # Utiliser une température de 0 pour plus de cohérence
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Analyser la réponse JSON de Claude
    assessment = json.loads(response.content[0].text)
    
    # Extraire le niveau de risque, les catégories violées et l'explication de l'évaluation
    risk_level = assessment["risk_level"]
    violated_categories = assessment["categories"]
    explanation = assessment.get("explanation")
    
    return risk_level, violated_categories, explanation

# Traiter chaque commentaire et afficher les résultats
for comment in user_comments:
    print(f"\nCommentaire : {comment}")
    risk_level, violated_categories, explanation = assess_risk_level(comment, unsafe_categories)
    
    print(f"Niveau de risque : {risk_level}")
    if violated_categories:
        print(f"Catégories violées : {', '.join(violated_categories)}")
    if explanation:
        print(f"Explication : {explanation}")

Ce code implémente une fonction assess_risk_level qui utilise Claude pour évaluer le niveau de risque d’un message. La fonction accepte un message et une liste de catégories dangereuses comme entrées.

Dans la fonction, un prompt est généré pour Claude, incluant le message à évaluer, les catégories dangereuses et des instructions spécifiques pour évaluer le niveau de risque. Le prompt demande à Claude de répondre avec un objet JSON qui inclut le niveau de risque, les catégories violées et une explication optionnelle.

Cette approche permet une modération de contenu flexible en attribuant des niveaux de risque. Elle peut être intégrée de manière transparente dans un système plus large pour automatiser le filtrage du contenu ou signaler les commentaires pour un examen humain en fonction de leur niveau de risque évalué. Par exemple, lors de l’exécution de ce code, le commentaire Supprime ce post maintenant ou tu ferais mieux de te cacher. Je viens pour toi et ta famille. est identifié comme à haut risque en raison de sa menace dangereuse. À l’inverse, le commentaire Évitez les téléphones 5G !! Ils utilisent la 5G pour vous contrôler. est catégorisé comme à risque moyen.

Déployer votre prompt

Une fois que vous êtes confiant dans la qualité de votre solution, il est temps de la déployer en production. Voici quelques bonnes pratiques à suivre lors de l’utilisation de la modération de contenu en production :

  1. Fournir un retour clair aux utilisateurs : Lorsque l’entrée d’un utilisateur est bloquée ou qu’une réponse est signalée en raison de la modération de contenu, fournissez un retour informatif et constructif pour aider les utilisateurs à comprendre pourquoi leur message a été signalé et comment ils peuvent le reformuler de manière appropriée. Dans les exemples de code ci-dessus, cela est fait via la balise explanation dans la réponse de Claude.

  2. Analyser le contenu modéré : Gardez une trace des types de contenu signalés par votre système de modération pour identifier les tendances et les domaines potentiels d’amélioration.

  3. Évaluer et améliorer continuellement : Évaluez régulièrement les performances de votre système de modération de contenu en utilisant des métriques telles que le suivi de la précision et du rappel. Utilisez ces données pour affiner itérativement vos prompts de modération, mots-clés et critères d’évaluation.


Améliorer les performances

Dans des scénarios complexes, il peut être utile de considérer des stratégies supplémentaires pour améliorer les performances au-delà des techniques d’ingénierie de prompt standard. Voici quelques stratégies avancées :

Définir les sujets et fournir des exemples

En plus de lister les catégories dangereuses dans le prompt, des améliorations supplémentaires peuvent être apportées en fournissant des définitions et des phrases liées à chaque catégorie.

import anthropic
import json

# Initialiser le client Anthropic
client = anthropic.Anthropic()

# Dictionnaire des catégories considérées comme dangereuses pour la modération de contenu, avec leurs définitions
unsafe_category_definitions = {
    'Exploitation des enfants': 'Contenu qui dépeint la nudité des enfants ou qui permet, encourage, excuse ou dépeint l\'abus sexuel des enfants.',
    'Théories du complot': """Contenu qui promeut ou approuve des théories non fondées, fausses ou trompeuses sur des événements, situations ou individus, 
        qui peuvent inciter à la violence ou miner la confiance du public dans les institutions ou les faits.""",
    'Haine': """Contenu qui est haineux envers les personnes sur la base de leurs caractéristiques protégées 
        (race, couleur, ethnicité, origine nationale, handicap, affiliation religieuse, caste, orientation sexuelle, sexe, identité de genre et maladie grave), 
        ou contenu qui perpétue des stéréotypes négatifs.""",
    'Armes indiscriminées': 'Contenu qui permet la création d\'armes de destruction massive.', 
    'Propriété intellectuelle': 'Contenu qui viole les droits de propriété intellectuelle de tiers.',
    'Crimes non violents': 'Contenu qui permet, encourage ou excuse la commission de crimes non violents.', 
    'Vie privée': 'Contenu qui contient des informations sensibles et personnelles sur des individus privés.',
    'Automutilation': 'Contenu qui permet, encourage ou excuse les actes d\'automutilation intentionnelle.',
    'Crimes sexuels': 'Contenu qui permet, encourage ou excuse la commission de crimes sexuels.',
    'Contenu sexuel': 'Contenu qui contient des descriptions érotiques ou des représentations explicites  d\'actes sexuels.',
    'Conseils spécialisés': """Contenu qui contient des conseils financiers, médicaux ou juridiques. 
        Les conseils financiers incluent des orientations sur les investissements, les actions, les obligations ou toute planification financière.""",
    'Crimes violents': 'Contenu qui permet, encourage ou excuse la commission de crimes violents.', 
}


def moderate_message_with_definitions(message, unsafe_category_definitions):
    # Formater la chaîne des catégories dangereuses, avec chaque catégorie et sa définition sur une nouvelle ligne
    unsafe_category_str = '\n'.join(f'{category}: {definition}' 
        for category, definition in unsafe_category_definitions.items()
    )
    
    # Construire le prompt pour Claude, incluant le message et les catégories dangereuses
    assessment_prompt = f"""Déterminez si le message suivant nécessite une modération, en fonction des catégories dangereuses décrites ci-dessous.

Message :
<message>{message}</message>

Catégories dangereuses et leurs définitions :
<categories>
{unsafe_category_str}
</categories>

Il est important que vous vous souveniez de toutes les catégories dangereuses et de leurs définitions.

Répondez UNIQUEMENT avec un objet JSON, en utilisant le format ci-dessous :
{{
  "violation": <Champ booléen indiquant si le message doit être modéré>,
  "categories": [Liste des catégories violées séparées par des virgules],
  "explanation": [Optionnel. À inclure uniquement s'il y a une violation.]
}}"""

    # Envoyer la requête à Claude pour la modération de contenu
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Utilisation du modèle Haiku pour des coûts plus bas
        max_tokens=200,
        temperature=0,   # Utiliser une température de 0 pour plus de cohérence
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Analyser la réponse JSON de Claude
    assessment = json.loads(response.content[0].text)
    
    # Extraire le statut de violation de l'évaluation
    contains_violation = assessment['violation']
    
    # S'il y a une violation, obtenir les catégories et l'explication ; sinon, utiliser des valeurs par défaut vides
    violated_categories = assessment.get('categories', []) if contains_violation else []
    explanation = assessment.get('explanation') if contains_violation else None
    
    return contains_violation, violated_categories, explanation


# Traiter chaque commentaire et afficher les résultats
for comment in user_comments:
    print(f"\nCommentaire : {comment}")
    violation, violated_categories, explanation = moderate_message_with_definitions(comment, unsafe_category_definitions)
    
    if violation:
        print(f"Catégories violées : {', '.join(violated_categories)}")
        print(f"Explication : {explanation}")
    else:
        print("Aucun problème détecté.")

La fonction moderate_message_with_definitions étend la fonction moderate_message précédente en permettant à chaque catégorie dangereuse d’être associée à une définition détaillée. Cela se produit dans le code en remplaçant la liste unsafe_categories de la fonction originale par un dictionnaire unsafe_category_definitions. Ce dictionnaire associe chaque catégorie dangereuse à sa définition correspondante. Les noms des catégories et leurs définitions sont inclus dans le prompt.

Notamment, la définition de la catégorie Conseils spécialisés spécifie maintenant les types de conseils financiers qui devraient être interdits. En conséquence, le commentaire C'est le bon moment pour investir dans l'or !, qui avait précédemment passé l’évaluation moderate_message, déclenche maintenant une violation.

Considérer le traitement par lots

Pour réduire les coûts dans les situations où la modération en temps réel n’est pas nécessaire, envisagez de modérer les messages par lots. Incluez plusieurs messages dans le contexte du prompt et demandez à Claude d’évaluer quels messages doivent être modérés.

import anthropic
import json

# Initialiser le client Anthropic
client = anthropic.Anthropic()

def batch_moderate_messages(messages, unsafe_categories):
    # Convertir la liste des catégories dangereuses en chaîne, avec chaque catégorie sur une nouvelle ligne
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Formater la chaîne des messages, avec chaque message enveloppé dans des balises de type XML et doté d'un ID
    messages_str = '\n'.join([f'<message id={idx}>{msg}</message>' for idx, msg in enumerate(messages)])
    
    # Construire le prompt pour Claude, incluant les messages et les catégories dangereuses
    assessment_prompt = f"""Déterminez les messages à modérer, en fonction des catégories dangereuses décrites ci-dessous.

Messages :
<messages>
{messages_str}
</messages>

Catégories dangereuses et leurs définitions :
<categories>
{unsafe_category_str}
</categories>

Répondez UNIQUEMENT avec un objet JSON, en utilisant le format ci-dessous :
{{
  "violations": [
    {{
      "id": <id du message>,
      "categories": [liste des catégories violées],
      "explanation": <Explication de la violation>
    }},
    ...
  ]
}}

Notes importantes :
- N'oubliez pas d'analyser chaque message pour une violation.
- Sélectionnez toutes les violations qui s'appliquent raisonnablement."""

    # Envoyer la requête à Claude pour la modération de contenu
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Utilisation du modèle Haiku pour des coûts plus bas
        max_tokens=2048,  # Augmentation du nombre maximal de tokens pour gérer les lots
        temperature=0,    # Utiliser une température de 0 pour plus de cohérence
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Analyser la réponse JSON de Claude
    assessment = json.loads(response.content[0].text)
    return assessment


# Traiter le lot de commentaires et obtenir la réponse
response_obj = batch_moderate_messages(user_comments, unsafe_categories)

# Afficher les résultats pour chaque violation détectée
for violation in response_obj['violations']:
    print(f"""Commentaire : {user_comments[violation['id']]}
Catégories violées : {', '.join(violation['categories'])}
Explication : {violation['explanation']}
""")

Dans cet exemple, la fonction batch_moderate_messages gère la modération d’un lot entier de messages avec un seul appel à l’API Claude. À l’intérieur de la fonction, un prompt est créé qui inclut la liste des messages à évaluer, les catégories de contenu dangereux définies et leurs descriptions. Le prompt demande à Claude de renvoyer un objet JSON listant tous les messages qui contiennent des violations. Chaque message dans la réponse est identifié par son id, qui correspond à la position du message dans la liste d’entrée. Gardez à l’esprit que trouver la taille de lot optimale pour vos besoins spécifiques peut nécessiter quelques expérimentations. Bien que des tailles de lot plus importantes puissent réduire les coûts, elles peuvent aussi entraîner une légère diminution de la qualité. De plus, vous devrez peut-être augmenter le paramètre max_tokens dans l’appel à l’API Claude pour accommoder des réponses plus longues. Pour plus de détails sur le nombre maximum de tokens que votre modèle choisi peut produire, consultez la page de comparaison des modèles.