OpenAI
Introdução
A plataforma Devprime acelera a produtividade do desenvolvedor de software, oferecendo um projeto completo de arquitetura de software, componentes com comportamentos inteligentes, aceleradores para implementação de código e atualizações com novos recursos.
Neste artigo, abordaremos a utilização do Adapter de Extensions presente na arquitetura Devprime, que permite adicionar comportamentos adicionais por meio de componentes externos baseados na tecnologia do NuGet. Isso proporciona a possibilidade de expandir as funcionalidades da plataforma Devprime e aderir aos padrões de arquitetura de software, melhorando a manutenibilidade, reuso e testabilidade.
Durante esse artigo utilizaremos o componente nuget Azure.AI.OpenAI que incopora o acesso a API do Microsoft Azure OpenAI e OpenAI.
Cheklist e preperação do ambiente inicial:
- Abra uma conta na plataforma Devprime e adquira uma licença (Developer/Enterprise).
- Instale uma versão atualizada do .NET (Linux, macOS e Windows)
- Instale e/ou atualize o Visual Studio Code e/ou o Visual Studio 2023 Community / Professional / Enterprise.
- Instale e/ou atualize o Docker (Para Windows, utilize o WSL2).
- Inicialize os containers do MongoDB e RabbitMQ no Docker e adicione a fila ‘orderevents’ no RabbitMQ.
- Instale e ative a versão mais nova do Devprime CLI.
- Crie uma pasta para os seus projetos e defina as permissões de leitura e gravação.
- Consulte o artigo “Criando o primeiro microsserviço” para explorar os primeiros passos na Devprime.
- Crie uma conta no Microsoft Azure OpenAI ou OpenAI e obenha as credenciais de acesso a API.
Exemplo pronto com todos os passos do artigo
Este artigo inclui um projeto completo que demonstra o recurso discutido. Você pode optar por fazer o download seguindo as etapas abaixo ou simplesmente prosseguir para os próximos itens.
- Efetue um clone no repo
git clone https://github.com/devprime/examples.git
- Entre na pasta
cd examples/extensions/openai/basic
- Atualize a sua licença Devprime
dp stack
- Atualize as configurações do MongoDB / RabbitMQ
- Atualize as credenciais do Azure OpenAI / OpenAI no appsettings.json
- Localize em DevPrime_Custom os itens:
ai.url / ai.credential / ai.deploymentmodel
- Execute o microsserviço
Criando um microserviço para utilizar no exemplo
O primeiro passo é criar um novo microsserviço para que possamos realizar customizações no Adapter de Extensions, adicionando o componente externo NuGet e preparando-o para interagir com a API da OpenAI. O nome deste microsserviço será definido como “ms-ai”, conforme demonstrado no comando abaixo.
dp new ms-ai --state mongodb --stream rabbitmq
Após a criação do novo microsserviço entre na pasta do projeto “ms-ai” e já poderá visualizar todas as implementações pelo Visual Studio Code conforme demonstrado no artigo relacionado a criação do primeiro microsserviço.
Adicionando uma regra de negócio
As regras de negócio na arquitetura da plataforma Devprime são baseadas em Domain-Driven Design (DDD), e para avançarmos, é necessário adicionar uma classe Aggregate Root
dentro do projeto Domain. Para facilitar esse procedimento, utilizaremos o comando abaixo disponível no Devprime CLI.
dp add aggregate AI
Visualize a nova classe criada pelo Visual Studio Code.
code src/Core/Domain/Aggregates/AI/AI.cs
Modifique a classe AI
adicionando uma propriedade chamada “Prompt” conforme exemplo abaixo.
|
|
Utilizando os aceleradores de código da plataforma Devprime
Agora que você já implementou uma regra de negócio, vamos usar o acelerador do Devprime CLI para gerar o código necessário e iniciar o microsserviço com base na regra de negócio inicial que você forneceu.
Execute o comando a seguir e digite A
para avançar nas implementações:
|
|
Após a conclusão deste comando, você já terá as implementações básicas do seu microsserviço e utilizaremos como referência para avançar para o próximo passo, que envolve a incorporação do componente OpenAI no Adapter de Extension.
Adicionando a extension Intelligence
Neste ponto, iniciaremos os procedimentos para habilitar uma extensão de terceiros fornecida como um componente NuGet na plataforma Devprime, seguindo padrões de desenvolvimento que garantem a manutenibilidade e desacoplamento.
Para acelerar esse processo, usaremos o comando abaixo, que implementa a nova extensão no serviço de aplicação por meio de uma interface e injeção de dependência, e construirá a implementação inicial necessária no adaptador.
Execute o comando abaixo:
dp add extensions IntelligenceService
|
|
A classe IntelligenceService
e a sua interface IIntelligenceService
implementam as integrações com a biblioteca OpenAI. Por outro lado, a classe Extensions
e sua interface IExtensions
atuam como proxies, permitindo que o contexto de execução do Devprime Pipeline acesse todas as extensões disponíveis na aplicação por meio da injeção de dependência.
Adicionando a referência ao componente da OpenAI
Adicione a referência do componente NuGet Azure.AI.OpenAI ao arquivo de projeto do Adapter de Extensions. Certifique-se de verificar o portal NuGet em busca da versão mais atual e ajuste a versão, se necessário:
Execute o comando abaixo em uma única linha:
|
|
Agora que você acabou de adicionar um novo componente aproveite e efetue um build do microsserviço para se certificar
que está tudo funcionando corretamente com essa nova dependência.
Execute o comando:
|
|
Implementando a integração com o componente da OpenAI
Neste momento, vamos implementar a integração com o componente OpenAI dentro do Adapter de Extensions. O primeiro passo é modificar a interface para incluir um método chamado “Conversation” e, em seguida, implementar o código que realiza a chamada à API do OpenAI e retorna o resultado em um formato que pode ser transportado para o contexto de nossa aplicação.
Abra Abra a interface IIntelligenceService
no Visual Studio Code.
code src/Core/Application/Interfaces/Adapters/Extensions/IIntelligenceService.cs
Substitua pelo código abaixo:
|
|
Abra Abra a classe IntelligenceService
no Visual Studio Code.
code src/Adapters/Extensions/IntelligenceService/IntelligenceService.cs
Substitua pelo código abaixo:
|
|
Adicionando váriaveis de ambiente para uso no OpenAI
Na implementação anterior nós utilizamos o comando Dp.Settings.Default("ai.credential")
para obter o parametro de uma variavel de ambiente definida no projeto local no arquivo “src/App/appsettings.json”. Abra o bloco “DevPrime_Custom” seguindo exemplo abaixo adicionando a URL do servíco de OpenAI, a credencial e o modelo de deployment.
Abra e edite pelo Visual Studio Code
code src/App/appsettings.json
|
|
Implementado a chamada ao adapter de extension
O primeiro ponto de contato com a nova funcionalidade disponibilizada pela nova Extension do OpenAI é o Handler que nesse contexto utilizaremos o CreateAIEventHandler
que tem o papel de interceptar um evento de dominio e mediar a integração com os recursos tecnologicos da plataforma. Para que tenha suporte ao Extensions nós adicionamos a herança para a classe EventHandlerWithExtensions
além de adicionarmos a interface IExtensions
.
É importante observar que após as implementações anteriores agora nós temos a dispoção dentro da arquitetura Devprime um novo metodo Dp.Extensions.IntelligenceService.Conversation()
que executa o código externo incoporado dentro do Adapter de Extensions.
Essa nova implementação executará a chamada ao OpenAI e retornará o resultado. Para avançar abra o arquivo e substitua todo o código.
Abra o Handler pelo Visual Studio Code.
code src/Core/Application/EventHandlers/AI/CreateAIEventHandler.cs
|
|
Em função dessa modificação no Handler remova o arquivo de testes que não é utilizado nesse exemplo
utilizando o comando abaixo:
Removendo arquivo
rm src/Tests/Core/Application/AI/CreateAIEventHandlerTest.cs
Modificando o método ADD no Aggregate Root
Agora retornaremos à regra de negócio no Aggregate Root para realizar uma customização no método “ADD”, substituindo-o pelo código abaixo para permitir a execução do evento de domínio “CreateAI” e obter esse retorno. Esse evento será processado no Handler “CreateAIEventHandler” responsável pela interação com o Adapter de Extensions."
Abra a classe Aggregate Root no Visual Studio Code
code src/Core/domain/aggregates/AI/AI.cs
|
|
Modificando a Interface e Application Services
Devido à implementação no Adapter de Extension, é necessário obter o retorno do Aggregate Root no Application Services. O primeiro passo é modificar a interface IAIService
conforme o exemplo abaixo.
Abra a Interface no Vsiual Studio Code
code src\Core\Application\Interfaces\Services\IAIService.cs
|
|
Após a modificação da interface no passo anterior, é hora de refletir essa alteração no Application Services. Localize o método Add
abaixo e faça a substituição para que o serviço de aplicação retorne o resultado do nosso Aggregate Root.
Abra o Application Services no Visual Studio Code.
code src\Core\Application\Services\AI\AIService.cs
|
|
Explorando o microsserviço integrado com o OpenAI
Ao final dessa implementação nós já podemos realizar os testes executando o microsserviço customizando com a integração do OpenAI.
Inicie o microsserviço executando um dos scripts abaixo:
|
|
Acesse o portal do swagger do microsserviço
Efetue um post na API pelo Swagger preenchendo o prompt
|
|
e confira o resultado no json abaixo:
|
|
Acompanhe o exemplo de registro de log gerado automaticamente pelo Adapter de Observability, que detalha todo o fluxo interno, desde o recebimento do POST até a integração com o OpenAI no Adapter de Extensions.
|
|
Mais artigos sobre extesions na plataforma Devprime
Utilizando o SendGrid em microsserviços
Utilizando o Humanizer em microsserviços