-
Notifications
You must be signed in to change notification settings - Fork 42
Uso de slots e entidades
Os Slots funcionam como a memória do Bot. As informações dos slots serão armazenadas na forma de pares de chaves-valores.
Os Slots podem ou não influenciar na tomada de decisões do bot, de acordo com o seu tipo.
O tipo text pode ser utilizado para coleta de informações diretas do usuário, por exemplo para pegar o nome de uma cidade, de um local, o CPF do usuário, etc. Para este tipo, durante o fluxo de conversa, só é possível saber quando o slot foi preenchido ou não.
Os tipos categorical ou bool devem ser usado quando o valor em questão é importante para tomada de decisões.
Em casos onde se quer apenas armazenar dados mas não se espera que o slot afete o fluxo de conversação, deve-se utilizar o tipo unfeaturized.
Para utilizar um slot é preciso incluí-lo no arquivo domain.yml
, dentro de uma tag de slots:
slots:
pronac:
type: unfeaturized
Dentro das intents deve-se definir exemplos de entities, que terão seu valores preenchidos de acordo com o slot correspondente:
## intent:pronac
- meu pronac é [1234567](pronac)
- [98765](pronac)
- [098778](pronac)
- [97656](pronac)
- [1234567](pronac)
- o número do pronac é [6556789](pronac)
- o pronac do meu projeto é [093596](pronac)
- meu numero de pronac é [9104835](pronac)
- o pronac é [92749502](pronac)
- me fale sobre o projeto do pronac [0927493](pronac)
- quero saber do projeto [0439582](pronac)
- me fale sobre o projeto do pronac [029385](pronac)
Quando o slot é preeenchido, seu valor pode ser acessado dentro das Actions através do tracker. Ex:
class ActionInformacaoProjeto(Action):
def name(self):
return "informacao_projeto"
def run(self, dispatcher, tracker, domain):
pronac = tracker.current_slot_values()['pronac']
from rasa_core_sdk.actions import Action
from rasa_core_sdk.events import SlotSet
import requests
class ActionTipoDeProjeto(Action):
def name(self):
return "tipo_de_projeto"
## Descobrir tipo de projeto
def run(self, dispatcher, tracker, domain):
url = "http://projetos.com"
data = requests.get(url).json
return [SlotSet("tipo_de_projeto", data["tipo_de_projeto"])]
Uma vez que os valores possíveis para um slot foram definidos no domain
, deve-se escrever exemplos de caminhos a serem seguidos de acordo com o valor captado. Ex:
# story_01
* cumprimentar
- action_tipo_de_projeto
- slot{"tipo_de_projeto" : "tipo_1"}
- utter_projeto_tipo_1
# story_02
* cumprimentar
- action_tipo_de_projeto
- slot{"tipo_de_projeto" : "tipo_2"}
- utter_projeto_tipo_2
-
Slots utilizados para preferências do usuário, são necessários serem preenchidos para seguir pelo fluxo correto.
rasa_core.slots.Slot
receberá o valor1
caso esteja preenchido e0
caso não tenha sido preenchido ainda. -
Utilizado para slots binarios, de
True
ouFalse
. -
Slots em que é atribuído um valor de uma lista de opções de valores pré definida. Veja o exemplo:
slots: risk_level: type: categorical values: - low - medium - high
-
Utilizado para valores continuos. Pode ser estabelecido um valor minimo e máximo, onde, caso tente preencher o slot com um valor que ultrapassa esses estabelecidos,será preenchido com o valor ultrapassado. Exemplo:
slots: temperature: type: float min_value: -100.0 max_value: 100.0
-
Utilizado para slots que armazenamuma lista de valores.
-
Slots que não devem afetar o fluxo de conversa devem receber esse valor. Seu valor não influencia a previsão da proxima ação a ser chamada.
Uma forma comum de conversação de chatbot é ir coletando informações do usuário, isso é chamado de slot filling. Para coletar várias informações seguidas no Rasa é recomendado o uso de FormAction. Para usar forms é necessário incluir FormPolicy no arquivo de configuração e criar uma sessão de forms no domain:
forms: - my_form ...
Para preencher os slots é necessário criar stories da seguinte forma:
## happy path * request_restaurant - restaurant_form - form{"name": "restaurant_form"} - form{"name": null}
O FormAction faz com que o bot somente solicite informações ainda não obtidas. Os slots devem ser do tipo unfeaturized.
Para a utilização do FormAction também é necessária a criação de uma classe com o nome do formulário, essa classe deverá ter três metodos, name, required_slots e submit.
- name: Retorna o nome para indentificação do form;
- required_slots: Retorna uma lista de slots do form;
- submit: Função para o que deve ser feito ao final do formulario, depois de todos os dados serem preenchidos.
Veja o exemplo abaixo:
class RestaurantForm(FormAction): """Example of a custom form action""" def name(self): # type: () -> Text """Unique identifier of the form""" return "restaurant_form" @staticmethod def required_slots(tracker): # type: () -> List[Text] """A list of required slots that the form has to fill""" return ["cuisine", "num_people", "outdoor_seating", "preferences", "feedback"] def submit(self, dispatcher, tracker, domain): # type: (CollectingDispatcher, Tracker, Dict[Text, Any]) -> List[Dict] """Define what the form has to do after all required slots are filled""" # utter submit template dispatcher.utter_template('utter_submit', tracker) return []
Para realizar validações do slot preenchido é necessário sobreescrever o metodo
validate()
com as checagens necessárias.Outra forma de tratar de erros é pelas stories, indentificando o comportamento do usuário. Por exemplo, se os usuários conversarem com o bot durante o preenchimento do formulario:
## chitchat * request_restaurant - restaurant_form - form{"name": "restaurant_form"} * chitchat - utter_chitchat - restaurant_form - form{"name": null}
Ou caso o usuário queira parar o preenchimento do formulario:
## chitchat * request_restaurant - restaurant_form - form{"name": "restaurant_form"} * stop - utter_ask_continue * deny - action_deactivate_form - form{"name": null}
- Conteúdo atual
- Novos tópicos para inserir no futuro
- Intents classificados errado
- Sinônimos de tópicos existentes
- Tópicos complicados para avaliar
- Sugestões de Fluxo
- intents_depreciadas
- utters_depreciadas
- Estudo sobre ferramentas de bots
- Estudo sobre melhores práticas de bots
- Estudo sobre pipeline do RASA
- Estudo sobre intents eficientes
- Estudo sobre refinamento da Taís
- Estudo de ferramentas de edição de conteúdo
- Estudo de Slots e Entidades
- Estudo de teste automatizado
- Estudo de Custom Actions
- Estudo de Interação
- Estudo de Métricas para Bots
- Estudo de Embedding Policy