diff --git a/.gitignore b/.gitignore
index b70b043c..c2b3495a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,8 @@
bot/models
rasa_core.log
errors.json
+models/dialogue/
+models/nlu/current/
### Rasa evaluation ###
.ipynb_checkpoints/
@@ -35,10 +37,11 @@ notebooks/stories/matrix.pdf
/data
uploads
-
-### database
+### database ###
web/postegres-data
+### PyCharm ###
+.idea/
# Created by https://www.gitignore.io/api/vim,linux,macos,python
@@ -198,6 +201,3 @@ tags
# End of https://www.gitignore.io/api/vim,linux,macos,python
-models/dialogue/
-
-models/nlu/current/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2fe7df52..1e318965 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,9 @@
image: python:3.6-slim
+before_script:
+ - apt-get update --yes
+ - apt-get install gcc
+
variables:
BOT_IMAGE: $DOCKERHUB_USER/bot
COACH_IMAGE: $DOCKERHUB_USER/coach
diff --git a/Makefile b/Makefile
index ab0a1098..7596656e 100644
--- a/Makefile
+++ b/Makefile
@@ -2,15 +2,16 @@ build-bot:
./docker/build-base.sh
make train
+run-analytics:
+ docker-compose up -d rabbitmq
+ docker-compose up -d rabbitmq-consumer
+ docker-compose up -d elasticsearch
+ docker-compose run --rm -v $PWD/analytics:/analytics bot python /analytics/setup_elastic.py
+ docker-compose up -d kibana
+
train:
docker build . -f docker/coach.Dockerfile -t lappis/coach:boilerplate
docker-compose build bot
-run-telegram:
- docker-compose up telegram_bot
-
run-console:
docker-compose run bot make run-console
-
-test-dialogue:
- docker-compose run --rm bot make e2e
\ No newline at end of file
diff --git a/README.md b/README.md
index f0dbe797..d269a393 100644
--- a/README.md
+++ b/README.md
@@ -3,13 +3,33 @@
+## Tutorial para configurar todo o projeto
+
+```sh
+```
+
+```sh
+sudo docker-compose up -d rocketchat
+
+sudo docker-compose up -d rabbitmq
+sudo docker-compose up -d rabbitmq-consumer
+
+sudo docker-compose up -d elasticsearch
+sudo docker-compose run --rm -v $PWD/analytics:/analytics bot python /analytics/setup_elastic.py
+sudo docker-compose up -d kibana
+
+sudo docker-compose up -d bot
+```
+
+## Introdução
+
### For English version, see [README-en](docs/README-en.md)
Um projeto feito em Rasa com configurações necessárias para a construção de um projeto grande de chatbot.
-Este projeto teve como base a [Tais](http://github.com/lappis-unb/tais).
+Este projeto teve como base o projeto [Tais](http://github.com/lappis-unb/tais).
-# Entenda a Arquitetura
+### Entenda a Arquitetura
É utilizado no boilerplate diversas tecnologias que interagem entre si para obter um melhor resultado. Veja a arquitetura implementada:
@@ -23,120 +43,45 @@ Os notebooks avaliam o funcionamento de acordo com o formato das *intents* e *st
O elasticsearch coleta os dados da conversa e armazena para a análise feita pelo kibana, que gera gráficos para
avaliação das conversas dos usuários e do boilerplate.
-## Bot
-
+### Bot
Este script foi configurado para construir as imagens genéricas necessárias para execução deste ambiente.
Caso seu projeto utilize este boilerplate e vá realizar uma integração contínua ou similar, é interessante
-criar um repositório para as imagens e substitua os nomes das imagens "lappis/bot", "lappis/coach" e "lappis/botrequirements" pelas
-suas respectivas novas imagens, por exemplo "/bot" em repositório público.
+criar um repositório para as imagens e substitua os nomes das imagens "lappis/bot", e "lappis/botrequirements" pelas suas respectivas novas imagens, por exemplo "/bot" em repositório público.
-### RocketChat
-Para testar o assistente virtual utilizando da plataforma do RocketChat, siga os seguintes comandos para subir os containers em seu computador:
+### Treinamento
+**Atenção**: o comando de treinamento é usado para criar os modelos necessários na conversação do bot para treinar o seu chatbot execute o comando:
```sh
-sudo docker-compose up -d rocketchat
-
-# Caso não vá subir a stack do Analytics
-# aguarde o container do rocketchat subir
-sudo docker-compose up -d bot
-```
-
-Caso queira subir toda a stack e vá utilizar do analytics é necessário substituir a seguinte variável de ambiente no `docker/bot-rocketchat.env` de **False** para **True**.
-```
-# Analytics config
-ENABLE_ANALYTICS=True
-
-# E logo após trocar, subir o container do bot
-sudo docker-compose up -d bot
-```
-
-
-Após esses comandos o RocketChat deve estar disponível na porta 3000 do seu computador. Entre em http://localhost:3000 para acessar. Será pedido que faça login. Por padrão é gerado um usuário admin: username: admin senha: admin. Nas próximas telas apenas clique na opção `Continue` e `Go to your workspace`.
-
-Para configurar o bot no rocketchat e conseguir conversar com ele pelo próprio rocket, acesse o [link](http://github.com/lappis-unb/rasa-ptbr-boilerplate/tree/master/docs/add_bot_rocketchat.md).
-
-
-Opcionalmente, é possível fazer uma configuração para que o assistente virtual inicie a conversa, para isso você deve criar um `trigger`.
-Para criar um `trigger` entre no rocketchat como `admin`, e vá no painel do Livechat na
-seção de Triggers, clique em `New Trigger`. Preencha o Trigger da seguinte forma:
-
-
-```yaml
-Enabled: Yes
-Name: Start Talk
-Description: Start Talk
-Condition: Visitor time on site
- Value: 3
-Action: Send Message
- Value: Impersonate next agent from queue
- Value: Olá!
+sudo make train
```
+### Console
-#### Instalação
-
-Para executar o bot em um site você precisa inserir o seguinte Javascript na sua página
-
-```js
-
-
-
+```sh
+sudo make run-console
```
-**Atenção**: Você precisa alterar a variavel `host` dentro do código acima para a url do site onde estará o seu Rocket.Chat.
-
### 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.
-Antes de seguir adiante. Importante: As variáveis de ambiente são necessárias para o correto funcionamento do bot, por isso não esqueça de exportá-las.
+**Antes de seguir adiante. Importante:** As variáveis de ambiente são necessárias para o correto funcionamento do bot, por isso não esqueça de exportá-las.
Se ainda não tiver treinado seu bot execute antes:
-```sh
-make train
-```
-**Atenção**: o comando "make train" executa um container docker, caso precise de sudo em seu computador
-para execução docker, utilize "sudo make train".
-
Depois execute o bot no telegram:
```sh
sudo docker-compose up bot_telegram
```
-
-### Console
-
-```sh
-make train
-sudo docker-compose run --rm bot make run-console
-```
-
-### Train Online
-
-```
-make train
-sudo docker-compose run --rm coach make train-online
-```
-
-## Analytics
+### Analytics
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.
-#### Setup RabbitMQ
+### Configuração do RabbitMQ
Em primeiro lugar para fazer o setup do analytics é necessário subir o RabiitMQ e suas configurações.
@@ -163,9 +108,7 @@ RABBITMQ_DEFAULT_PASS=admin
Sendo que as configurações de `RABBITMQ_DEFAULT_USER` e `RABBITMQ_DEFAULT_PASS` devem ser as mesmas definidas no serviço do `rabbitmq`.
-
-
-### Execução
+#### 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:
@@ -201,7 +144,7 @@ Ao final é necessário buildar novamente o container do bot.
sudo docker-compose up --build -d bot
```
-### Setup ElasticSearch
+### 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.
@@ -221,12 +164,13 @@ ENVIRONMENT_NAME=localhost
BOT_VERSION=last-commit-hash
```
-### Setup Kibana (Visualização)
+#### 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
```
@@ -282,24 +226,6 @@ docker-compose up -d notebooks
Acesse o notebook em `localhost:8888`
-
-
-## Tutorial para levantar toda a stack
-
-```sh
-sudo docker-compose up -d rocketchat
-
-sudo docker-compose up -d rabbitmq
-sudo docker-compose up -d rabbitmq-consumer
-
-sudo docker-compose up -d elasticsearch
-sudo docker-compose run --rm -v $PWD/analytics:/analytics bot python /analytics/setup_elastic.py
-sudo docker-compose up -d kibana
-
-sudo docker-compose up -d bot
-```
-
-
# Como conseguir ajuda
Parte da documentação técnica do framework da Tais está disponível na
diff --git a/bot/Makefile b/bot/Makefile
index e7d87c9d..74b53dcd 100644
--- a/bot/Makefile
+++ b/bot/Makefile
@@ -1,39 +1,36 @@
run-rocketchat:
make config-bot
- python3 run-rocketchat.py
+ python3 run_rocketchat.py
run-telegram:
- python -m rasa_core.run -d /models/dialogue -u /models/nlu/current --port 5001 --credentials credentials.yml --endpoints endpoints.yml
+ rasa run -m /models/dialogue --port 5001 --credentials credentials.yml \
+ --endpoints endpoints.yml
config-rocket:
python /scripts/bot_config.py
run-console:
- python3 -m rasa_core.run -d /models/dialogue -u /models/nlu/current --debug
+ rasa shell -m /models/dialogue -vv
run-console-broker:
- python3 -m rasa_core.run -d /models/dialogue -u /models/nlu/current --debug --endpoints endpoints.yml
+ rasa shell -m /models/dialogue -vv --endpoints endpoints.yml
run-api:
- python3 -m rasa_core.run -d /models/dialogue -u /models/nlu/current \
- --endpoints endpoints.yml --debug --enable_api
-
-evaluate:
- python3 -m rasa_core.evaluate -d /models/dialogue -s data/core/
+ rasa run -m /models/dialogue -vv --endpoints endpoints.yml --enable_api
run-actions:
- python -m rasa_core_sdk.endpoint --actions actions
+ rasa run actions --actions actions
# Force Makefile to execute e2e command every time
-.PHONY: all e2e clean
-test-dialogue:
- make e2e
-
-e2e:
- python3 -m rasa_core.evaluate default --core /models/dialogue --nlu /models/nlu/current --stories e2e/e2e_stories.md --e2e
-
-test-stories:
- python3 test_stories.py --stories e2e/e2e_stories.md --e2e
-
-config-bot:
- python /scripts/bot_config.py -r ${ROCKETCHAT_URL} -an ${ROCKETCHAT_ADMIN_USERNAME} -ap ${ROCKETCHAT_ADMIN_PASSWORD} -bu ${ROCKETCHAT_BOT_USERNAME} -bp ${ROCKETCHAT_BOT_PASSWORD}
+#.PHONY: all e2e clean
+#test-dialogue:
+# make e2e
+#
+#e2e:
+# python3 -m rasa_core.evaluate default --core /models/dialogue --nlu /models/nlu/current --stories e2e/e2e_stories.md --e2e
+#
+#test-stories:
+# python3 test_stories.py --stories e2e/e2e_stories.md --e2e
+#
+#config-bot:
+# python /scripts/bot_config.py -r ${ROCKETCHAT_URL} -an ${ROCKETCHAT_ADMIN_USERNAME} -ap ${ROCKETCHAT_ADMIN_PASSWORD} -bu ${ROCKETCHAT_BOT_USERNAME} -bp ${ROCKETCHAT_BOT_PASSWORD}
diff --git a/bot/connector.py b/bot/connector.py
index f00f5eaf..3d231b16 100644
--- a/bot/connector.py
+++ b/bot/connector.py
@@ -6,7 +6,7 @@
from flask import Blueprint, request, jsonify, make_response
-from rasa_core.channels.channel import UserMessage, OutputChannel, InputChannel
+from rasa.core.channels.channel import UserMessage, OutputChannel, InputChannel
logger = logging.getLogger(__name__)
diff --git a/bot/credentials.yml b/bot/credentials.yml
index 766a4230..9a204236 100644
--- a/bot/credentials.yml
+++ b/bot/credentials.yml
@@ -1,4 +1,10 @@
-telegram:
- access_token: ${TELEGRAM_TOKEN}
- verify: ${TELEGRAM_BOT_USERNAME}
- webhook_url: ${TELEGRAM_WEBHOOK}
+#telegram:
+# access_token: ${TELEGRAM_TOKEN}
+# verify: ${TELEGRAM_BOT_USERNAME}
+# webhook_url: ${TELEGRAM_WEBHOOK}
+
+#rocketchat:
+# user: ${ROCKETCHAT_BOT_USERNAME}
+# password: ${ROCKETCHAT_BOT_PASSWORD}
+# server_url: ${ROCKETCHAT_URL}
+
diff --git a/bot/run-rocketchat.py b/bot/run_rocketchat.py
similarity index 100%
rename from bot/run-rocketchat.py
rename to bot/run_rocketchat.py
diff --git a/bot/test_stories.py b/bot/test_stories.py
index 9620eb2f..62231fa9 100644
--- a/bot/test_stories.py
+++ b/bot/test_stories.py
@@ -1,18 +1,16 @@
-from rasa_core.test import _generate_trackers, collect_story_predictions
-
-import logging
-from rasa_core import utils
-from rasa_core.utils import AvailableEndpoints
-from rasa_core.run import load_agent
-from rasa_core.interpreter import NaturalLanguageInterpreter
-from collections import namedtuple
+import os
import re
import sys
-import os
+import logging
+import argparse
from os import listdir
from os.path import isfile, join
-import argparse
+from collections import namedtuple
+from rasa.core import utils
+from rasa.core import run
+from rasa.core.interpreter import NaturalLanguageInterpreter
+from rasa.core.test import _generate_trackers, collect_story_predictions
logger = logging.getLogger(__name__)
@@ -90,9 +88,9 @@ def run_evaluation(file_to_evaluate,
max_stories=None,
use_e2e=False):
- _endpoints = AvailableEndpoints.read_endpoints(None)
+ _endpoints = utils.AvailableEndpoints.read_endpoints(None)
_interpreter = NaturalLanguageInterpreter.create(NLU_DIR)
- _agent = load_agent(CORE_DIR,
+ _agent = run.load_agent(CORE_DIR,
interpreter=_interpreter,
endpoints=_endpoints)
diff --git a/coach/Makefile b/coach/Makefile
index 3e82a743..bda43c0d 100644
--- a/coach/Makefile
+++ b/coach/Makefile
@@ -1,16 +1,15 @@
train-nlu:
- python3 -m rasa_nlu.train -c nlu_config.yml --fixed_model_name current \
- --data data/intents/ -o /src_models --project nlu --verbose
+ rasa train nlu -vv \
+ --config nlu_config.yml \
+ --fixed-model-name current \
+ --nlu data/intents/ \
+ --out /src_models
train-core:
- python3 train.py
+ rasa train core -vv \
+ --config core_config.yml \
+ -d domain.yml \
+ -s data/stories/ \
+ --out /src_models/dialogue/
train: train-nlu train-core
-
-train-online:
- python -m rasa_core.train \
- interactive -o models/dialogue \
- -d domain.yml -c policy_config.yml \
- -s data/stories \
- --nlu models/nlu/current/ \
- --endpoints endpoints.yml
diff --git a/coach/core_config.yml b/coach/core_config.yml
new file mode 100644
index 00000000..fadcda73
--- /dev/null
+++ b/coach/core_config.yml
@@ -0,0 +1,24 @@
+policies:
+ - name: MemoizationPolicy
+ - name: KerasPolicy
+ - name: MappingPolicy
+
+# TODO: Update this config file with previous configurations
+#policies:
+# - name: KerasPolicy
+# priority: 5
+# epochs: 20
+# batch_size: 10
+# featurizer:
+# - name: FullDialogueTrackerFeaturizer
+# state_featurizer:
+# - name: LabelTokenizerSingleStateFeaturizer
+# - name: FallbackPolicy
+# nlu_threshold: 0.6
+# core_threshold: 0.6
+# priority: 1
+# - name: MemoizationPolicy
+# priority: 2
+# max_history: 2
+#
+#
diff --git a/coach/policy_config.yml b/coach/policy_config.yml
index b4454b32..17ae1d15 100644
--- a/coach/policy_config.yml
+++ b/coach/policy_config.yml
@@ -15,4 +15,3 @@ policies:
priority: 2
max_history: 2
-
diff --git a/coach/train.py b/coach/train.py
deleted file mode 100644
index 5db72acb..00000000
--- a/coach/train.py
+++ /dev/null
@@ -1,24 +0,0 @@
-import logging
-
-from rasa_core import utils, train
-
-logger = logging.getLogger(__name__)
-
-utils.configure_colored_logging(loglevel='DEBUG')
-
-
-def train_dialogue(domain_file,
- model_path,
- training_folder,
- policy_config):
- return train(domain_file=domain_file,
- stories_file=training_folder,
- output_path=model_path,
- policy_config=policy_config,
- kwargs={'augmentation_factor': 50,
- 'validation_split': 0.2, })
-
-
-if __name__ == "__main__":
- train_dialogue('domain.yml', '/src_models/dialogue',
- 'data/stories/', 'policy_config.yml')
diff --git a/docker-compose.yml b/docker-compose.yml
index 42d32f9f..18b7f00b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,26 +1,8 @@
version: '2'
services:
- # ============================= Rocketchat ==================================
- rocketchat:
- container_name: rocketchat
- image: rocket.chat:0.69.2
- restart: unless-stopped
- env_file:
- - docker/rocketchat.env
- ports:
- - 3000:3000
- depends_on:
- - mongo
-
- mongo:
- image: mongo:3.2
- restart: unless-stopped
- volumes:
- - ./data/db:/data/db
- command: mongod --smallfiles --oplogSize 128
-
# =============================== Coach =================================
+ # All the models are trained by this coach.
coach:
container_name: coach
image: botcoach:latest
@@ -29,16 +11,14 @@ services:
command: sh -c "cp -r /src_models/* /notebook_models"
# ================================= Bot =====================================
+ # Generic Rasa bot, used to run console for example.
bot:
image: lappis/bot:boilerplate
- container_name: bot_rocketchat
+ container_name: bot
build:
context: .
dockerfile: ./docker/bot.Dockerfile
restart: unless-stopped
- command: make run-rocketchat
- env_file:
- - docker/bot-rocketchat.env
ports:
- 5002:5002
depends_on:
@@ -46,8 +26,24 @@ services:
volumes:
- ./bot:/bot
- ./scripts:/scripts
+ command: sh -c "rasa run"
+
+ # ================================= Actions =================================
+ # Rasa middleware used to connect with external APIs.
+ actions:
+ container_name: actions
+ build:
+ context: .
+ dockerfile: ./docker/actions.Dockerfile
+ ports:
+ - 5055:5055
+ volumes:
+ - ./bot/actions:/bot/actions
+ - ./bot/Makefile:/bot/Makefile
+ command: sh -c "make run-actions"
# =============================== Analytics =================================
+ # Analitics ElasticSearch Stack.
elasticsearch:
build:
context: .
@@ -63,6 +59,7 @@ services:
- ./elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- esdata:/usr/share/elasticsearch/data
+ # Visualization layer of Analitics Stack.
kibana:
build:
context: .
@@ -78,6 +75,7 @@ services:
- elasticsearch
# =============================== Broker ====================================
+ # Custom broker to store Rasa tracker data.
rabbitmq:
image: rabbitmq:3-management
restart: unless-stopped
@@ -89,6 +87,7 @@ services:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
+ # Custom broker consumer responsible to store data into ElasticSearch.
rabbitmq-consumer:
build:
context: .
@@ -102,6 +101,7 @@ services:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
+ # TODO: move this env vars to a envfile
# Analytics config
- ELASTICSEARCH_URL=elasticsearch:9200
- ENVIRONMENT_NAME=localhost
@@ -113,6 +113,7 @@ services:
command: python3 /opt/scripts/consume_bot_messages.py
# ============================ Telegram Bot =================================
+ # Specific Rasa bot integrated with Telegram.
bot_telegram:
container_name: bot_telegram
build:
@@ -129,20 +130,51 @@ services:
- ./scripts:/scripts
command: sh -c "make run-telegram"
- # ================================= Actions =================================
- actions:
- container_name: actions
+ # ================================= Bot =====================================
+ # Specific Rasa bot integrated with Rocket.Chat.
+ bot_rocketchat:
+ image: lappis/bot:boilerplate
+ container_name: bot_rocketchat
build:
context: .
- dockerfile: ./docker/actions.Dockerfile
+ dockerfile: ./docker/bot.Dockerfile
+ restart: unless-stopped
+ env_file:
+ - docker/bot-rocketchat.env
ports:
- - 5055:5055
+ - 5002:5002
+ depends_on:
+ - actions
volumes:
- - ./bot/actions:/bot/actions
- - ./bot/Makefile:/bot/Makefile
- command: sh -c "make run-actions"
+ - ./bot:/bot
+ - ./scripts:/scripts
+ command: sh -c "rasa run --credentials credentials.yml --model /models"
+
+ # ============================= Rocketchat ==================================
+ # Rocketchat container instance avaible on localhost:3000.
+ rocketchat:
+ container_name: rocketchat
+ # TODO: Update to 1.x.x version.
+ image: rocket.chat:0.69.2
+ restart: unless-stopped
+ env_file:
+ - docker/rocketchat.env
+ ports:
+ - 3000:3000
+ depends_on:
+ - mongo
+
+ # Rocketchat local database.
+ mongo:
+ image: mongo:3.2
+ restart: unless-stopped
+ volumes:
+ - ./data/db:/data/db
+ command: mongod --smallfiles --oplogSize 128
+
# =============================== Notebooks =================================
+ # Rasa lab to enhance hyperparameters.
notebooks:
container_name: notebooks
build:
@@ -159,8 +191,9 @@ services:
depends_on:
- coach
+# Shared volumes between containers (coach and bot).
volumes:
notebook_models:
esbackup:
esdata:
- driver: local
\ No newline at end of file
+ driver: local
diff --git a/docker/bot-rocketchat.env b/docker/bot-rocketchat.env
index 74f8bab9..80f7ce6a 100644
--- a/docker/bot-rocketchat.env
+++ b/docker/bot-rocketchat.env
@@ -15,6 +15,7 @@ ENVIRONMENT_NAME=localhost
# Last commit hash using this command: git rev-parse HEAD
BOT_VERSION=last-commit-hash
+# TODO: These configs should be in a analytics.env not here.
# Analytics config
ENABLE_ANALYTICS=False
diff --git a/requirements.txt b/requirements.txt
index 8ff16bbf..e963b9af 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,8 +1,5 @@
-rasa-nlu==0.15.0
-rasa-core==0.14.1
-rasa-core-sdk==0.14.0
-sklearn-crfsuite==0.3.6
-nltk==3.3
+rasa==1.2.2
+nltk==3.4.5
rocketchat-py-sdk==0.0.8
elasticsearch==7.0.4
-flake8==3.7.8
+flake8==3.7.8
\ No newline at end of file