Neste quarto post da série sobre o Conversation irei falar sobre como criar loops dentro dos diálogos do Conversation. Aproveitarei também para dar alguns exemplos de onde/como esses loops podem ser usados, e talvez ajudar você a pensar em outros casos de uso!

Introdução

Em qualquer linguagem de programação os loops são sempre muito úteis. Há sempre situações onde é necessário repetir, por um determinado número de vezes, o mesmo trecho de código, algumas vezes variando determinadas varáveis.

Com o Conversation não é diferente. Imagine as seguintes situações:

  1. Seu usuário cai em uma intenção ambígua (por exemplo consulta_saldo_conta) e o Conversation retorna para ele perguntando se ele deseja consultar o saldo da conta corrente ou da poupança. No diálogo há nós com a condição de cada entidade (conta corrente/conta poupança) para capturar a desambiguação e seguir o fluxo. Porém o que acontece caso nenhuma das entidades seja capturada na resposta do usuário? Não seria legal poder perguntar novamente? E se o usuário errar mais do que um certo número de vezes, não seria legal conseguir sair do loop?
  2. Digamos que o Conversation retorne para o usuário a intenção incorreta. Não seria legal poder antes confirmar com ele se ele deseja mesmo aquela intenção e caso contrário oferecer uma das outras intenções reconhecidas?

Para implementar o loop pode ser necessário utilizar uma variável de contagem, que chamaremos aqui de contador. Iremos também guardá-la dentro to objeto context (lembrem-se que o context fica sempre indo e vindo nas chamadas para o Conversation, permitindo assim saber, ao retornar ao Conversation, em qual posição do loop estavamos).

Neste post irei explicar como implementar o loop descrito na situação 1.

Loop de desambiguação

Desenvolvimento

Iremos continuar de onde paramos no post Introdução ao Serviço Watson Conversation. Nele tínhamos o seguinte diálogo:

Iremos então adicionar um nó abaixo do nó com a condição @tipo_conta(conta poupança). Este nó será responsável por capturar quando o usuário não informar nenhuma das duas entidades esperadas. Crie então o novo nó com a condição anything_else. Esta condição é sempre avaliada como verdadeira e utilizamos ela para representar a última opção do conversation para um determinado fluxo, a fim de não deixar o usuário sem nenhuma resposta. Na resposta deste nó coloque “Desculpe, não entendi. me informe novamente a qual tipo de conta deseja consultar o saldo, conta corrente ou conta poupança?”.

Este nó é responsável por realizar uma nova pergunta para o usuário (questionando novamente o tipo de conta) e aguardar uma nova resposta do usuário. Porém assim que o usuário responder, devemos retornar ao primeiro nó da desambiguação (aquele com a condição @tipo_conta:(conta corrente) para verificarmos novamente se a entidade desta vez foi encontrada. Para isto adicione um novo nó a direita do nó com a condição anything_else. Este nó será apenas um nó de passagem, sendo responsável por redirecionar ao primeiro nó da desambiguação. Por isto, coloque a condição dele como true (indicando que ele sempre deve entrar neste nó). Não há necessidade de colocar nenhuma resposta.

Em seguida precisamos redirecionar o fluxo para o primeiro nó da desambiguação. Para isto, dentro da caixa do nó com condição true, clique no ícone

(ícone que indica um Jump to). Em seguida você deve selecionar o nó de destino do Jump to. Selecione o nó inicial da desambiguação, aquele com a condição @tipo_conta:(conta corrente), e em seguida clique em Go to condition, que diz que a condição do nó deve ser avaliada novamente (enquanto que Go to response leva diretamente para a resposta, sem avaliar a condição, o que não é a nossa intenção).

Desta forma, agora temos um loop. Sempre que nenhuma das entidades for reconhecida ele irá perguntar novamente. Porém, do jeito que está, se o usuário nunca inserir nenhuma das entidades, o fluxo ficará preso ai para sempre. Podemos então utilizar uma variável de contagem para saber se devemos tentar novamente ou se devemos sair do fluxo.

Clique no nó com a condição #consulta_saldo_conta. Na tela de edição do nó clique em

e em seguida em JSON (isto ativa a tela de edição avançada do nó, onde será possível manipular o context).

Deixe o JSON do nó igual abaixo:

Perceba que adicionamos o objeto context, e dentro dele uma varíavel chamada contador, que possui o valor inicial 0. Precisamos em seguida incrementar esse contador. Clique no nó com condição anything_else, abaixo do nó com condição @tipo_conta:(conta poupança). No campo de resposta, adicione no final a seguinte frase “Você errou <? context.contador ?> vez(es).”, a fim de mostrar quantas vezes o usuário ja errou. O <? ?> é necessário para acessar o valor da variável. Em seguida, acesse o modo avançado de edição do nó, deixando-o igual abaixo:

O código “contador”: “<? context.contador + 1 ?>” representa um incremento no contador. Sendo assim, a cada vez que o fluxo passar por este nó, o contador será incrementado. Nos falta então agora definir um critério de saída, ou seja, verificar se o valor do contador é superior ou igual a determinado limite, e em caso positivo, tirar o usuário deste fluxo. Para isto vamos adicionar um novo nó abaixo do nó com condição @tipo_conta:(conta poupança). Na condição deste nó coloque “context.contador >= 2” e na resposta coloque “Desculpe, você errou mais de duas vezes. Tente novamente”. Desta forma caso o usuário erre mais que duas vezes ele irá sair do fluxo.

Desta forma construimos nosso loop com critério de parada! Vamos então testá-lo.

Testando

Você pode realizar o teste do loop tanto pela tela lateral de testes quanto pelo API Explorer (explicado no post Testando o Conversation pelo API Explorer). A vantagem de testar pelo API Explorer é que você pode ver as variáveis de contexto a cada iteração. Por questão de conveniência, irei realizar o teste utilizando o painel lateral.

Inicie um novo chat clicando no botão

no canto superior direito da tela. Siga o fluxo contido na imagem abaixo e perceba o resultado.

O que fazer em seguida

Para continuar o aprendizado, sugiro praticar a metodologia de loops descrita neste post.

Aproveite para consultar a referência do Conversation para ver quais outras operações é possível fazer dentro do modo avançado de edição do nó.

E deixo aqui um desafio para você. Do jeito que o diálogo foi construído, caso na primeira frase (aquela que o leva a cair na intenção consulta_saldo_conta) o usuário já tenha escrito o nome da entidade, o fluxo irá perguntar novamente. Veja o exemplo abaixo:

Perceba que o usuário precisa repetir o valor da entidade neste caso. Isto pode atrapalhar bastante a experiência do usuário. Portanto, como podemos resolver isso???

Dica: utilize o Jump to a seu favor!

Utilize o espaço de comentários abaixo para dúvidas e sugestões!

Posts relacionados

Introdução ao Serviço Watson Conversation.

Testando o Conversation pelo API Explorer

Parâmetros de request/response da conversa do Conversation

Originally published at franklinlindemberg.wordpress.com on April 9, 2017.

Senior Software Engineer @ LogMeIn

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store