Este código refere-se à palestra "Chatbot em Python", do SciPy #1 de 29/07/2017. Ver slides da apresentação
- Python 3.6
- Conta no Microsoft LUIS
- Módulo
luis
Nota: Os seguintes comandos funcionam em Linux e macOS. Se você está usando Windows, os passos são os mesmos, porém os comandos podem ser diferentes.
- Baixe e instale Python 2.7+ ou 3.6+ do site oficial.
- Crie uma conta no serviço Microsoft LUIS, através do site.
- Baixe o projeto e extraia seu conteúdo, você deve ver uma pasta chamada
chatbot-python
. - No Terminal ou Prompt de Comando, acesse a pasta onde você extraiu o projeto.
- Copie a pasta chatbot-python para sua pasta Home:
$ cp -R chatbot-python ~/
- Acesse a pasta Home:
$ cd ~/
- Instale o módulo Virtualenv para isolar o código:
$ pip3 install virtualenv
- Crie o virtual environment:
$ virtualenv chatbot-python
- Entre na pasta do projeto:
$ cd chatbot-python
- Ative o virtual environment:
$ source bin/activate
- Instale os módulos do Python:
$ pip3 install -r requirements.txt
O primeiro passo é importar e inicializar os módulos necessários, além de criar a estrutura para que o código seja feito usando Programação Orientada a Objetos.
Para isso, vamos:
- Inserir o shebang, na linha 1.
- Importar o módulo que faz a conexão com o LUIS, na linha 2.
- Armazenar a URL do enpoint numa constante, na quarta linha. Veja como conseguir ela aqui
- Inicializar o módulo usando a constante que armazena a URL do endpoint, na linha 5.
- Apontar que o método
start()
da classeMain()
é o método principal da classe e deve ser o chamado quando o arquivo é executado, nas linhas 7 e 8.
#!/usr/bin/env python
import luis
LUIS_ENDPOINT = "" # Coloque aqui a URL do seu endpoint
LUIS = luis.Luis(url=LUIS_ENDPOINT)
if __name__ == '__main__':
Main().start()
Agora vamos criar categorias de perguntas e suas respostas.
Para isso, vamos criar um dicionário ANSWERS
, que recebe como chave a categoria, chamada de intent pelo LUIS, e o valor do dicionário é a resposta.
Este dicionário será criado localmente na classe Main()
.
Vamos criar também o método start()
, para manter o código de acordo com a especificação de execução, feitas no passo anterior.
O código abaixo deve ser inserido na linha 6, abaixo da inicialização do módulo luis
na constante LUIS
.
class Main(object):
"""Baseado na pergunta do usuário, mostra a resposta mais adequada"""
ANSWERS = {
"BEST_LANGUAGE": "Sem sombra de dúvidas, a melhor linguagem de programação é Python.",
"WORST_LANGUAGE": "Não sei, mas com a mais absoluta certeza, não é Python.",
"ABOUT_PYTHON": "Python é a melhor linguagem de programação do mundo.",
"WELCOME": "Oi amigo! Faça sua pergunta...",
"GOODBYE": "Tchauzinho! :)",
"SENTIDO_VIDA": "O sentido da vida é programar em Python",
"None": "Desculpe, não entendi. Por favor, tente escrever de outra forma."
}
def start(self):
"""Initializa o bot"""
pass
Vamos criar o código para receber a mensagem do usuário e responder de acordo.
Primeiro, vamos colocar uma mensagem indicando o início da interação. (linha 3)
Depois, a mensagem recebida pelo usuário é armazenada numa variável. (linha 6)
Esta variável é passada como parâmetro para método replies()
que fará a análise da mensagem e retornará a resposta. Daqui a pouco criaremos este método replies()
. (linha 7)
A resposta, então, é exibida para o usuário. (linha 8).
Vamos colocar o processo de receber a mensagem e responder num loop, para que possa haver múltiplas interações.
Caso a mensagem seja de despedida, o bot é encerrado. (linhas 9 e 10)
No método start()
, substitua o pass
pelo código abaixo.
def start(self):
"""Initializa o bot"""
print("Início da interação:")
while True:
question = input("Usuário: ")
answer = self.replies(question)
print(f"Bot: {answer}")
if answer == self.ANSWERS["GOODBYE"]:
break
Para responder o usuário de forma mais adequada, vamos utilizar o serviço Microsoft LUIS.
Para isso, vamos criar o método replies()
que, a partir de uma mensagem, consulta o LUIS, e retorna o texto da resposta mais adequada.
Na linha 3, vamos fazer o envio da mensagem para análise, através do método analyze()
.
Este método retorna o atributo best_intent()
, que retorna com dois itens, o primeiro sendo a intent com maior probabilidade de ser a correta e o segundo é a probabilidade em si.
Vamos pegar apenas o nome da intent, através do atributo intent
e armazenar numa variável.
Com o nome da intent, vamos fazer a busca no dicionário ANSWERS e retornaremos a resposta, nas linhas 4 e 5.
Mais pra frente, criaremos as intents no LUIS.
Coloque este código dentro da classe Main()
, logo acima do método start()
def replies(self, text):
"""Baseado na pergunta do usuário, identifica qual a sua intenção"""
intent = LUIS.analyze(text).best_intent().intent
answer = self.ANSWERS[intent]
return answer
Nosso código está pronto, porém as perguntas não serão entendidas sem que o LUIS tenha sido treinado.
Primeiro, vamos criar o app:
- Após login no Microsoft LUIS, na aba My Apps, clique no botão New App.
- Coloque o nome da aplicação, como por exemplo "Chatbot Python".
- Coloque o idioma para "Brazilian Portuguese".
- Como Enpoint key, selecione "BoostrapKey".
A explicação detalhada de como criar o app no LUIS por ser encontrada aqui.
Agora que temos o App criado, temos que adicionar as intents:
- No menu lateral, clique em intents.
- Agora, clique no botão Add Intent, para adicionar uma nova intent.
- Coloque o nome da intent, de acordo com uma das chaves do nosso dicionário
ANSWERS
. - Clique no botão Save.
- Faça este passo até que todas as chaves do dicionário
ANSWERS
tenham uma intent no Microsoft LUIS. A intent None é criada por padrão e não precisa ser criada novamente.
A explicação detalhada de como criar intents no LUIS por ser encontrada aqui.
Depois de criada, a intent precisa ser treinada:
- Clique no nome de uma intent.
- Na caixa de input, onde está escrito Type a new utterance & press Enter, digite a mensagem que será categorizada naquela intent. Por exemplo, na intent WELCOME, colocamos a mensagem "oi".
- Crie um número razoável de mensagens. Quanto mais mensagens, mais preciso fica o sistema de identificação.
- Crie mensagens para todas as intents. Apesar de ser opcional fazer isso para a intent None, é recomendável que mensagens não relacionadas a nenhuma das outras intents sejam inseridas em None.
A explicação detalhada de como adicionar mensagens numa intent do LUIS por ser encontrada aqui
Depois de criar todas as intents e inserir mensagens e todas elas, precisamos fazer o treinamento em si.
- No menu lateral, clique em Train & Test.
- Clique no botão Train Application.
- Ao final do treinamento, é possível testar a precisão do treinamento na caixa de input Type a test utterance & press Enter.
A explicação detalhada de como fazer o treinamento no LUIS por ser encontrada aqui
Caso o treinamento não esteja satisfatório, coloque mais mensagens nas intents (passo anterior) e refaça o treinamento (este passo).
Com a aplicação treinada, precisamos publicá-la para uso externo.
- No menu lateral, clique em Publish App.
- Caso a Endpoint Key não esteja selecionada, selecione "BootstrapKey".
- Em Endpoint slot, selecione "Production".
- Clique no botão Publish.
- Será gerada a Endpoint URL. Copie a URL e cole no código, atribuido ela como String à constante
LUIS_ENDPOINT
LUIS_ENDPOINT = "https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/LETRASENUMEROS?subscription-key=NUMERODASUBSCRIPTIONKEY8&timezoneOffset=0&verbose=true&q="
Toda vez que fizer um novo treinamento, as alterações só estarão disponíveis após fazer a publicação (este passo). A publicação tem que ser feita todas as vezes.
A explicação detalhada de como fazer a publicação do App do LUIS por ser encontrada aqui
Agora está tudo pronto! Basta rodar o script e tudo deve funcionar perfeitamente.
Para isso, dentro da pasta chatbot-python
, execute o seguinte comando e manda uma mensagem para o bot:
$ python3 chatbot.py
Este projeto está licenciado sob a Licença MIT