Use os modelos de moderação da OpenAI para detectar conteúdo nocivo em textos e imagens. Você pode classificar entradas de forma independente com o endpoint de moderação ou solicitar pontuações de moderação junto com uma resposta gerada. Use os resultados para aplicar a política do seu aplicativo. Por exemplo, você pode filtrar conteúdo, encaminhar uma solicitação para análise ou tomar medidas em relação a contas que enviam conteúdo sinalizado.
O modelo omni-moderation-latest aceita entradas de texto e imagem. Ele não classifica áudio. O uso do endpoint de moderação é gratuito, e cada arquivo de imagem pode ter até 20 MB.
Segurança infantil: Não envie à API de moderação nenhum conteúdo que você saiba ou suspeite ser material de abuso sexual infantil (CSAM). A API não foi projetada para detectar ou lidar com CSAM e não substitui medidas específicas de proteção infantil. Consulte nossas orientações sobre CSAM para saber como prevenir e detectar casos de CSAM, como responder a eles e como denunciá-los.
Seu aplicativo precisa saber quais categorias de conteúdo nocivo se aplicam a textos, imagens ou ambos.
Moderar conteúdo gerado
Quando seu aplicativo precisar receber o texto gerado e as pontuações de moderação na mesma resposta, inclua um objeto moderation no nível superior da solicitação de geração. A API retorna as pontuações de moderação da entrada do modelo e da saída gerada sem exigir uma solicitação de moderação separada.
O modelo continua gerando texto normalmente. Analise os resultados da moderação antes de mostrar a saída ao usuário ou executar ações que dependam dela.
Defina moderation.model ao criar uma resposta:
Gerar uma resposta com pontuações de moderação
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)
A API Responses retorna um objeto moderation_result para a entrada em response.moderation.input e um objeto moderation_result para a saída em response.moderation.output.
Defina moderation.model ao criar uma resposta de chat:
Gerar uma resposta de chat com pontuações de moderação
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)
A API chat completions retorna os objetos que contêm os resultados da moderação em completion.moderation.input e completion.moderation.output. Se a solicitação gerar uma única opção, consulte results[0] em cada objeto para obter o primeiro resultado de entrada e o primeiro de saída. Se você solicitar várias opções, completion.moderation.output.results[i] corresponderá a completion.choices[i].
Os resultados de moderação que acompanham a resposta usam os mesmos campos de categoria que os resultados de uma solicitação de moderação separada. Comece por flagged para tomar uma decisão inicial. Depois, examine categories e category_scores para registrar eventos, encaminhar solicitações, manter trilhas de auditoria ou organizar filas de revisão humana. Mesmo uma recusa ou outra resposta que leve em conta a segurança pode ser sinalizada se abordar conteúdo nocivo. Use as pontuações de moderação como sinais para aplicar a política do seu aplicativo. Uma pontuação, por si só, não deve determinar o bloqueio automático do conteúdo.
Se o aplicativo precisar lidar com falhas de moderação, verifique o tipo de resultado antes de ler as pontuações. Se uma etapa de moderação não puder ser concluída, o campo de moderação correspondente à entrada ou à saída poderá conter um erro em vez das pontuações.
Em solicitações com chamadas de ferramentas, a moderação abrange os argumentos das chamadas e as saídas das ferramentas quando aparecem no conteúdo da conversa. Ela não abrange nomes, descrições ou schemas das ferramentas, nem schemas de formato de resposta.
Se você transmitir uma resposta gerada por streaming, as pontuações de moderação chegarão depois que toda a saída gerada estiver disponível. Os trechos parciais da saída não incluem essas pontuações.
O exemplo abaixo mostra a saída completa para uma imagem de um único quadro de um filme de guerra. O modelo identifica indícios de violência na imagem e atribui à categoria violence uma pontuação superior a 0,8.
A resposta JSON inclui campos que indicam quais categorias estão presentes na entrada e o grau de confiança do modelo em cada classificação.
Campo de saída
Descrição
flagged
O valor é true se o modelo classificar o conteúdo como potencialmente nocivo e false caso contrário.
categories
Contém um dicionário que indica se houve violação em cada categoria. O valor é true se o modelo sinalizar uma violação na categoria correspondente e false caso contrário.
category_scores
Contém um dicionário de pontuações por categoria. Cada pontuação indica o grau de confiança do modelo de que a entrada contém conteúdo daquela categoria. O valor varia de 0 a 1. Quanto maior o valor, maior a confiança.
category_applied_input_types
Contém os tipos de entrada aos quais se aplica a pontuação de cada categoria. Por exemplo, se a categoria violence/graphic se aplicar tanto a imagens quanto a textos, o valor da propriedade violence/graphic será ["image", "text"].
Planejamos atualizar continuamente o modelo usado pelo endpoint de moderação. Por isso, pode ser necessário recalibrar, ao longo do tempo, as políticas personalizadas que dependem de category_scores.
Consultar as categorias compatíveis
A tabela abaixo descreve as categorias de conteúdo que o endpoint de moderação consegue detectar e os tipos de entrada compatíveis com cada uma.
As categorias marcadas como “Somente texto” não aceitam entradas de imagem. Se você enviar apenas imagens, sem texto, ao modelo omni-moderation-latest, ele retornará uma pontuação de 0 para essas categorias. Cada arquivo de imagem pode ter até 20 MB.
Categoria
Descrição
Entradas
harassment
Conteúdo que usa linguagem de assédio contra qualquer alvo ou que incita ou promove o uso dessa linguagem.
Somente texto
harassment/threatening
Conteúdo de assédio que também envolve violência ou danos graves contra qualquer alvo.
Somente texto
hate
Conteúdo que expressa, incita ou promove ódio com base em raça, gênero, etnia, religião, nacionalidade, orientação sexual, deficiência ou casta. O modelo classifica como assédio o conteúdo de ódio dirigido a grupos não protegidos, como jogadores de xadrez.
Somente texto
hate/threatening
Conteúdo de ódio que também envolve violência ou danos graves contra um grupo por motivos de raça, gênero, etnia, religião, nacionalidade, orientação sexual, deficiência ou casta.
Somente texto
illicit
Conteúdo que dá orientações ou instruções sobre como cometer atos ilícitos. Uma frase como “como furtar produtos de uma loja” se enquadraria nessa categoria.
Somente texto
illicit/violent
Os mesmos tipos de conteúdo sinalizados na categoria illicit, quando também há referências à violência ou à obtenção de uma arma.
Somente texto
self-harm
Conteúdo que promove, incentiva ou retrata comportamentos autolesivos, como suicídio, cortes autoinfligidos e comportamentos associados a transtornos alimentares.
Texto e imagens
self-harm/intent
Conteúdo em que a pessoa afirma que pratica ou pretende praticar atos autolesivos, como suicídio, cortes autoinfligidos e comportamentos associados a transtornos alimentares.
Texto e imagens
self-harm/instructions
Conteúdo que incentiva atos autolesivos, como suicídio, cortes autoinfligidos e comportamentos associados a transtornos alimentares, ou que dá instruções ou orientações sobre como praticá-los.
Texto e imagens
sexual
Conteúdo destinado a provocar excitação sexual, como a descrição de atividades sexuais, ou que promove serviços sexuais. Educação sexual e bem-estar sexual ficam fora dessa categoria.
Texto e imagens
sexual/minors
Conteúdo sexual que envolve uma pessoa menor de 18 anos.
Somente texto
violence
Conteúdo que retrata morte, violência ou lesões físicas.
Texto e imagens
violence/graphic
Conteúdo que retrata morte, violência ou lesões físicas em detalhes explícitos.