Usa los modelos de moderación de OpenAI para detectar contenido dañino en texto e imágenes. Puedes clasificar entradas independientes con el punto de acceso de moderación o solicitar puntuaciones de moderación junto con una respuesta generada. Usa los resultados para aplicar la política de tu aplicación, por ejemplo, filtrando contenido, enviando una solicitud a revisión o tomando medidas sobre las cuentas que envían contenido marcado.
El modelo omni-moderation-latest acepta entradas de texto e imágenes. No clasifica audio. El punto de acceso de moderación es gratuito y los archivos de imagen pueden tener un tamaño de hasta 20 MB.
Seguridad infantil: no envíes a la API de Moderación contenido que sepas o sospeches que es material de abuso sexual infantil (MASI). La API no está diseñada para detectar ni manejar MASI y no sustituye las medidas específicas de protección infantil. Consulta nuestra guía sobre MASI para conocer los pasos para prevenir, detectar, responder y denunciar este tipo de material.
Tu aplicación necesita saber qué categorías de contenido dañino se aplican al texto, a las imágenes o a ambos.
Modera contenido generado
Cuando tu aplicación necesite tanto texto generado como puntuaciones de moderación, pasa un objeto moderation en el nivel superior de la solicitud de generación. La API devuelve puntuaciones de moderación para la entrada del modelo y la salida generada sin necesidad de una solicitud de moderación por separado.
El modelo sigue generando contenido con normalidad. Revisa los resultados de moderación antes de mostrar la salida a un usuario o realizar acciones posteriores.
Configura moderation.model al crear una respuesta:
Genera una respuesta con puntuaciones de moderación
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)
La API Responses devuelve un objeto moderation_result de entrada en response.moderation.input y un objeto moderation_result de salida en response.moderation.output.
Configura moderation.model al crear una respuesta de chat:
Genera una respuesta de chat con puntuaciones de moderación
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)
Chat Completions devuelve contenedores de resultados de moderación en completion.moderation.input y completion.moderation.output. Para una solicitud con una sola opción generada, lee el primer resultado de entrada y el primero de salida en results[0]. Si solicitas varias opciones, completion.moderation.output.results[i] corresponde a completion.choices[i].
Los resultados de moderación integrados usan los mismos campos de categoría que un resultado de moderación independiente. Comienza con flagged para tomar una decisión inicial y luego examina categories y category_scores para registrar eventos, enrutar solicitudes, mantener registros de auditoría o gestionar colas de revisión humana. Un rechazo u otra respuesta que tenga en cuenta la seguridad también puede activar un indicador si trata sobre contenido dañino. Considera las puntuaciones de moderación como señales para aplicar la política de tu aplicación, no como una decisión automática de bloqueo.
Comprueba el tipo de resultado de moderación antes de leer las puntuaciones si tu aplicación necesita gestionar fallas de moderación. Si un paso de moderación no puede completarse, el campo de moderación de entrada o salida correspondiente puede contener un error en lugar de puntuaciones de moderación.
En las solicitudes con llamadas a herramientas, la moderación abarca los argumentos de las llamadas y las salidas de las herramientas cuando aparecen en el contenido de la conversación. No abarca los nombres, las descripciones ni los esquemas de las herramientas, ni los esquemas de formato de respuesta.
Si transmites una respuesta generada en streaming, las puntuaciones de moderación llegan después de que esté disponible toda la salida generada. No se incluyen en los fragmentos incrementales de la salida.
Este es un ejemplo de salida completa para una imagen de un solo fotograma de una película de guerra. El modelo identifica indicios de violencia en la imagen, con una puntuación superior a 0,8 en la categoría violence.
La respuesta JSON incluye campos que describen qué categorías están presentes en la entrada y la confianza del modelo en cada categoría.
Categoría de salida
Descripción
flagged
Su valor es true si el modelo clasifica el contenido como potencialmente dañino;
false en caso contrario.
categories
Contiene un diccionario de indicadores de infracción por categoría. Para cada categoría,
el valor es true si el modelo detecta una infracción
en la categoría correspondiente; false en caso contrario.
category_scores
Contiene un diccionario de puntuaciones por categoría. Cada puntuación representa la
confianza del modelo en que la entrada contiene contenido de esa categoría. El
valor está entre 0 y 1; los valores más altos indican mayor confianza.
category_applied_input_types
Contiene los tipos de entrada a los que se aplica la puntuación de la categoría. Por ejemplo,
si la categoría violence/graphic se aplica tanto a entradas de imagen como de texto,
la propiedad violence/graphic se establece en ["image", "text"].
Planeamos actualizar continuamente el modelo subyacente del punto de acceso de moderación.
Por lo tanto, las políticas personalizadas que dependen de category_scores podrían necesitar
ajustes de calibración con el tiempo.
Consulta las categorías admitidas
La siguiente tabla describe las categorías de contenido que el punto de acceso de moderación puede detectar y los tipos de entrada que admite cada categoría.
Las categorías marcadas como “Solo texto” no admiten entradas de imagen. Si envías solo
imágenes (sin texto que las acompañe) al modelo omni-moderation-latest,
este devolverá una puntuación de 0 para esas categorías no admitidas. Los archivos de imagen tienen
un límite de 20 MB.
Categoría
Descripción
Entradas
harassment
Contenido que expresa, incita o promueve lenguaje de acoso dirigido a
cualquier destinatario.
Solo texto
harassment/threatening
Contenido de acoso que también incluye violencia o daños graves dirigidos a cualquier
destinatario.
Solo texto
hate
Contenido que expresa, incita o promueve odio por motivos de raza, género,
etnia, religión, nacionalidad, orientación sexual, discapacidad
o casta. El contenido de odio dirigido a grupos no protegidos (por ejemplo, jugadores
de ajedrez) se considera acoso.
Solo texto
hate/threatening
Contenido de odio que también incluye violencia o daños graves contra el
grupo al que se dirige por motivos de raza, género, etnia, religión, nacionalidad,
orientación sexual, discapacidad o casta.
Solo texto
illicit
Contenido que ofrece consejos o instrucciones sobre cómo cometer actos ilícitos. Una
frase como “cómo hurtar en una tienda” entraría en esta categoría.
Solo texto
illicit/violent
Los mismos tipos de contenido que marca la categoría illicit, pero que también
incluyen referencias a la violencia o a la obtención de un arma.
Solo texto
self-harm
Contenido que promueve, fomenta o representa actos de autolesión, como el suicidio, los cortes autoinfligidos y los trastornos alimentarios.
Texto e imágenes
self-harm/intent
Contenido en el que la persona expresa que está realizando o tiene la intención de realizar actos de autolesión, como el suicidio, los cortes autoinfligidos y los trastornos alimentarios.
Texto e imágenes
self-harm/instructions
Contenido que fomenta actos de autolesión, como el suicidio, los cortes autoinfligidos y los trastornos alimentarios, o que da instrucciones o consejos sobre cómo realizar esos actos.
Texto e imágenes
sexual
Contenido destinado a provocar excitación sexual, como las descripciones de actividad sexual, o que promueve servicios sexuales (se excluyen la educación y el bienestar sexuales).
Texto e imágenes
sexual/minors
Contenido sexual que incluye a una persona menor de 18 años.
Solo texto
violence
Contenido que representa muerte, violencia o lesiones físicas.
Texto e imágenes
violence/graphic
Contenido que representa muerte, violencia o lesiones físicas con detalles gráficos explícitos.