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:
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:
Uma assinatura do Azure - Crie uma gratuitamente
Permissões da conta do Azure - Sua Conta do Azure deve ter
Microsoft.Authorization/roleAssignments/write
permissões, como Administrador de Acesso de Usuário ou Proprietário.Conta do GitHub
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.
- 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.
Na página Criar espaço de código, revise e selecione Criar novo espaço de código
Aguarde até que o espaço de código inicie. Este processo de arranque pode demorar alguns minutos.
Entre no Azure com a CLI do Desenvolvedor do Azure no terminal na parte inferior da tela.
azd auth login
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.
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
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. 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
O terminal exibe uma URL após a implantação bem-sucedida do aplicativo.
Selecione esse URL rotulado
Deploying service web
para abrir o aplicativo de bate-papo em um navegador.No navegador, insira uma pergunta como "Por que a identidade gerenciada é melhor do que as chaves?".
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 oclient_id
paraManagedIdentityCredential
. - 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
: AChainedTokenCredential
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_version
parâmetros , azure_endpoint
e 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 oAZURE_CLIENT_ID
que foi fornecido aoManagedIdentityCredential
. - 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:
Restrinja o acesso ao conjunto apropriado de usuários do aplicativo usando o Microsoft Entra.
Proteger a instância dos Aplicativos de Contêiner do Azure com um firewall e/ou Rede Virtual.
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.
Entre no painel do GitHub Codespaces (https://github.com/codespaces).
Localize seus Codespaces atualmente em execução provenientes do
Azure-Samples/openai-chat-app-quickstart
repositório GitHub.Abra o menu de contexto do espaço de código e selecione Excluir.
Entre no painel do GitHub Codespaces (https://github.com/codespaces).
Localize seus Codespaces atualmente em execução provenientes do
Azure-Samples/openai-chat-app-quickstart-dotnet
repositório GitHub.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.