Criando uma aplicação para solução de problemas mecânicos com Inteligência Artificial no .NET

Marcio Nizzola
5 min readDec 8, 2023

No início do ano cheguei escrever um artigo onde mostrei como acessar a API de Inteligência Artificial da OpenAI e obter respostas do ChatGpt, porém eram com chamadas Http escritas na aplicação para o caso específico (vide artigo) e depois utilizando a biblioteca Azure.AI.OpenAi (vide artigo).

Agora a Microsoft vem atualizando a biblioteca que promete acelerar e facilitar o uso de Inteligência Artificial seja através da OpenAi ou do mesmo serviço no Azure, trata-se da biblioteca “Azure.AI.OpenAI” que nesta data (05/12/2023) encontra-se na sua versão “beta 9” ou seja, ainda não é uma versão final.

Para demonstrar a facilidade de sua utilização, criei um projeto base onde podemos entender seu uso fazendo uma consulta de defeitos de carros utilizando a I.A.

Foi criado um projeto contendo a biblioteca pelo Nuget Package Manager, onde caso não esteja encontrando, basta clicar para ver “pré-release”.

Instalação da biblioteca Azure AI OpenAI no Visual Studio Nuget Package Manager

Depois disso, criaremos algumas classes:

public class MechanicSolutionModel
{
public string Model { get; set; }
public string Problem { get; set; }
public string Solution { get; set; }
}

para fugir um pouco do padrão, vou criar como “Record” a requisição (um tipo Record pode ser utilizado ao invés de uma classe! veja artigo neste link)

public record ProblemsRequestModel(string VehicleModel, string Problem);

Então vamos ao código para executar a consulta, no nosso caso, criaremos uma classe chamada “MechanicService”.

esta classe implementa o método “GetMechanic” que recebe os parâmetros que vem no record “ProblemsRequestModel” constando o modelo do veículo (VehicleModel) e o problema (Problem).

Na linha 19, instanciamos o serviço, passando como parâmetros o endpoint do serviço OpenAi e a chave, que são obtidos do config da aplicação recebido no construtor.

Na linha 22 criamos uma Lista de elementos do tipo “ChatMessage” que servirá para incluirmos as mensagens a serem enviadas para a Inteligência Artificial.

Na linha 23, iremos adicionar uma mensagem nessa lista, sendo que esta mensagem é classificada como “System”, ela contém as instruções para a montagem da resposta conforme esperamos, vale destacar que o serviço recebe 3 tipos de mensagem sendo:

  • System = orientações para o sistema
  • User = mensagens do usuário
  • Assistant = mensagens devolvidas pelo próprio assistente

Na linha 25, criamos um string falando sobre o problema do veículo, concactenando os elementos string.

Na linha 27, adicionamos este string para compor uma mensagem na lista, do tipo “User”.

Na linha 29, montamos os parâmetros da chamada, criando um objeto que contém o nome de deploy obtido no config, e mais a lista de mensagens.

Já na linha 31 é onde a comunicação com o serviço acontece, acionando o client previamente criado (na linha 19) e passando o objeto “chatCompletionsOptions” que foi criado na linha 29, sendo o resultado armazenado num objeto chamado “response”.

Na linha 33, é feita a deserialização do objeto transformando a resposta contida na primeira posição da propriedade “Choices” dado que é um array, onde extraímos a propriedade “Content” do objeto “Message” , a resposta será devolvida no formato de uma lista da classe: “MechanicSolutionModel”.

O resultado da sua execução é bem bacana, mas o segredo de tudo isso está na montagem dos prompts (linha 23) !

Veja o teste no Swagger da API

Depois de enviado, chega a resposta:

Mas e o “prompt” utilizado? bom, para montagem do prompt inicial da linha 23, criei uma classe contendo strings, onde defini a seguinte sequência:

    public static string MechanicQuestion = @"você atuará como um mecânico, indicando as soluções de principais problemas em veículos que serão informados os modelos e os problemas dele,
indique uma solução para o problema ser realizado em residência,A sua resposta deverá vir em formato JSON conforme o exemplo que vou fornecer, você deverá estruturar o mesmo resultado
como neste modelo de exemplo em um array Json pronto para Deserialização, sua resposta deverá conter apenas o Json, sem nenhum comentário.
[
{
""Model"":"" "",
""Problem"": "" ""
""Solution"" : "" ""
}
]";

Assim podemos utilizar a I.A. para solução de problemas mecânicos !!

BÔNUS

Até podemos fazer sugestões de respostas alternativas utilizando prompts diferentes, neste caso vamos personalizar respostas para marcas específicas por brincadeira, vou adicionar um novo prompt ali na linha 24, o propósito é demonstrar que podemos enviar mais de uma mensagem “System” se quisermos:

Vamos novamente perguntar o defeito do carro:

Vejam que a resposta inclui um pouco de sarcasmo:

Mas o que dizia este prompt?

public static string JokeAnswer = "Mas se o veículo for um Peugeot ou um Marea você deve fazer ao final da solução uma piada similar à esta: 'se você tiver fé, reze pois este carro costuma ser uma bomba'";

Utilidade

Não posso deixar de mencionar que esta idéia de sugerir problemas de carros foi utilizada no TCC da Etec de Itu onde ajudei nossos alunos a desenvolver um trabalho muito bem elaborado utilizando esta biblioteca em 2023 num site destinado a ser um guia de carros.

Gostou do artigo? clique no ícone👏e me siga para ver as próximas publicações !! Quer ver mais conteúdos, acesse minhas redes através do Linktree: https://linktree.com/nizzola

Esta publicação tem partes que foram apresentadas na minha palestra feita no Dev Pira Festival 2023 onde tenho o exemplo no github: NIZZOLA/devpira2023: Projeto Apresentado no DevPira Festival 2023 — Criando uma API com dados de Inteligência Artificial (github.com)

Referências:

Utilizando o ChatGpt com uma aplicação .NET | by Marcio Nizzola | Medium

Utilizando a biblioteca Azure.Openai para integrar suas aplicações .NET com ChatGpt | by Marcio Nizzola | Medium

--

--

Marcio Nizzola

Microsoft MVP | Software Architect na CI&T | Prof. da Etec Itu | Membro Fundador da Comunidade Itu Developers.