Skip to content

Commit

Permalink
Merge pull request #142 from lappis-unb/update_analytics
Browse files Browse the repository at this point in the history
Update analytics
  • Loading branch information
arthurTemporim authored Sep 11, 2020
2 parents a6a9575 + beb779a commit 997d8a3
Show file tree
Hide file tree
Showing 21 changed files with 455 additions and 581 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ events.db
events.db-shm
events.db-wal
rasa.db
*.db*

### Rasa visualize ###
graph.html
Expand Down
51 changes: 33 additions & 18 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
current_dir := $(shell pwd)
user := $(shell whoami)

clean:
docker-compose down
cd bot/ && make clean

stop:
docker-compose stop
Expand Down Expand Up @@ -31,57 +33,70 @@ build-analytics:
docker-compose up -d rabbitmq
docker-compose up -d rabbitmq-consumer
docker-compose up -d kibana
# This sleep time is a work arround the main objetive is run the following command when elasticsearch is ready
# The following command is needed just once for project. It's just a setup onfiguration script.
sleep 30
make config-elastic
make config-kibana

config-elastic:
docker-compose run --rm -v $(current_dir)/modules/analytics/setup_elastic.py:/analytics/setup_elastic.py bot python /analytics/setup_elastic.py
docker-compose run --rm -v $(current_dir)/modules/analytics/:/analytics/ bot python /analytics/import_dashboards.py

config-kibana:
docker-compose run --rm -v $(current_dir)/modules/analytics/:/analytics/ kibana python3 /analytics/import_dashboards.py
$(info )
$(info Não se esqueça de atualizar o arquivo endpoints.yml)
$(info Acesse o KIBANA em: http://localhost:5601)
$(info )
sensible-browser --no-sandbox http://localhost:5601

run-analytics:
docker-compose up -d rabbitmq
docker-compose up -d rabbitmq-consumer
docker-compose up -d elasticsearch
docker-compose up -d kibana
sensible-browser --no-sandbox http://localhost:5601

run-shell:
docker-compose run --rm --service-ports bot make shell

run-api:
docker-compose run --rm --service-ports bot make api

run-actions:
docker-compose run --rm --service-ports bot make actions

run-x:
docker-compose run --rm --service-ports bot make x

run-webchat:
$(info )
$(info Executando Bot com Webchat. Caso seu navegador não seja iniciado automáticamente, abra o seguinte arquivo com seu navegador: modules/webchat/index.html)
$(info Executando Bot com Webchat.)
$(info )
docker-compose run -d --rm --service-ports bot-webchat
sensible-browser modules/webchat/index.html
$(info )
$(info Caso o FIREFOX não seja iniciado automáticamente, abra o seguinte arquivo com seu navegador:)
$(info modules/webchat/index.html)
$(info )
firefox modules/webchat/index.html

run-telegram:
docker-compose run -d --rm --service-ports bot_telegram make telegram

run-notebooks:
docker-compose up -d notebooks
sensible-browser --no-sandbox http://localhost:8888
$(info )
$(info Acesse o KIBANA em: http://localhost:8888)
$(info )

train:
mkdir -p bot/models
docker-compose up --build coach

############################## TESTS ##############################
test:
docker-compose run --rm bot make test

run-test-nlu:
docker-compose run --rm bot make test-nlu

run-test-core:
docker-compose run --rm bot make test-core

validate:
docker-compose run --rm coach rasa data validate --domain domain.yml --data data/ -vv
docker-compose run --rm bot rasa data validate --domain domain.yml --data data/ -vv

visualize:
docker-compose run --rm -v $(current_dir)/bot:/coach coach rasa visualize --domain domain.yml --stories data/stories.md --config config.yml --nlu data/nlu.md --out ./graph.html -vv
sensible-browser --no-sandbox bot/graph.html
$(info )
$(info Caso o FIREFOX não seja iniciado automáticamente, abra o seguinte arquivo com seu navegador:)
$(info bot/graph.html)
firefox bot/graph.html
113 changes: 12 additions & 101 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,13 +91,14 @@ criar um repositório para as imagens e substitua os nomes das imagens "lappis/b
make train
```

### Console
### Executando o bot no terminal
Para executar o bot no terminal execute:

```sh
make run-shell
```

### Telegram
### Executando o bot no Telegram

Após realizar o [tutorial](/docs/setup_telegram.md) de exportação de todas variávies de ambiente necessárias, é possível realizar a execução do bot no telegram corretamente.

Expand All @@ -112,12 +113,6 @@ telegram:
webhook_url: ${TELEGRAM_WEBHOOK}
```

Se ainda não tiver treinado seu bot execute antes:

```sh
make train
```

Depois execute o bot no telegram:

```sh
Expand All @@ -128,113 +123,29 @@ make run-telegram

Para a visualização dos dados da interação entre o usuário e o chatbot nós utilizamos uma parte da Stack do Elastic, composta pelo ElasticSearch e o Kibana. Com isso, utilizamos um broker para fazer a gerência de mensagens. Então conseguimos adicionar mensagens ao ElasticSearch independente do tipo de mensageiro que estamos utilizando.

### Configuração do RabbitMQ

* Para uma **configuração rápida** execute o seguinte comando:

```sh
make build-analytics
```

O comando acima só precisa ser executado apenas 1 vez e já vai deixar toda a infra de `analytics` pronta para o uso.

Nas próximas vezes que desejar utilizar o `analytics` execute o comando:

```sh
make run-analytics
```

Por fim acesse o **kibana** no `locahost:5601`

* **Explicação completa:**

Em primeiro lugar para fazer o setup do analytics é necessário subir o RabiitMQ e suas configurações.

Inicie o serviço do servidor do RabbitMQ:

```sh
sudo docker-compose up -d rabbitmq
```

Inicie o serviço do consumidor do RabbitMQ, que ficará responsável por enviar as mensagens para o ElasticSearch:
Espere até os serviço do *ElasticSearch* estar pronto, e execute o comando abaixo para configurar os índices:

```sh
sudo docker-compose up -d rabbitmq-consumer
```
make config-elastic
```

Lembre-se de configurar as seguintes variáveis de ambiente do serviço `rabbitmq-consumer` no `docker-compose`.
Espere até os serviço do *Kibana* estar pronto, e execute o comando abaixo para configurar os *dashboards*:

```sh
ENVIRONMENT_NAME=localhost
BOT_VERSION=last-commit-hash
RABBITMQ_DEFAULT_USER=admin
RABBITMQ_DEFAULT_PASS=admin
```
make config-kibana
```

Sendo que as configurações de `RABBITMQ_DEFAULT_USER` e `RABBITMQ_DEFAULT_PASS` devem ser as mesmas definidas no serviço do `rabbitmq`.

#### Integração com Rasa

Existem duas formas para executar a Tais com o *broker*. A primeira delas é via linha de comando.
Para utilizar esta forma é preciso definir Dentro do arquivo `endpoints.yml` as configurações do broker:

```yml
event_broker:
url: rabbitmq
username: admin
password: admin
queue: bot_messages
```
Ao final é necessário buildar novamente o container do bot.
```
sudo docker-compose up --build -d bot
```

### Configuração ElasticSearch

O ElasticSearch é o serviço responsável por armazenar os dados provenientes da interação entre o usuário e o chatbot.

As mensagens são inseridas no índice do ElasticSearch utilizando o *broker* RabbitMQ.

Para subir o ambiente do ElasticSearch rode os seguintes comandos:

```
sudo docker-compose up -d elasticsearch
sudo docker-compose run --rm -v $PWD/analytics:/analytics bot python /analytics/setup_elastic.py
```

Lembre-se de setar as seguintes variaveis de ambiente no `docker-compose`.

```
ENVIRONMENT_NAME=localhost
BOT_VERSION=last-commit-hash
```

#### Setup Kibana (Visualização)

Para a análise dos dados das conversas com o usuário, utilize o kibana, e veja como os usuários estão interagindo com o bot, os principais assuntos, média de usuários e outras informações da análise de dados.

O Kibana nos auxilia com uma interface para criação de visualização para os dados armazenados nos índices do ElasticSearch.

```sh
sudo docker-compose up -d kibana
```

**Atenção:** Caso queira configurar permissões diferentes de usuários (Login) no ElasticSearch/Kibana, siga esse tutorial ([link](https://github.com/lappis-unb/rasa-ptbr-boilerplate/tree/master/docs/setup_user_elasticsearch.md)).

#### Importação de dashboards

Caso queira subir com os dashboards que criamos para fazer o monitoramento de bots:

```
sudo docker-compose run --rm kibana python3.6 import_dashboards.py
```
O comando acima precisa ser executado apenas 1 vez e já vai deixar toda a infra de `analytics` pronta para o uso.

Após rodar o comando anterior os dashboards importados estarão presentes no menu management/kibana/Saved Objects.
Acesse o **kibana** na url `locahost:5601`

Você pode acessar o kibana no `locahost:5601`
Caso você deseje entender o processo de configuração da *stack* de *analytics*, veja a [explicação completa de analytics](docs/setup_analytics.md).

## Notebooks - Análise de dados

Expand Down
5 changes: 1 addition & 4 deletions bot/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@ train:
rasa train -vv

# TESTS
validate:
rasa data validate -vv

test:
rasa test --out results/

Expand All @@ -35,7 +32,7 @@ test-core:

# VALIDACAO
validate:
rasa data validate
rasa data validate -vv

# MENSAGEIROS
shell:
Expand Down
Empty file added bot/actions/__init__.py
Empty file.
16 changes: 8 additions & 8 deletions bot/actions/actions.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# This files contains your custom actions which can be used to run
# custom Python code.
# Este arquivo contém custom actions que utilizão código python
# para executar ações no diálogo.
#
# See this guide on how to implement these action:
# Veja o guia na documentação do RASA em:
# https://rasa.com/docs/rasa/core/actions/#custom-actions/

from typing import Any, Text, Dict, List
Expand All @@ -28,9 +28,9 @@ def run(
return []


class ActionCPF(Action):
class ActionTelefone(Action):
def name(self) -> Text:
return "action_cpf"
return "action_telefone"

def run(
self,
Expand All @@ -39,10 +39,10 @@ def run(
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:

cpf = tracker.get_slot('cpf')
telefone = tracker.get_slot('telefone')

try:
dispatcher.utter_message("O seu CPF é {}?".format(cpf))
dispatcher.utter_message("O seu telefone é {}?".format(telefone))
except ValueError:
dispatcher.utter_message(ValueError)
return [SlotSet("cpf", cpf)]
return [SlotSet("telefone", telefone)]
53 changes: 53 additions & 0 deletions bot/actions/data_validator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import re


def isCpfValid(cpf):
""" If cpf in the Brazilian format is valid, it returns True, otherwise, it returns False. """

# Check if type is str
if not isinstance(cpf, str):
return False

# Remove some unwanted characters
cpf = re.sub("[^0-9]", "", cpf)

# Checks if string has 11 characters
if len(cpf) != 11:
return False

sum = 0
weight = 10

""" Calculating the first cpf check digit. """
for n in range(9):
sum = sum + int(cpf[n]) * weight

# Decrement weight
weight = weight - 1

verifyingDigit = 11 - sum % 11

if verifyingDigit > 9:
firstVerifyingDigit = 0
else:
firstVerifyingDigit = verifyingDigit

""" Calculating the second check digit of cpf. """
sum = 0
weight = 11
for n in range(10):
sum = sum + int(cpf[n]) * weight

# Decrement weight
weight = weight - 1

verifyingDigit = 11 - sum % 11

if verifyingDigit > 9:
secondVerifyingDigit = 0
else:
secondVerifyingDigit = verifyingDigit

if cpf[-2:] == "%s%s" % (firstVerifyingDigit, secondVerifyingDigit):
return True
return False
Loading

0 comments on commit 997d8a3

Please sign in to comment.