A internet sempre foi algo cíclico. No início, tínhamos páginas web o mais clean possível, com poucos elementos e que ainda demoravam para carregar. Nessa época, a conexão era muito lenta. Com a melhora da qualidade das conexões oferecidas e, consequentemente, do carregamento das páginas, elas foram ganhando mais recursos visuais, banners e sites em Flash, um milhão de gifs animados e páginas extremamente pesadas. Mas o que vemos hoje é uma volta ao passado: os sites estão se preocupando novamente com performance, oferecendo páginas com poucos recursos e que demandam pouco da banda.
O mesmo aconteceu com a forma de se comunicar. Começou com o telnet, os chats, o ICQ e o mIRC, que eram recursos que utilizavam a escrita como forma de comunicação. Então, eles evoluíram para a comunicação por voz, como o Paltalk, as mensagens de voz do MSN. Em seguida, fomos para os vídeos do Skype e do Hangouts. Logo após, fomos apresentados ao Whatsapp, que, retornou para a forma textual de se comunicar.
E hoje não é diferente. A bola da vez é o que chamamos de Chatbots. O conceito é bem antigo: basicamente um programa que se apresenta em forma de um usuário de alguma plataforma no estilo chat (mIRC, Telegram, Slack, Facebook Messenger, Skype etc.) que responde a comandos em um chat. Ele pode realizar algumas lógicas, alimentar banco de dados, criar e realizar tarefas em geral e dar uma resposta ao comando solicitado.
No início, os Chatbots respondiam a comandos simples, como os iniciados com “!” e compreendiam algumas abreviações. Observando o caso acima, quando um usuário do canal #the.bot.city de um servidor de IRC, escrevesse “wz (Código da Localidade)”, o ExtremeBot respondia com algumas informações, como, o nome da cidade, estado, umidade, horário local etc.
Um exemplo de código em mIRC Scripting que retornaria o que o bot respondeu, seria:
on *:TEXT:wz &:#the.bot.city:{ msg $chan $nick $+ $message }
Onde “on *:TEXT:wz &:#the.bot.city:” é um gatilho de evento: quando, for digitado o texto “wz” seguido de um outro argumento (no caso “36869”) no canal “#the.bot.city”, “.msg # $nick $+ $message” envia uma mensagem no canal que foi digitado começando com o nick da pessoa que digitou, concatenado com a mensagem. No caso existe uma lógica por trás da mensagem, que traz os dados da localização e do clima.
Com o passar do tempo, os Chatbots começaram a ser programados para responder de acordo com um contexto de conversa, como por exemplo nesse chat do Slack:
E é aí que o negócio começa a ficar interessante! O boom dos Chatbots vem exatamente junto com outro boom: o do Machine Learning. Utilizando conceitos de Inteligência Artificial e a crescente gama de serviços de Machine Learning fica muito mais fácil para a máquina aprender padrões comportamentais e linguísticos de determinada pessoa. Sendo assim, os Chatbots deixaram de apenas responder a comandos; agora eles conseguem interagir com humanos usando linguagem natural.
Agora vamos ilustrar um exemplo básico de Chatbot. Para isso, utilizaremos o Telegram como tecnologia de chat e uma API do Google chamada Google Prediction como ferramenta de Machine Learning. Caso você não conheça, o Telegram é um aplicativo para troca de mensagens, que possui APIs abertas para comunicação entre usuários. O que o torna bastante interessante quando falamos de Chatbots.
Neste exemplo, iremos criar um ChatBot que descobrirá de onde o usuário é, através da leitura de expressões comuns de alguns lugares no Brasil. Nesse caso, utilizaremos termos típicos do “carioca”, do “mineiro” e do “gaúcho” para o bot reconhecer.
O primeiro passo para criar um bot no Telegram é falar com o BotFather. Assim, você conseguirá criar um bot com o nick que você quiser, receber o token de acesso ao bot, dar as permissões necessárias para o bot participar de canais e programá-lo. Para saber mais sobre o processo, acesse aqui.
Com o bot criado, agora vamos entender um pouco sobre o que o Google Prediction faz. Ele é um serviço do Google que recebe uma massa de dados – no caso, enviaremos em formato csv –, treina essa massa e fornece um “previsão” em relação a uma chamada a sua API.
Para usá-lo, é preciso ter uma conta no Google Cloud Platform e habilitar alguns processos. Os passos necessários para essa habilitação podem ser vistos aqui.
No nosso caso, iremos usar uma massa de dados de expressões em determinado regionalismo. Será algo parecido com isso:
Região de onde provém, Regionalismo:
- “carioca”, “mermão”
- ”mineiro”, “trem”
- “gaucho”, “guri”
- “gaucho”, “tche”;
- “carioca”, “bixcoito”
- “mineiro”, “belzonti”
- “carioca”, “sinistro”
…
Devemos, então, treinar a massa dos dados, dentro do serviço do Google Prediction, para poder fazer as chamadas na API. Para isso, devemos chamar o serviço prediction.trainedmodels.insert e, depois de algum tempo, chamar o serviço prediction.trainedmodels.get para verificar se a massa de dados já foi treinada. Então, quando chamarmos, por exemplo, a API do Google Prediction passando “trem”, ela deve nos retornar “mineiro”.
Vale lembrar que em um projeto de Machine Learning, assim que o Chatbot percebe que o usuário é de uma determinada região, ele irá treinar ainda mais expressões para melhorar a taxa de acerto.
Com a massa treinada, vamos à integração do Chatbot com o Google Prediction. Para realizar essa integração, podemos utilizar diversas bibliotecas e SDKs disponíveis para a linguagem de preferência. Porém, para efeito de entendimento, iremos utilizar as chamadas puras a API do Telegram.
Quando criamos um bot no Telegram, o BotFather envia um token para podermos as chamadas na API. Para verificar as mensagens que seu Bot recebeu, podemos realizar uma chamada a seguinte URL: https://api.telegram.org/bot{token}/getUpdates.
Onde {token} é a chave que o BotFather enviou. No nosso caso, enviei algumas mensagens no privado do Bot e fiz a chamada de getUpdates. O resultado dessa chamada é algo parecido com isso:
{"ok":true,"result":[{"update_id":86879252, "message":{"message_id":2,"from":{"id":121585871,"first_name":"Pokemaobr","username":"pokemaobr"},"chat":{"id":121585871,"first_name":"Pokemaobr","username":"pokemaobr","type":"private"},"date":1481719126,"text":"e aew mermão"}},{"update_id":86879253, "message":{"message_id":3,"from":{"id":121585871,"first_name":"Pokemaobr","username":"pokemaobr"},"chat":{"id":121585871,"first_name":"Pokemaobr","username":"pokemaobr","type":"private"},"date":1481719226,"text":"tá sinistro isso brother"}}]}
Um JSON que contém o id de cada mensagem, o conteúdo e quem a enviou. Você pode ler esse JSON na linguagem de sua preferência. Quase todas as linguagens possuem suporte a leitura de JSON. Em PHP, por exemplo, poderíamos utilizar um json_decode($json) para transformar o JSON em Array.
Com o JSON lido, temos agora quem enviou a mensagem e seu conteúdo. Portanto, podemos enviar o conteúdo da mensagem a API do Google Prediction e verificar qual de onde é a pessoa que enviou a mensagem.
Vale ressaltar que quando você for desenvolver o projeto, caso não esteja usando uma biblioteca ou SDK de Telegram, você terá que iterar entre as mensagens recebidas e fazer um controle para que você não leia ou responda a mesma mensagem mais de uma vez.
Então, cada conversa no privado do ChatBot estará no Updates e poderá ser recuperada no getUpdates. Partindo daí, basta utilizar o serviço prediction.trainedmodels.predict para receber a “previsão” de que estado é aquele usuário que usa regionalismos específicos.
Recebendo o JSON de retorno do Prediction API. Que seria algo como:
{"kind": "prediction#output", "id": "sotaques", "selfLink": "link_para_o_predict", "outputLabel": "Carioca", "outputMulti": [{"label": "Mineiro","score": "0.100000"},{"label": "Carioca", "score": "0.900000"},{"label": "Gaucho","score": "0.000000"}]}
Verifique que cada possível região, ou o sotaque desta região, recebe um “score” e o outputLabel (que no caso é o retorno) é a região que recebe mais porcentagem nesse score.
Bem, depois de receber o sotaque no Prediction API. Basta, enviarmos o “vencedor” para a API do Telegram, para que nosso ChatBot possa enviar o resultado para o usuário.
Um exemplo da chamada para retorno para o usuário seria:
https://api.telegram.org/bot{token}/sendMessage?chat_id={id_da_conversa}&text=Carioca
E o resultado:
Lembrando que a ideia desse artigo é mostrar de modo didático como é feito em geral uma aplicação de ChatBot. Existem infinitas bibliotecas em diversas linguagens, tanto para trabalhar com a API do Telegram, quanto com as APIs do Google – inclusive a Google Prediction. Neste caso, foram utilizadas as chamadas diretas HTTP para entendermos como funcionaria os princípios da comunicação com as APIs.
Espero que tenham gostado e até a próxima.