Tecnologia

Formatos de dados necessários para treinar seu chatbot - Parte II

17/08/20 por Simon Scudder

Este artigo é uma continuação do que falamos no último texto sobre os formatos necessários para treinar seu chatbot, que você pode ler clicando aqui. Vamos seguir vendo os formatos como são guardados os dados dentro dos arquivos do RASA. Vamos ver também como colocamos as respostas que o chatbot dará durante uma conversa com o usuário e quais as opções que temos para respostas. Falaremos também sobre os arquivos de NLU, que são os exemplos de frases em que o chatbot irá interpretar e descobrir a intenção do usuário.

Vamos lá?

As respostas do chatbot ficam dentro da seção de respostas do arquivo domain.yml. Cada resposta pode ser simplesmente uma frase, ou uma frase entre algumas opções de frase. Além disso, podemos mostrar botões para o usuário que servem como atalhos para frases do usuário. Caso ele clique em um botão, seria como se ele tivesse digitado um texto. Cada frase-resposta ou grupo de frases-resposta possui um nome que, como vimos anteriormente, começa com "utter". Um exemplo para uma saudação seria:

responses:

  utter_saudacao:

    - text: "Olá, como vai?"

Neste caso, se numa estória o chatbot ver que deve chamar o "utter_saudacao", aparece para o usuário a frase "Olá, como vai?". É muito importante você deixar as linhas da forma que estão no exemplo com dois espaços antes do nome do utter, que é seguido de dois pontos, e o texto começa com 4 espaços, um hífen e um espaço, seguido de text e dois pontos. Em alguns casos é possível não usar aspas, mas para evitar erros futuros, sempre coloque o texto entre aspas duplas. Por exemplo, se você não colocar aspas duplas e tiver um hífen na frase, vai dar erro.

Uma coisa que pode tornar as conversas mais parecidas com as conversas de um atendente humano, é dar variações, para que o chatbot não responda sempre com a mesma frase. Para fazer isto, basta colocar várias frases diferentes como no exemplo abaixo:

responses:

  utter_saudacao:

    - text: "Olá, como vai?"

    - text: "E aí, como estão as coisas?"

    - text: "Opa, como você está hoje?"

Agora, se o chatbot achar que deve mostrar o utter_saudacao, irá escolher uma das opções de forma aleatória. Ou seja, para cada conversa, você nunca sabe qual opção o chatbot vai escolher.

Entre um utter e outro, devemos deixar sempre uma linha em branco, e só precisamos da linha "responses:" uma única vez. Lembre-se de que todos os nomes das respostas devem aparecer na seção de ações do arquivo também.

Outro detalhe importante: se você quiser alterar uma resposta, uma estória ou os dados de exemplo, você precisará treinar novamente seu modelo para ver as alterações surtirem efeito. Também podemos dar uma opção para o usuário escolher através de botões:

responses:

  utter_saudacao:

    - text: "como você está hoje?"

      buttons:

      - title: "Estou feliz"

        payload: "feliz"

      - title: "Estou triste"

        payload: "triste"

Do jeito que estão definidos, irá aparecer a frase "como você está hoje?", seguido de dois botões, um escrito "estou feliz" e o outro escrito "estou triste". Se o usuário clicar em cima de um botão, será como se ele tivesse digitado "feliz" ou "triste". Se quisermos tratar o texto como se tivesse sido digitado, podemos deixar dessa forma, mas também podemos "forçar" uma intenção colocando uma barra e o nome da intenção. Veremos mais sobre intenções e daremos um  exemplo disso quando formos falar de NLU.

As informações sobre a sessão o usuário 

Depois de colocarmos todas as respostas do chatbot, passaremos para as informações sobre a sessão do usuário. A configuração padrão é a seguinte:

session_config:

  session_expiration_time: 60

  carry_over_slots_to_new_session: true

A primeira opção session_expiration_time informa quantos minutos uma conversa fica ativa se o usuário parar de enviar frases. No caso, após uma hora sem mandar nenhuma frase para o chabot é entendido que o usuário foi embora. Se ele voltar a fazer perguntas, é como se fosse uma nova conversa.

A opção carry_over_slots_to_new_session determina se as informações contidas nos slots permanecem de uma sessão para outra. No exemplo padrão, os valores contidos nos slots permanecem.

NLU - Compreensão de Linguagem Natural

Vamos para os arquivos NLU, que é onde os exemplos de frases são definidas. O formato do arquivo é um pouco diferente, pois usa atualmente a sintaxe markdown. Uma intenção começa com duas hashtags, e em seguida seu tipo, e o seu nome. Todas as intenções começam então com ## intent: <nome da intenção>. Novamente, o nome da intenção não pode conter acentos, símbolos ou espaços (somente o sublinhado), e não pode começar com um número.

## intent: saudacao

- oi

- boa noite

- boa tarde

- bom dia

- oie

- oieeee

- e aí cara?

- bão

Veja que este não é um exemplo muito bom de intenção, pq todos os exemplos possuem apenas poucas palavras. Uma frase exemplo não precisa ser tão curta. O importante no momento é colocar variações para "ensinar" o chatbot o que é uma saudação. O chatbot pode analisar a gramática e sinônimos de palavras e entender que "tarde!" é um tipo de saudação, mesmo que não tenha explicitamente um exemplo desses.

Quanto mais exemplos a gente colocar, melhor será a interpretação da intenção por parte do chatbot, e é comum a gente colocar 10, 20 ou até mais exemplos. O trabalho de melhoria dos diálogos do chatbot é um trabalho contínuo e deve ser analisado conversas com usuários para ver onde é necessário colocar mais exemplos alterar o fluxo das conversas para melhorar a experiência de usuários no futuro.

Podemos colocar intenções de onde tiramos informações (as entidades!). Para isto, devemos colocar exemplos de informações nas frase exemplo. Por exemplo, se quisermos informar uma cor, podemos usar algo assim:

## intent: define_cor

- a cor é [verde](cor)

- prefiro [azul](cor)

- pode ser [vermelho](cor)

- vou escolher o [amarelo](cor)

- cor [laranja](cor)

Com estes exemplos, caso a pessoa digite "a cor é" e qualquer dos exemplos de cor, o chatbot irá extrair a entidade "cor", e salvar num slot do mesmo nome. Posso escrever "a cor é laranja", "cor azul", "prefiro verde", que o chatbot irá entender a intenção "define_cor", e preencher o slot "cor" que o que o usuário digitou. No próximo artigo vamos falar sobre os arquivos de estórias!

Gostou deste artigo? Veja outros insights no nosso blog ou fale com um dos especialistas da Viceri.


Tags: RASA, chatbot, NLU