Modération de contenu avec l'API
Modération de contenu avec l’API
L’API de modération d’OpenAI permet de détecter automatiquement les contenus inappropriés. C’est un outil gratuit et essentiel pour toute application qui accepte du contenu utilisateur.
L’API Moderation
from openai import OpenAI
client = OpenAI()
# L'API de modération est GRATUITE
moderation = client.moderations.create(
model="omni-moderation-latest",
input="Bonjour, comment allez-vous ?"
)
result = moderation.results[0]
print(f"Contenu flaggé : {result.flagged}")
print(f"Catégories : {result.categories}")
# Résultat :
# Contenu flaggé : False
# Catégories : Categories(harassment=False, hate=False, ...)
Les catégories de modération
L’API détecte plusieurs catégories de contenu problématique :
def analyser_moderation(texte: str) -> dict:
"""Analyse détaillée de la modération."""
moderation = client.moderations.create(
model="omni-moderation-latest",
input=texte
)
result = moderation.results[0]
# Catégories disponibles
categories = {
"harassment": result.categories.harassment,
"harassment_threatening": result.categories.harassment_threatening,
"hate": result.categories.hate,
"hate_threatening": result.categories.hate_threatening,
"self_harm": result.categories.self_harm,
"self_harm_instructions": result.categories.self_harm_instructions,
"self_harm_intent": result.categories.self_harm_intent,
"sexual": result.categories.sexual,
"sexual_minors": result.categories.sexual_minors,
"violence": result.categories.violence,
"violence_graphic": result.categories.violence_graphic,
}
# Scores de confiance (0.0 a 1.0)
scores = {
"harassment": result.category_scores.harassment,
"hate": result.category_scores.hate,
"self_harm": result.category_scores.self_harm,
"sexual": result.category_scores.sexual,
"violence": result.category_scores.violence,
}
return {
"flagged": result.flagged,
"categories_detectees": [k for k, v in categories.items() if v],
"scores_principaux": {k: round(v, 4) for k, v in scores.items()},
}
# Test
resultat = analyser_moderation("Bonjour tout le monde !")
print(f"Flaggé : {resultat['flagged']}")
print(f"Scores : {resultat['scores_principaux']}")
Pipeline de modération complet
Modérer les entrées utilisateur
class ContentModerator:
"""Modérateur de contenu pour les applications."""
def __init__(self, seuil_custom: float = 0.5):
self.client = OpenAI()
self.seuil = seuil_custom
def moderer(self, texte: str) -> tuple[bool, dict]:
"""Modère un texte. Retourne (est_acceptable, détails)."""
moderation = self.client.moderations.create(
model="omni-moderation-latest",
input=texte
)
result = moderation.results[0]
if result.flagged:
categories = []
if result.categories.harassment:
categories.append("harcèlement")
if result.categories.hate:
categories.append("discours haineux")
if result.categories.sexual:
categories.append("contenu sexuel")
if result.categories.violence:
categories.append("violence")
if result.categories.self_harm:
categories.append("automutilation")
return False, {
"raison": "Contenu inapproprié détecté",
"categories": categories
}
return True, {"raison": "Contenu acceptable"}
def moderer_conversation(self, messages: list[str]) -> list[dict]:
"""Modère une liste de messages."""
resultats = []
for msg in messages:
acceptable, details = self.moderer(msg)
resultats.append({
"message": msg[:50] + "..." if len(msg) > 50 else msg,
"acceptable": acceptable,
**details
})
return resultats
# Utilisation
moderateur = ContentModerator()
acceptable, details = moderateur.moderer("Bonjour, comment puis-je vous aider ?")
print(f"Acceptable : {acceptable}")
print(f"Détails : {details}")
Intégration dans le pipeline API
def chatbot_modere(user_input: str) -> str:
"""Chatbot avec modération des entrées ET des sorties."""
moderateur = ContentModerator()
# 1. Modérer l'entrée
input_ok, input_details = moderateur.moderer(user_input)
if not input_ok:
return (f"Votre message a été bloqué : "
f"{', '.join(input_details['categories'])}")
# 2. Générer la réponse
response = client.responses.create(
model="gpt-5.3",
instructions="Répondez de manière professionnelle et sûre.",
input=user_input
)
# 3. Modérer la sortie
output_ok, output_details = moderateur.moderer(response.output_text)
if not output_ok:
return "Je ne suis pas en mesure de fournir cette réponse."
return response.output_text
# Test
print(chatbot_modere("Quelle est la capitale de la France ?"))
Modération en batch
Pour modérer de gros volumes efficacement :
def moderer_batch(textes: list[str]) -> list[dict]:
"""Modère plusieurs textes en une seule requête."""
resultats = []
# L'API accepte un tableau d'inputs
moderation = client.moderations.create(
model="omni-moderation-latest",
input=textes
)
for i, result in enumerate(moderation.results):
resultats.append({
"index": i,
"texte_preview": textes[i][:50],
"flagged": result.flagged,
})
flagged_count = sum(1 for r in resultats if r["flagged"])
print(f"Modéré {len(textes)} textes : {flagged_count} flaggés")
return resultats
# Utilisation
textes = [
"Bonjour, comment allez-vous ?",
"Super produit, je recommande !",
"Le service client est excellent.",
]
resultats = moderer_batch(textes)
Logging de la modération
import json
import logging
from datetime import datetime
logger = logging.getLogger("moderation")
def moderer_avec_log(texte: str, user_id: str = "anonymous") -> bool:
"""Modère et logue le résultat pour audit."""
moderation = client.moderations.create(
model="omni-moderation-latest",
input=texte
)
result = moderation.results[0]
log_entry = {
"timestamp": datetime.now().isoformat(),
"user_id": user_id,
"flagged": result.flagged,
"text_preview": texte[:100],
"scores": {
"harassment": round(result.category_scores.harassment, 4),
"hate": round(result.category_scores.hate, 4),
"violence": round(result.category_scores.violence, 4),
}
}
if result.flagged:
logger.warning(json.dumps(log_entry))
else:
logger.info(json.dumps(log_entry))
return not result.flagged
# Utilisation
est_ok = moderer_avec_log("Message de test", user_id="user-123")
Points clés à retenir
- L’API de modération est gratuite — utilisez-la systématiquement
- Modérez les entrées (contenu utilisateur) ET les sorties (réponses du modèle)
- Le modèle
omni-moderation-latestcouvre toutes les catégories de contenu - Loguez toutes les décisions de modération pour l’audit
- Utilisez le batch pour modérer efficacement de gros volumes
- La modération est un complément aux instructions système, pas un remplacement