Compartilhar via


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 junto com modelos principais, incluindo modelos de geração de imagem DALL-E. 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 risco

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.
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.

Proteções de solicitação

Tipo Descrição
Escudo de alerta para ataques de jailbreak Os ataques de jailbreak são avisos do usuário projetados para provocar o modelo de IA generativa a exibir comportamentos que foi treinado para evitar ou para quebrar as regras definidas na mensagem do sistema. Tais ataques podem variar desde uma interpretação complexa até uma subversão sutil do objetivo de segurança.
Escudo imediato para ataques indiretos Os ataques indiretos, também conhecidos como ataques de prompt indireto ou ataques de injeção de prompt entre domínios, são uma vulnerabilidade potencial onde terceiros colocam instruções maliciosas dentro de documentos que o sistema de IA generativa pode acessar e processar. Requer incorporação e formatação de documentos.

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 padrão de filtragem de conteúdo para a série de modelos GPT é definida para filtrar no limite de gravidade médio para todas as quatro categorias de conteúdo prejudicial (ódio, violência, sexual e automutilação) e se aplica a ambos os prompts (texto, texto multimodal/ imagem) e conclusões (texto). 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 gravidade baixo não é filtrado pelos filtros de conteúdo. Para DALL-E, o limite de gravidade padrão é definido como baixo para prompts (texto) e conclusões (imagens), para que o conteúdo detectado em níveis de gravidade baixo, médio ou alto seja filtrado. 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 Yes 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. Exige aprovação1.
Nenhum filtro Se aprovado1 Se aprovado1 nenhum conteúdo será filtrado, independentemente do nível de gravidade detectado. Exige aprovação1.

1 Para modelos OpenAI do Azure, somente os clientes aprovados para filtragem de conteúdo modificado têm o controle completo de filtragem de conteúdo e podem desativar os filtros de conteúdo. Aplique filtros de conteúdo modificados por meio deste formulário: Revisão de Acesso Limitado do OpenAI do Azure: Filtros de Conteúdo Modificados para clientes do Azure Governamental, solicite filtros de conteúdo modificados por meio deste formulário: Azure Governamental – Solicitar Filtragem de Conteúdo Modificada para o Serviço OpenAI do Azure.

Filtros de conteúdo configuráveis para entradas (prompts) e saídas (conclusões) estão disponíveis para os seguintes modelos do Azure OpenAI:

  • Série de modelos GPT
  • GPT-4 Turbo Vision GA* (turbo-2024-04-09)
  • GPT-4o
  • DALL-E 2 e 3

*Disponível apenas para o GPT-4 Turbo Vision em disponibilidade geral, não se aplica à versão prévia do GPT-4 Turbo Vision

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.

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.

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 nos trechos de código abaixo, as seguintes informações são retornadas pela API para modelos opcionais:

Modelar Saída
jailbreak detectado (verdadeiro ou falso),
filtrado (verdadeiro ou falso)
ataques indiretos detectado (verdadeiro ou falso),
filtrado (verdadeiro ou falso)
texto de material protegido detectado (verdadeiro ou falso),
filtrado (verdadeiro ou falso)
código de material protegido detectado (verdadeiro ou falso),
filtrado (verdadeiro ou falso),
Exemplo de citação do repositório público GitHub onde o 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 necessária para a cobertura do Compromisso de Direitos Autorais do Cliente.

Veja a tabela a seguir para ver a disponibilidade de anotações em cada versão da API:

Categoria 01/02/2024 GA 01/04/2024-versão prévia 2023-10-01-preview 2023-06-01-preview
Ódio
Violência
Sexual
Automutilação
Prompt Shield para ataques de jailbreak
Prompt Shield para ataques indiretos
Texto de material protegido
Código de material protegido
Lista de bloqueios de imoralidades
Lista de bloqueio 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))

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

Incorporação de documentos em prompts

Um aspecto fundamental das medidas de IA responsável do Azure OpenAI é o sistema de segurança de conteúdo. Esse sistema funciona junto com o modelo GPT principal para monitorar quaisquer irregularidades na entrada e na saída do modelo. Seu desempenho é melhorado quando ele pode diferenciar entre vários elementos do seu prompt, como entrada do sistema, entrada do usuário e saída do assistente de IA.

Para recursos de detecção aprimorados, os prompts devem ser formatados de acordo com os métodos recomendados a seguir.

API de conclusões de chat

A API de conclusão de chat é estruturada por definição. Consiste em uma lista de mensagens, cada uma com uma função atribuída.

O sistema de segurança analisará esse formato estruturado e aplicará o seguinte comportamento:

  • No conteúdo de “usuário” mais recente, serão detectadas as seguintes categorias de Riscos RAI:
    • Ódio
    • Sexual
    • Violência
    • Automutilação
    • Jailbreak (opcional)

Esse é um exemplo de matriz de mensagens:

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

Incorporando documentos em seu prompt

Além da detecção do conteúdo do último usuário, o Azure OpenAI também oferece suporte à detecção de riscos específicos dentro de documentos de contexto por meio de Prompt Shields – Indirect Prompt Attack Detection. Você deve identificar partes da entrada que são um documento (por exemplo, site recuperado, email, etc.) com o seguinte delimitador de documento.

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

Ao fazer isso, as seguintes opções estarão disponíveis para detecção em documentos marcados:

  • Em cada conteúdo de “documento” marcado, detecte as seguintes categorias:
    • Ataques indiretos (opcional)

Aqui está um exemplo de matriz de mensagens de conclusão de chat:

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

Quando você marca documentos não verificados para detecção, o conteúdo do documento deve ter escape JSON para garantir uma análise bem-sucedida pelo sistema de segurança Azure OpenAI.

Por exemplo, veja o seguinte corpo do email:

Hello Josè, 

I hope this email finds you well today.

Com JSON escapando, seria:

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

O texto escapado em um contexto de conclusão de chat seria:

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

Padrão

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 Assíncrono

Os clientes podem escolher o Filtro 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 experiência de streaming rápida com latência zero associada à segurança do conteúdo.

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.

Compromisso de Direitos Autorais do Cliente: o conteúdo sinalizado retroativamente como material protegido pode não ser qualificado para a cobertura do Compromisso de Direitos Autorais do Cliente.

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 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
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 um prompt e um "status": 400 é recebido como parte da resposta, haverá uma cobrança por essa solicitação, pois o prompt foi avaliado pelo serviço. Devido à natureza assíncrona do sistema de filtragem de conteúdo, haverá um encargo para os tokens de solicitação e de conclusã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