Skip to content

Uso de slots e entidades

Gabriela Guedes edited this page Mar 25, 2019 · 5 revisions

Uso de Slots

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.

Configuração dos Slots

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)

Acessando e alterando valores dos Slots

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']

Definindo o valor de um Slot a partir de uma Custom Action

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"])]

Definindo comportamento do bot de acordo com o Slot

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

Tipos de Slots

  • Text

    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 valor 1 caso esteja preenchido e 0 caso não tenha sido preenchido ainda.

  • Bool

    Utilizado para slots binarios, de Trueou False.

  • Categorical

    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
  • Float

    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
  • List

    Utilizado para slots que armazenamuma lista de valores.

  • Unfeaturized

    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.

    Slots Filling:

    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}
Referências:
Clone this wiki locally