Introdução ao bloco de construção de segurança do Azure OpenAI

Este artigo mostra como criar e usar o exemplo de bloco de construção de segurança do Azure OpenAI. O objetivo é demonstrar o provisionamento de conta do Azure OpenAI com controle de acesso baseado em função (RBAC) para autenticação sem chave (Microsoft Entra ID) para o Azure OpenAI. Este exemplo de aplicativo de chat também inclui toda a infraestrutura e configuração necessárias para provisionar recursos do Azure OpenAI e implantar o aplicativo em Aplicativos de Contêiner do Azure usando a CLI do Desenvolvedor do Azure.

Seguindo as instruções neste artigo, você irá:

  • Implante um aplicativo de chat seguro do Contêiner do Azure.
  • Use a identidade gerenciada para o acesso ao Azure OpenAI.
  • Converse com um Azure OpenAI Large Language Model (LLM) usando a biblioteca OpenAI.

Depois de concluir este artigo, você pode começar a modificar o novo projeto com seu código e dados personalizados.

Nota

Este artigo usa um ou mais modelos de aplicativo de IA como base para os exemplos e orientações no artigo. Os modelos de aplicativos de IA fornecem implementações de referência bem mantidas e fáceis de implantar que ajudam a garantir um ponto de partida de alta qualidade para seus aplicativos de IA.

Descrição geral da arquitetura

Uma arquitetura simples do aplicativo de bate-papo é mostrada no diagrama a seguir: Diagrama mostrando a arquitetura do cliente para o aplicativo de back-end.

O aplicativo de chat é executado como um Aplicativo de Contêiner do Azure. O aplicativo usa identidade gerenciada por meio da ID do Microsoft Entra para autenticar com o Azure OpenAI, em vez de uma chave de API. O aplicativo de chat usa o Azure OpenAI para gerar respostas às mensagens do usuário.

A arquitetura do aplicativo depende dos seguintes serviços e componentes:

  • O Azure OpenAI representa o provedor de IA para o qual enviamos as consultas do usuário.
  • Os Aplicativos de Contêiner do Azure são o ambiente de contêiner onde o aplicativo está hospedado.
  • A Identidade Gerenciada nos ajuda a garantir a melhor segurança da categoria e elimina a necessidade de você, como desenvolvedor, gerenciar um segredo com segurança.
  • Arquivos Bicep para provisionamento de recursos do Azure, incluindo Azure OpenAI, Azure Container Apps, Azure Container Registry, Azure Log Analytics e funções RBAC.
  • O Microsoft AI Chat Protocol fornece contratos de API padronizados em soluções e idiomas de IA. O aplicativo de bate-papo está em conformidade com o Microsoft AI Chat Protocol, que permite que o aplicativo de avaliações seja executado em qualquer aplicativo de bate-papo que esteja em conformidade com o protocolo.
  • Um Python Quart que usa o openai pacote para gerar respostas a mensagens do usuário.
  • Um frontend HTML/JavaScript básico que transmite respostas do back-end usando linhas JSON em um ReadableStream.
  • Um aplicativo Web Blazor que usa o pacote Azure.AI.OpenAI NuGet para gerar respostas às mensagens do usuário.

Custo

Na tentativa de manter o preço o mais baixo possível neste exemplo, a maioria dos recursos usa um nível de preço básico ou de consumo. Altere o nível da camada conforme necessário com base no uso pretendido. Para parar de incorrer em cobranças, exclua os recursos quando terminar o artigo.

Saiba mais sobre o custo no repositório de amostra.

Pré-requisitos

Um ambiente de contêiner de desenvolvimento está disponível com todas as dependências necessárias para concluir este artigo. Você pode executar o contêiner de desenvolvimento no GitHub Codespaces (em um navegador) ou localmente usando o Visual Studio Code.

Para usar este artigo, você precisa cumprir os seguintes pré-requisitos:

Ambiente de desenvolvimento aberto

Use as instruções a seguir para implantar um ambiente de desenvolvimento pré-configurado contendo todas as dependências necessárias para concluir este artigo.

O GitHub Codespaces executa um contêiner de desenvolvimento gerenciado pelo GitHub com o Visual Studio Code for the Web como interface do usuário. Para o ambiente de desenvolvimento mais simples, use o GitHub Codespaces para que você tenha as ferramentas de desenvolvedor corretas e as dependências pré-instaladas para concluir este artigo.

Importante

Todas as contas do GitHub podem usar o Codespaces por até 60 horas gratuitas por mês com 2 instâncias principais. Para obter mais informações, consulte GitHub Codespaces mensalmente incluído armazenamento e horas principais.

Use as etapas a seguir para criar um novo espaço de código do GitHub na main ramificação do Azure-Samples/openai-chat-app-quickstart repositório do GitHub.

  1. Clique com o botão direito do mouse no botão a seguir e selecione Abrir link na nova janela. Esta ação permite que você tenha o ambiente de desenvolvimento e a documentação disponíveis para revisão.

Abrir no GitHub Codespaces

Abrir no GitHub Codespaces

  1. Na página Criar espaço de código, revise e selecione Criar novo espaço de código

    Captura de tela da tela de confirmação antes de criar um novo espaço de código.

  2. Aguarde até que o espaço de código inicie. Este processo de arranque pode demorar alguns minutos.

  3. Entre no Azure com a CLI do Desenvolvedor do Azure no terminal na parte inferior da tela.

    azd auth login
    
  4. Copie o código do terminal e cole-o em um navegador. Siga as instruções para autenticar com sua conta do Azure.

As tarefas restantes neste artigo ocorrem no contexto desse contêiner de desenvolvimento.

Implantar e executar

O repositório de exemplo contém todos os arquivos de código e configuração para a implantação do Azure do aplicativo de chat. As etapas a seguir orientam você pelo processo de implantação do Azure do aplicativo de chat de exemplo.

Implantar o aplicativo de chat no Azure

Importante

Os recursos do Azure criados nesta seção incorrem em custos imediatos. Esses recursos podem acumular custos mesmo se você interromper o comando antes que ele seja totalmente executado.

  1. Execute o seguinte comando da CLI do Desenvolvedor do Azure para provisionamento de recursos do Azure e implantação de código-fonte:

    azd up
    
  2. Use a tabela a seguir para responder aos prompts:

    Pedido Resposta
    Nome do ambiente Mantenha-o curto e minúsculo. Adicione o seu nome ou alias. Por exemplo, secure-chat. Ele é usado como parte do nome do grupo de recursos.
    Subscrição Selecione a assinatura na qual criar os recursos.
    Localização (para hospedagem) Selecione um local perto de você na lista.
    Localização para o modelo OpenAI Selecione um local perto de você na lista. Se o mesmo local estiver disponível como seu primeiro local, selecione isso.
  3. Aguarde até que o aplicativo seja implantado. A implantação geralmente leva entre 5 e 10 minutos para ser concluída.

Use o aplicativo de bate-papo para fazer perguntas ao modelo de linguagem grande

  1. O terminal exibe uma URL após a implantação bem-sucedida do aplicativo.

  2. Selecione esse URL rotulado Deploying service web para abrir o aplicativo de bate-papo em um navegador.

    Captura de tela do aplicativo de bate-papo no navegador mostrando várias sugestões para entrada de bate-papo e a caixa de texto do bate-papo para inserir uma pergunta.

  3. No navegador, insira uma pergunta como "Por que a identidade gerenciada é melhor do que as chaves?".

  4. A resposta vem do Azure OpenAI e o resultado é exibido.

Explorando o código de exemplo

Embora o OpenAI e o Serviço OpenAI do Azure dependam de uma biblioteca de cliente Python comum, pequenas alterações de código são necessárias ao usar pontos de extremidade do Azure OpenAI. Vamos ver como este exemplo configura a autenticação sem chave com o Microsoft Entra ID e se comunica com o Azure OpenAI.

Configurar autenticação com identidade gerenciada

Neste exemplo, o arquivo começa com a src\quartapp\chat.py configuração da autenticação sem chave.

O trecho a seguir usa o módulo azure.identity.aio para criar um fluxo de autenticação assíncrono do Microsoft Entra.

O trecho de código a seguir usa a AZURE_CLIENT_ID azd variável de ambiente para criar uma instância ManagedIdentityCredential capaz de autenticar por meio da identidade gerenciada atribuída pelo usuário.

user_assigned_managed_identity_credential = ManagedIdentityCredential(client_id=os.getenv("AZURE_CLIENT_ID")) 

Nota

As azd variáveis de ambiente de recursos são provisionadas durante azd a implantação do aplicativo.

O trecho de código a seguir usa AZURE_TENANT_ID azd a variável de ambiente de recursos para criar uma instância AzureDeveloperCliCredential capaz de autenticar com o locatário atual do Microsoft Entra.

azure_dev_cli_credential = AzureDeveloperCliCredential(tenant_id=os.getenv("AZURE_TENANT_ID"), process_timeout=60)  

A biblioteca de cliente do Azure Identity fornece credenciais — classes públicas que implementam o protocolo TokenCredential da biblioteca do Azure Core. Uma credencial representa um fluxo de autenticação distinto para adquirir um token de acesso do Microsoft Entra ID. Essas credenciais podem ser encadeadas para formar uma sequência ordenada de mecanismos de autenticação a serem tentados.

O trecho a seguir cria um ChainedTokenCredential usando a ManagedIdentityCredential e um AzureDeveloperCliCredential:

  • O ManagedIdentityCredential é usado para o Azure Functions e o Serviço de Aplicativo do Azure. Uma identidade gerenciada atribuída pelo usuário é suportada passando o client_id para ManagedIdentityCredential.
  • O AzureDeveloperCliCredential é usado para o desenvolvimento local. Ele foi definido anteriormente com base no locatário do Microsoft Entra a ser usado.
azure_credential = ChainedTokenCredential(
    user_assigned_managed_identity_credential,
    azure_dev_cli_credential
)

Gorjeta

A ordem das credenciais é importante, pois o primeiro token de acesso válido do Microsoft Entra é usado. Para obter mais informações, consulte o artigo Visão geral de ChainedTokenCredential.

O trecho de código a seguir obtém o provedor de token OpenAI do Azure com base na credencial do Azure selecionada. Esse valor é obtido chamando o azure.identity.aio.get_bearer_token_provider com dois argumentos:

  • azure_credential: A ChainedTokenCredential instância criada anteriormente para autenticar a solicitação.

  • https://cognitiveservices.azure.com/.default: Necessário um ou mais escopos de token de portador. Nesse caso, o ponto de extremidade dos Serviços Cognitivos do Azure.

token_provider = get_bearer_token_provider(
    azure_credential, "https://cognitiveservices.azure.com/.default"
)

As linhas a seguir verificam as variáveis de ambiente necessárias AZURE_OPENAI_ENDPOINT e AZURE_OPENAI_CHATGPT_DEPLOYMENT azd de recursos, que são provisionadas durante azd a implantação do aplicativo. Um erro é lançado se um valor não estiver presente.

if not os.getenv("AZURE_OPENAI_ENDPOINT"):
    raise ValueError("AZURE_OPENAI_ENDPOINT is required for Azure OpenAI")
if not os.getenv("AZURE_OPENAI_CHATGPT_DEPLOYMENT"):
    raise ValueError("AZURE_OPENAI_CHATGPT_DEPLOYMENT is required for Azure OpenAI")

Este trecho inicializa o cliente OpenAI do Azure, definindo os api_versionparâmetros , azure_endpointe azure_ad_token_provider (client_args):

bp.openai_client = AsyncAzureOpenAI(
    api_version=os.getenv("AZURE_OPENAI_API_VERSION") or "2024-02-15-preview",
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
    azure_ad_token_provider=token_provider,
)  

A linha a seguir define o nome de implantação do modelo OpenAI do Azure para uso em chamadas de API:

bp.openai_model = os.getenv("AZURE_OPENAI_CHATGPT_DEPLOYMENT")

Nota

O OpenAI usa o argumento da model palavra-chave para especificar qual modelo usar. O Azure OpenAI tem o conceito de implantações de modelo exclusivas. Quando você usa o Azure OpenAI, model deve se referir ao nome de implantação subjacente escolhido durante a implantação do modelo do Azure OpenAI.

Quando essa função for concluída, o cliente estará configurado corretamente e pronto para interagir com os serviços do Azure OpenAI.

Fluxo de resposta usando o OpenAI Client e o modelo

O response_stream lida com a chamada de conclusão do chat na rota. O trecho de código a seguir mostra como openai_client e model são usados.

async def response_stream():
    # This sends all messages, so API request may exceed token limits
    all_messages = [
        {"role": "system", "content": "You are a helpful assistant."},
    ] + request_messages

    chat_coroutine = bp.openai_client.chat.completions.create(
        # Azure Open AI takes the deployment name as the model name
        model=bp.openai_model,
        messages=all_messages,
        stream=True,
    )

Explore o código de exemplo

Os aplicativos .NET dependem da biblioteca de cliente Azure.AI.OpenAI para se comunicar com os serviços OpenAI do Azure, que depende da biblioteca OpenAI . O aplicativo de exemplo configura a autenticação sem chave usando o Microsoft Entra ID para se comunicar com o Azure OpenAI.

Configurar autenticação e registro de serviço

Neste exemplo, a autenticação sem chave é configurada program.cs no arquivo. O trecho de código a seguir usa a AZURE_CLIENT_ID variável de ambiente definida por azd para criar uma instância ManagedIdentityCredential capaz de autenticar por meio da identidade gerenciada atribuída pelo usuário.

var userAssignedIdentityCredential = 
    new ManagedIdentityCredential(builder.Configuration.GetValue<string>("AZURE_CLIENT_ID"));

Nota

As azd variáveis de ambiente de recursos são provisionadas durante azd a implantação do aplicativo.

O trecho de código a seguir usa a AZURE_TENANT_ID variável de ambiente definida por azd para criar uma instância AzureDeveloperCliCredential capaz de autenticar localmente usando a conta conectada ao azd.

var azureDevCliCredential = new AzureDeveloperCliCredential(
    new AzureDeveloperCliCredentialOptions()
    { 
        TenantId = builder.Configuration.GetValue<string>("AZURE_TENANT_ID") 
    });

A biblioteca de cliente do Azure Identity fornece classes de credenciais que implementam o protocolo TokenCredential da biblioteca do Azure Core. Uma credencial representa um fluxo de autenticação distinto para adquirir um token de acesso do Microsoft Entra ID. Essas credenciais podem ser encadeadas usando ChainedTokenCredential para formar uma sequência ordenada de mecanismos de autenticação a serem tentados.

O trecho a seguir registra o AzureOpenAIClient para injeção de dependência e cria um ChainedTokenCredential usando a ManagedIdentityCredential e um AzureDeveloperCliCredential:

  • O ManagedIdentityCredential é usado para o Azure Functions e o Serviço de Aplicativo do Azure. Uma identidade gerenciada atribuída pelo usuário é suportada usando o AZURE_CLIENT_ID que foi fornecido ao ManagedIdentityCredential.
  • O AzureDeveloperCliCredential é usado para o desenvolvimento local. Ele foi definido anteriormente com base no locatário do Microsoft Entra a ser usado.
builder.Services.AddAzureClients(
    clientBuilder => {
        clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)
            => new AzureOpenAIClient(
                new Uri(endpoint),
                new ChainedTokenCredential(
                    userAssignedIdentityCredential, azureDevCliCredential), options));
    });

Gorjeta

A ordem das credenciais é importante, pois o primeiro token de acesso válido do Microsoft Entra é usado. Para obter mais informações, consulte o artigo Visão geral de ChainedTokenCredential.

Obter conclusão de chat usando o cliente OpenAI do Azure

O aplicativo web Blazor injeta o registrado AzureOpenAIClient na parte superior do Home.Razor componente:

@inject AzureOpenAIClient azureOpenAIClient

Quando o usuário envia o formulário, o AzureOpenAIClient envia seu prompt para o modelo OpenAI para gerar uma conclusão:

ChatClient chatClient = azureOpenAIClient.GetChatClient("gpt-4o-mini");

messages.Add(new UserChatMessage(model.UserMessage));

ChatCompletion completion = await chatClient.CompleteChatAsync(messages);
    messages.Add(new SystemChatMessage(completion.Content[0].Text));

Outras considerações de segurança

Este artigo demonstra como o exemplo usa ChainedTokenCreadential para autenticação no serviço Azure OpenAI.

O exemplo também tem uma ação do GitHub que verifica os arquivos de infraestrutura como código e gera um relatório contendo quaisquer problemas detetados. Para garantir práticas recomendadas contínuas em seu próprio repositório, recomendamos que qualquer pessoa que crie soluções com base em nossos modelos garanta que a configuração de verificação secreta do GitHub esteja ativada.

Considere outras medidas de segurança, tais como:

Clean up resources (Limpar recursos)

Limpar recursos do Azure

Os recursos do Azure criados neste artigo são cobrados na sua assinatura do Azure. Se você não espera precisar desses recursos no futuro, exclua-os para evitar incorrer em mais cobranças.

Para excluir os recursos do Azure e remover o código-fonte, execute o seguinte comando da CLI do Desenvolvedor do Azure:

azd down --purge

Limpar espaços de código do GitHub

Excluir o ambiente do GitHub Codespaces garante que você possa maximizar a quantidade de direitos de horas gratuitas por núcleo que você obtém para sua conta.

Importante

Para obter mais informações sobre os direitos da sua conta do GitHub, consulte Codespaces do GitHub mensalmente incluídos armazenamento e horas principais.

  1. Entre no painel do GitHub Codespaces (https://github.com/codespaces).

  2. Localize seus Codespaces atualmente em execução provenientes do Azure-Samples/openai-chat-app-quickstart repositório GitHub.

  3. Abra o menu de contexto do espaço de código e selecione Excluir.

  1. Entre no painel do GitHub Codespaces (https://github.com/codespaces).

  2. Localize seus Codespaces atualmente em execução provenientes do Azure-Samples/openai-chat-app-quickstart-dotnet repositório GitHub.

  3. Abra o menu de contexto do espaço de código e selecione Excluir.

Obter ajuda

Se o problema não for resolvido, registre-o nos Problemas do repositório.

Próximos passos