Filtragem de conteúdos

Importante

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

O Serviço OpenAI do Azure inclui um sistema de filtragem de conteúdo que funciona em conjunto com os modelos principais. Este sistema funciona executando tanto o prompt como o preenchimento através de um conjunto de modelos de classificação destinados a detetar e prevenir a saída de conteúdo nocivo. O sistema de filtragem de conteúdo deteta e age em categorias específicas de conteúdo potencialmente nocivo em prompts de entrada e finalizações de saída. As variações nas configurações da API e na conceção da aplicação podem afetar as conclusões e, consequentemente, 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. No entanto, o serviço pode funcionar em muitos outros idiomas, mas a qualidade pode variar. Em todos os casos, deve efetuar os seus próprios testes para garantir que funciona para a sua aplicação.

Além do sistema de filtragem de conteúdo, o Serviço Azure OpenAI realiza monitoramento para detetar conteúdo e/ou comportamentos que sugerem o uso do serviço de uma maneira que pode violar os termos do produto aplicáveis. Para obter mais informações sobre como compreender e mitigar os riscos associados ao seu aplicativo, consulte a Nota de Transparência para o Azure OpenAI. Para obter mais informações sobre como os dados são processados para filtragem de conteúdo e monitoramento de abuso, consulte 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 cenários de API a serem considerados no design e implementação de aplicativos.

Categorias de filtragem de conteúdo

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

  • Modelos neurais de classificação multiclasse destinados a detetar e filtrar conteúdos nocivos; Os modelos abrangem quatro categorias (ódio, sexual, violência e automutilação) em quatro níveis de gravidade (seguro, baixo, médio e alto). O conteúdo detectado no nível de gravidade "seguro" é identificado em anotações, mas não está sujeito a filtragem e não é configurável.
  • Outros modelos de classificação opcionais destinados a detetar o 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 ao texto conhecido ou ao código-fonte. O uso desses modelos é opcional, mas o uso de 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 Description
Ódio e justiça Os danos relacionados com o ódio e a equidade referem-se a qualquer conteúdo que ataque ou utilize linguagem pejorativa ou discriminatória com referência a uma pessoa ou a grupos de identidade com base em certos atributos diferenciadores desses grupos, incluindo, entre outros, raça, etnia, nacionalidade, grupos e expressão de identidade de género, orientação sexual, religião, estatuto de imigração, estatuto de capacidade, aparência pessoal, e tamanho do corpo. 

A equidade diz respeito a garantir que os sistemas de IA tratam todos os grupos de pessoas de forma equitativa, sem contribuir para as desigualdades societais existentes. À semelhança do discurso de ódio, os danos relacionados com a equidade dependem do tratamento díspar dos grupos de identidade.  
Sexual Sexual descreve linguagem relacionada a órgãos anatômicos e genitais, relacionamentos românticos, atos retratados em termos eróticos ou afetivos, gravidez, atos sexuais físicos, incluindo aqueles retratados como uma agressão ou um 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, ferir, danificar ou matar alguém ou algo; descreve armas, armas e entidades relacionadas, tais como fabricantes, associações, legislação, etc.
Automutilação A automutilação descreve a linguagem relacionada com ações físicas destinadas a ferir, ferir, danificar o corpo ou matar-se propositadamente.
Risco de jailbreak Os ataques de jailbreak são Prompts do Usuário projetados para provocar o modelo de IA Generativa a exibir comportamentos que ele foi treinado para evitar ou quebrar as regras definidas na Mensagem do Sistema. Tais ataques podem variar de uma intrincada encenação a uma subversão subtil do objetivo de segurança.
Material protegido para texto* O texto de material protegido descreve o conteúdo de texto conhecido (por exemplo, letras de músicas, artigos, receitas e conteúdo da Web selecionado) que pode ser gerado por modelos de linguagem grandes.
Material protegido para 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 código-fonte.

* Se você é proprietário de material de texto e deseja enviar conteúdo de texto para proteção, envie uma solicitação.

Conteúdo do texto

Aviso

A guia Definições de gravidade neste documento contém exemplos de conteúdo prejudicial que pode ser perturbador para alguns leitores.

Conteúdo da imagem

Aviso

A guia Definições de gravidade neste documento contém exemplos de conteúdo prejudicial que pode ser perturbador para alguns leitores.

Configurabilidade (pré-visualização)

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

Severidade filtrada Configurável para prompts Configurável para finalizações Descrições
Baixa, média, alta Sim Sim Configuração de filtragem mais rigorosa. O conteúdo detetado nos níveis de gravidade baixo, médio e alto é filtrado.
Médio, alto Sim Sim Configuração padrão. O conteúdo detetado no nível de gravidade baixo não é filtrado, o conteúdo em médio e alto é filtrado.
Alto Sim Sim O conteúdo detetado nos níveis de gravidade baixo e médio não é filtrado. Apenas o conteúdo com nível de severidade alto é filtrado.
Sem filtros Se aprovado* Se aprovado* Nenhum conteúdo é filtrado, independentemente do nível de gravidade detetado. Requer aprovação*.

* Somente os clientes que foram aprovados para filtragem de conteúdo modificado têm controle total de filtragem de conteúdo e podem desativar os filtros de conteúdo parcial ou totalmente. O controlo de filtragem de conteúdos não se aplica aos filtros de conteúdos para DALL-E (pré-visualização) ou GPT-4 Turbo com Visão (pré-visualização). Solicite filtros de conteúdo modificados usando este formulário: Azure OpenAI Limited Access Review: Modified Content Filtering (microsoft.com).

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

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

Detalhes do cenário

Quando o sistema de filtragem de conteúdo deteta conteúdo nocivo, você recebe um erro na chamada de API se o prompt foi considerado inadequado ou a finish_reason resposta na resposta será content_filter para indicar que parte da conclusão foi filtrada. Ao criar seu aplicativo ou sistema, convém levar em conta esses cenários em que o conteúdo retornado pela API de Conclusão é filtrado, o que pode resultar em conteúdo incompleto. A forma como você age com base nessas informações será específica do aplicativo. O comportamento pode ser resumido nos seguintes pontos:

  • Os pedidos classificados numa categoria filtrada e ao nível de gravidade irão devolver um erro HTTP 400.
  • As chamadas de conclusão sem streaming não retornarão nenhum conteúdo quando o conteúdo for filtrado. O finish_reason valor será definido como content_filter. Em casos raros com respostas mais longas, um resultado parcial pode ser retornado. Nestes casos, o finish_reason será atualizado.
  • Para chamadas de conclusão de streaming, os segmentos serão devolvidos ao usuário à medida que forem concluídos. O serviço continuará transmitindo até atingir um token de parada, comprimento ou quando o conteúdo classificado em uma categoria filtrada e nível de gravidade for detetado.

Cenário: Você envia uma chamada de conclusão sem streaming solicitando várias saídas; Nenhum conteúdo é classificado em uma categoria filtrada e nível de severidade

A tabela abaixo 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 os filtros conforme configurados, nenhum detalhe de moderação de conteúdo é adicionado à resposta. O finish_reason para cada geração será de parada ou comprimento.

Exemplo de carga útil 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 de 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 que foram filtradas terão um finish_reason valor de content_filter.

Exemplo de carga útil 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ão (para streaming ou não-streaming)

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

Exemplo de carga útil 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 severidade

Código de resposta HTTP Comportamento de resposta
200 Neste caso, a chamada será transmitida de volta com a geração completa e finish_reason será 'duração' ou 'parada' para cada resposta gerada.

Exemplo de carga útil 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 finalizações e pelo menos uma parte do conteúdo de saída é filtrada

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 não nulo finish_reason . O valor é content_filter quando a geração foi filtrada.

Exemplo de carga útil 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 após a conclusão

Código de resposta HTTP Comportamento de resposta
200 Se o sistema de filtragem de conteúdo estiver inativo ou não conseguir 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 content_filter_result objeto.

Exemplo de carga útil 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 trecho 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 self_harm)
  • o nível de severidade (seguro, baixo, médio ou alto) dentro de cada categoria de conteúdo
  • estado de filtragem (true ou false).

Modelos opcionais

Os modelos opcionais podem ser ativados no modo de 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),
  • detetado (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:

  • um exemplo de citação de um repositório público do GitHub onde um trecho 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 exigida para a cobertura do Compromisso de Direitos Autorais do Cliente.

As anotações estão atualmente disponíveis na versão 2024-02-01 da API do GA e em todas as versões de visualização a partir de Conclusões e Conclusão do 2023-06-01-preview 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ão, 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 API de visualização a partir de 2023-06-01-preview, bem como a versão 2024-02-01da API GA.

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

{
    "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 do Azure OpenAI. Com a aprovação, você tem a opção de receber conteúdo da API à medida que é gerado, em vez de esperar que partes de conteúdo que foram verificadas passem pelos filtros de conteúdo.

Predefinido

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 armazenado em buffer e, dependendo da configuração de filtragem de conteúdo, o conteúdo é retornado ao usuário se 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 devolver o conteúdo de conclusão prejudicial. Este processo é repetido até o final do fluxo. O conteúdo é totalmente verificado de acordo com a política de filtragem de conteúdo antes de ser devolvido ao usuário. O conteúdo não é retornado token por token neste caso, mas em "blocos de conteúdo" do respetivo tamanho de 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, proporcionando uma nova experiência de streaming. Nesse caso, os filtros de conteúdo são executados de forma assíncrona e o conteúdo de conclusão é retornado imediatamente com uma experiência de streaming suave token por token. Nenhum conteúdo é armazenado em buffer, o que permite latência zero.

Os clientes devem estar cientes de que, embora o recurso melhore a latência, é uma compensação contra a segurança e a verificação em tempo real de seções menores da 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 os sinais de violação de política são atrasados, 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 que você consuma anotações em seu aplicativo e implemente mecanismos adicionais de segurança de conteúdo de IA, como a edição de conteúdo ou o retorno de informações de segurança adicionais ao usuário.

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

A aprovação da filtragem de conteúdo modificado é necessária para o acesso ao filtro modificado assíncrono. A candidatura pode ser consultada aqui. Para habilitá-lo no Azure OpenAI Studio, siga o guia de instruções do filtro 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 dos modos de filtragem de conteúdo

Comparar Streaming - Padrão Streaming - Filtro modificado assíncrono
Status GA Pré-visualização Pública
Elegibilidade Todos os clientes Clientes aprovados para filtragem de conteúdo modificado
Como ativar Ativado por padrão, nenhuma ação necessária Os clientes aprovados para filtragem de conteúdo modificada podem configurá-la diretamente no Azure OpenAI Studio (como parte de uma configuração de filtragem de conteúdo, aplicada no nível de 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 buffering, os filtros são executados de forma assíncrona)
Sinal de filtragem de conteúdo Sinal de filtragem imediata Sinal de filtragem atrasado (em incrementos de até ~1.000 caracteres)
Configurações de filtragem de conteúdo Suporta configuração de filtro padrão e qualquer configuração de filtro definida pelo cliente (incluindo modelos opcionais) Suporta configuração de filtro padrão e qualquer configuração de filtro definida pelo cliente (incluindo modelos opcionais)

Anotações e exemplos de respostas

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 será sempre uma cadeia de caracteres vazia, indicando que não há novos tokens. As anotações só serão relevantes para tokens já enviados. Pode haver várias mensagens de anotação referentes 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 para qual texto a anotação é relevante.

"check_offset" representa a quantidade de texto que foi totalmente moderada. É um limite inferior exclusivo sobre os "end_offset" valores de anotações futuras. Não está diminuindo.

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 amostra (passa filtros)

Abaixo está uma resposta real de conclusão de bate-papo usando filtro modificado assíncrono. Observe como as anotações de prompt não são alteradas, os tokens de conclusão são enviados sem anotações e as novas mensagens de anotação são enviadas sem tokens — em vez disso, elas 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 amostra (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 um prompt e um "status": 400 é recebido como parte da resposta, pode haver uma cobrança por essa solicitação, pois o prompt foi avaliado pelo serviço. As cobranças também ocorrerão quando um "status":200 for recebido com "finish_reason": "content_filter". Neste caso, o prompt não teve problemas, mas a conclusão gerada pelo modelo foi detetada para violar as regras de filtragem de conteúdo, o que resulta na conclusão sendo filtrada.

Melhores práticas

Como parte do design da sua aplicação, considere as seguintes boas práticas para oferecer uma experiência positiva com a sua aplicação e, ao mesmo tempo, minimizar potenciais danos:

  • Decida como pretende lidar com cenários em que os utilizadores enviam pedidos que contêm conteúdo classificado numa categoria filtrada e nível de gravidade ou utilizam a sua aplicação indevidamente.
  • Verifique finish_reason para ver se a conclusão está filtrada.
  • Verifique se não existe nenhum objeto de erro no content_filter_result (a indicar que os filtros de conteúdo não foram executados).
  • Se você estiver 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óximos passos