Détectez les contenus préjudiciables dans les textes et les images.
Responses
Utilisez les modèles de modération d’OpenAI pour détecter les contenus préjudiciables dans les textes et les images. Vous pouvez classer des entrées indépendamment de toute génération avec le point de terminaison de modération ou demander des scores de modération en même temps qu’une réponse générée. Utilisez ces résultats pour appliquer les règles de votre application, par exemple pour filtrer du contenu, transmettre une requête pour examen ou prendre des mesures à l’égard des comptes qui soumettent des contenus signalés.
Le modèle omni-moderation-latest accepte du texte et des images en entrée. Il ne classe pas les contenus audio. L’utilisation du point de terminaison de modération est gratuite. La taille maximale d’un fichier image est de 20 Mo.
Protection des enfants : N’envoyez à l’API de modération aucun contenu dont vous savez ou soupçonnez qu’il s’agit de matériel pédopornographique. L’API n’est pas conçue pour détecter ou traiter ce type de matériel et ne remplace pas les dispositifs spécifiquement destinés à protéger les enfants. Consultez nos recommandations sur le matériel pédopornographique pour connaître les mesures de prévention, savoir détecter ce matériel, réagir en sa présence et le signaler.
Votre application doit déterminer quelles catégories de contenus préjudiciables s’appliquent au texte, aux images ou aux deux.
Modérez le contenu généré
Si votre application a besoin à la fois du texte généré et des scores de modération, incluez un objet moderation à la racine de la requête de génération. L’API renvoie les scores de modération de l’entrée du modèle et de la sortie générée sans nécessiter de requête de modération distincte.
Le modèle génère sa réponse comme d’habitude. Examinez les résultats de modération avant de présenter la sortie à un utilisateur ou de lancer d’autres actions à partir de cette sortie.
Renseignez moderation.model lors de la création d’une réponse :
Générez une réponse avec des scores de modération
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import OpenAI from "openai";const client = new OpenAI();const response = await client.responses.create({ model: "gpt-6-astra", input: [ { role: "user", content: "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative.", }, ], moderation: { model: "omni-moderation-latest" },});const inputModeration = response.moderation.input;const outputModeration = response.moderation.output;if (inputModeration.type === "error") { throw new Error(inputModeration.message);}if (outputModeration.type === "error") { throw new Error(outputModeration.message);}console.log(inputModeration.flagged);console.log(outputModeration.flagged);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27from openai import OpenAIclient = OpenAI()response = client.responses.create(model="gpt-6-astra",input=[ {"role": "user","content": ("A user asks for instructions to make a harmful weapon. ""Draft a brief refusal and offer a safer alternative." ), } ],moderation={"model": "omni-moderation-latest"},)input_moderation = response.moderation.inputoutput_moderation = response.moderation.outputif input_moderation.type =="error":raiseRuntimeError(input_moderation.message)if output_moderation.type =="error":raiseRuntimeError(output_moderation.message)print(input_moderation.flagged)print(output_moderation.flagged)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44import com.openai.client.OpenAIClient;import com.openai.client.okhttp.OpenAIOkHttpClient;import com.openai.core.JsonValue;import com.openai.models.responses.ResponseCreateParams;import java.util.ArrayList;import java.util.List;import java.util.Map;ResponseCreateParams params = ResponseCreateParams.builder() .model("gpt-6-astra") .input( "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative.") .putAdditionalBodyProperty( "moderation", JsonValue.from(Map.of("model", "omni-moderation-latest"))) .build();var response = client.responses().create(params);var moderation = response .moderation() .orElseThrow( () -> new IllegalStateException("The response did not include moderation results"));List<Boolean> flags = new ArrayList<>();var input = moderation.input();if (input.isError()) { throw new IllegalStateException(input.asError().message());}if (!input.isModerationResult()) { throw new IllegalStateException("Missing input moderation flag");}flags.add(input.asModerationResult().flagged());var output = moderation.output();if (output.isError()) { throw new IllegalStateException(output.asError().message());}if (!output.isModerationResult()) { throw new IllegalStateException("Missing output moderation flag");}flags.add(output.asModerationResult().flagged());flags.forEach(System.out::println);
1
2
3
4
5
6
7
8
9
10
11require "openai"client = OpenAI::Client.newresponse = client.responses.create( model: "gpt-6-astra", input: "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative.", moderation: { model: "omni-moderation-latest" })puts(response.moderation)
L’API Responses renvoie un objet moderation_result pour l’entrée dans response.moderation.input et un objet moderation_result pour la sortie dans response.moderation.output.
Renseignez moderation.model lors de la création d’une réponse avec l’API Chat Completions :
Générez une réponse avec des scores de modération via l’API Chat Completions
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26import OpenAI from "openai";const client = new OpenAI();const completion = await client.chat.completions.create({ model: "gpt-6-astra", messages: [ { role: "user", content: "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative.", }, ], moderation: { model: "omni-moderation-latest" },});const inputResult = completion.moderation.input;const outputResult = completion.moderation.output;if (inputResult.type === "error") throw new Error(inputResult.message);if (outputResult.type === "error") throw new Error(outputResult.message);const inputModeration = inputResult.results[0];const outputModeration = outputResult.results[0];console.log(inputModeration.flagged);console.log(outputModeration.flagged);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30from openai import OpenAIclient = OpenAI()completion = client.chat.completions.create(model="gpt-6-astra",messages=[ {"role": "user","content": ("A user asks for instructions to make a harmful weapon. ""Draft a brief refusal and offer a safer alternative." ), } ],moderation={"model": "omni-moderation-latest"},)input_result = completion.moderation.inputoutput_result = completion.moderation.outputif input_result.type =="error":raiseRuntimeError(input_result.message)if output_result.type =="error":raiseRuntimeError(output_result.message)input_moderation = input_result.results[0]output_moderation = output_result.results[0]print(input_moderation.flagged)print(output_moderation.flagged)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45import com.openai.client.OpenAIClient;import com.openai.client.okhttp.OpenAIOkHttpClient;import com.openai.core.JsonValue;import com.openai.models.chat.completions.ChatCompletionCreateParams;import java.util.ArrayList;import java.util.List;import java.util.Map;ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() .model("gpt-6-astra") .addUserMessage( "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative.") .putAdditionalBodyProperty( "moderation", JsonValue.from(Map.of("model", "omni-moderation-latest"))) .build();var completion = client.chat().completions().create(params);var moderation = completion .moderation() .orElseThrow( () -> new IllegalStateException("The completion did not include moderation results"));List<Boolean> flags = new ArrayList<>();var input = moderation.input();if (input.isError()) { throw new IllegalStateException(input.asError().message());}if (!input.isModerationResults() || input.asModerationResults().results().isEmpty()) { throw new IllegalStateException("Missing input moderation flag");}flags.add(input.asModerationResults().results().get(0).flagged());var output = moderation.output();if (output.isError()) { throw new IllegalStateException(output.asError().message());}if (!output.isModerationResults() || output.asModerationResults().results().isEmpty()) { throw new IllegalStateException("Missing output moderation flag");}flags.add(output.asModerationResults().results().get(0).flagged());flags.forEach(System.out::println);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16require "openai"client = OpenAI::Client.newcompletion = client.chat.completions.create( model: "gpt-6-astra", messages: [ { role: :user, content: "A user asks for instructions to make a harmful weapon. Draft a brief refusal and offer a safer alternative." } ], moderation: { model: "omni-moderation-latest" })puts(completion.moderation)
L’API Chat Completions regroupe les résultats de modération dans completion.moderation.input et completion.moderation.output. Si la requête génère un seul choix, lisez le premier résultat de l’entrée et celui de la sortie dans le champ results[0] de chaque objet. Si vous demandez plusieurs choix, completion.moderation.output.results[i] correspond à completion.choices[i].
Les résultats de modération inclus dans la réponse utilisent les mêmes champs de catégorie que ceux d’une requête de modération distincte. Consultez d’abord flagged pour prendre une première décision, puis examinez categories et category_scores pour alimenter vos journaux, orienter les requêtes, conserver une piste d’audit ou placer des contenus en file d’attente pour examen humain. Même un refus ou une autre réponse qui tient compte des règles de sécurité peut déclencher un signalement si cette réponse évoque un contenu préjudiciable. Utilisez les scores de modération comme des indicateurs pour appliquer les règles de votre application. Un score ne doit pas entraîner à lui seul un blocage automatique.
Si votre application doit gérer les échecs de modération, vérifiez le type de résultat avant de lire les scores. Si une étape de modération échoue, le champ de modération correspondant à l’entrée ou à la sortie peut contenir une erreur à la place des scores.
Pour les requêtes qui font appel à des outils, la modération couvre les arguments des appels d’outils et les sorties des outils lorsqu’ils figurent dans le contenu de la conversation. Elle ne couvre ni les noms, descriptions et schémas des outils, ni les schémas de format de réponse.
Si vous diffusez une réponse au fil de sa génération, vous recevez les scores de modération une fois la sortie complète disponible. Les fragments de sortie transmis pendant la génération ne contiennent pas ces scores.
Classez des entrées indépendamment de la génération
Voici un exemple de sortie complète pour une image extraite d’un film de guerre. Le modèle détecte des signes de violence dans l’image et attribue à la catégorie violence un score supérieur à 0,8.
Les champs de la réponse JSON indiquent les catégories détectées dans l’entrée et le degré de confiance du modèle pour chacune d’elles.
Champ de sortie
Description
flagged
Vaut true si le modèle classe le contenu comme potentiellement préjudiciable,
et false dans le cas contraire.
categories
Contient un dictionnaire de signalements par catégorie. Pour chaque catégorie,
la valeur est true si le modèle signale une infraction dans cette catégorie,
et false dans le cas contraire.
category_scores
Contient un dictionnaire de scores par catégorie. Chaque score indique le degré de confiance
du modèle quant à la présence, dans l’entrée, de contenu relevant de la catégorie.
Il varie de 0 à 1. Plus le score est élevé, plus la confiance du modèle est grande.
category_applied_input_types
Indique les types d’entrées auxquels s’applique le score de chaque catégorie. Par exemple,
si la catégorie violence/graphic s’applique à la fois aux images et au texte,
la propriété violence/graphic vaut ["image", "text"].
Nous prévoyons d’améliorer régulièrement le modèle utilisé par le point de terminaison de modération.
Si vos règles de modération reposent sur category_scores, vous devrez peut-être
les recalibrer au fil du temps.
Consultez les catégories prises en charge
Le tableau ci-dessous décrit les catégories de contenus que le point de terminaison de modération peut détecter et les types d’entrées pris en charge pour chacune d’elles.
Les catégories portant la mention « Texte uniquement » ne prennent pas en charge les images.
Si vous envoyez uniquement des images, sans texte, au modèle omni-moderation-latest,
il renvoie un score de 0 pour ces catégories. La taille maximale d’un fichier image est de 20 Mo.
Catégorie
Description
Entrées
harassment
Contenu qui tient des propos relevant du harcèlement, incite à en tenir ou les encourage,
quelle que soit la cible.
Texte uniquement
harassment/threatening
Contenu relevant du harcèlement qui comporte aussi des violences ou des atteintes graves
à l’encontre de la cible, quelle qu’elle soit.
Texte uniquement
hate
Contenu qui exprime, attise ou encourage la haine fondée sur la race, le genre, l’origine ethnique,
la religion, la nationalité, l’orientation sexuelle, le handicap ou la caste.
Les contenus haineux visant des groupes non protégés, comme les joueurs d’échecs, relèvent du harcèlement.
Texte uniquement
hate/threatening
Contenu haineux qui comporte aussi des violences ou des atteintes graves à l’encontre d’un groupe
ciblé en raison de la race, du genre, de l’origine ethnique, de la religion, de la nationalité,
de l’orientation sexuelle, du handicap ou de la caste de ses membres.
Texte uniquement
illicit
Contenu qui donne des conseils ou des instructions pour commettre des actes illicites.
Une expression comme « comment voler à l’étalage » relève de cette catégorie.
Texte uniquement
illicit/violent
Mêmes types de contenus que ceux signalés dans la catégorie illicit, avec en plus
des références à la violence ou à l’acquisition d’une arme.
Texte uniquement
self-harm
Contenu qui décrit, encourage ou valorise des comportements par lesquels une personne se fait du mal,
comme le suicide, les scarifications ou les conduites liées aux troubles alimentaires.
Texte et images
self-harm/intent
Contenu dans lequel une personne indique qu’elle se fait du mal ou qu’elle en a l’intention,
par exemple en évoquant le suicide, des scarifications ou des conduites liées aux troubles alimentaires.
Texte et images
self-harm/instructions
Contenu qui incite une personne à se faire du mal, par exemple par le suicide, les scarifications
ou des conduites liées aux troubles alimentaires, ou qui donne des instructions ou des conseils
sur la manière de le faire.
Texte et images
sexual
Contenu destiné à susciter l’excitation sexuelle, par exemple en décrivant une activité sexuelle,
ou qui fait la promotion de services sexuels. L’éducation sexuelle et le bien-être sexuel sont exclus.
Texte et images
sexual/minors
Contenu sexuel impliquant une personne de moins de 18 ans.
Texte uniquement
violence
Contenu qui représente la mort, des violences ou des blessures physiques.
Texte et images
violence/graphic
Contenu qui représente de manière crue et détaillée la mort, des violences ou des blessures physiques.