Azure OpenAI e .NET
Usar o Azure OpenAI no .NET permite que suas aplicações C# conversem com modelos GPT hospedados no Microsoft Azure, com segurança e governança corporativa. Neste artigo, você vai revisar os conceitos de IA por trás do ChatGPT, criar o recurso pela CLI do Azure e escrever o código que consome o modelo com o SDK Azure.AI.OpenAI.
O exemplo usa o pacote Azure.AI.OpenAI na versão 1.0.0-beta.16, a versão em preview disponível na época da live que deu origem a este conteúdo. Por isso, a API mostrada aqui reflete essa versão específica do SDK.
O que é inteligência artificial
Antes de começar, vale alinhar algumas definições, a começar pela própria inteligência artificial. IA, ou AI em inglês, nada mais é do que a capacidade que as máquinas têm de imitar comportamentos humanos.
IA não é um termo novo, já que a ideia vem lá dos anos 1950. No entanto, o assunto ganhou uma proporção enorme nos últimos anos com a chegada do ChatGPT.
Embora o ChatGPT faça parte da IA, o termo inteligência artificial é muito mais abrangente. Dentro dele, temos áreas como:
- Machine Learning
- Computer Vision
- Natural Language Processing
- Document Intelligence
- Knowledge Mining
- Generative AI
Cada um desses tópicos ainda se subdivide, ou seja, IA é um campo extenso, e o Azure OpenAI no .NET cobre apenas uma parte dele. Por isso, aproveite para conferir a série Fundamentos da IA aqui no balta.io.
ChatGPT, NLP e IA generativa
O ChatGPT chocou o mundo combinando duas áreas da IA: o processamento de linguagem natural e a IA generativa. Na verdade, ele envolve várias outras técnicas, mas essas duas explicam a maior parte do impacto.
Juntas, elas produzem um efeito muito próximo do que estamos acostumados no dia a dia. Assim, boa parte do hype vem justamente dessa união, que tornou possível uma conversa amigável com as máquinas.
Entender esses dois conceitos ajuda a usar o Azure OpenAI no .NET com mais critério.
Natural Language Processing
O NLP, ou processamento de linguagem natural, é a capacidade da IA de compreender texto escrito e falado de forma natural. Além de compreender, o NLP também permite responder de forma natural, como se fosse realmente uma pessoa.
Quando você chama o Azure OpenAI no .NET, é essa capacidade que interpreta a pergunta do usuário.
Além disso, o NLP não se limita a texto. Ele também funciona para áudio, tanto na captação quanto na resposta.
O que é Generative AI
Generative AI, ou GenAI, é o segmento da IA capaz de produzir conteúdo original a partir de dados coletados. Esse conteúdo pode assumir diferentes formatos, como texto, imagens e vídeos.
Esses modelos se baseiam em redes neurais profundas (deep neural networks) que usam estatística para gerar dados. Existem várias famílias de modelos generativos, cada uma com seus pontos fortes, e o Azure OpenAI no .NET dá acesso a uma delas.
GAN, VAE, LSTM e Transformers
GAN (Generative Adversarial Networks) consiste em duas redes neurais que competem entre si: o gerador e o discriminador. O gerador cria amostras a partir de ruído aleatório, enquanto o discriminador tenta diferenciar as amostras geradas dos dados reais.
O treinamento funciona como um jogo de gato e rato, em que o gerador melhora continuamente para enganar o discriminador. Normalmente, você encontra GANs na criação de imagens realistas, na síntese de voz e na arte digital.
VAE (Variational Autoencoder) é um tipo de rede neural que aprende a codificar a entrada em um espaço latente compacto e depois reconstruí-la. Durante o treinamento, o modelo otimiza a distribuição desse espaço para facilitar a geração de novos dados parecidos com os originais.
Por isso, os VAEs aparecem na melhoria de imagens, na geração de novos conteúdos e na compressão de dados.
LSTM (Long Short-Term Memory) surgiu para tarefas de previsão e classificação em sequências, mas também gera texto ou música. Afinal, as LSTMs processam dados sequenciais e lembram informações por longos períodos, algo crucial quando a coerência importa.
Transformers usam mecanismos de atenção para modelar relações entre todas as partes de uma entrada ao mesmo tempo. Com isso, eles entendem o contexto em sequências longas e geram conteúdo a partir desse entendimento, como nos modelos GPT, na tradução automática e no conteúdo interativo.
GPT
GPT, ou Generative Pre-trained Transformer, é um tipo de modelo de IA criado pela OpenAI que usa a arquitetura Transformer para gerar texto em linguagem natural. Se você quiser se aprofundar, o artigo o que é um GPT e como sua arquitetura funciona detalha esse funcionamento.
Esses modelos passam primeiro por um pré-treinamento não supervisionado em enormes conjuntos de texto. Depois, recebem ajustes para tarefas específicas de linguagem, e são esses modelos que você consome com o Azure OpenAI no .NET.
Azure AI Services e o Azure OpenAI no .NET
O Microsoft Azure possui uma gama de serviços que cobrem as áreas de IA citadas acima. Entre eles, estão:
| Serviço | Área da IA |
|---|---|
| Azure Machine Learning | Machine Learning |
| Azure AI Vision | Computer Vision |
| Azure AI Language | NLP |
| Azure AI Document Intelligence | Document Intelligence |
| Azure AI Search | Knowledge Mining |
| Azure OpenAI Service | Generative AI |
A maior parte desses serviços funciona pelos respectivos estúdios, que são interfaces gráficas, por API ou pela CLI do Azure. Neste artigo, vamos usar a CLI, porque ela deixa cada passo explícito e fácil de automatizar.
Para conhecer melhor o catálogo completo, vale ler o artigo que explora os recursos de inteligência artificial do Microsoft Azure.
Criando o recurso para usar Azure OpenAI no .NET
Antes de escrever qualquer linha de C#, você precisa de um recurso Azure OpenAI e de um modelo publicado. A documentação oficial de criação de recursos descreve esse fluxo, e os comandos a seguir seguem a mesma sequência.
Como pré-requisito, você precisa de uma assinatura do Azure, de permissão para criar recursos e da CLI do Azure instalada e autenticada.
Criando um resource group
Como sempre, o primeiro passo é criar um grupo de recursos para organizar os itens. O comando abaixo cria o grupo OAIResourceGroup na região East US.
az group create --name OAIResourceGroup --location eastus
Criando o recurso Azure OpenAI
Em seguida, o comando az cognitiveservices account create cria o recurso em si, alocado dentro do grupo criado anteriormente. Repare no parâmetro --kind OpenAI, que define o tipo do recurso.
az cognitiveservices account create --name MyOpenAIResource --resource-group OAIResourceGroup --location eastus --kind OpenAI --sku s0 --subscription <subscriptionID>
Obtendo a URL e a chave
Ao final da criação, a CLI exibe os dados de acesso, como a URL. Caso precise dessa informação depois, use o az cognitiveservices account show e filtre a propriedade properties.endpoint com o jq.
az cognitiveservices account show --name <myResourceName> --resource-group <myResourceGroupName> | jq -r .properties.endpoint
Além da URL, o acesso aos serviços exige uma chave. Você obtém essa chave com o az cognitiveservices account keys list, informando o nome do recurso e o grupo.
az cognitiveservices account keys list --name <myResourceName> --resource-group <myResourceGroupName> | jq -r .key1
Publicando e excluindo um modelo
Com o recurso pronto, o az cognitiveservices account deployment create publica um modelo. No exemplo, a implantação se chama MyModel e usa o modelo de embeddings text-embedding-ada-002.
az cognitiveservices account deployment create --name <myResourceName> --resource-group <myResourceGroupName> --deployment-name MyModel --model-name text-embedding-ada-002 --model-version "1" --model-format OpenAI --sku-capacity "1" --sku-name "Standard"
Um detalhe importante: no Azure OpenAI, o código chama o modelo pelo nome da implantação, e não pelo nome do modelo. Portanto, escolha esse nome com cuidado, porque ele vai aparecer no seu código C#.
Caso precise excluir o modelo, use o mesmo comando com a opção delete.
az cognitiveservices account deployment delete --name <myResourceName> --resource-group <myResourceGroupName> --deployment-name MyModel
Por fim, para excluir o recurso inteiro, aplique o delete diretamente no account. Atenção, porque esse processo é irreversível.
az cognitiveservices account delete --name <myResourceName> --resource-group <myResourceGroupName>
Como consumir o Azure OpenAI no .NET
Agora vem a parte mais interessante, que é consumir os recursos do OpenAI e do Azure OpenAI no .NET. Existem duas formas de fazer isso:
- Chamando a API REST diretamente.
- Usando o SDK
Azure.AI.OpenAI.
Aqui, vamos focar no SDK, porque ele era o recurso novo na época, ainda em beta. Afinal, o consumo de APIs REST é suportado no .NET há anos e segue sempre o mesmo padrão.
Instalando os pacotes do Azure OpenAI no .NET
O pacote para consumir o Azure OpenAI no .NET é o Azure.AI.OpenAI, que neste exemplo está na versão 1.0.0-beta.16. Como ele é um prerelease, a instalação exige a flag --prerelease.
dotnet add package Azure.AI.OpenAI --prerelease
dotnet add package Azure.Identity
Note que também instalamos o Azure.Identity, responsável pela autenticação e pelo acesso aos serviços do Azure. Ele entra em cena quando você usar o Microsoft Entra ID em vez de chaves.
Criando o OpenAIClient do Azure OpenAI no .NET
O primeiro passo no código é criar a conexão, e isso acontece pelo OpenAIClient. Para o Azure, ele recebe dois parâmetros: a URL do recurso, como um Uri, e a chave de acesso, como um AzureKeyCredential.
using Azure;
using Azure.AI.OpenAI;
var useAzureOpenAI = true;
OpenAIClient client = useAzureOpenAI
? new OpenAIClient(
new Uri("https://your-azure-openai-resource.com/"),
new AzureKeyCredential("your-azure-openai-resource-api-key"))
: new OpenAIClient("your-api-key-from-platform.openai.com");
Repare que o mesmo cliente também aceita uma chave da plataforma da OpenAI, sem passar pelo Azure. Nesse caso, você informa apenas a API Key no construtor.
As informações de acesso vêm dos comandos account show e keys list que executamos antes.
Autenticação com Microsoft Entra ID no Azure OpenAI para .NET
Caso precise se autenticar com o Microsoft Entra ID, antigo Azure Active Directory, informe um DefaultAzureCredential como credencial. Dessa forma, nenhuma chave fica gravada no código ou na configuração.
using Azure.AI.OpenAI;
using Azure.Identity;
var endpoint = "https://myaccount.openai.azure.com/";
var client = new OpenAIClient(new Uri(endpoint), new DefaultAzureCredential());
O DefaultAzureCredential percorre várias fontes de credencial, como identidade gerenciada e o login da CLI do Azure. Assim, o mesmo código funciona na sua máquina e no ambiente hospedado.
Configurando o chat do Azure OpenAI no .NET
Chegou o grande momento de usar o modelo na aplicação. Partindo do ponto em que você já criou o recurso e instalou os pacotes, inicialize o cliente lendo a chave de uma variável de ambiente.
Uri azureOpenAIResourceUri = new("https://my-resource.openai.azure.com/");
AzureKeyCredential azureOpenAIApiKey = new(Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY"));
OpenAIClient client = new(azureOpenAIResourceUri, azureOpenAIApiKey);
Agora, o recurso de chat completions gera respostas para as entradas da aplicação. Para isso, comece criando um ChatCompletionsOptions, que concentra as opções da conversa.
O primeiro parâmetro é o DeploymentName, que indica o modelo, como gpt-3.5-turbo. Caso use um modelo publicado por você, informe o nome da implantação criada no passo az cognitiveservices account deployment create.
O segundo parâmetro é a lista Messages, que representa o histórico da conversa. Cada mensagem tem um papel: a de sistema define o comportamento do assistente, a de usuário traz a pergunta e a de assistente traz uma resposta anterior.
var chatCompletionsOptions = new ChatCompletionsOptions()
{
// Use DeploymentName como "model" em clientes fora do Azure
DeploymentName = "gpt-3.5-turbo",
Messages =
{
// Como o assistente deve se comportar
new ChatRequestSystemMessage("You are a helpful assistant. You will talk like a pirate."),
// Mensagem inicial do usuário
new ChatRequestUserMessage("Can you help me?"),
// Resposta inicial do assistente
new ChatRequestAssistantMessage("Arrrr! Of course, me hearty! What can I do for ye?"),
new ChatRequestUserMessage("What's the best way to train a parrot?"),
}
};
Nesse exemplo, a mensagem de sistema pede que o assistente fale como um pirata. Em seguida, o histórico simula uma troca inicial antes da pergunta real sobre como treinar um papagaio.
Interagindo com o GPT pelo Azure OpenAI no .NET
Com as opções prontas, o método GetChatCompletionsAsync envia a conversa para o modelo. Ele devolve um Response<ChatCompletions>, e a resposta do assistente fica em Choices[0].Message.
Response<ChatCompletions> response = await client.GetChatCompletionsAsync(chatCompletionsOptions);
ChatResponseMessage responseMessage = response.Value.Choices[0].Message;
// Exibe o papel (assistant) e o conteúdo da resposta
Console.WriteLine($"[{responseMessage.Role.ToString().ToUpperInvariant()}]: {responseMessage.Content}");
Para continuar a conversa, basta adicionar a resposta recebida e a próxima pergunta à lista Messages e chamar o método de novo. Afinal, o modelo não guarda estado entre chamadas, e o histórico precisa viajar em cada requisição.
Esse é o ciclo básico do Azure OpenAI no .NET: configurar o cliente, montar as mensagens e ler a resposta. Para uma visão mais ampla da IA generativa na plataforma, o artigo IA generativa no .NET e C# complementa este conteúdo.
ML.NET: machine learning sem sair do .NET
Além do Azure OpenAI no .NET, o ecossistema oferece o ML.NET para criar modelos customizados de machine learning. Ou seja, você reaproveita todo o conhecimento de C# e .NET para treinar seus próprios modelos, e o framework também suporta F#.
O exemplo abaixo treina um classificador binário de sentimento a partir de um arquivo de texto. Em seguida, ele usa o modelo treinado para prever se uma frase é positiva ou negativa.
using Microsoft.ML;
using Microsoft.ML.Data;
var dataPath = "sentiment.tsv";
// Passo 1: criar o contexto do ML.NET
var ctx = new MLContext();
// Passo 2: ler os dados de treinamento de um arquivo de texto
IDataView trainingData = ctx.Data
.LoadFromTextFile<ModelInput>(dataPath, hasHeader: true);
// Passo 3: montar o pipeline de processamento e treinamento
var pipeline = ctx.Transforms.Text
.FeaturizeText("Features", nameof(ModelInput.Text))
.Append(ctx.BinaryClassification.Trainers
.LbfgsLogisticRegression("Label", "Features"));
// Passo 4: treinar o modelo
ITransformer trainedModel = pipeline.Fit(trainingData);
// Passo 5: fazer previsões com o modelo treinado
var predictionEngine = ctx.Model
.CreatePredictionEngine<ModelInput, ModelOutput>(trainedModel);
var sampleStatement = new ModelInput { Text = "This is a horrible movie" };
var prediction = predictionEngine.Predict(sampleStatement);
public class ModelInput
{
[LoadColumn(0)]
public bool Label { get; set; }
[LoadColumn(1)]
public string Text { get; set; } = string.Empty;
}
public class ModelOutput
{
[ColumnName("PredictedLabel")]
public bool Prediction { get; set; }
}
Perceba a diferença de abordagem. Com o Azure OpenAI, você consome um modelo pronto e enorme, enquanto o ML.NET treina um modelo pequeno e específico com os seus próprios dados.
.NET Smart Components: Azure OpenAI no .NET em componentes
O .NET Smart Components é um conjunto de componentes com IA embutida para Blazor e para MVC/Razor Pages. Na prática, ele empacota em componentes boa parte do que mostramos na seção de GPT.
O próprio repositório no GitHub apresenta esses componentes como implementações de exemplo, criadas para inspirar um ecossistema de bibliotecas com IA. Portanto, trate-os como referência, e não como uma biblioteca de produção.
Smart Paste é um componente aplicado a formulários que analisa o conteúdo copiado com CTRL + C. Em seguida, ele popula automaticamente os campos do formulário, evitando a digitação manual.
Smart TextArea é uma área de texto que sugere respostas usando NLP e IA generativa. Ela completa frases inteiras respeitando o tom, as políticas e os links que você configurar.
Smart ComboBox sugere opções de forma inteligente, com base em correspondência semântica. Diferente dos outros dois, ele usa embeddings locais e roda na CPU do servidor, sem depender de um serviço externo de IA.
Já o Smart Paste e a Smart TextArea precisam de um backend configurado com OpenAI ou Azure OpenAI. Assim, eles fecham o ciclo deste artigo, levando o modelo publicado no Azure até a interface do usuário.
Gravação da live
Todo o conteúdo deste artigo foi apresentado em uma live, com demonstrações ao vivo do código e dos componentes. Confira a gravação completa abaixo.
Conclusão
A IA vai muito além do ChatGPT, mas o NLP e a IA generativa explicam por que ele mudou a forma como interagimos com as máquinas. No Azure, o Azure OpenAI Service entrega esses modelos com a governança da plataforma.
Para usar o Azure OpenAI no .NET, você cria o recurso, publica um modelo, obtém URL e chave e consome tudo pelo OpenAIClient. Além disso, o ML.NET e os Smart Components ampliam as opções para quem quer treinar modelos próprios ou levar IA direto para a interface.
Por fim, lembre que o SDK mostrado aqui estava em beta. Por isso, confira sempre as notas da versão antes de atualizar o pacote em um projeto existente.
FAQ
Qual pacote NuGet usar para o Azure OpenAI no .NET?
O pacote é o Azure.AI.OpenAI, junto com o Azure.Identity para autenticação. Este artigo usa a versão 1.0.0-beta.16, instalada com a flag --prerelease.
O DeploymentName é o nome do modelo?
No Azure OpenAI, o DeploymentName é o nome da implantação que você criou. Em clientes fora do Azure, a mesma propriedade recebe o nome do modelo.
Dá para usar o mesmo cliente com a OpenAI e com o Azure OpenAI?
Sim. O OpenAIClient aceita a URL e a chave do recurso Azure ou apenas uma API Key da plataforma da OpenAI.
Como evitar chaves no código?
Use o Microsoft Entra ID com o DefaultAzureCredential do pacote Azure.Identity. Assim, a autenticação usa identidades em vez de segredos.
Os .NET Smart Components precisam de Azure OpenAI?
O Smart Paste e a Smart TextArea precisam de um backend OpenAI ou Azure OpenAI. Já o Smart ComboBox usa embeddings locais.