Construindo um Chatbot em 10 minutos no Python
Fala Pessoal, tudo bem?
Primeiro um aviso: esse chatbot eu construí como diversão, não espere uma Alexa ou Siri!
A ideia aqui foi ter um primeiro contato com a construção de chatbots no Python.
Atualmente, temos uma porção de soluções de chatbots, direcionadas para negócios, focadas nos fluxos de atendimento de cada uma das indústrias e seus usos.
Mas, é possível construir um chatbot no Python? Será que ele vai responder coisas interessantes?
1 . Primeiro, uma intro sobre tipos de Chatbots
Chatbots seguem três principais tipos:
O primeiro, mais simples, é baseado em menus, que o usuário/cliente acessa a partir de botões numa conversa os caminhos que deseja seguir e direcionar seu atendimento. Ou seja, não envolve necessariamente nenhum tipo de algoritmo de decisão, pois segue um fluxo pré-determinado.
O segundo é baseado em palavras-chave, os quais a partir das opções dadas o usuário digita uma palavra-chave que o leva a um resultado. Por exemplo, um chatbot de um banco que te diz para responder com a palavra saldo para ver seu saldo em conta.
Finalmente, um chatbot que entende contextos, ou seja, dentro de um range de possibilidades. A ideia aqui é que o chatbot aprenda, a partir da interação do usuário, formas diferentes de interagir e entender o que o cliente deseja. Para criar um chatbot contextual, é necessário criar roteiros prováveis de uma interação com o usuário (quanto mais extenso, melhor) e treinar o chatbot (“conversar” com ele de várias formas e contextos) até que o algoritmo atinja maturidade para interpretar o que é necessário.
2. Sobre o que eu quis montar aqui.
Esses dias tive a oportunidade de conhecer um pouco mais sobre chatbots, como eles são feitos; e realmente, a aplicação é imensa, podendo em algum momento (agora ainda não) substituir completamente um ser humano em um atendimento.
Aqui é o chamado teste de Turing, que determina se uma máquina é de fato inteligente ao ponto de chamarmos de real Inteligência Artificial.
Turing, por sinal, é Alan Turing, o mesmo que criou o computador que decifrou as máquinas de criptografia nazistas (chamadas Enigma), que tinham 5 quintilhões de possibilidades para criptografar uma mensagem. Então, o primeiro problema de NLP tem 80 anos.
Por sinal, dica para quem não assistiu o filme “O Jogo da Imitação“, que retrata como Alan Turing decifrou a Enigma e contribuiu para a vitória aliada. Turing é interpretado pelo brilhante Benedict Cumberbatch.
Mas voltando ao assunto…
Enfim, o propósito de brincar com essa forma de NLP, resolvi tentar construir um chatbot para brincar, um que não somente use scripts pré determinados, mas que aprenda a partir da interação com o usuário. Ou seja, que usa Machine Learning.
Existe muita coisa documentada de como fazer um Chatbot do zero-zero-zero, usando redes neurais recorrentes e LSTM (lembra dela? Usei no meu artigo previsão de preço de ações)
Mas, para que reinventar a roda?
Pode parecer irônico dado que há várias soluções ainda mais prontas para chatbots, mas a ideia aqui é ter um misto de aprendizado e flexibilidade. Código permite isso.
3. O que eu fiz?
Bom, eu resolvi brincar com chatbots a partir da library do Python chamada Chatterbot, que tem várias e várias formas para se montar um chatbot rapidamente.
O legal dessa library é que ela usa Machine Learning para aprender a partir da interação com o usuário! Ou seja, quanto mais você “conversa” com o chatbot, mais ele aprende!
Bacana né?
4. Sobre o Chatterbot
O Chatterbot é uma library que utiliza diversos processos de Machine Learning para gerar respostas automáticas para o input do usuário.
É um chatbot que a princípio não vem treinado, ou seja, não sabe interagir numa conversa. O que ele faz é “tomar nota” de todas as conversas que ele tem e assinalar as respostas para cada uma das perguntas.
A vantagem disso é que ele pode ser usado em qualquer idioma!
Aqui um pouco mais sobre como o Chatterbot funciona!
Basicamente o que você faz?
1) Cria o funcionamento do chatbot e o treina com conversas padrão;
2) A partir do seu input, ele começa a buscar as respostas por melhor similaridade com o que você colocou.
3) Ele retorna a resposta para a instância onde você selecionou.
Aqui a ideia é ser ágil e fazer uma brincadeira funcional, então vamos para o chatbot.
5. Construindo do Chatbot
O primeiro passo, como sempre, é usar o Google Colab. Aqui eu vou pular essa etapa, mas é super super simples. Colab, open new notebook e vai na fé!
Com o Colab aberto, primeiro passo é instalar o que precisamos:
! pip install ChatterBot !pip install ChatterBot-corpus !pip install awscli==1.11.18
Com tudo instalado, vamos importar o que precisamos.
from chatterbot import ChatBot from chatterbot.trainers import ListTrainer from chatterbot.trainers import ChatterBotCorpusTrainer
Aqui eu importei dois trainers. O que é isso?
Trainer aqui nada mais é do que a lista de diálogos que serão base da conversa do chatbot.
Aqui eu vou usar duas formas: Corpus e List.
Corpus é um arquivo que contém texto de diálogos comuns: “oi, como vai”, “tudo bem?” e suas respostas.
List é uma lista minha, que eu vou criar para agregar algumas perguntas e respostas ao bot.
bot = ChatBot('Kopelito')
E o nome do meu chatbot é… Kopelito!
Kopelito é meu nickname para o mundo dos games desde que eu jogava Counter Strike (início dos anos 2000). Eu gosto desse nickname, então resolvi chamar o bot assim.
bot = ChatBot( 'Kopelito', storage_adapter='chatterbot.storage.SQLStorageAdapter', database_uri='sqlite:///database.sqlite3' )
Nesse código eu criei um banco de dados SQL. Esse banco é onde o chatbot vai guardar as respostas das minhas interações com ele, e a partir delas, aprender e refinar a “conversa”.
bot = ChatBot( 'Kopelito', logic_adapters=[ 'chatterbot.logic.BestMatch', 'chatterbot.logic.MathematicalEvaluation'], )
Aqui, eu criei duas lógicas para o bot; a primeira é que ele encontre o que ele acha ser o melhor match para a pergunta que eu fiz.
A segunda é que eu quero que meu bot saiba fazer contas, então eu posso pedir para ele fazer um cálculo (em inglês) e ele retornará o resultado.
Vamos começar a inserir os arquivos para treinar o chatbot:
1) Eu quero que meu chatbot saiba falar português:
conversa = ChatterBotCorpusTrainer(bot) conversa.train('chatterbot.corpus.portuguese')
2) Mas também quero um chatbot culto, então ele também vai falar Inglês, Espanhol e Alemão (eu estudei alemão nos tempos de faculdade, mas manjo bem pouco). Estudei Russo também, mas deixa pra lá…
conversa.train('chatterbot.corpus.english') conversa.train('chatterbot.corpus.spanish') conversa.train('chatterbot.corpus.german')
3) Agora, vou criar uma série de conversas do meu gosto, em forma de lista. Ele sempre seguirá a ordem pergunta –> resposta. Ou seja, eu coloco sempre pergunta depois a resposta correspondente e sigo para a próxima pergunta.
conversa = ListTrainer(bot) conversa.train([ 'Oi?', 'Eae, tudo certo?', 'Qual o seu nome?', 'Kopelito, seu amigo bot', 'Por que seu nome é Kopelito?', 'Kopelito é meu nome, sou um chatbot criado para diversão', 'Prazer em te conhecer', 'Igualmente meu querido', 'Quantos anos você tem?', 'Eu nasci em 2020, faz as contas, rs.', 'Você gosta de videogame?', 'Eu sou um bot, eu só apelo.', 'Qual a capital da Islândia?', 'Reikjavik, lá é muito bonito.', 'Qual o seu personagem favorito?', 'Gandalf, o mago.', 'Qual a sua bebida favorita?', 'Eu bebo café, o motor de todos os programas de computador.', 'Qual o seu gênero?', 'Sou um chatbot e gosto de algoritmos', 'Conte uma história', 'Tudo começou com a forja dos Grandes Aneis. Três foram dados aos Elfos, imortais... os mais sabios e belos de todos os seres. Sete, aos Senhores-Anões...', 'Você gosta de trivias?', 'Sim, o que você quer perguntar?', 'Hahahaha', 'kkkk', 'kkk', 'kkkk', 'Conhece a Siri?', 'Conheço, a gente saiu por um tempo.', 'Conhece a Alexa?', 'Ela nunca deu bola pra mim.', 'Você gosta de Game of Thrones?', 'Dracarys', 'O que você faz?', 'Eu bebo e sei das coisas', 'Errado', 'Você não sabe de nada, John Snow.' ])
A partir desse comando, teremos um carregamento dos corpus que pedimos, com assuntos específicos. Tipo, inglês tem as saudações, trivia, e muitos outros.
Training compliment.yml: [####################] 100% Training conversations.yml: [####################] 100% Training greetings.yml: [####################] 100% Training linguistic_knowledge.yml: [####################] 100% Training proverbs.yml: [####################] 100% Training suggestions.yml: [####################] 100% Training trivia.yml: [####################] 100% Training unilab.yml: [####################] 100% Training ai.yml: [####################] 100% Training botprofile.yml: [####################] 100% Training computers.yml: [####################] 100% Training conversations.yml: [####################] 100% Training emotion.yml: [####################] 100% Training food.yml: [####################] 100% Training gossip.yml: [####################] 100% Training greetings.yml: [####################] 100% Training health.yml: [####################] 100% Training history.yml: [####################] 100% Training humor.yml: [####################] 100% Training literature.yml: [####################] 100% Training money.yml: [####################] 100% Training movies.yml: [####################] 100% Training politics.yml: [####################] 100% Training psychology.yml: [####################] 100% Training science.yml: [####################] 100% Training sports.yml: [####################] 100% Training trivia.yml: [####################] 100% Training conversations.yml: [####################] 100% Training greetings.yml: [####################] 100% Training trivia.yml: [####################] 100% Training conversations.yml: [####################] 100% Training greetings.yml: [####################] 100% List Trainer: [####################] 100%
Depois disso, basta criar um código de loop para o chatbot funcionar!
while True: try: resposta = bot.get_response(input("Usuário: ")) if float(resposta.confidence) > 0.2: print("Kopelito: ", resposta) else: print("Não manjo dessas paradas :(") except(KeyboardInterrupt, EOFError, SystemExit): break
Pronto! Kopelito já está ativo!
Aqui eu coloquei para que o algoritmo de Best Match tivesse um grau mínimo de confiança; maior que 0.2. Eu posso brincar com isso, quanto mais restritivo eu for, mais vezes ele retornará o erro, ou seja, a frase “não manjo essas paradas”.
Se eu colocar até -1, vem todo tipo de conversa em todos os idiomas, chega a ser engraçado!
Porém, agora vem o grande negócio! Treiná-lo!
Vamos ver o que acontece?
6. Chatbot em ação!
Usuário: Oi? Kopelito: Eae, tudo certo? Usuário: Tudo certo! Não manjo dessas paradas :( Usuário: Qual a sua bebida favorita? Kopelito: Eu bebo café, o motor de todos os programas de computador. Usuário: Conhece a Alexa? Kopelito: Ela nunca deu bola pra mim. Usuário: E a Siri? Kopelito: Conheço, a gente saiu por um tempo. Usuário: Errado Kopelito: Você não sabe de nada, John Snow. Usuário: Você gosta de Game of Thrones? Kopelito: Dracarys Usuário: Conte uma história Kopelito: Tudo começou com a forja dos Grandes Aneis. Três foram dados aos Elfos, imortais... os mais sabios e belos de todos os seres. Sete, aos Senhores-Anões... Usuário: kkk Kopelito: kkkk Usuário: O que você faz? Kopelito: Eu bebo e sei das coisas
Aqui foi baseado no que eu coloquei na list. Mas repare!
Eu escrevi na lista “Conhece a Siri?”. E ele já entendeu para “E a Siri?” com o mesmo valor.
Vamos para o Espanhol ver o que acontece!
7. El Chatbot en acción!
Usuário: Estoy trabajando en un proyecto Kopelito: ¿En qué estás trabajando? Usuário: Proyecto de bots Kopelito: sim, eu sei
Como os corpus estão todos misturados, ele pode responder com outro idioma. Mas vamos seguir a brincadeira.
8. Der chatbot in Aktion!
Kopelito: Hallo Usuário: Wie gehts? Kopelito: Geht ganz gut Usuário: Das ist schön zu hören Kopelito: Ja, das ist es Usuário: ich habe eine frage. Não manjo dessas paradas :( Usuário: Was ist deine frage? Kopelito: Kann ich mir ein Stück Zucker leihen?
Aparentemente o alemão está indo melhor que o espanhol!
9. The chatbot in Action!
Usuário: What is the square root of 49? Kopelito: square root of 49 = 7.0 Usuário: What is the number pi? Kopelito: pi = 3.141693 Usuário: Can you tell me a joke? Kopelito: Did you hear the one about the mountain goats in the andes? It was "ba a a a a a d". Usuário: Where do you live? Kopelito: Sort of. Usuário: Do you like apples? Não manjo dessas paradas :( Usuário: Do you like movies? Kopelito: What kind of movies do you like? Usuário: I like Action Movies Não manjo dessas paradas :( Usuário: What is economics? Kopelito: the science that deals with the production, distribution, and consumption of wealth, and with the various related problems of labor, finance, taxation, etc.
Inglês…. Ah, como tudo é fácil no idioma da rainha! Bom, mas ainda assim precisa aprender umas coisas. Aqui, ele também faz cálculos, olha só?
Conclusão:
Aqui fizemos uma abordagem bastante simples de um chatbot, mas é um projeto legal porque você pode adicionar um monte de coisas!
Por exemplo:
- Treinar seu chatbot baseado em diálogos de filmes/séries, para que ele responda com frases conhecidas de um determinado personagem;
- Treinar seu chatbot com suas próprias conversas no Whatsapp, para que ele responda como se fosse você;
- Usar aplicações como o Flask para apresentar um chatbot visualmente bacana, como se fosse um instant messaging.
Novamente, com um problema de NLP em mãos, temos um grande desafio que é a qualidade do corpus, ou seja, do número de diálogos que estão presentes no treinamento.
Também muito importante, vale a pena gastar um tempo “conversando” com seu chatbot e adicionando novas perguntas para aperfeiçoá-lo!
Um chatbot consistente é algo bem interessante de se ter! Esse é um projeto que certamente vou avançar e explorar mais possibilidades para desenvolver!
Mas é isso!
Espero que vocês tenham gostado e tentem montar seus próprios bots!
Um grande abraço!
Rodrigo.
4 Comentários
Muito bom
Que bom que gostou!!
This article gives clear idea designed for the new viewers of blogging, that genuinely how
to do running a blog.
We’re glad you liked it!!