TUTORIAL - CHATGPT EM DELPHI

Adicionado em 07/05/2023 - Atualizado em 26/01/2024

Por: Equipe ABC do Código

Compartilhar em:

Atualização - 26/01/2024

Recentemente, a OpenAI mudou de forma expressiva os protocolos de comunicação com a API.

Desta forma, o código que havia sido fornecido nas versões anteriores do nosso site (até 15/10/2023) tal como o código que havia sido usado no video abaixo já não estão totalmente funcionais.

O código abaixo foi modificado a fim de atualizar os protocolos e tornar, novamente, código totalmente funcional.

Se tiverem alguma dúvida, não deixem de entrar em contato.

Olá pessoal!

Hoje vamos mostrar como criar uma simples aplicação em Delphi que permite conectar ao ChatGPT.

Você pode acompanhar a criação do aplicativo no video abaixo e entender os detalhes do código mais abaixo:

Nosso exemplo tem como intuito mostrar os comandos básicos de conexão, e as informações que você precisa para realizar a conexão. O exemplo mostrado foi criado em Embarcadero Delphi 10.4 Sidney, e pode necessitar modificações de acordo com a versão do Delphi que você está utilizando.

----------------------------------------------------

- INTERFACE GRÁFICA

Primeiramente, vamos iniciar uma nova aplicação VCL no Delphi:

No novo form que surgiu, vamos agora adicionar os seguintes componentes:

  • 1 TMemo
  • 2 TEdit
  • 1 TButton
  • 2 TLabel

Selecionamos o Memo1 em nosso form clicando uma vez sobre ele, e mudamos a propriedade Align no Object Inspector para alTop. Além disso, mudamos na propriedade Lines, clicamos nos 3 pontos que aparecem, e removemos o texto que está no Memo.

Clicamos agora sobre o nosso TLabel e mudamos a propriedade Caption para Coloque sua API key: . Para o Label2, mudamos a propriedade Caption para Pronto.

Agora, clicamos sobre o Edit1, e deletamos o texto da propriedade Text. Já no Edit2, vamos colocar uma pergunta padrão que pode ser enviada ao ChatGPT no início. Nesse caso, colocamos nosso Text como "Olá, quem foi Albert Einstein?". Você pode colocar o texto que preferir, ou pode deixar esse campo em branco também.

Por fim, mudamos a propriedade Caption do Button1 para Enviar. Seu form deve parecer com o seguinte:

Até agora, só criamos o layout do nosso programa e obviamente se você clicar no botão nada irá acontecer. Você pode escolher utilizar outro layout, como por exemplo colocar o Memo na parte inferior, ou utilizar um TMemo ao invés de um TEdit para enviar a pergunta ao ChatGPT. Esse tutorial só serve de guia para mostrar como fazer o software funcionar. Posteriomente, você pode modificar o form de acordo com sua necessidade.

----------------------------------------------------

- CÓDIGO DE CONEXÃO COM API

Agora, vamos a parte mais importante do nosso software, o código.

A conexão com o ChatGPT vai ser realizada através da utilização do API do ChatGPT.

API, que significa Application Programming Interface, é um protocolo que permite que dois softwares se comuniquem. Nesse caso, temos que fazer o nosso software se comunicar com o software do ChatGPT.

O ChatGPT contém em sua plataforma chaves únicas que são criadas pelo usuário para se comunicar. Essas chaves servem como senhas e não devem ser compartilhadas com outros usuários.

Para ter acesso as APi Keys, o usuário deverá realizar o registro na plataforma e adicionar créditos para a utilização dos modelos fornecidos. Mais abaixo, mostramos como criar as API keys e como adicionar crédito a sua conta.

A vantagem é que a cobrança só é realizada por pergunta feita ao sistema, e o valor por pergunta é muito barato (menos de 50 centavos por pergunta no momento da criação desse artigo).

Tendo isso em mente, damos dois cliques sobre o nosso botão Enviar e escrevemos o seguinte código inicial:

Nesse código, garantimos que quando a solicitação for enviada, o usuário terá introduzido um valor para API Key.

Agora vamos, criar uma variável chamada Autorizacao que irá receber o nosso API key

O texto Bearer que é enviado junto com a API key faz parte da identificação para comunicação com o ChatGPT.

Além disso, adicionamos o comando Application.ProcessMessages que faz com que todas as ações do software sejam realizadas e exibidas. Isso será útil mais pra frente quando o software terá que esperar a resposta do ChatGPT e o software ficará sem responder por alguns segundos.

Agora vamos a parte mais importante do código, vamos iniciar a conexão com o API utilizando os protocolos HTTP.

Para isso, declaramos as variáveis de comunicação HTTP e JSON, e vamos completar nosso código dentro do Button.

O código abaixo foi atualizado no dia 26/01/2024

Para conseguir compilar esse código, você deve adicionar os uses IdHTTP e System.JSON, que são as bibliotecas que permitem a nossa comunicação.

Primeiramente, utilizamos a função ConfigurereSSLParaHTTP a fim de ajustar as camadas de segurança SSL do IdHTTP para a conexão com a API. A função a ser adicionada é a seguinte:

Os parâmetros que foram configurados para o SSL estão funcionando de acordo com a última atualização da OpenAI.

O nosso código faz uso dos componentes IdHTTP para realizar a conexão e do JSON para realizar a organização das respostas provenientes do ChatGPT. Definimos a utilização do JSON com os comandos: IdHTTP.Request.ContentType := 'application/json'; e IdHTTP.Request.Accept := 'application/json';. Caso queira utilizar outros formatos, eles devem ser identificados aqui.

Nesse caso, decidimos utilizar a criação dinâmica do TIdHTTP, ao invés de adicionar o icone do componente dentro do nosso Form, porque necessitamos destruir o componente com IdHTTP.Destroy ao final de cada procedimento para podermos mandar novas perguntas. Caso não façamos isso, o IdHTTP poderá se manter conectado e isso irá gerar um erro.

Utilizamos também o TLabel para mostrar que a resposta está sendo criada, e isso pode levar alguns segundos. Desta forma, o comando Label2.Caption := 'Espere!'; seguindo do Application.ProcessMessages; permite ao usuário ver que a requisição está sendo realizada e que a falta de resposta do software é devido a isso. A utilizar de um TTimer com um Application.ProcessMessages também poderia ser utilizado para fazer que outros processo do aplicativo continuem ativos.

A comunicação do IdHTTP é feita pelo comando IdHTTP.Post('https://api.openai.com/v1/chat/completions', DadosAEnviar, RespostaStream);, sendo que a variável resposta recebe diretamente as respostas do ChatGPT.

O ChatGPT fornece diferentes tipos de respostas e selecionamos qual deles queremos ver utilizando o JSON. Nesse caso, selecionamos a resposta inicial através do comando: JsonChoice := JsonArray.Get(0) as TJSONObject; . Dessa forma, você está livre para verificar outras possíveis respostas fornecidas pelo ChatGPT.

O protocolo de comunicação feito com a API fornecendo os parâmetros que serão utilizados são adicionados dentro da classe JSON através da variável SubmeterJSON do tipo TJSONObject.

Nessa linha, criamos o texto a ser enviado para o API. A primeira informação a ser fornecida ao API é o modelo a ser utilizado, nesse caso utilizamos o gpt-4-0613 que é o modelo do ChatGPT4. Você pode escolher outros modelos que são indicados para respostas mais precisas, respostas rápidas, ou respostas em outros tópicos. Você pode encontrar mais detalhes sobre outros modelos disponíveis no site oficial da OpenAI.

Obviamente, nem todos os modelos estão disponíveis na versão gratuida to OpenAI API, e você deve buscar aqueles que realmente funcionam. O código mostrado no site foi criado com o modelo mais poderoso do OpenAI (até a data de publicação deste artigo), o ChatGPT4. Se você utilizar a versão gratuita, verifique a disponibilidade dos modelos.

Outra informação importante na comunicação com o API é o maxtokens que configuramos para 4096. Caso esse valor não seja pré-estabelecido, as respostas podem ser curtas. O valor 4096 é o máximo de token permitido pelo API. Cada token pode representar uma palavra ou um fragmento de palavra que permite flexibilidade para a AI.

Um parâmetro que você pode brincar é com o fator Temperature que colocamos como 0.7. Esse parâmetro determinar qual será o nível de criatividade e ousadia da AI. Valores padrões estão entre 0.5 e 1, sendo que quanto mais alto, mais criativa as respostas. Entretando, valores muito altos podem gerar respostas que não fazem muito sentido. Valores baixo, por outro lado, produzem respostas previsíveis.

----------------------------------------------------

- CRIAÇÃO DA API KEY NA PLATAFORMA DA OPENAI

Agora, você deve criar um API para iniciar o teste do seu código. Para isso, acesse o site:

API Keys - ChatGPT

Se você não estiver registrado ainda, clique em Cadastrar. Se você já tive registro, selecione a forma que deseja entrar. Nas atualizações mais recentes da OpenAI, você só conseguirá utilizar a API key se você pagar pelo acesso.

Os passos de criação da API key estão mostrados na figura a seguir:

Passo-a-passo de como criar sua API key

Após criar e copiar sua API key, você pode colar ela na propriedade Text to Edit1 no Object Inspector.

----------------------------------------------------

- EXECUTANDO O SEU PROGRAMA

Agora, você pode rodar o seu código. Ao pressionar o botão e enviar a mensagem, pode ser que você já obtenha uma resposta do ChatGPT. Mas em muitos casos você receberá um erro sobre carregamento das Dlls do OpenSSL (veja imagem abaixo).

O SSL (Secure Sockets Layer) é um sistema de comunicação que torna segura transmissão de informações online. Dessa forma, é importante você realizar esse tipo de comunicação com o seu software.

Para resolver esse problema, existem diversos métodos que podem ser realizados. Um dos mais simples, é adicionar as DLLs diretamente à pasta do seu executável.

As Dlls libeay32.dll e ssleay32.dll podem ser encontradas no seguinte endereço: SSL - Indy

Com o software que desenvolvemos aqui, utilizamos o seguinte arquivo que pode ser baixado aqui: OpenSSL 1.0.2

Após baixar o arquivo adicione as Dlls ao diretório que contém o arquivo executável. Isso deve permitir que você realize a conexão com o ChatGPT.

Caso algum outro tipo de erro relacionado às Dlls, você pode instalar OpenSLL 32 bits (visto que nossa versão do Delphi é 32 bits) no seguinte website: Instalador OpenSSL

Após compilar o seu software, e pressionar o botão, recebemos a seguinte resposta:

----------------------------------------------------

- ADICIONANDO HISTÓRICO DE MENSAGENS

Já podemos realizar diversas perguntas ao ChatGPT. Existe um pequena limitação do código: não mantém o histórico de mensagens. Isso quer dizer que quando você faz uma pergunta ao ChatGPT ele irá responder sem "lembrar" das respostas anteriores.

Uma forma de melhorar isso é através da utilização de uma TStringList que receba toda a conversa anterior realizada com o ChatGPT, e que ela seja enviada junto com a nova mensagem. Para isso, temos que modificar um pouco o código que havíamos escrito acima.

Primeiramente, vamos declarar a variável TextoAEnviar como variável global. Para isso, publicamos a variável "TextoAEnviar: String;" dentro da cláusula private do TForm1. Fazemos isso, porque a nossa varíavel vai ir armazenando todo o histórico do texto com o ChatGPT.

Agora, adicionamos a variável TempTexto: String ao nosso procedimento do evento Click do Button1. Essa varíavel vai ser utilizada para reorganizar a string de comunicação com a API.

Declaramos também outra varíavel em nossa função que será responsável pelo histórico de mensagens, essa variável se chamará HistoricoDeConversas : TStringList;

Sua declaração de variaveis na função deve estar assim:

O código abaixo foi atualizado no dia 26/01/2024

Agora, precisamos implementar a criação do histórico de mensagens.

Para isso, vamos adicionar o seguinte código dentro do procedimento do nosso Button, logo após "TextoAEnviar := ''";.

Como estamos utilizando JSON, os comandos "\n" e "\\n" são utilizados para pular linha. Dessa forma, temos que garantir que a informação chegará correta ao JSON.

Adicione as seguintes linhas para adicionar as mensagens ao histórico de conversas:

O intuito de adicionar essas linhas a exceção é que, caso tenhamos erro ao solicitar o envio de informação a API, o API e o IdHTTP proverão os erros e ficará mais fácil identificar a solução.

A variável HistoricoDeConversas: TStringList deve ser declarada no código e criada no começo do código com o comando HistoricoDeConversas := TStringList.Create; (evento OnCreate do TForm1) e destruída ao final do código com HistoricoDeConversas.Free; (evento OnClose do TForm1).

O resultado da comunicação é mostrado na figura abaixo:

E agora a segunda pergunta:

Bom pessoal, esse é um exemplo simples de como realizar uma comunicação com o API do OpenAPI e criar um chat com o ChatGPT. Esse código pode ser otimizado para realizar diversas outras tarefas automatizadas de comunicação com o API. Claro que existe um limite de requisições ao API que deve ser obedecido.

Por hoje é isso, espero que tenham gostado. Se tiverem alguma dúvida, não deixem de entrar em contato conosco.E lembrem-se, o código mostrado aqui no ABC do Código não deve ser utilizados para fins comerciais sem prévio aviso aos donos do site.

Se houverem outras alterações de comunicação com o ChatGPT no futuro, iremos atualizando este aritgo.