Watson Assistant é o nome dado pela IBM ao seu serviço de chatbot (ou agente virtual que é um nome mais descolado) que possui inteligência cognitiva avançada, utilizando recursos avançados de NLU (Natural Language Understanding), raciocínio automatizado e tecnologias de aprendizado de máquinas.

Você pode encontrar na internet o nome Watson Conversation que é mesma coisa que o Watson Assistant, acontece que a IBM muda frequentemente o nome dos seus produtos e as vezes nós ficamos perdidos. Outro exemplo é a IBM Cloud, que até pouco tempo atras era chamada de BlueMix, nome que você ainda vê muito por ai.

O objetivo deste artigo é descrever passo a passo a criação de um chatbot dentro do ambiente da IBM Cloud, vamos explorar varios recursos que vão te dar uma base para construir e entender o funcionamento de um chatbot.

Fique tranquilo, o watson assistant é gratuito contanto que você respeite alguns limites, então basta criar uma conta na IBM Cloud, instanciar o serviço e …

Workspace

Antes de entrar no Watson Assistant, temos que escolher um workspace. Cada workspace representa um chatbot e uma empresa pode ter N chatbots para atender seus clientes. Não é uma boa pratica utilizar um único chatbot para atender sobre todos os assuntos, no caso de um banco por exemplo, um chatbot poderia tratar exclusivamente sobre empréstimos que já é um assunto bastante extenso e com diversos produtos, existiria um outro chatbot pra falar sobre renegociação de dividas, outro para informações sobre cartão de credito e etc.

O termo chatbot tem sido deixado de lado pelo mercado pois passa uma impressão simples e pouco profissional sobre o recurso. O mais comum hoje é utilizar o termo agente virtual ou assistente virtual. Por hora, vamos continuar chamando de chatbot, pois o termo já está no sangue 🙂

Home

Ao entrar no workspace pela primeira vez somos direcionados a tela de BUILD que é o foco deste artigo sobre o assistant. Nesta interface que vamos adicionar nossas intenções (intents), entidades (entities) e configurar os dialogos (dialog) do chatbot.

Os dois principais conceitos para começarmos a entender o comportamento de um chatbot, são as intents e entities.

Intent (Intenção)

Como o próprio nome diz, são as intenções dos usuários que estão conversando com o chatbot.

Por exemplo, no site de um restaurante eu posso ter as seguintes intenções:

  • Fazer um pedido de delivery.
  • saber que horário o restaurante abre.
  • se possui pratos vegetarianos.

Intents são representadas dentro do watson assitant pela “#” seguido do nome da intent: 

  • #Horario_Atendimento
  • #Pedido_Online
  • #Informacoes_Vegetarianos 

Entity (Entidade)

Para quem conhece orientação a objeto, é um conceito muito similar. Se cidade é uma entidade, “Rio de Janeiro” é um objeto da entidade cidade, “São Paulo” também.

Dias da semana é outro bom exemplo, domingo é um objeto da entidade Dias da semana. Utilizando como exemplo o restaurante, onde o usuário informa no chat a seguinte frase:

Gostaria de saber se vocês abrem no domingo

A intenção do usuário é saber o horário de funcionamento do restaurante, enquanto domingo é um objeto da entidade dia da semana. Com essa informação podemos responder ao usuário precisamente sobre o que ele está buscando.

Entidades são representadas dentro do watson assitant pela “@” seguido do nome da entidade: 

  • @Dia_Semana
  • @Formas_Pagamento

Alem da tela de build, temos as telas de Deploy e Improve que não fazem parte do escopo deste artigo, mas para conhecimento, a primeira possui orientações para instalação do chatbot em canais como facebook e slack e a segunda apresenta estatísticas de uso do chatbot.

Primeiros Passos

Ao iniciar a construção de um chatbot no WA, o primeiro passo é criar as intenções, sendo que algumas dessas intenções são de conhecimentos gerais e já estão pré-configuradas. Para acessa-las clique na opção Content Catalog

Para este artigo, vamos criar um chatbot para atendimento de um restaurante especializado em bolos e que faz entrega por encomenda.

Olhando o catalogo de intenções já existentes, vamos adicionar o grupo Geral, que possui 10 intents já configuradas.
Apos adiciona-las, vamos ver na aba Intents o que foi criado

Temos agora 10 Intents já criadas para o chatbot que são de uso comum, como “terminar uma conversa”, “solicitar o atendimento de um humano”, “cumprimentos”.  Elas são apresentadas em uma lista com as seguintes informações

  • Intent: Nome da intent
  • Description: Descrição da intent
  • Modified: Ultima vez que a intent foi modificada
  • In Conflict: Informa se uma intent está em conflito com outra intent (ambiguidade)
  • Exemplo: Total de exemplos utilizados para treinamento da intent

Não é obrigatário o treinamento de todas essas intents, mas o seu chat torna-se mais humano com a compreensão de contextos fora do seu negocio. É importante que num ambiente de produção, você consiga monitorar quais mensagens enviadas pelos usuários não foram identificadas pelo chatbot, permitindo assim encontrar uma intenção frequente e então adiciona-la ao chatbot.

Antes de criar as nossas próprias intenções referente ao nosso negocio, vamos dar uma olhada na aba Dialog para ver o que já podemos ensinar ao bot para conversar com um cliente do restaurante.

conhecendo a dialog

Apos clicar em Create, vemos um dialogo inicial já criado com dois nodes: Bem-Vindo e Em outros casos. Esses nodes são padrões e é aconselhável utiliza-los em qualquer chatbot criado.

O primeiro é utilizado para dar boas vindas e iniciar uma conversa, enquanto o segundo é utilizado quando o bot não entende nenhuma informação que o usuário passou, respondendo por exemplo “Não entendi o que você me disse, pode ser mais especifico ?”

ao clicar no node Bem-Vindo é aberto um painel a direita:

No topo do painel, podemos ver o titulo do node Bem-vindo. Embaixo do título temos as regras que descreve o comportamento do node:

  • If bot recognizes: neste campo vamos indicar as condições para que caso sejam verdadeiras, o fluxo de conversa entre dentro do node. Neste campo podemos indicar uma intent, uma entity, variáveis de contexto (serão vistas mais a frente) e outros valores possíveis. Neste node, está escrito welcome, que é um padrão do Watson Assistant pra iniciar o chatbot e não será modificado.
  • Then respond with: Olhando de cima para baixo a logica temos Se o bot reconhecer “X“, seguido de Responda com isso. Ou seja, caso a condição para entrar no node seja satisfeita, ele vai responder com o que vem a seguir. Neste node vemos uma unica mensagem Olá. como posso te ajudar.
  • And finally: indica qual ação será feita com a resposta do node. Podemos ir para outro node, ou podemos aguardar que o usuário entre com a próxima mensagem.

clique agora no node Em outros casos:

Neste node temos o mesmo padrão do node Bem-vindo, com uma diferença, no campo Then respond with está selecionada uma saída do tipo “Text”, mas ela possui 3 mensagens. Isso não significa que o bot está respondendo com as 3 mensagens e sim que ele escolherá uma das 3 mensagens baseadas no critério que você achar melhor. Esta técnica é utilizada para fazer com que o bot pareça mais com um humano, pois ele nunca responderá da mesma forma a mesma pergunta.

no final do bloco de resposta do tipo “Text” com as 3 mensagens, temos a seguinte informação:

Response variations are set tosequential. Set torandom|multiline

Por padrão, as 3 mensagens configuradas são do tipo sequencial, ou seja, a primeira resposta do chatbot, para caso ele não compreenda o que o usuário informou será 

Eu não entendi. Você pode tentar reformular a frase.

A segunda vez que ele não compreender a mensagem, como está em sequencia, será: 

Você pode reformular sua afirmação? Eu não estou entendendo.

As outras duas opções são:

  • random: sempre que este node responder, uma das 3 mensagens será escolhida de forma aleatória.
  • multiline: não se aplica a este exemplo, mas neste caso, todas as 3 mensagens serão retornadas na mesma resposta.

Criando seus próprios nodes

Com o conhecimento básico do que é um node de um dialog, vamos agora incluir os nossos próprios nodes utilizando as intenções gerais que incluímos a partir do Content Catalog.

clique nos 3 pontos no canto direito do node Bem-Vindo e selecione a opção Add Node Below

Vamos configurar o node para reconhecer a intent #General_Greetings e #General_Ending

Nós temos no momento um bot capaz de dar boas vindas, responder a cumprimentos do usuário, entender que o usuário está indo embora e também quando ele não entende o que o usuário quer dizer. Para testar o boot é bastante simples, no canto superior direito, clique em Try Out

Para finalizar esta parte, retorne ao catalogo e adicione o grupo Atendimento ao cliente. Inclua um node apos o node “#General_Greetings” para a intent “#Customer_Care_Contact_Us” e informe a mensagem “Você pode entrar em contato conosco pelo telefone 21-9999.9999 de segunda a sexta-feira das 09:00 as 18:00”.

Construindo um chatbot do básico ao intemediario

No primeiro passo iniciamos a construção de um chatbot abordando os principais conceitos. Nesta etapa, vamos dar sequencia a criação do chatbot relacionado ao restaurante. 

O restaurante chama-se Boom Cake e alem do restaurante, eles começaram a trabalhar fazendo entrega de bolos. Nosso chatbot vai responder perguntas sobre o restaurante, o seu menu e também irá cancelar pedidos de bolos que foram encomendados previamente.

Vamos começar criando as intents para identificar: Informações do Restaurante, Detalhes do Menu e Cancelamento de Pedido

Informações do Restaurante

Acesse a aba INTENT e clique em Add Intent. Crie a intent com o nome #sobre_restaurante e adicione as seguintes frases:

  • Me fale sobre o restaurante
  • Eu quero saber sobre voces
  • Quem são os donos do restaurante e qual a sua filosofia?
  • Qual a sua história ?
  • Qual a origem dos seus produtos ?
  • Quem é o seu cheff principal?
  • Quantas filiais vocês possuem?
  • Em quais endereços posso encontrar vocês?
  • vocês fazem buffet em casa ou recebem eventos no restaurante ?vocês fazem entrega ?
  • vocês estão abertos para o café da manhã?

Acesse a aba DIALOG e adicione um node que reconheça a INTENT recém criada abaixo do node #General_Greetings. Para este node, insira o seguinte texto

Boom Cake é uma criação de Gloria e Fernando Oliveira. O que começou em 2004 como um food truck que participava de eventos pela cidade, cresceu e tornou-se um promissor restaurante. Hoje nos temos um lindo e aconchegante espaço no charmoso bairro do Leblon, Rio de Janeiro. A cozinha cresceu, mas o cheff Rodrigo Almeira permanece conosco desde o inicio. Agora com a companhia de uma equipe ainda maior, segue com a mesma filosofia de sucesso desde o nosso inicio: alimentos frescos feitos com produtores locais de forma inovadora e deliciosa.Junte-se a nos para um almoço ou jantar 7 dias na semana. Ou faça o pedido de um de nossos deliciosos bolos em nossa confeitaria. 

Vamos adicionar também uma imagem apos o texto. Clique em Add response Type abaixo do texto que você incluiu na resposta do node, para criar mais um bloco de resposta. Selecione image e informe a seguinte url:

https://www.ibmlearningcenter.com/wp-content/uploads/2018/02/IBM-Learning-Center-Food4.jpg

apos adicionar a imagem, clique no botão Move no canto superior direito do bloco de resposta para mover a resposta para cima do texto informado anteriormente. Agora vamos testar!

Com uma unica intent respondemos uma seria de perguntas sobre o restaurante, como filosofia, historia, quem são os donos, quem é o cheff e etc. Esta abordagem é bastante indicada para esse tipo de questionamento, pois facilita o gerenciamento, responde as perguntas do usuário e leva informações extras que sejam interessante para o marketing e divulgação da marca, como storytelling por exemplo.

Menu do Restaurante

Uma pergunta chave para potenciais clientes de restaurante é informação sobre o menu. O Boom Cake muda o cardápio diariamente e alem do menu padrão, ele possui menus exclusivo para vegetarianos e encomenda de bolos.

Quando o usuário pergunta sobre o menu, o bot precisa entender sobre qual menu o usuário está fazendo referencia e exibir um link para o menu do site que é alterado diariamente.

Nunca inclua informações hard-coded numa dialog se esta informação muda regularmente.

vamos criar a intent #menu e adicionar as seguintes frases:

  • eu gostaria de ver o menu
  • o que você tem para comer?
  • existe algum prato especial hoje?
  • onde eu posso encontrar informações sobre a sua comida ?
  • quais pratos vocês possuem ?
  • quais as opções de aperitivos ?
  • vocês servem sobremesa?
  • qual o a variação de preços entre os seus pratos ?
  • quanto custa um prato de uma refeição comum em seu restaurante ?
  • me diga quais opções tem de entrada

criada a intent, vamos criar um node abaixo do node #sobre_restaurante. Este novo node vai reconhecer a intent #menu e exibir a seguinte resposta:

em função do nosso comprometimento de oferecer aos nossos clientes, somente alimentos locais e frescos, o nosso menu muda diariamente para acomodar o que compramos de nossos produtores na manhã. Você pode encontrar o nosso menu do dia em nosso site.

Alem da resposta com o texto, vamos retornar uma segunda resposta que é uma opção para o usuário escolher entre os 3 menus disponíveis. Para isso clicamos em Add Response Type como fizemos para adicionar a imagem na intent anterior, mas selecionamos neste caso a opção Option.

Se você for testar, verá que a a intent já é reconhecida e as opções são apresentadas, porem não temos a logica ainda para saber para onde iremos direcionar. Abaixo vamos criar nossa primeira entity e finalizar o node do menu.

Clique na aba Entity e em seguida Add entity

Na imagem acima, criamos entity @menu com os seguintes objetos e seus sinônimos:

  • padrão: padrão, menu padrão, menu do dia, cardápio
  • vegetariano: vegano, vegan, sem carnes, diet
  • bolo: menu de bolo, confeitaria, sobremesa, doces.

Agora vamos voltar a dialog e criar os primeiros nodes filhos (Child Nodes). Clique no ícone de opções do node #menu e selecione Add child node.

Na condição de entrada do node, informe a entidade seguida de “:” e o valor da entidade desejado. Quando fazemos isso, dizemos que esse node será acionado quando for identificada a entidade “@menu” e ela for do tipo padrao.

No campo de resposta, insira o texto abaixo:

para ver o nosso cardápio padrão, clique <a href=”https://www.example.com/menu.html” target=”blank”>aqui</a> ou acesse o menu <b>Menu do dia</b> em nosso site.

Repare que dentro do texto temos um código HTML, o WA entende este formato e você pode formatar uma saída de texto utilizando este recurso.

Agora fazemos o mesmo para o menu vegetariano e de bolos. Para facilitar a criação, selecione a opção Duplicate do node @menu:padrao. Segue abaixo o texto para os dois nodes:

para ver o nosso cardápio vegetariano, clique <a href=”https://www.example.com/vegetarian-menu.html” target=”blank”>aqui</a> ou acesse o menu <b>Para Vegetarianos</b> em nosso site.

para ver o nosso cardápio para encomenda de bolos, clique <a href=”https://www.example.com/menu.html” target=”blank”>aqui</a> ou acesse o menu <b>Bolos para encomenda</b> em nosso site.podemos testar:

Direção de leitura dos nodes

Existe uma sequencia que o bot verifica pelas condições de entrada em cada node, ela possui uma estrutura TOP-DOWN, ou seja, quando uma mensagem é enviada, o bot começá verificando pelo primeiro node de cima para baixo até que uma condição seja encontrada. 

No exemplo acima, seria é uma boa pratica mover o menu padrão abaixo dos outros dois menus, pois ele com certeza é utilizado mais frequentemente por ter uma característica mais generalista que os demais.

Logo os nodes mais especializados devem estar acima para garantir uma melhor assertividade do fluxo de diálogos.

para mover um node, selecione a opção Move do menu direito do node e clique no node desejado, seguido da posição que deseja em relação ao node que foi clicado:

Quando a condição de um node é verdadeira, o bot entra no node e verifica tambem se existem child nodes. Caso existam, eles são avaliados da mesma forma TOP-DOWN que os nodes pais

Encomendas de Bolos

Os clientes do restaurante podem fazer encomendas de bolo pessoalmente, pelo telefone ou pelo site. No chat, é possível cancelar essas encomendas através de um numero de pedido. Para isso, precisamos de uma intent para identificar que o cliente quer cancelar uma encomenda e uma entity que identifique um numero de pedido.

vamos criar a entity para identificar o numero de pedido, sendo que o numero de pedido possui um nomenclatura de 2 caracteres em caixa alta seguido de 5 caracteres numéricos. Exemplo: YR34663

A entity deve ser criada de forma similar ao @menu, porem ao invés de informar os sinônimos, vamos selecionar a opção Pattern e adicionar a expressão regular “[A-Z]{2}\d{5}”

para a Intent, vamos criar uma chamada #cancelar_pedido com as seguintes frases:

  • eu quero cancelar meu pedido
  • eu quero cancelar a encomenda do meu bolo
  • eu preciso cancelar um pedido que acabei de fazer
  • posso cancelar meu pedido?
  • eu gostaria de cancelar meu pedido
  • tive um problema, eu preciso cancelar minha encomenda.
  • por favor cancele o bolo de aniversario que eu encomendei semana passada
  • o tema da festa mudou, nao precisamos mais do bolo que foi encomendado
  • o pedido que eu fiz preciso cancelar
  • preciso cancelar a encomenda

como não queremos que nosso cliente cancele o seu bolo sem querer, vamos precisar de uma segunda intent de confirmação. Esta intent deve se chamar #sim e ter as seguintes frases:

  • Sim
  • Correto
  • Por favor faça
  • voce entendeu corretamente
  • por favor, faça isso
  • está correto
  • é isso ai
  • yes
  • yeah
  • ok!
  • sim, vamos em frente

Vamos criar a dialog que reconhece a intent #cancelamento_pedido embaixo do node do menu. Agora existe um conceito importante, o usuário pode requisitar o cancelamento e na mesma frase já informar o numero do pedido, não faz sentido então questiona-lo novamente sobre o número já informado. Para tratar esse caso, vamos precisar utilizar o editor de contexto.

Em then respond with, clique na opção a direita e selecione Open context editor.

dentro do editor de contexto, vamos criar a variavel $numero_pedido

assim como a intent possui “#” no inicio do seu nome e a entidade “@”. As variáveis de contexto possuem um “$”

o campo de valor deve receber o seguinte: <? @numero_pedido.literal ?>
o comando acima está no formato SpEL expression (Spring Expression Language) e esta pegando o valor da entidade (literal) que foi encontrado na mensagem e setando para a variável de contexto $numero_pedido

inclua tambem no node, a resposta

se a data de entrega for superior a 48h a partir de agora, você pode cancelar o seu pedido.

Agora precisamos criar um node filho que peça o numero do pedido, caso não tenha sido informado e que peça também uma confirmação.

Nomeie o node com o titulo Perguntar sobre o numero de pedido e informe true em If bot recognizes, que significa que sempre entrará neste node. Na parte de resposta, preencha com Qual o número do pedido?

Vamos então criar outro child node embaixo da pergunta sobre o numero do pedido. Este child node vai receber a mesma variável de contexto de $numero_pedido. Na resposta informe Ok. o pedido $numero_pedido foi cancelado.

agora precisamos de um outro node para tratar pedidos fora do formato esperado. Este node deve estar embaixo do node Perguntar sobre o numero de pedido e depois do node @numero_pedido. Este node deve exibir a mensagem:

eu preciso de um número de pedido válido para cancelar o pedido. Caso não saiba o número, entre em contato no número 2564-8977

Agora vamos criar o node que identifica que o numero do pedido ja foi informado e vamos enviar ao usuário uma mensagem de confirmação. 
O node deve ser filho de #cancelar_pedido, reconhecer @numero_pedido e retornar a mensagem

somente para confirmar, você quer cancelar o numero do pedido $numero_pedido ?

Vamos criar abaixo o node que identifica a intent #sim que confirma o numero pedido informado pelo usuário.

Deve ser criado um node filho do “numero informado” que reconheça a Intent #sim e responda ok, o pedido $numero_pedido foi cancelado!.

Um outro node será criado no mesmo nível da intent #sim, para os casos de não confirmação. Estes casos devem direcionar a resposta do node para o node Perguntar sobre o numero de pedido

o resultado final deve ficar igual a imagem abaixo:

o node da intent #cancelar_pedido deve pular o input do usuário para checar diretamente os child notes.

caso você decida você testar agora, vera que o fluxo esta funcionando, porem o usuário pode ficar confuso sobre como digitar o numero do pedido, para isso vamos criar mais um node embaixo da pergunta sobre o numero do pedido. Neste node, a condição de reconhecimento deve ser: 

input.text.find(‘\d’)

Esta é uma SpEL que indica se encontrar um ou mais números na mensagem, deve ativar o node.

no próximo node vamos utilizar pela primeira vez a opção de múltiplas respostas. Crie um child node a partir do node recém criado e informe true na condição de gatilho.

Para utilizar varias respostas para o mesmo node, é necessário clicar em Customize no menu superior a direita e ligar a opção Multiple Responses

com a opção ligada, vamos configurar 2 saidas para o node de acordo com os gatilhos que forem identificados.

com isso terminamos este tutorial de construção do chatbot. No próximo post sobre o watson assistant, vamos entrar na parte avançada e mostrar como você pode integrar os seus nodes com sua própria API para prover conteúdo a dialog.

Tópicos Adicionais

long-tail questions

Um item importante na construção de um chatbot são as long-tail questions, que são perguntas que o usuário pode fazer ao bot e que ele não está preparado para responder.

Esse tipo de pergunta pode ser respondida utilizando outros recursos de machine learning e como estamos falando de produto IBM, o Watson Discovery é uma excelente ferramenta para integrar ao seu chatbot e resolve bem esse tipo de situação.

Um bom exemplo seria um chatbot de uma montadora de veículos, o chatbot não vai ter configurado todo o manual de todos os modelos de veículos para responder as perguntas do usuários, nestes casos, os manuais podem ser carregados no watson discovery que integrado ao chatbot, irá responder as perguntas do usuário.

Related Posts

IBM Cloud além do Watson – Parte 1
WKS – Watson Knowledge Studio
Text-to-Speech SpringBoot Web Service com Watson
× Como posso te ajudar?