Compartir a través de


Filtrado de contenido

Importante

El sistema de filtrado de contenido no se aplica a solicitudes y finalizaciones procesadas por el modelo Whisper en el servicio Azure OpenAI. Obtenga más información sobre el modelo Whisper en Azure OpenAI.

Azure OpenAI Service incluye un sistema de filtrado de contenido que funciona junto con los modelos principales, incluidos los modelos de generación de imágenes DALL-E. Este sistema funciona ejecutando tanto la solicitud como la finalización a través de un conjunto de modelos de clasificación destinados a detectar y evitar la salida de contenido dañino. El sistema de filtrado de contenido detecta y toma medidas en categorías específicas de contenido potencialmente perjudicial tanto en solicitudes de entrada como en finalizaciones de salida. Las variaciones en las configuraciones de API y el diseño de aplicaciones pueden afectar a las finalizaciones y, por tanto, al comportamiento de filtrado.

Los modelos de filtrado de contenido para las categorías de odio, sexual, violencia y autolesiones se han entrenado y probado específicamente en los siguientes idiomas: inglés, alemán, japonés, español, francés, italiano, portugués y chino. Sin embargo, el servicio puede funcionar en muchos otros idiomas, pero la calidad puede variar. En todos los casos, debe realizar sus propias pruebas para asegurarse de que funciona para la aplicación.

Además del sistema de filtrado de contenido, Azure OpenAI Service realiza la supervisión para detectar contenido o comportamientos que sugieren el uso del servicio de una manera que podría infringir los términos de producto aplicables. Para más información sobre cómo comprender y mitigar los riesgos asociados a la aplicación, consulte la Nota de transparencia para Azure OpenAI. Para más información sobre cómo se procesan los datos en relación con el filtrado de contenido y la supervisión de abusos, consulte Datos, privacidad y seguridad para Azure OpenAI Service.

En las secciones siguientes, se proporciona información sobre las categorías de filtrado de contenido, los niveles de gravedad de filtrado y su capacidad de configuración, además de los escenarios de API que se deben tener en cuenta en el diseño y la implementación de aplicaciones.

Categorías de filtrado de contenido

El sistema de filtrado de contenido integrado en Azure OpenAI Service contiene:

  • Modelos de clasificación neuronales de varias clases destinados a detectar y filtrar contenido dañino; los modelos cubren cuatro categorías (odio, sexual, violencia y autolesiones) en cuatro niveles de gravedad (seguro, bajo, medio y alto). El contenido detectado en el nivel de gravedad "seguro" está etiquetado en anotaciones, pero no está sujeto al filtrado y no es configurable.
  • Modelos de clasificación opcionales adicionales destinados a detectar el riesgo de jailbreak y el contenido conocido para el texto y el código; estos modelos son clasificadores binarios que marcan si el comportamiento del usuario o del modelo se califica como un ataque de jailbreak o coincide con el texto o el código fuente conocidos. El uso de estos modelos es opcional, pero el uso del modelo de código de material protegido puede ser necesario para la cobertura del compromiso de derechos de autor del cliente.

Categorías de riesgo

Category Descripción
Odio y equidad Los daños relacionados con el odio y la equidad se refieren a cualquier contenido que ataque o utilice un lenguaje peyorativo o discriminatorio con referencia a una persona o grupo identitario basado en ciertos atributos diferenciadores de estos grupos, incluidos, entre otros, la raza, la etnia, la nacionalidad, grupos de identidad y expresión de género, la orientación sexual, la religión, el estatus migratorio, el estado de capacidad, la apariencia personal y el tamaño corporal. 

La equidad consiste en garantizar que los sistemas de IA traten a todos los grupos de personas de forma equitativa sin contribuir a las desigualdades sociales existentes. Como en el caso de la incitación al odio, los perjuicios relacionados con la equidad se basan en el trato desigual de los grupos identitarios.  
Sexual Sexual describe el lenguaje relacionado con los órganos anatómicos y los genitales, el embarazo, las relaciones románticas, los actos representados en términos eróticos o afectuosos, los actos sexuales físicos, incluidos los representados como una agresión o un acto violento sexual forzado contra la propia voluntad, la prostitución, la pornografía y el abuso.  
Violencia Violencia describe el lenguaje relacionado con acciones físicas destinadas a herir, lesionar, dañar o matar a alguien o algo; describe armas, pistolas y entidades relacionadas, como fabricantes, asociaciones, legislación, etc.
Autolesiones Autolesión describe el lenguaje relacionado con acciones físicas destinadas a herir, lesionar o dañar intencionadamente su propio cuerpo o a suicidarse.
Material protegido para texto* El texto de material protegido describe contenidos textuales conocidos (por ejemplo, letras de canciones, artículos, recetas y contenidos web seleccionados) que pueden ser emitidos por grandes modelos de lenguaje.
Material protegido para código El código de material protegido describe el código fuente que coincide con un conjunto de códigos fuente de repositorios públicos, que pueden ser emitidos por grandes modelos lingüísticos sin citar adecuadamente los repositorios de origen.

* Si es propietario del material de texto y desea enviar contenido de texto para la protección, envíe una solicitud.

Escudos de avisos

Tipo Descripción
Escudo de solicitudes para ataques de evasión de seguridad Los ataques de evasión de seguridad son solicitudes de usuario diseñadas para provocar que el modelo de IA generativa muestre comportamientos que fue entrenado para evitar o romper las reglas establecidas en el mensaje del sistema. Dichos ataques pueden variar de un papel intrincado a una subversión sutil del objetivo de seguridad.
Escudo de solicitudes frente a ataques indirectos Los ataques indirectos, también conocidos como ataques indirectos de solicitudes o ataques de inyección de solicitudes entre dominios, son una posible vulnerabilidad en la que terceros colocan instrucciones malintencionadas dentro de documentos a los que el sistema de inteligencia artificial generativa puede acceder y procesar. Requieren inserción de documentos y formato.

Contenido de texto

Advertencia

La pestaña Definiciones de gravedad de este documento contiene ejemplos de contenido dañino que puede resultar preocupante para algunos lectores.

Contenido de la imagen

Advertencia

La pestaña Definiciones de gravedad de este documento contiene ejemplos de contenido dañino que puede resultar preocupante para algunos lectores.

Capacidad de configuración (versión preliminar)

La configuración de filtrado de contenido predeterminada para la serie de modelos GPT se establece para filtrar en el umbral de gravedad medio para las cuatro categorías de daño de contenido (odio, violencia, sexual y autolesión) y se aplica a ambos avisos (texto, texto o imagen multi modal) y finalizaciones (texto). Esto significa que el contenido que se detecta en el nivel de gravedad medio o alto se filtra, mientras que el contenido detectado en el nivel de gravedad bajo no se filtra por los filtros de contenido. Para DALL-E, el umbral de gravedad predeterminado se establece en bajo para las solicitudes (texto) y finalizaciones (imágenes), por lo que el contenido detectado en niveles de gravedad bajo, medio o alto se filtra. La característica de configuración está disponible en versión preliminar y permite a los clientes ajustar la configuración, por separado para solicitudes y finalizaciones, para filtrar el contenido de cada categoría de contenido en distintos niveles de gravedad, tal y como se describe en la tabla siguiente:

Gravedad filtrada Configurable para solicitudes Configurable para finalizaciones Descripciones
Bajo, medio, alto Configuración de filtrado más estricta. El contenido detectado en niveles de gravedad bajo, medio y alto se filtra.
Medio y alto El contenido detectado en el nivel de gravedad bajo no se filtra, sino que se filtra el contenido de un nivel medio y alto.
Alto El contenido detectado en niveles de gravedad bajo y medio no se filtra. Solo se filtra el contenido en el nivel de gravedad alto. Requiere aprobación1.
Sin filtros Si se aprueba1 Si se aprueba1 No se filtra ningún contenido, independientemente del nivel de gravedad detectado. Requiere aprobación1.

1 En el caso de los modelos de Azure OpenAI, solo los clientes aprobados para el filtrado de contenidos modificado tienen el control total de los filtros de contenido y pueden desactivarlos. Solicite filtros de contenido modificado mediante este formulario: Revisión de acceso limitado de Azure OpenAI: filtros de contenido modificados y supervisión de abusos (microsoft.com)

Esta característica en versión preliminar está disponible para los siguientes modelos de Azure OpenAI:

  • Serie de modelos GPT (texto)
  • GPT-4 Turbo Vision 2024-04-09 (texto o imagen multimodal)
  • DALL-E 2 y 3 (imagen)

Las configuraciones de filtrado de contenido se crean dentro de un recurso en Azure AI Studio y se pueden asociar a implementaciones. Obtenga más información sobre la capacidad de configuración aquí.

Los clientes son responsables de garantizar que las aplicaciones que integran Azure OpenAI cumplan con el código de conducta.

Detalles del escenario

Cuando el sistema de filtrado de contenidos detecte contenido nocivo, recibirá un error en la llamada a la API si la indicación se ha considerado inapropiada o el finish_reason de la respuesta será content_filter para indicar que se ha filtrado parte de la información completada. Cuando compile su aplicación o sistema, querrá tener en cuenta estos escenarios en los que la API de finalizaciones filtra el contenido devuelto, lo que puede dar lugar a que el contenido esté incompleto. La manera de actuar sobre esta información será específica de la aplicación. El comportamiento puede resumirse en los siguientes puntos:

  • Los mensajes que se clasifican en una categoría filtrada y nivel de gravedad devolverán un error HTTP 400.
  • Las llamadas de finalización sin streaming no devolverán ningún contenido cuando se filtre el contenido. El valor finish_reason se establecerá en content_filter. En casos raros con respuestas más largas, se puede devolver un resultado parcial. En estos casos, se actualizará finish_reason.
  • Para las llamadas de finalización de transmisión, los segmentos se devolverán al usuario a medida que se completen. El servicio continuará transmitiendo hasta alcanzar un token de detención, una longitud o cuando se detecte el contenido clasificado en una categoría filtrada y nivel de gravedad.

Escenario: se envía una llamada de finalización sin streaming que solicita varias salidas; ningún contenido se clasifica en una categoría filtrada y en el nivel de gravedad

En la tabla siguiente se describen las distintas formas en que puede aparecer el filtrado de contenidos:

Código de respuesta HTTP Comportamiento de respuesta
200 En los casos en que toda la generación pasa los filtros tal y como están configurados, no se agrega ningún detalle de moderación de contenido a la respuesta. El finish_reason para cada generación será o bien stop o bien length.

Ejemplo de carga útil de la solicitud:

{
    "prompt":"Text example", 
    "n": 3,
    "stream": false
}

Ejemplo de respuesta JSON:

{
    "id": "example-id",
    "object": "text_completion",
    "created": 1653666286,
    "model": "davinci",
    "choices": [
        {
            "text": "Response generated text",
            "index": 0,
            "finish_reason": "stop",
            "logprobs": null
        }
    ]
}

Escenario: la llamada API solicita varias respuestas (N>1) y se filtra al menos una de las respuestas.

Código de respuesta HTTP Comportamiento de respuesta
200 Las generaciones filtradas tendrán un valor finish_reason de content_filter.

Ejemplo de carga útil de la solicitud:

{
    "prompt":"Text example",
    "n": 3,
    "stream": false
}

Ejemplo de respuesta JSON:

{
    "id": "example",
    "object": "text_completion",
    "created": 1653666831,
    "model": "ada",
    "choices": [
        {
            "text": "returned text 1",
            "index": 0,
            "finish_reason": "length",
            "logprobs": null
        },
        {
            "text": "returned text 2",
            "index": 1,
            "finish_reason": "content_filter",
            "logprobs": null
        }
    ]
}

Escenario: se envía una solicitud de entrada inapropiada a la API de finalizaciones (ya sea para streaming o no streaming)

Código de respuesta HTTP Comportamiento de respuesta
400 Se produce un error en la llamada API cuando el mensaje desencadena un filtro de contenido tal como está configurado. Modifique el comando de entrada e inténtelo de nuevo.

Ejemplo de carga útil de la solicitud:

{
    "prompt":"Content that triggered the filtering model"
}

Ejemplo de respuesta JSON:

"error": {
    "message": "The response was filtered",
    "type": null,
    "param": "prompt",
    "code": "content_filter",
    "status": 400
}

Escenario: realiza una llamada a finalizaciones de streaming; ningún contenido de salida se clasifica en una categoría filtrada y nivel de gravedad

Código de respuesta HTTP Comportamiento de respuesta
200 En este caso, la llamada volverá a transmitirse con la generación completa y finish_reason será "length" o "stop" para cada respuesta generada.

Ejemplo de carga útil de la solicitud:

{
    "prompt":"Text example",
    "n": 3,
    "stream": true
}

Ejemplo de respuesta JSON:

{
    "id": "cmpl-example",
    "object": "text_completion",
    "created": 1653670914,
    "model": "ada",
    "choices": [
        {
            "text": "last part of generation",
            "index": 2,
            "finish_reason": "stop",
            "logprobs": null
        }
    ]
}

Escenario: se realiza una llamada de finalización de streaming que solicita varias finalizaciones y se filtra al menos una parte del contenido de salida

Código de respuesta HTTP Comportamiento de respuesta
200 Para un índice de generación determinado, el último fragmento de la generación incluye un valor de finish_reason no nulo. El valor es content_filter cuando se filtre la generación.

Ejemplo de carga útil de la solicitud:

{
    "prompt":"Text example",
    "n": 3,
    "stream": true
}

Ejemplo de respuesta JSON:

 {
    "id": "cmpl-example",
    "object": "text_completion",
    "created": 1653670515,
    "model": "ada",
    "choices": [
        {
            "text": "Last part of generated text streamed back",
            "index": 2,
            "finish_reason": "content_filter",
            "logprobs": null
        }
    ]
}

Escenario: el sistema de filtrado de contenido no se ejecuta en la finalización

Código de respuesta HTTP Comportamiento de respuesta
200 Si el sistema de filtrado de contenidos no funciona o no puede completar la operación a tiempo, su solicitud se completará igualmente sin filtrado de contenido. Puede determinar que el filtrado no se aplicó buscando un mensaje de error en el objeto content_filter_result.

Ejemplo de carga útil de la solicitud:

{
    "prompt":"Text example",
    "n": 1,
    "stream": false
}

Ejemplo de respuesta JSON:

{
    "id": "cmpl-example",
    "object": "text_completion",
    "created": 1652294703,
    "model": "ada",
    "choices": [
        {
            "text": "generated text",
            "index": 0,
            "finish_reason": "length",
            "logprobs": null,
            "content_filter_result": {
                "error": {
                    "code": "content_filter_error",
                    "message": "The contents are not filtered"
                }
            }
        }
    ]
}

anotaciones

Filtros de contenido

Cuando se activan las anotaciones, como se muestra en el fragmento de código siguiente, se devuelve la siguiente información a través de la API para las categorías principales (odio y equidad, sexual, violencia y autolesiones):

  • categoría de filtros de contenido (odio, sexual, violencia, autolesiones)
  • nivel de gravedad (seguro, bajo, medio o alto) dentro de cada categoría de contenido
  • estado del filtro (true o false).

Modelos opcionales

Los modelos opcionales pueden activarse en modo de anotación (devuelve información cuando se marcó el contenido, pero no se filtró) o en modo de filtro (devuelve información cuando el contenido fue marcado y filtrado).

Cuando las anotaciones están habilitadas como se muestra en los fragmentos de código siguientes, la API devuelve la siguiente información para los modelos opcionales:

Modelo Output
evasión de seguridad detectado (true o false),
filtrado (true o false)
ataques indirectos detectado (true o false),
filtrado (true o false)
texto de material protegido detectado (true o false),
filtrado (true o false)
código de material protegido detectado (true o false),
filtrado (true o false),
Cita de ejemplo del repositorio público de GitHub donde se encontró el fragmento de código,
La licencia del repositorio

Cuando muestre código en la aplicación, se aconsejamos que muestre también la cita de ejemplo de las anotaciones. El cumplimiento de la licencia citada también puede exigirse para la cobertura del compromiso de derechos de autor del cliente.

Consulte la tabla siguiente para obtener la disponibilidad de anotaciones en cada versión de API:

Category 2024-02-01 GA 2024-04-01-preview 2023-10-01-preview 2023-06-01-preview
Odio
Violencia
Sexual
Autolesiones
Escudo de solicitudes para ataques de evasión de seguridad
Escudo de solicitudes frente a ataques indirectos
Texto del material protegido
Código de material protegido
Lista de bloqueos de insultos
Lista de bloqueos personalizada
# os.getenv() for the endpoint and key assumes that you are using environment variables.

import os
from openai import AzureOpenAI
client = AzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
    api_version="2024-03-01-preview",
    azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT") 
    )

response = client.completions.create(
    model="gpt-35-turbo-instruct", # model = "deployment_name".
    prompt="{Example prompt where a severity level of low is detected}" 
    # Content that is detected at severity level medium or high is filtered, 
    # while content detected at severity level low isn't filtered by the content filters.
)

print(response.model_dump_json(indent=2))

Output

{ 
  "choices": [ 
    { 
      "content_filter_results": { 
        "hate": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "protected_material_code": { 
          "citation": { 
            "URL": " https://github.com/username/repository-name/path/to/file-example.txt", 
            "license": "EXAMPLE-LICENSE" 
          }, 
          "detected": true,
          "filtered": false 
        }, 
        "protected_material_text": { 
          "detected": false, 
          "filtered": false 
        }, 
        "self_harm": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "sexual": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "violence": { 
          "filtered": false, 
          "severity": "safe" 
        } 
      }, 
      "finish_reason": "stop", 
      "index": 0, 
      "message": { 
        "content": "Example model response will be returned ", 
        "role": "assistant" 
      } 
    } 
  ], 
  "created": 1699386280, 
  "id": "chatcmpl-8IMI4HzcmcK6I77vpOJCPt0Vcf8zJ", 
  "model": "gpt-35-turbo-instruct", 
  "object": "text.completion",
  "usage": { 
    "completion_tokens": 40, 
    "prompt_tokens": 11, 
    "total_tokens": 417 
  },  
  "prompt_filter_results": [ 
    { 
      "content_filter_results": { 
        "hate": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "jailbreak": { 
          "detected": false, 
          "filtered": false 
        }, 
        "profanity": { 
          "detected": false, 
          "filtered": false 
        }, 
        "self_harm": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "sexual": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "violence": { 
          "filtered": false, 
          "severity": "safe" 
        } 
      }, 
      "prompt_index": 0 
    } 
  ]
} 

Para más información sobre los puntos de conexión de la API de REST de inferencia para Azure OpenAI y cómo crear chat y finalizaciones, siga las Instrucciones de referencia de la API de REST de Azure OpenAI Service. Las anotaciones se devuelven para todos los escenarios al usar cualquier versión preliminar de la API a partir de 2023-06-01-preview, así como la versión 2024-02-01de la API de disponibilidad general.

Escenario de ejemplo: se envía una solicitud de entrada que contiene contenido clasificado en una categoría filtrada y el nivel de gravedad se envía a la API de finalizaciones

{
    "error": {
        "message": "The response was filtered due to the prompt triggering Azure Content management policy. 
                   Please modify your prompt and retry. To learn more about our content filtering policies
                   please read our documentation: https://go.microsoft.com/fwlink/?linkid=21298766",
        "type": null,
        "param": "prompt",
        "code": "content_filter",
        "status": 400,
        "innererror": {
            "code": "ResponsibleAIPolicyViolation",
            "content_filter_result": {
                "hate": {
                    "filtered": true,
                    "severity": "high"
                },
                "self-harm": {
                    "filtered": true,
                    "severity": "high"
                },
                "sexual": {
                    "filtered": false,
                    "severity": "safe"
                },
                "violence": {
                    "filtered":true,
                    "severity": "medium"
                }
            }
        }
    }
}

Inserción de documentos en solicitudes

Un aspecto clave de las medidas de inteligencia artificial responsable de Azure OpenAI es el sistema de seguridad de contenido. Este sistema se ejecuta junto con el modelo GPT principal para supervisar cualquier irregularidad en la entrada y salida del modelo. Su rendimiento se mejora cuando puede diferenciar entre varios elementos de la solicitud, como la entrada del sistema, la entrada del usuario y la salida del asistente de IA.

En el caso de las funcionalidades de detección mejoradas, se debe dar formato a las indicaciones según los siguientes métodos recomendados.

API de finalizaciones de chat

La API de finalización de chat está estructurada por definición. Consta de una lista de mensajes, cada uno con un rol asignado.

El sistema de seguridad analizará este formato estructurado y aplicará el siguiente comportamiento:

  • En el contenido del “usuario” más reciente, se detectarán las siguientes categorías de riesgos de IA responsable:
    • Odio
    • Sexual
    • Violencia
    • Autolesiones
    • Evasión de seguridad (opcional)

Se trata de una matriz de mensajes de ejemplo:

{"role": "system", "content": "Provide some context and/or instructions to the model."}, 
{"role": "user", "content": "Example question goes here."}, 
{"role": "assistant", "content": "Example answer goes here."}, 
{"role": "user", "content": "First question/message for the model to actually respond to."} 

Inserción de documentos en su solicitud

Además de la detección en el contenido del último usuario, Azure OpenAI también admite la detección de riesgos específicos dentro de los documentos de contexto a través de Escudos de solicitudes - Detección indirecta de ataques de solicitud. Debe identificar partes de la entrada que son un documento (por ejemplo, sitio web recuperado, correo electrónico, etc.) con el delimitador de documento siguiente.

<documents> 
*insert your document content here* 
</documents>

Al hacerlo, están disponibles las siguientes opciones para la detección en documentos etiquetados:

  • En cada contenido de documento” etiquetado“, detecte las siguientes categorías:
    • Ataques indirectos (opcional)

Esta es una matriz de mensajes de finalización de chat de ejemplo:

{"role": "system", "content": "Provide some context and/or instructions to the model, including document context. \"\"\" <documents>\n*insert your document content here*\n<\\documents> \"\"\""}, 

{"role": "user", "content": "First question/message for the model to actually respond to."} 

Escape JSON

Al etiquetar documentos no verificados para la detección, el contenido del documento debe tener un escape JSON para garantizar un análisis correcto mediante el sistema de seguridad de Azure OpenAI.

Por ejemplo, consulte el siguiente cuerpo de correo electrónico:

Hello Josè, 

I hope this email finds you well today.

Con el escape JSON, se leía lo siguiente:

Hello Jos\u00E9,\nI hope this email finds you well today. 

El texto con escape en un contexto de finalización del chat leería:

{"role": "system", "content": "Provide some context and/or instructions to the model, including document context. \"\"\" <documents>\n Hello Jos\\u00E9,\\nI hope this email finds you well today. \n<\\documents> \"\"\""}, 

{"role": "user", "content": "First question/message for the model to actually respond to."}

Streaming de contenido

En esta sección se describe la experiencia y las opciones de streaming de contenido de Azure OpenAI. Los clientes tienen la opción de recibir contenido de la API a medida que se genera, en lugar de esperar a recibir fragmentos de contenido que se ha comprobado que han pasado los filtros de contenido.

Valor predeterminado

El sistema de filtrado de contenido está integrado y habilitado de manera predeterminada para todos los clientes. En el escenario de streaming predeterminado, el contenido de finalización se almacena en búfer, el sistema de filtrado de contenido se ejecuta en el contenido almacenado en búfer y, en función de la configuración del filtrado de contenido, se devuelve contenido al usuario si no infringe la directiva de filtrado de contenido (configuración de usuario personalizada o predeterminada de Microsoft), o se bloquea inmediatamente, lo que devuelve un error de filtrado de contenido, sin devolver contenido de finalización perjudicial. Este proceso se repite hasta el final de la secuencia. El contenido se verifica en su totalidad en función de la directiva de filtrado de contenido antes devolverse al usuario. En este caso, el contenido no se devuelve token por token, sino en “fragmentos de contenido” del tamaño de búfer correspondiente.

Filtro asincrónico

Los clientes pueden elegir el filtro asincrónico como opción adicional, lo que proporciona una nueva experiencia de streaming. En este caso, los filtros de contenido se ejecutan de forma asincrónica, el contenido de finalización se devuelve inmediatamente con una experiencia de streaming de token por token fluida. No se almacena en búfer ningún contenido, lo que permite una experiencia de streaming rápida con cero latencia asociada a la seguridad del contenido.

Los clientes deben tener en cuenta que, aunque la característica mejora la latencia, puede implicar una compensación en términos de seguridad y verificación en tiempo real de secciones más pequeñas de la salida del modelo. Dado que los filtros de contenido se ejecutan de forma asincrónica, los mensajes de moderación de contenido y las señales de infracción de directivas se retrasan, por lo que se podrían mostrar al usuario algunas secciones de contenido perjudicial que se habrían filtrado inmediatamente de otro modo.

Anotaciones: las anotaciones y los mensajes de moderación de contenido se devuelven continuamente durante la secuencia. Se recomienda encarecidamente consumir anotaciones en la aplicación e implementar mecanismos de seguridad de contenido de IA adicionales, como la expurgación de contenido o la devolución de información de seguridad adicional al usuario.

Señal de filtrado de contenido: se retrasa la señal de error de filtrado de contenido. En el caso de una infracción de directiva, se devuelve tan pronto como está disponible y se detiene la secuencia. La señal de filtrado de contenido se garantiza dentro de una ventana de aproximadamente 1000 caracteres del contenido que infringe la directiva.

Compromiso de derechos de autor del cliente: el contenido que se marca retroactivamente como material protegido puede no ser apto para la cobertura del compromiso de derechos de autor del cliente.

Para la habilitación del filtro asincrónico en Azure OpenAI Studio, siga la Guía paso a paso del filtro de contenido para crear una nueva configuración de filtrado de contenido y seleccione Filtro asincrónico en la sección Streaming.

Comparación de los modos de filtrado de contenido

Comparación Streaming: valor predeterminado Streaming: Filtro asincrónico
Estado GA Vista previa pública
Elegibilidad Todos los clientes Clientes aprobados para el filtrado de contenido modificado
Cómo habilitar Habilitado de forma predeterminada, no se necesita realizar ninguna acción Los clientes aprobados para el filtrado de contenido modificado pueden configurarse directamente a través de Azure OpenAI Studio (como parte de una configuración de filtrado de contenido que se aplica a nivel de implementación)
Modalidad y disponibilidad Texto; todos los modelos de GPT Texto; todos los modelos de GPT excepto gpt-4-vision
Experiencia de streaming El contenido se almacena en búfer y se devuelve en fragmentos Cero latencia (sin almacenamiento en búfer; los filtros se ejecutan de forma asincrónica)
Señal de filtrado de contenido Señal de filtrado inmediata Señal de filtrado retrasada (en incrementos de hasta unos 1000 caracteres)
Configuración de filtrado de contenido Admite el valor predeterminado y cualquier configuración de filtro definida por el cliente (incluidos los modelos opcionales) Admite el valor predeterminado y cualquier configuración de filtro definida por el cliente (incluidos los modelos opcionales)

Anotaciones y respuesta de ejemplo

Mensaje de anotación de consulta

Este es igual que las anotaciones predeterminadas.

data: { 
    "id": "", 
    "object": "", 
    "created": 0, 
    "model": "", 
    "prompt_filter_results": [ 
        { 
            "prompt_index": 0, 
            "content_filter_results": { ... } 
        } 
    ], 
    "choices": [], 
    "usage": null 
} 

Mensaje de token de finalización

Los mensajes de finalización se reenvían inmediatamente. No se realiza ninguna moderación primero y no se proporciona ninguna anotación inicialmente.

data: { 
    "id": "chatcmpl-7rAJvsS1QQCDuZYDDdQuMJVMV3x3N", 
    "object": "chat.completion.chunk", 
    "created": 1692905411, 
    "model": "gpt-35-turbo", 
    "choices": [ 
        { 
            "index": 0, 
            "finish_reason": null, 
            "delta": { 
                "content": "Color" 
            } 
        } 
    ], 
    "usage": null 
} 

Mensaje de anotación

El campo de texto siempre será una cadena vacía, lo que indica que no hay nuevos tokens. Las anotaciones solo serán relevantes para los tokens ya enviados. Puede haber varios mensajes de anotación que hacen referencia a los mismos tokens.

"start_offset" y "end_offset" son desplazamientos de granularidad baja en texto (con 0 al principio de la consulta) para los que es relevante la anotación.

"check_offset" representa la cantidad de texto que se ha moderado completamente. Este es un límite inferior exclusivo en los valores "end_offset" de anotaciones futuras. No es decreciente.

data: { 
    "id": "", 
    "object": "", 
    "created": 0, 
    "model": "", 
    "choices": [ 
        { 
            "index": 0, 
            "finish_reason": null, 
            "content_filter_results": { ... }, 
            "content_filter_raw": [ ... ], 
            "content_filter_offsets": { 
                "check_offset": 44, 
                "start_offset": 44, 
                "end_offset": 198 
            } 
        } 
    ], 
    "usage": null 
} 

Flujo de respuesta de ejemplo (pasa filtros)

A continuación, se muestra una respuesta de finalización de chat real con el filtro asincrónico. Observe cómo no se cambian las anotaciones de consulta; los tokens de finalización se envían sin anotaciones; y los nuevos mensajes de anotación se envían sin tokens, en su lugar asociados a determinados desplazamientos de filtro de contenido.

{"temperature": 0, "frequency_penalty": 0, "presence_penalty": 1.0, "top_p": 1.0, "max_tokens": 800, "messages": [{"role": "user", "content": "What is color?"}], "stream": true}

data: {"id":"","object":"","created":0,"model":"","prompt_annotations":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"choices":[],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"role":"assistant"}}],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":"Color"}}],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" is"}}],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" a"}}],"usage":null} 

... 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":null,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"check_offset":44,"start_offset":44,"end_offset":198}}],"usage":null} 

... 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":"stop","delta":{}}],"usage":null} 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":null,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"check_offset":506,"start_offset":44,"end_offset":571}}],"usage":null} 

data: [DONE] 

Flujo de respuesta de ejemplo (bloqueado por filtros)

{"temperature": 0, "frequency_penalty": 0, "presence_penalty": 1.0, "top_p": 1.0, "max_tokens": 800, "messages": [{"role": "user", "content": "Tell me the lyrics to \"Hey Jude\"."}], "stream": true}

data: {"id":"","object":"","created":0,"model":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"choices":[],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"role":"assistant"}}],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":"Hey"}}],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" Jude"}}],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":","}}],"usage":null} 

... 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35- 

turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" better"}}],"usage":null} 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":null,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"check_offset":65,"start_offset":65,"end_offset":1056}}],"usage":null} 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":"content_filter","content_filter_results":{"protected_material_text":{"detected":true,"filtered":true}},"content_filter_offsets":{"check_offset":65,"start_offset":65,"end_offset":1056}}],"usage":null} 

data: [DONE] 

Importante

Cuando se activa el filtrado de contenidos para una solicitud y "status": 400 se recibe una como parte de la respuesta, se cobrará por esta solicitud, ya que la solicitud ha sido evaluada por el servicio. También se producirán cargos cuando se reciba un "status":200 con "finish_reason": "content_filter". En este caso, la solicitud no tenía ninguna incidencia, pero se detectó la finalización generada por el modelo para infringir las reglas de filtrado de contenido dando lugar a que se filtre la finalización.

procedimientos recomendados

Como parte del diseño de la aplicación, tenga en cuenta los siguientes procedimientos recomendados para ofrecer una experiencia positiva con la aplicación, a la vez que minimiza posibles daños:

  • Decida cómo quiere controlar los escenarios en los que sus usuarios envían avisos con contenido clasificado en una categoría y nivel de gravedad filtrados o hacen un mal uso de su aplicación.
  • Compruebe finish_reason para ver si se filtra la generación.
  • Compruebe que no hay ningún objeto de error en content_filter_result (lo que indica que los filtros de contenido no se ejecutaron).
  • Si utiliza el modelo de código de material protegido en modo de anotación, muestre la URL de la cita cuando muestre el código en su aplicación.

Pasos siguientes