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.

Componente Smart Paste preenchendo os campos de um formulário a partir do texto copiado, um exemplo de Azure OpenAI no .NET
O Smart Paste transforma um texto colado em dados estruturados no formulário.

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.

Componente Smart TextArea sugerindo a continuação de uma frase enquanto o usuário digita
A Smart TextArea completa frases conforme o contexto definido pela aplicação.

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.

Componente Smart ComboBox exibindo sugestões semanticamente relacionadas ao termo digitado
O Smart ComboBox encontra opções pelo significado, e não apenas pelo texto exato.

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.

Glossário

Termo Significado
NLP Processamento de linguagem natural, área da IA que compreende e gera linguagem humana
Generative AI Segmento da IA que produz conteúdo original, como texto, imagem e vídeo
GPT Generative Pre-trained Transformer, família de modelos de linguagem da OpenAI
Transformer Arquitetura de rede neural baseada em mecanismos de atenção
Resource group Contêiner lógico que agrupa recursos do Azure
Deployment Implantação de um modelo dentro de um recurso Azure OpenAI, chamada pelo nome no código
Chat completions Recurso que gera a próxima mensagem de uma conversa a partir do histórico
Microsoft Entra ID Serviço de identidade da Microsoft, antigo Azure Active Directory
ML.NET Framework open source para criar modelos de machine learning em .NET
Embeddings Representações numéricas de texto usadas para comparar significado

Fontes