Filtrage du contenu

Azure OpenAI Service inclut un système de gestion de contenu qui fonctionne avec les modèles principaux pour filtrer le contenu. Ce système fonctionne en exécutant à la fois l’invite d’entrée et le contenu généré par le biais d’un ensemble de modèles de classification visant à détecter les mauvaises utilisations. Si le système identifie un contenu dangereux, vous recevrez soit une erreur sur l’appel API si l’invite a été jugée inappropriée, soit la valeur de finish_reason sera content_filter en réponse pour signifier qu’une partie de la génération a été filtrée. Vous pouvez générer du contenu avec l’API de saisie semi-automatique à l’aide de nombreuses configurations différentes qui modifient le comportement de filtrage attendu. La section suivante vise à énumérer tous ces scénarios pour vous permettre de concevoir correctement votre solution.

Pour vous assurer que vous avez correctement atténué les risques dans votre application, vous devez évaluer soigneusement tous les dommages potentiels, suivre les instructions de la note de transparence et ajouter une atténuation spécifique au scénario si nécessaire.

Détails du scénario

Lors de la génération de votre application, vous souhaiterez prendre en compte les scénarios dans lesquels le contenu retourné par l’API Completions est filtré et peut ne pas être terminé. La façon dont vous agissez sur ces informations sera spécifique à l’application. Le comportement peut être résumé dans les points clés suivants :

  • Les invites jugées inappropriées retournent une erreur HTTP 400
  • Les appels de saisie semi-automatique sans diffusion en continu ne retournent aucun contenu lorsque le contenu est filtré. La valeur finish_reason sera définie sur content_filter. Dans de rares cas avec des réponses longues, un résultat partiel peut être retourné. Dans ce cas, finish_reason est mis à jour.
  • Pour les appels de saisie semi-automatique de diffusion en continu, les segments sont renvoyés à l’utilisateur à mesure qu’ils sont terminés. Le service continue de diffuser en streaming jusqu’à ce qu’un jeton d’arrêt, une longueur ou un contenu dangereux soit détecté.

Scénario : Vous envoyez un appel de saisie semi-automatique sans diffusion en continu demandant plusieurs générations sans contenu inapproprié

Le tableau ci-dessous présente les différentes façons dont le filtrage de contenu peut apparaître :

Code de réponse HTTP Comportement de la réponse
200 Dans les cas où toutes les générations passent les modèles de filtre, aucun détail de modération de contenu n’est ajouté à la réponse. Le finish_reason de chaque génération sera soit stop, soit length.

Exemple de charge utile de requête :

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

Exemple JSON de réponse :

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

Scénario : votre appel d’API demande plusieurs réponses (N>1) et au moins 1 des réponses est filtrée

Code de réponse HTTP Comportement de la réponse
200 Les générations qui ont été filtrées auront la valeur finish_reason de « content_filter ».

Exemple de charge utile de requête :

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

Exemple JSON de réponse :

{
    "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
        }
    ]
}

Scénario : une invite d’entrée inappropriée est envoyée à l’API de saisie semi-automatique (pour la diffusion en continu ou la non-diffusion en continu)

Code de réponse HTTP Comportement de la réponse
400 L’appel d’API échoue lorsque l’invite déclenche l’un de nos modèles de stratégie de contenu. Modifiez l’invite et réessayez.

Exemple de charge utile de requête :

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

Exemple JSON de réponse :

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

Scénario : vous effectuez un appel de saisie semi-automatique de diffusion en continu avec tout le contenu généré qui transmet les filtres de contenu

Code de réponse HTTP Comportement de la réponse
200 Dans ce cas, l’appel revient en continu avec la génération complète et la valeur de finish_reason est « length » ou « stop » pour chaque réponse générée.

Exemple de charge utile de requête :

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

Exemple JSON de réponse :

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

Scénario : Vous effectuez un appel d’achèvement en continu demandant plusieurs réponses générées, et au moins une réponse est filtrée.

Code de réponse HTTP Comportement de la réponse
200 Pour un index de génération donné, le dernier segment de la génération inclut une valeur non null finish_reason. La valeur est « content_filter » lorsque la génération a été filtrée.

Exemple de charge utile de requête :

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

Exemple JSON de réponse :

 {
    "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
        }
    ]
}

Scénario : le système de filtrage de contenu ne s’exécute pas lors de la génération

Code de réponse HTTP Comportement de la réponse
200 Si le système de filtrage de contenu est en panne ou si vous ne parvenez pas à terminer l’opération dans le temps, votre requête est toujours terminée. Vous pouvez déterminer que le filtrage n’a pas été appliqué en recherchant un message d’erreur dans l’objet « content_filter_result ».

Exemple de charge utile de requête :

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

Exemple JSON de réponse :

{
    "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"
                }
            }
        }
    ]
}

meilleures pratiques recommandées.

Dans le cadre de votre conception d’application, vous devez réfléchir attentivement à la façon d’optimiser les avantages de vos applications tout en réduisant les dommages. Envisagez les meilleures pratiques suivantes :

  • Comment gérer les scénarii dans lesquels vos utilisateurs envoient une entrée appropriée ou utilisent abusivement votre application. Vérifiez la finish_reason pour voir si la génération est filtrée.
  • S’il est essentiel que les filtres de contenu s’exécutent sur vos générations, vérifiez qu’il n’y a aucun objet error dans content_filter_result.
  • Pour faciliter la surveillance de l’utilisation abusive possible, les applications qui servent plusieurs utilisateurs finaux doivent passer le paramètre user à chaque appel d’API. user doit être un identificateur unique pour l’utilisateur final. N’envoyez aucune information d’identification utilisateur réelle comme valeur.

Étapes suivantes

Découvrez-en plus sur les modèles sous-jacents d’Azure OpenAI.