Desenvolvendo Chatbots com Watson Conversation

Mas o que é "esse Watson"?

Para falar de Watson vale um breve histórico: o Watson foi lançado em 2011 e em sua primeira aparição no Jeopardy, ganhando de dois super especialistas do jogo. Posteriormente, com muito estudo e desenvolvimento, o Watson tornou-se APIs disponíveis na IBM Cloud.

O Watson Conversation, especificamente, trata-se de uma API para desenvolvimento de Bots, com uma interface simples para que até mesmo uma pessoa que não seja de TI consiga desenvolver e ensinar conteúdo ao bot.

O que faremos aqui?

Feitas as devidas apresentações, neste tutorial faremos um chatbot para pedido de pizza! Nesse caso, mais importante do que o tema do Bot é o entendimento da interface do Watson Conversation. O tutorial ficou um pouco longo pois explicarei cada parte da API, qualquer dúvida só comentar ok?


Criando a API:

Para criar a API você precisa criar uma conta na IBM Cloud a qual te dará acesso à diversos serviços tanto de Watson como de Infra e Plataforma para sempre!! ( não , você não terá que colocar o seu cartão de crédito ao utilizar a camada free).

Pois bem, com a conta criada você terá que ir no catálogo e lá no final da página selecionar o serviço de Conversation:

Ao clicar no Conversation abrirá a página abaixo, no meu caso eu mudei o nome do serviço para esse tutorial, mas essa ação não é necessária.

Após clicar em Create, você será direcionado à página do Conversation. É legal saber que neste caso trabalharemos com o Toolkit mas é possível fazer o desenvolvimento na mão com os SDKs de Watson a utilizando as credenciais da API.

Dentro do toolkit do Watson Conversation faremos nosso primeiro Workspace, que nada mais é que um ambiente de conhecimento específico para o seu bot.

Outro ponto importante é não esquecer de selecionar a língua para português! Deste modo ele utilizará todos os modelos de NLP (Natural Language Processing) próprios da nossa língua.

Pronto, já temos nosso Conversation configurado. Agora teremos que populá-lo com intenções e entidades.

Intenções:

Uma intenção trata-se da ação atrelada às perguntas realizadas pelo usuário. Isto é, o que o usuário procura ao falar algo; e sim, podemos falar a mesma coisa de diversas maneiras, sendo praticamente impossível treinar todas as opções de interação. Deste modo, no Conversation nós damos exemplos de frases e posteriormente o sistema generaliza para identificação de outras intenções comuns.

Neste caso eu adicionei algumas opções de como o usuário entraria em contato com o bot para pedir uma pizza. E caso o usuário falasse : "to querendo uma pizza aí meu" (mesmo que esse exemplo não está no meu treinamento), ele entenderia que a intenção é #pedir_pizza.

Feito isso, você pode adicionar diversas outras intenções como #saudacao, #despedida, #informações… Sempre levando em consideração o que você quer que o seu bot saiba responder. Mas, além da intenção temos que adicionar os complementos desta ação, então vamos às entidades.

Entidades:

Entidades são conhecidas como os complementos de informação. Neste exemplo os complementos serão o sabor da pizza, o tipo de massa, CEP e data de entrega (poderíamos pedir outras informações, mas para este caso, já é mais do que suficiente).

É legal de se saber que o Watson Conversation tem system entities prontas que não precisam ser treinadas. Sendo assim, o primeiro passo é habilitar a @sys-date para garantir que o bot entenda quando você falar que quer uma pizza para amanhã, no natal ou no ano novo

Caso você queira utilizar as outras entidades de sistema é só habilitá-las!

Pois bem, além das entidades de sistema, teremos que criar as outras entidades como abaixo. Notem que ao colocar os exemplos podemos tanto adicionar sinônimos, como no caso de Mussarela — queijo , ou adicionar patterns (Expressões Regulares), como no caso do CEP — [0–9]{5}-[0–9]{3}

Pronto, o nosso bot está populado, mas agora precisamos criar as regras de resposta e o fluxo de conversa.

Diálogo:

Ao criar o diálogo note que duas caixas são criadas, a de "Bem-Vindo"e "Em outros casos".

Essas duas variáveis de sistema (welcome e anything else) são utilizadas para definição da mensagem enviada pelo bot quando:

a. o usuário entra na interface

b. o bot não encontra nenhuma resposta correlacionada ao que o usuário digitou (o famoso "não sei falar sobre isso" ou "sou um robô que está sendo treinado").

Ao clicar na caixa de welcome podemos trocar a mensagem conforme abaixo:

É possível adicionar variações para a mesma resposta de modo sequencial ou randômico

Para testar as alterações basta clicar no símbolo de “chat” à direita da tela:

Esse debug será essencial para ver se o bot está sempre caindo no nó correto do diálogo

Agora precisaremos adicionar um novo nó. Notem que há opção de adicionar nós ou nós filhos. Adicionando um nó ele não terá correlação com o anterior enquanto o nó filho só ocorre se o pai ocorrer primeiro.

Por exemplo: se adicionássemos uma intenção de saudação além da pedir pizza, vejamos o que ocorreria:

No caso à esquerda, não necessariamente o usuário precisa enviar um “oi” para posteriormente pedir uma pizza. Já no caso à direita, o nó de “pedir_pizza” só ocorre após uma saudação.

Isso é extremamente importante para condições que necessitam seguir uma sequência.

Desta forma, para o nosso caso, utilizaremos a primeira opção.

Notem que os nós serão sempre um "if then else"- se ele reconhecer uma condição responda com essa informação, se não passe para o próximo nó.

Até aí simples , Stéfany! Mas como fazemos já que para a pizzaria temos 4 variáveis a serem coletadas: o sabor, o tipo de massa, a data e o CEP de entrega?

Vamos criar o nó com a intenção de pedir_pizza, mas ele é um caso particular no qual utilizaremos os Slots:

Slots são utilizados para coleta de informações ao longo da conversa, de um modo alternativo à formulários. O mais legal é que ao interagir com o bot o usuário não precisa enviar as informações em uma ordem específica pois o slot trata variável por variável.

Para o nosso caso, o bot coletará as informações necessárias mas de um modo inteligente. Vejam a imagem abaixo na qual eu habilito os slots e adiciono uma condição:

  1. Abrir aba de customização de resposta;
  2. Habilitar os slots;

3. Adicionar um slot (uma nova variável);

4. Adicionar uma nova condição. Neste caso por exemplo, eu verifico se o usuário indicou o sabor de pizza com a entidade @sabor;

5. Criação de variável de contexto , que posteriormente pode ser manipulada. Toda variável de contexto no conversation é indicada por um $;

6. Inserir o texto que o bot deve enviar se não reconhecer a variável (neste caso , ele pergunta"Qual sabor vc quer?");

7. Nesta engrenagem abriremos o painel de configurações da variável, mostrado na imagem à direita;

8. Neste painel vemos que adicionei uma informação no "not found". Isto é, se o usuário continuar enviando alguma informação que não corresponda à condição indicada, o bot enviará outra mensagem. Como neste caso "você não informou um sabor válido". Neste mesmo painel, poderia ser adicionada uma informação no “found" no caso em que a variável fosse reconhecida.

Uma vez que esse fluxo foi detalhado, realizei o mesmo processo para todas as variáveis.

Para o CEP em específico, considerando que queremos que o bot guarde literalmente o que for escrito pelo usuário, vamos mudar as características da variável de contexto:

A variável de contexto tem a seguinte configuração: informação_entrega.literal

Por fim, queremos que o bot indique o resumo do pedido. Podemos manipular as variáveis para criar uma resposta:

Ué, não entendi essa inteligência aí?! Pois bem, utilizando os slots, se o usuário digitar “quero uma pizza”, o bot perguntará variável por variável como um atendente. Porém, suponhamos que o usuário digite “me vê uma pizza de queijo com massa fina para amanhã”, o bot só perguntará o CEP de entrega, pois as outras variáveis já foram reconhecidas.

E então…. Vamos testar!

Nestes exemplos, fiz três tipos diferentes de interação com o bot e ele conseguiu reconhecer as variáveis de modo correto!

The end!

Agora com os conceitos mais claros, é só popular o bot com mais conteúdo e me chamar para comer a pizza! (eu gosto de catupiry, hein?!)

Existem outras funcionalidades do conversation, como o Jump, que eu tratarei em próximos tutoriais.

E ah, se quiser acessar essa demo prontinha, veja o link abaixo:

No meu git tem o Código pra importação do Workspace também:

Valeu!