Como eu integrei o ChatGPT ao WhatsApp para uma empresa
Alguns meses atrás fui contratado para desenvolver um sistema web que realizasse uma integração com o WhatsApp, acredito que só imaginar como isso deve funcionar, você consiga enxergar os possíveis problemas e dificuldades, pois bem. A primeira dificuldade foi decidir se a integração iria ocorrer através da API oficial do WhatsApp ou não, uma vez que a API oficial possui diversas limitações e um custo elevado, a empresa contratante decidiu por solicitar que o desenvolvimento fosse realizado com uma conexão não oficial com o WhatsApp, sendo assim, seria necessário contratar um sistema já desenvolvido de integração com o WhatsApp, o que iria gerar custos adicionais ou desenvolver e hospedar por conta própria (o que também leva a custos adicionais, porém menores em longo prazo).
Conectando com o WhatsApp
Com o foco em desenvolver uma conexão com o WhatsApp de maneira não oficial, decidimos por desenvolver em NodeJs a conexão com o WhatsApp utilizando o whatsapp-web.js, um projeto super legal com uma comunidade bastante ativa no Discord. Decidido o caminho do desenvolvimento, criei toda uma API em Express.js que se conectasse com o WhatsApp através do whatsapp-web.js e permitisse que essa conexão fosse explorada no sistema web em seguida.
Com a API de conexão finalizada, ela foi previamente hospedada em um servidor simples que serviu para que realizassemos diversos testes de usabilidade e uso de CPU, com os testes a empresa contratante decidiu por hospedar a API do WhatsApp em uma máquina local que ficasse 24 horas ligada (como uma nuvem no seu próprio escritório), construiram todo um sistema de conexão com a internet que diminuisse ao máximo as possibilidades de não haver conexão e com proteção contra queda de energia.
Isso claramente gerou um custo maior que contratar uma empresa já existente que tivesse a API do WhatsApp não oficial, mas o custo é imediato e consegue ser reduzido a longo prazo, uma vez que uma API não oficial cobra em média de 99 reais por instância e eles (empresa contratante) utilizariam mais de 50 instâncias, gerando um custo de mais de 4950 reais por mês.
Acessando o WhatsApp
Já com a API hospedada e funcionando corretamente, o desenvolvimento do sistema web que se conectasse com ela se iniciava, ele deveria conter diversas funções que iam além do que era fornecido pelo WhatsApp e também por outras empresas já existentes, como a ChatGuru ou a Umbler Talk, uma vez que parte das funções eram voltadas diretamente para o uso da empresa contratante.
O sistema desenvolvido contou com funções como:
- Visualização dos contatos;
- Filtro avançado de listagem de contatos;
- Envio de mensagens de texto, mídia e áudio;
- Diferentes níveis de acesso;
- Gestão de etiquetas de contatos;
- Gestão de campos personalizados;
- Gestão e envio automatizado de mensagens periódicas;
- Gestão de equipes de atendentes;
- Gestão de instâncias.
Assim, um único sistema web permite que mais de 50 atendentes utilizem o WhatsApp corporativo (cada um com o seu próprio número) com acesso a todos os recursos e automações e permissão para que os gestores consigam controlar como tudo sem funcionado, conseguindo gerar relatórios de atendimento, acompanhar vendas, controlar acessos e outros...
Toda a conexão entre o WhatsAppWebJs (API desenvolvida em NodeJs) e o sistema web (desenvolvido em PHP com uso do framework também desenvolvido por mim Luna é realizada através de chamadas HTTP e envio de WebHooks.
As funções citadas ainda não envolvem o chatbot e tão pouco a inteligência artificial, daria para imagina-las como uma versão 2.0 do WhatsApp, servindo como a base para a integração do ChatGPT.
Criando um fluxo de atendimento
Agora que a base de conexão com o WhatsApp já estava preparada (isso demorou mais do que eu imaginava e menos do que deveria) era hora de partir para o fluxo de atendimento, de maneira simples, um caminho que o sistema deveria percorrer sempre que uma nova mensagem surgir e permitir que a parte inicial do atendimento fosse agilizada e chegasse no atendente já filtrada.
Você com certeza já utilizou algo semelhante, quando manda uma mensagem para uma empresa pelo WhatsApp e o retorno é algo como "Digite 1 para realizar X ação".
Esse desenvolvimento é um pouco mais complexo, explicar totalmente aqui é possível mas tomaria um tempo não disponível no momento, por isso tentarei resumir como as coisas funcionam:
- O contato envia uma mensagem;
- O sistema verifica se existe uma sessão já aberta para aquele contato, se não, a cria;
- Caso a sessão exista, verifica qual o estágio dela e realiza as ações daquele estágio, como enviar mensagens, verificar respostas, redirecionar ou outras ações.
A configuração do fluxo parecia ser tão complexa quanto o desenvolvimento dele, ainda mais quando me baseava em outros sistemas já existentes, tudo parecia ser bastante confuso e bagunçado, por isso tentei criar algo que fosse bastante intuitivo e permitisse que o usuário comum (ou gestor) conseguisse configurar tudo sem dificuldades.
Exemplo de um fluxo configurado:
Ainda pode parecer confuso, mas esse fluxo está grande sem muita necessidade, ele foi utilizado para testes, um fluxo real seria menor e mais dividido entre diferentes fluxos
O uso do fluxo já permitiria que parte das conversas realizadas por atendentes fosse reduzida, uma vez que algumas informações poderiam ser filtradas e chegaria ao atendente aquilo que fosse realmente necessário, contudo ainda não iniciamos a inteligência artificial, porém tudo que foi dito até agora serve como uma escada, sem essas etapas a integração da inteligência seria inviável (ou inútil) e por isso precisa ser citado.
Integrando o ChatGPT
A API do ChatGPT possui uma documentação mas não consegui entender tudo muito bem, algumas informações são rasas (ou eram no momento em que li), o que dificultou um pouco na integração, contudo alguns estudos e testes me auxiliaram no entendimento. Com isso em mente, irei detalhar algumas informações importantes aqui para você, pode ser que um dia sejam úteis:
Como o ChatGPT cobra
O ChatGPT é parte da OpenAi, uma empresa que desenvolve diversos sistemas de inteligências artificiais que podem ser utilizadas pelo público, como a MidJourney para gerar imagens, sendo assim, o ChatGPT está atrelado na cobrança da API da OpenAi, que solicita um valor de depósito através de um cartão de crédito e realiza cobranças conforme o uso sob aquele valor depositado.
Existem funções dentro do dashboard da OpenAi que permite bloquear maiores cobranças e lhe notifica caso chegue em um valor X.
Agora que a OpenAi possui o acesso ao cartão de crédito e possibilidade de cobrar, ela irá faze-lo (no caso do ChatGPT) com precificação sob seus tokens, por exemplo o modelo GPT 3.5 Turbo (os preços variam dependendo da versão do ChatGPT utilizada) atualmente cobra 0.0015 por mil tokens de entrada (pergunta) e 0.002 por mil tokens de saída (resposta).
O valor informado foi encontrado aqui no dia 17/09/2023.
Mas, o que são tokens? Segundo o ChatGPT:
Os tokens são unidades de texto em que o modelo de linguagem divide o texto de entrada ou geração de texto. Em termos simples, um token pode ser uma palavra única ou uma parte de uma palavra, como um caractere individual. Por exemplo:
- A palavra "chat" é um token.
- A palavra "GPT-3" é um token.
- A frase "ChatGPT é incrível!" pode ser dividida em cinco tokens: ["Chat", "G", "PT", " é", " incrível", "!"].
No momento que escrevo isso, ainda decidimos por utilizar a API do ChatGPT, porém existe a possibilidade de em breve utilizarmos uma máquina própria para rodar uma versão local da inteligência artificial do ChatGPT e reduzir também esse custo de tokens, se for viável.
Enviando uma pergunta ao ChatGPT
Como o sistema web foi desenvolvido em PHP, optei por utilizar o pacote orhanerday/open-ai para realizar a integração, mas um cURL
também seria capaz de faze-lo. A preferência pelo uso do pacote foi para reduzir tempo de desenvolvimento e facilitar a integração.
Existe pacotes para diversas linguagens e eles podem ser encontrados aqui.
Conforme explicado anteriormente, o sistema verifica a sessão do contato e caso a sessão esteja como chat_ai = true
, então todas as próximas mensagens são enviadas para o ChatGPT e a resposta retornada ao contato. O fluxo (citado anteriormente também) é quem controla quando um contato deve conversar com o sistema de regras, com o ChatGPT ou com um atendente humano.
Indo para o código, exemplificando em PHP:
$openAi = new OpenAi($chatAi->api_key);
$messages = [];
$chat = $openAi->chat([
'model' => $chatAi->model,
'max_tokens' => $chatAi->max_tokens,
'messages' => $messages,
]);
$received = $chat->choices[0]->message->content;
Bastante simples, certo? O valor de $received
armazena a resposta do ChatGPT, a função $openAi->chat()
envia a requisição para o ChatGPT enviando model
com o modelo que deve ser utilizado (gpt-3.5-turbo), o valor de max_tokens
com o máximo de tokens que aquela requisição deve gastar para obter uma resposta e messages
com um array contendo todas as mensagens que devem ser analisadas pelo ChatGPT. Obtendo a resposta, o código envia pelo WhatsApp ao contato que realizou a pergunta.
Mas, como o array $messages
deve ser populado? Basicamente com todas as mensagens que você deseja que o ChatGPT leve em consideração, permitindo que exista um contexto geral naquela conversa. Por isso todas as perguntas e respostas são armazenadas no banco de dados do sistema web enquanto o contato estiver falando com o ChatGPT, para que sempre sejam utilizadas para manter o contexto do contato e evitar respostas repetidas.
Para evitar armazenamento de dados desnecessários, assim que a conversa com o ChatGPT é finalizada todas as perguntas e respostas daquela sessão são excluídas também.
Sendo assim, o array $messages
seria parecido com isso:
$messages = [
[
'role' => 'user',
'content' => 'Pergunta 01'
],
[
'role' => 'assistant',
'content' => 'Resposta 01'
],
[
'role' => 'user',
'content' => 'Pergunta 02'
],
[
'role' => 'assistant',
'content' => 'Resposta 02'
]
];
Também é possível adicionar uma mensagem do sistema, geralmente utilizada no começo da conversa, que será utilizada para configurar como o ChatGPT deve se comportar, por exemplo:
$messages = [
[
'role' => 'system',
'content' => 'Atue como um atendente chamado Gabriel com linguagem formal'
],
// ...
];
Uma informação útil, o valor de role
deve ser system
, assistant
ou user
(também existe o valor function
mas ainda não está 100% disponível) e eles significam respectivamente uma mensagem enviada pelo Sistema, uma mensagem enviada pelo ChatGPT e uma mensagem enviada pelo Usuário.
Com isso, ao perguntar "Qual o seu nome", o ChatGPT irá responder "Meu nome é Gabriel".
Também adicionei algumas formas de verificação para evitar respostas que já foram obtidas antes com a exata mesma mensagem, já que são armazenadas durante a sessão, o sistema a identifica e responde diretamente pela resposta anterior, evitando que seja realizada uma nova requisição ao ChatGPT, além de também criar uma fila para que caso o contato envie múltiplas mensagens em sequência, elas serão ignoradas até que a primeira mensagem seja respondida.
Treinando o ChatGPT
Se você já conversou com o ChatGPT, sabe o quanto ele é estranho em algumas respostas, e isso faria com que parte dos clientes estranhassem esse contato com uma inteligência artificial, por isso foi necessário criar um modelo próprio e voltado exclusivamente para a empresa contratante, uma vez que o ChatGPT talvez não teria as devidas respostas para perguntas especificas de produtos da empresa. O modelo personalizado pode ser criado a partir da função chamada Fine-Tuning
explicada aqui.
Ainda estamos realizando esse treinamento, por isso não tenho muito o que comentar sobre, em breve retorno com mais informações.
Respondendo o contato
Agora que o ChatGPT está configurado e funcionando, o fluxo determina quando o contato deve se conectar com a inteligência artificial e realiza o envio das perguntas do WhatsApp para o ChatGPT e a resposta novamente para o WhatsApp.
A integração permite que o atendimento funcione 24 horas por dia por todos os dias da semana mesmo que um atendente humano não esteja disponível, além de reduzir a quantidade de contatos que chegarão a falar com um atendente humano, uma vez que o ChatGPT pode tirar todas as dúvidas do contato sozinho.
Considerações finais
Desenvolver todos esses sistemas, integrar com o WhatsApp utilizando um "bot", desenvolver o sistema web, se conectar com a API do bot criado para o WhatsApp e também com a API do ChatGPT além de todas as outras funções do sistema foi bastante complicado, mas como programar (ainda) é minha paixão, foi tão prazeroso quanto. O custo da empresa com certeza (segundo estudos) será reduzido, embora seja alto nesse começo, e isso irá permitir maiores lucros.
Existe sim uma chance que o ChatGPT aprenda o suficiente com as conversas dos contatos e atendentes e futuramente os atendentes se tornem obsoletos para a inteligência artificial e sejam em sua maioria demitidos, mas prefiro pensar que eles terão mais tempo livres para alguma coisa...