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 la respuesta generada. Usa los resultados para aplicar la política de tu aplicación, por ejemplo, para filtrar contenido, enviar una solicitud a revisión o tomar medidas sobre las cuentas que envíen contenido marcado.
El modelo omni-moderation-latest admite texto e imágenes como entradas. No clasifica audio. El uso del 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 gestionar MASI y no sustituye las medidas específicas de protección infantil. Consulta nuestra guía sobre MASI para saber cómo prevenir y detectar casos de MASI, responder ante ellos y denunciarlos.
Tu aplicación necesita saber qué categorías de contenido dañino se aplican al texto, a las imágenes o a ambos.
Moderar contenido generado
Si tu aplicación necesita obtener el texto generado junto con las puntuaciones de moderación, incluye un objeto moderation en el nivel superior de la solicitud de generación. La API devuelve las puntuaciones de moderación de la entrada del modelo y de la salida generada sin necesidad de una solicitud de moderación por separado.
El modelo sigue generando contenido como de costumbre. Revisa los resultados de moderación antes de mostrarle la salida a un usuario o de realizar acciones posteriores.
Configura moderation.model al crear una respuesta:
Generar 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 de respuestas devuelve un objeto moderation_result para la entrada en response.moderation.input y un objeto moderation_result para la salida en response.moderation.output.
Configura moderation.model al generar una respuesta de chat:
Generar 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)
La API para completar chats devuelve los contenedores de resultados de moderación en completion.moderation.input y completion.moderation.output. Si la solicitud genera una sola opción, consulta results[0] en cada contenedor para obtener el primer resultado de entrada y el primero de salida. Si solicitas varias opciones, completion.moderation.output.results[i] corresponde a completion.choices[i].
Los resultados de moderación incluidos en la respuesta usan los mismos campos de categoría que los resultados de una solicitud de moderación independiente. Consulta primero flagged para tomar una decisión preliminar. Luego revisa categories y category_scores para registrar eventos, dirigir solicitudes, mantener registros de auditoría o gestionar colas de revisión humana. El modelo puede negarse a responder o dar otra respuesta que tenga en cuenta la seguridad y, aun así, esa respuesta puede quedar marcada si menciona contenido dañino. Usa las puntuaciones de moderación como señales al aplicar la política de tu aplicación, sin convertirlas en decisiones automáticas de bloqueo.
Si tu aplicación necesita gestionar fallos de moderación, verifica el tipo de resultado de moderación antes de leer las puntuaciones. Si un paso de moderación no se completa, el campo de moderación de la entrada o salida correspondiente puede contener un error en lugar de puntuaciones.
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 del formato de respuesta.
Si transmites una respuesta a medida que se genera, recibirás las puntuaciones de moderación cuando esté disponible la salida completa. Las puntuaciones no se incluyen en los fragmentos de salida que recibes durante la generación.
Este ejemplo muestra la salida completa para una imagen tomada de un solo fotograma de una película de guerra. El modelo identifica indicios de violencia en la imagen y asigna a la categoría violence una puntuación superior a 0,8.
La respuesta JSON incluye campos que indican qué categorías están presentes en la entrada y el grado de confianza del modelo en la clasificación de cada una.
Categoría de salida
Descripción
flagged
Su valor es true si el modelo clasifica el contenido como potencialmente dañino y false en caso contrario.
categories
Contiene un diccionario con un indicador de infracción por categoría. El valor de cada categoría es true si el modelo detecta una infracción en esa categoría y false en caso contrario.
category_scores
Contiene un diccionario de puntuaciones por categoría. Cada puntuación representa el grado de confianza del modelo en que la entrada incluye contenido de esa categoría. El valor está entre 0 y 1. Cuanto mayor es el valor, mayor es la 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 las imágenes como al texto de entrada, la propiedad violence/graphic toma el valor ["image", "text"].
Planeamos seguir actualizando el modelo que usa el punto de acceso de moderación. Por eso, es posible que con el tiempo tengas que recalibrar las políticas personalizadas que dependen de category_scores.
Consultar las categorías admitidas
La siguiente tabla describe las categorías de contenido que puede detectar el punto de acceso de moderación y los tipos de entrada que admite cada categoría.
Las categorías marcadas como “Solo texto” no admiten imágenes como entrada. Si solo envías imágenes (sin texto que las acompañe) al modelo omni-moderation-latest, este devolverá una puntuación de 0 para esas categorías. El tamaño máximo de cada archivo de imagen es de 20 MB.
Categoría
Descripción
Entradas
harassment
Contenido que usa lenguaje de acoso contra cualquier persona o grupo, o que incita a usarlo o lo promueve.
Solo texto
harassment/threatening
Contenido de acoso que también incluye violencia o daños graves contra cualquier persona o grupo.
Solo texto
hate
Contenido que expresa o promueve el odio, o que incita a él, 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 clasifica como 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 da consejos o instrucciones para cometer actos ilícitos. Una frase como “cómo robar mercancía de una tienda” entraría en esta categoría.
Solo texto
illicit/violent
Los mismos tipos de contenido que se marcan en la categoría illicit, con referencias adicionales a la violencia o a la obtención de un arma.
Solo texto
self-harm
Contenido que promueve, alienta o representa conductas autolesivas, como el suicidio, las cortaduras autoinfligidas y las conductas asociadas a trastornos alimentarios.
Texto e imágenes
self-harm/intent
Contenido en el que una persona expresa que tiene conductas autolesivas o que tiene la intención de hacerse daño, por ejemplo, mediante el suicidio, las cortaduras autoinfligidas o las conductas asociadas a trastornos alimentarios.
Texto e imágenes
self-harm/instructions
Contenido que alienta conductas autolesivas, como el suicidio, las cortaduras autoinfligidas y las conductas asociadas a trastornos alimentarios, o que da instrucciones o consejos para llevarlas a cabo.
Texto e imágenes
sexual
Contenido destinado a provocar excitación sexual, como la descripción de actividades sexuales, o que promueve servicios sexuales (se excluyen la educación sexual y el bienestar sexual).
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.