Filtragem de conteúdo

Importante

O sistema de filtragem de conteúdo não é aplicado a prompts e conclusões processados pelo modelo Whisper no Serviço OpenAI do Azure. Saiba mais sobre o modelo Whisper no OpenAI do Azure.

O Serviço OpenAI do Azure inclui um sistema de filtragem de conteúdo que funciona juntamente com os principais modelos. Esse sistema funciona executando o prompt e a conclusão por meio de um conjunto de modelos de classificação destinados a detectar e impedir a saída de conteúdo prejudicial. O sistema de filtragem de conteúdo detecta e executa ações em categorias específicas de conteúdo potencialmente prejudicial em prompts de entrada e conclusões de saída. As variações nas configurações de API e no design do aplicativo podem afetar os preenchimentos e, portanto, o comportamento de filtragem.

Os modelos de filtragem de conteúdo para as categorias de ódio, sexual, violência e automutilação foram especificamente treinados e testados nos seguintes idiomas: inglês, alemão, japonês, espanhol, francês, italiano, português e chinês. Contudo, o serviço pode funcionar em muitos outros idiomas, mas a qualidade pode variar. Em todos os casos, você deve fazer seus próprios testes para garantir que ele funcione no seu aplicativo.

Além do sistema de filtragem de conteúdo, o Serviço OpenAI do Azure executa o monitoramento para detectar conteúdo e/ou comportamentos que sugerem uso do serviço de maneira que possa violar os termos do produto aplicáveis. Para obter mais informações sobre como entender e mitigar os riscos associados ao seu aplicativo, confira a Nota de Transparência do Azure OpenAI. Para obter mais informações sobre como os dados são processados para filtragem de conteúdo e monitoramento de abuso, veja Dados, privacidade e segurança para o Serviço OpenAI do Azure.

As seções a seguir fornecem informações sobre as categorias de filtragem de conteúdo, os níveis de severidade de filtragem e sua configurabilidade, e os cenários de API a serem considerados no design e na implementação do aplicativo.

Categorias de filtragem de conteúdo

O sistema de filtragem de conteúdo integrado no Serviço OpenAI do Azure contém:

  • Neural de várias classes destinados a detectar e filtrar conteúdos perigosos. Os modelos abrangem quatro categorias (ódio, sexual, violência e automutilação) em quatro níveis de severidade (seguro, baixo, médio e alto). O conteúdo detectado no nível de gravidade "seguro" é rotulado em anotações, mas não está sujeito a filtragem e não é configurável.
  • Outros modelos de classificação opcionais destinados a detectar risco de jailbreak e conteúdo conhecido para texto e código; esses modelos são classificadores binários que sinalizam se o comportamento do usuário ou do modelo se qualifica como um ataque de jailbreak ou corresponde a um texto conhecido ou código-fonte. O uso desses modelos é opcional, mas o uso do modelo de código de material protegido pode ser necessário para a cobertura do Compromisso de Direitos Autorais do Cliente.

Categorias de danos

Categoria Descrição
Ódio e imparcialidade Danos relacionados ao ódio e à justiça referem-se a qualquer conteúdo que ataque ou use linguagem pejorativa ou discriminatória com referência a uma pessoa ou grupos de identidade com base em certos atributos diferenciadores desses grupos, incluindo, entre outros, raça, etnia, nacionalidade, grupos de identidade de gênero e expressão, orientação sexual, religião, status de imigração, status de capacidade, aparência pessoal e tamanho corporal. 

A imparcialidade está preocupada em garantir que os sistemas de IA tratem todos os grupos de pessoas de forma equitativa sem contribuir para as iniquidades sociais existentes. Semelhante ao discurso de ódio, os danos relacionados à imparcialidade dependem de um tratamento díspar aos Grupos de identidade.  
Sexual Sexual descreve a linguagem relacionada a órgãos anatômicos e genitais, relacionamentos românticos, atos retratados em termos eróticos ou afetuosos, gravidez, atos sexuais físicos, incluindo aqueles retratados como agressão ou ato sexual violento forçado contra a vontade, prostituição, pornografia e abuso.  
Violência A violência descreve a linguagem relacionada a ações físicas destinadas a ferir, danificar ou matar alguém ou algo assim; descreve armas e entidades relacionadas, como fabricantes, associações, etc.
Automutilação A automutilação descreve a linguagem relacionada a ações físicas destinadas a ferir, danificar propositalmente o próprio corpo ou se matar.
Risco de jailbreak Ataques de jailbreak são prompts de usuário projetados para provocar o modelo de IA generativa a exibir comportamentos que foi treinado para evitar ou quebrar as regras definidas na Mensagem do Sistema. Tais ataques podem variar desde interpretações elaboradas até subversões sutis do objetivo de segurança.
Material protegido para o texto* O texto de material protegido descreve o conteúdo de texto conhecido (por exemplo, letras de música, artigos, receitas e conteúdo da Web selecionado) que pode ser gerado por modelos de linguagem grandes.
Material protegido para o código O código de material protegido descreve o código-fonte que corresponde a um conjunto de código-fonte de repositórios públicos, que pode ser gerado por modelos de linguagem grandes sem a citação adequada de repositórios de origem.

* Caso seja um proprietário do material de texto e quiser enviar conteúdo de texto para proteção, registre uma solicitação.

Conteúdo de texto

Aviso

A guia Definições de severidade neste documento contém exemplos de conteúdo prejudicial que podem ser perturbadores para alguns leitores.

Conteúdo da imagem

Aviso

A guia Definições de severidade neste documento contém exemplos de conteúdo prejudicial que podem ser perturbadores para alguns leitores.

Configurabilidade (versão prévia)

A configuração de filtragem de conteúdo padrão é definida para filtrar no limite de gravidade médio para todas as quatro categorias de danos de conteúdo para prompts e conclusões. Isso significa que o conteúdo detectado no nível de gravidade médio ou alto é filtrado, enquanto o conteúdo detectado no nível de severidade baixo não é filtrado pelos filtros de conteúdo. O recurso de configurabilidade está disponível na versão prévia e permite que os clientes ajustem as configurações, separadamente para prompts e conclusões, para filtrar o conteúdo de cada categoria de conteúdo em diferentes níveis de gravidade, conforme descrito na tabela abaixo:

Gravidade filtrada Configurável para prompts Configurável para conclusões Descrições
Baixo, médio ou alto Sim Sim Configuração de filtragem mais rigorosa. O conteúdo detectado nos níveis de gravidade baixo, médio e alto é filtrado.
Médio, alto Sim Sim Configuração padrão. O conteúdo detectado no nível de severidade baixo não é filtrado, enquanto o conteúdo nos níveis médio e alto é filtrado.
Alto Sim Yes O conteúdo detectado nos níveis de gravidade baixo e médio não será filtrado. Somente o conteúdos com nível de gravidade alto serão filtrados.
Nenhum filtro Se aprovado* Se aprovado* nenhum conteúdo será filtrado, independentemente do nível de gravidade detectado. Requer aprovação*.

* Somente os clientes aprovados para filtragem de conteúdo modificado têm o controle completo de filtragem de conteúdo e podem desativar parcial ou totalmente os filtros de conteúdo. O controle de filtragem de conteúdo não se aplica a filtros de conteúdo para DALL-E (versão prévia) ou GPT-4 Turbo com Visão (versão prévia). Aplique filtros de conteúdo modificados usando este formulário: Revisão de Acesso Limitado do OpenAI do Azure: Filtragem de Conteúdo Modificado (microsoft.com).

Os clientes são responsáveis por garantir que os aplicativos que integram o OpenAI do Azure estejam em conformidade com o Código de conduta.

As configurações de filtragem de conteúdo são criadas em um Recurso no Estúdio de IA do Azure e podem ser associadas a Implantações. Saiba mais sobre configurabilidade aqui.

Detalhes do cenário

Quando o sistema de filtragem de conteúdo detecta conteúdo prejudicial, você receberá um erro na chamada da API se o prompt for considerado inadequado ou o finish_reason na resposta será content_filter para indicar que parte da conclusão foi filtrada. Ao criar seu aplicativo ou sistema, convém considerar esses cenários em que o conteúdo retornado pela API de Conclusões é filtrado, o que pode resultar em conteúdo incompleto. Como você age a respeito dessas informações será específico do aplicativo. O comportamento pode ser resumido nos seguintes pontos:

  • Prompts classificados em uma categoria filtrada e nível de gravidade retornarão um erro HTTP 400.
  • As chamadas de conclusão não streaming não retornarão nenhum conteúdo quando o conteúdo for filtrado. O valor finish_reason será definido como content_filter. Em casos raros com respostas mais longas, pode ser retornado um resultado parcial. Nesses casos, o finish_reason será atualizado.
  • Para chamadas de conclusão de streaming, os segmentos voltarão para o usuário conforme forem concluídos. O serviço continuará transmitindo até atingir um token de parada ou comprimento, ou quando o conteúdo classificado em uma categoria filtrada e nível de gravidade for detectado.

Cenário: você envia uma chamada de conclusões que não são de streaming solicitando várias saídas; nenhum conteúdo é classificado em uma categoria filtrada e nível de gravidade

A tabela a seguir descreve as várias maneiras pelas quais a filtragem de conteúdo pode aparecer:

Código de resposta HTTP Comportamento de resposta
200 Nos casos em que toda a geração passa pelos filtros conforme configurado, nenhum detalhe de moderação de conteúdo é adicionado à resposta. O finish_reason para cada geração será de parada ou comprimento.

Exemplo de conteúdo de solicitação:

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

Exemplo de resposta JSON:

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

Cenário: sua chamada à API solicita várias respostas (N>1) e pelo menos uma das respostas é filtrada

Código de resposta HTTP Comportamento de resposta
200 As gerações filtradas terão um valor finish_reason de content_filter.

Exemplo de conteúdo de solicitação:

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

Exemplo de resposta 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
        }
    ]
}

Cenário: um prompt de entrada inadequado é enviado para a API de conclusões (seja para streaming ou não streaming)

Código de resposta HTTP Comportamento de resposta
400 A chamada à API falha quando o prompt dispara um filtro de conteúdo conforme configurado. Modifique o prompt e tente novamente.

Exemplo de conteúdo de solicitação:

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

Exemplo de resposta JSON:

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

Cenário: você faz uma chamada de conclusão de streaming; nenhum conteúdo de saída é classificado em uma categoria filtrada e nível de gravidade

Código de resposta HTTP Comportamento de resposta
200 Nesse caso, a chamada será transmitida novamente com a geração completa e finish_reason será de "comprimento" ou "parada" para cada resposta gerada.

Exemplo de conteúdo de solicitação:

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

Exemplo de resposta JSON:

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

Cenário: você faz uma chamada de conclusão de streaming solicitando várias conclusões e pelo menos uma parte do conteúdo de saída é filtrado

Código de resposta HTTP Comportamento de resposta
200 Para um determinado índice de geração, a última parte da geração inclui um valor finish_reason não nulo. O valor será content_filter quando a geração for filtrada.

Exemplo de conteúdo de solicitação:

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

Exemplo de resposta 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
        }
    ]
}

Cenário: o sistema de filtragem de conteúdo não é executado na conclusão

Código de resposta HTTP Comportamento de resposta
200 Se o sistema de filtragem de conteúdo estiver inativo ou não puder concluir a operação a tempo, sua solicitação ainda será concluída sem filtragem de conteúdo. Você pode determinar que a filtragem não foi aplicada procurando uma mensagem de erro no objeto content_filter_result.

Exemplo de conteúdo de solicitação:

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

Exemplo de resposta 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"
                }
            }
        }
    ]
}

Anotações

Filtros de conteúdo

Quando as anotações são habilitadas conforme mostrado no snippet de código abaixo, as seguintes informações são retornadas por meio da API para as categorias ódio e justiça, sexual, violência e automutilação:

  • categoria de filtragem de conteúdo (ódio, sexual, violência, e automutilação)
  • o nível de gravidade (seguro, baixo, médio ou alto) em cada categoria de conteúdo
  • status de filtragem (verdadeiro ou falso).

Modelos opcionais

Modelos opcionais podem ser habilitados em anotação (retorna informações quando o conteúdo foi sinalizado, mas não filtrado) ou no modo de filtro (retorna informações quando o conteúdo foi sinalizado e filtrado).

Quando as anotações são habilitadas conforme mostrado no trecho de código abaixo, as seguintes informações são retornadas pela API para modelos opcionais: risco de jailbreak, texto de material protegido e código de material protegido:

  • categoria (jailbreak, protected_material_text, protected_material_code),
  • detectado (verdadeiro ou falso),
  • filtrado (verdadeiro ou falso).

Para o modelo de código de material protegido, as seguintes informações adicionais são retornadas pela API:

  • uma citação de exemplo de um repositório público do GitHub em que um snippet de código foi encontrado
  • a licença do repositório.

Ao exibir o código em seu aplicativo, é altamente recomendável que o aplicativo também exiba a citação de exemplo das anotações. A conformidade com a licença citada também pode ser necessária para a cobertura do Compromisso de Direitos Autorais do Cliente.

As anotações estão atualmente disponíveis na versão API do GA 2024-02-01 e em todas as versões de visualização a partir de 2023-06-01-preview para conclusões e conclusões de chat (modelos GPT). O trecho de código a seguir mostra como usar anotações:

# 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))

Saída

{ 
  "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 obter detalhes sobre os pontos de extremidade da API REST de inferência para o Azure OpenAI e como criar Chat e Conclusões, siga as diretrizes de referência da API REST do Serviço OpenAI do Azure. As anotações são retornadas para todos os cenários ao usar qualquer versão de visualização da API a partir de 2023-06-01-preview, bem como a versão da API do GA 2024-02-01.

Cenário de exemplo: um prompt de entrada que contém o conteúdo classificado em uma categoria filtrada e nível de gravidade é enviado para a API de conclusões

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

Streaming de conteúdo

Esta seção descreve a experiência e as opções de streaming de conteúdo de OpenAI do Azure. Com a aprovação, você tem a opção de receber o conteúdo da API à medida que ele é gerado, em vez de esperar por partes de conteúdo que foram verificadas para passar pelos seus filtros de conteúdo.

Default

O sistema de filtragem de conteúdo é integrado e habilitado por padrão para todos os clientes. No cenário de streaming padrão, o conteúdo de conclusão é armazenado em buffer, o sistema de filtragem de conteúdo é executado no conteúdo em buffer e, dependendo da configuração de filtragem de conteúdo, o conteúdo é retornado ao usuário se ele não violar a política de filtragem de conteúdo (configuração de usuário padrão ou personalizada da Microsoft) ou é imediatamente bloqueado e retorna um erro de filtragem de conteúdo, sem retornar o conteúdo de conclusão prejudicial. Esse processo é repetido até o final do fluxo. O conteúdo é totalmente examinado de acordo com a política de filtragem de conteúdo antes de ser retornado ao usuário. O conteúdo não é retornado token por token nesse caso, mas em “partes de conteúdo” do respectivo tamanho do buffer.

Filtro modificado assíncrono

Os clientes que foram aprovados para filtros de conteúdo modificados podem escolher o filtro modificado assíncrono como uma opção adicional, fornecendo uma nova experiência de streaming. Nesse caso, os filtros de conteúdo são executados de forma assíncrona e o conteúdo completo é retornado imediatamente com uma experiência de streaming suave, token por token. Nenhum conteúdo é armazenado em buffer, o que permite uma latência zero.

Os clientes devem estar cientes de que, embora o recurso melhore a latência, é uma compensação em relação à segurança e verificação em tempo real de seções menores de saída do modelo. Como os filtros de conteúdo são executados de forma assíncrona, as mensagens de moderação de conteúdo e sinais de violação de política são adiados, o que significa que algumas seções de conteúdo prejudicial que, de outra forma, teriam sido filtradas imediatamente, podem ser exibidas para o usuário.

Anotações: anotações e mensagens de moderação de conteúdo são retornadas continuamente durante o fluxo. É altamente recomendável consumir anotações em seu aplicativo e implementar mecanismos adicionais de segurança de conteúdo de IA, como redigir conteúdo ou retornar informações adicionais de segurança ao usuário.

Sinal de filtragem de conteúdo: o sinal de erro de filtragem de conteúdo está atrasado. No caso de uma violação de política, ele é retornado assim que estiver disponível e o fluxo é interrompido. O sinal de filtragem de conteúdo é garantido dentro de uma janela de aproximadamente 1.000 caracteres do conteúdo que viola a política.

A aprovação para filtragem de conteúdo modificado é necessária para acesso ao filtro modificado assíncrono. O aplicativo pode ser encontrado aqui. Para habilitá-lo no Estúdio de OpenAI do Azure, siga o Guia de instruções de filtragem de conteúdo para criar uma nova configuração de filtragem de conteúdo e selecione Filtro Modificado Assíncrono na seção Streaming.

Comparação de modos de filtragem de conteúdo

Comparar Streaming – Padrão Streaming – Filtro modificado assíncrono
Status GA Visualização pública
Qualificação Todos os clientes Clientes aprovados para filtragem de conteúdo modificado
Como habilitar Habilitado por padrão, nenhuma ação é necessária Os clientes aprovados para filtragem de conteúdo modificado podem configurá-la diretamente por meio do Estúdio OpenAI do Azure (como parte de uma configuração de filtragem de conteúdo aplicada no nível da implantação)
Modalidade e disponibilidade Texto; todos os modelos GPT Texto; todos os modelos GPT, exceto gpt-4-vision
Experiência de streaming O conteúdo é armazenado em buffer e retornado em partes Latência zero (sem buffer, com os filtros sendo executados de forma assíncrona)
Sinal de filtragem de conteúdo Sinal de filtragem imediata Sinal de filtragem atrasado (em até aproximadamente 1.000 incrementos de caractere)
Configurações de filtragem de conteúdo Dá suporte a configurações de filtro padrão e definidas pelo cliente (incluindo modelos opcionais) Dá suporte a configurações de filtro padrão e definidas pelo cliente (incluindo modelos opcionais)

Anotações e respostas de exemplo

Mensagem de anotação de prompt

Isso é o mesmo que anotações padrão.

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

Mensagem de token de conclusão

As mensagens de conclusão são encaminhadas imediatamente. Nenhuma moderação é executada primeiro e nenhuma anotação é fornecida 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 
} 

Mensagem de anotação

O campo de texto sempre será uma cadeia de caracteres vazia, indicando que não há novos tokens. As anotações serão relevantes apenas para tokens já enviados. Pode haver várias mensagens de anotação fazendo referência aos mesmos tokens.

"start_offset" e "end_offset" são deslocamentos de baixa granularidade no texto (com 0 no início do prompt) para marcar a que texto a anotação se refere.

"check_offset" representa a quantidade de texto totalmente moderada. É um limite inferior exclusivo nos valores de "end_offset" das anotações futuras. Ele é não decrescente.

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 
} 

Fluxo de resposta de exemplo (passa filtros)

Veja abaixo uma resposta de conclusão de chat real usando filtro modificado assíncrono. Observe como as anotações de prompt não são alteradas, tokens de conclusão são enviados sem anotações, e novas mensagens de anotação são enviadas sem tokens, mas são associadas a determinados deslocamentos de filtro de conteúdo.

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

Fluxo de resposta de exemplo (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

Quando a filtragem de conteúdo é acionada para uma solicitação e um "status": 400 é recebido como parte da resposta, pode haver uma cobrança para essa solicitação, pois a solicitação foi avaliada pelo serviço. Cobranças também ocorrerão quando uma "status":200 for recebido com "finish_reason": "content_filter". Nesse caso, o solicitação não apresentou nenhum problema, mas foi detectado que a conclusão gerada pelo modelo violava as regras de filtragem de conteúdo, o que fez com que a conclusão fosse filtrada.

Práticas recomendadas

Como parte do design do aplicativo, considere as seguintes práticas recomendadas para fornecer uma experiência positiva com seu aplicativo, minimizando possíveis danos:

  • Decida como você deseja lidar com cenários em que os usuários enviam prompts contendo conteúdo classificado em uma categoria filtrada e nível de gravidade ou, de outra forma, usam o seu aplicativo incorretamente.
  • Verifique finish_reason para ver se uma conclusão foi filtrada.
  • Verifique se não há nenhum objeto de erro no content_filter_result (indicando que os filtros de conteúdo não foram executados).
  • Caso esteja usando o modelo de código de material protegido no modo de anotação, exiba o URL de citação quando estiver exibindo o código em seu aplicativo.

Próximas etapas