Configurações do nó

Para realizar ajustes e configurações do nó, basta clicar em cima do que deseja ajustar e uma tela se expandirá à direita.

Nome que identifica o nó

Para alterar, basta clicar em cima do nome e reescrever. Neste mesmo local, clicando no ícone da caixinha de mensagem, é possível adicionar um comentário no nó.

Ponto de entrada

Direcionamento acionado por meio de uma regra condicional. Sua configuração pode incluir variáveis, intenções, entidades e palavras-chave que são associadas ao nó a ser apresentado na conversação.

Essa configuração é muito importante e, quando bem utilizada, permite o assistente "pular" de um assunto para outro com facilidade. Quando mal utilizada, pode ocasionar o travamento da conversa. Sendo assim, é preciso ter muito cuidado em sua configuração

Ela está presente em todos os nós e permite editar uma ou mais condições que irão ativar fluxos de conversação específicos. Além das variáveis de contexto, contato, intenções e entidades, também é possível utilizar duas condições especiais:

  • start: condição que marca o início do fluxo. Deve ser aplicada no primeiro nó, ou seja, no início da conversa. Caso tenha mais de um nó com essa condição, o Zenvia NLU irá priorizar o último nó que você incluir o start.

  • anything_else: é uma condição de fallback. Quando não houver um nó de destino ele será acionado. Caso o fallback não esteja configurado, o fluxo será direcionado para o primeiro nó que possuir a condição start

Atenção ao utilizar variáveis de contexto no ponto de entrada de um nó, pois caso a condição seja atingida e a variável não mude de valor, a conversa ficará presa nesse ponto.

Tipos de nó

  • Padrão: Nó único que segue a condição de acordo com o fluxo criado. Nessa opção, somente o que é inserido na configuração (seja no ponto de entrada ou em outro local) é executado.

  • Respostas condicionais: Permite ter múltiplas respostas com condições associadas a diferentes resultados. Essa função é útil para personalizar respostas a partir de um contexto ou condição, como: dar uma resposta A caso o usuário for de São Paulo e B se ele for do Rio de Janeiro.

Exemplos:

Se criarmos um assistente virtual para uma pizzaria e o cliente solicitar duas pizzas, podemos utilizar:

$total_pizza == "2": para saber se foram solicitadas duas pizzas

$cnt_pizza == null : para identificar se ele selecionou apenas um sabor e então retornar com a seguinte resposta: "Ok, vamos definir os detalhes da sua segunda pizza!"

  • Slots: O slot é uma ferramenta eficaz que permite ao chatbot manter uma conversa natural com o usuário. Ele serve como um extrator de texto que une a intenção e a entidade e projeta perguntas que facilitam a interação.

Por exemplo: em um cenário onde a intenção do usuário seja "agendar uma consulta", os slots podem ser configurados em especialidades, data e horário. Dessa forma, se um usuário não der todas as informações de uma única vez, mas quiser agendar uma consulta, o chatbot já será capaz de retornar a ele com todos os parâmetros necessários para concluir a solicitação.

Essa ferramenta substitui a necessidade de criar um nó para cada ação (especialidade, data e hora). O slot facilita ao configurar toda a entidade no cognitivo dentro de um único script de conversa.

Estrutura:

O slot é acionado por meio de um botão na configuração do nó, sendo possível usar apenas um dos dois modos: resposta condicional ou slots.

Embaixo da Pergunta Padrão há uma opção para adicionar mais slots. Ao selecionar essa opção, é possível adicionar uma nova seção onde o campo "Digite uma entidade" deverá ser preenchido com o nome da entidade previamente cadastrada no NLU.

Esses campos seguem as regras de variáveis já utilizadas em todo builder, possuindo apenas nomes sistêmicos (sem espaço, caracteres especiais ou acento). Além disso, o nome das entidades será aceito com ou sem o uso de '@'.

Nessa mesma página ainda é possível realizar mais três ações:

  1. Editar o slot: Para editar um slot basta clicar no ícone de lápis, ao entrar na tela de edição serão apresentados os campos com o nome da entidade e os cinco componentes do nó: configuração de output, input, variáveis, ações e eventos

  2. Alterar a posição arrastando o slot para a ordem desejada

  3. Remover um slot (utilizando o botão x" próximo à edição)

Caso não haja um input configurado dentro de um Slot e ainda que não seja identificada a entidade no input do usuário, o fluxo do bot seguirá normalmente.

Termos importantes:

  1. Nó master de slots: nó principal onde os slots estão alocados

  2. Slot obrigatório: slot cujo output foi definido

Conceitos sobre o funcionamento de um slot

  1. Quando o slot é obrigatório, mas o usuário do chat não envia uma mensagem que atenda à entidade, o output é exibido.

  2. Se o input for ou não definido e a entidade detectada:

    • O output é ignorado

    • Caso os demais componentes (variáveis, ações e/ou eventos) estiverem definidos, eles serão processados e o fluxo seguirá normalmente para o próximo slot obrigatório. Nessa situação as ações são ignoradas

  3. Se o input não for definido e a entidade não for detectada:

    • O slot será apenas ignorado e nada dele será processado

  4. Se o input for definido e a entidade não for detectada:

    • O output será exibido, seguido pelo input. Os demais componentes do nó não serão processados até que o usuário digite algo

    • Após o processamento dos três componentes (variáveis, ações e eventos), as ações serão avaliadas

  5. Uma ação tem prioridade de execução superior ao reconhecimento de entidades. Por exemplo, temos uma ação do tipo "Sair dos Slots" que foi atendido, mas ainda tem slots obrigatórios não preenchidos. Esses slots serão ignorados e a ação será realizada para o nó master de slots.

Ação

Um único Slot pode ter várias ações e, na plataforma, você encontra cinco delas disponíveis para uso (listadas abaixo). Porém, assim como as ações de um nó, aquela que primeiro tiver a sua condição atendida, será a escolhida.

  1. Ir para o próximo slot: Marca o slot como concluído e passa para o próximo.

  2. Sair dos slots: Marca o slot como concluído e vai para as ações do nó master de slots.

  3. Limpar e repetir esse slot: Marca o slot como NÃO concluído e reprocessa.

  4. Limpar e ir para o próximo slot: Marca o slot como NÃO concluído e vai para o próximo.

  5. Limpar e sair dos slots: Marca slot como NÃO concluído e vai para as ações do nó master de slots.

A opção "Limpar e repetir esse slot" tem seu funcionamento diferente das demais opções, isso porque sua sequência de processamento se assemelha bastante ao de um nó normal. Em outras palavras, quando uma condição permite que essa ação se realize, os outputs serão exibidos ao usuário. Assim que ele digitar algo, as demais três áreas serão processadas, e na sequência, as ações novamente.

A última opção de um slot sempre estará fixa na opção "Ir para o próximo slot". Dessa forma fica garantido que, caso nenhuma das condições programadas seja atendida, o fluxo continuará seguindo

A variável especial slots_complete

Variável específica para caso o programador queira decidir uma direção para onde o fluxo deva ir. Ela indicará se todas as ações foram percorridas com sucesso, de acordo com a definição de cada opção de ação vista acima.

  • Slot como NÃO concluído: A sinalização individual do slot é setada como false.

  • Slot como concluído: A sinalização individual do slot passará a ser true.

Caso haja uma sinalização anterior setada false, ela é sobrescrita pela nova sinalização, e vice-versa.

Quando os slots voltarem para o nó master de slots, a variável slots_complete terá seu valor true somente se todos os slots tiverem sua sinalização individual true. Se algum slot, mesmo que seja apenas um, tiver a sua sinalização individual false, o slots_complete se tornará false.

Exemplos

A estrutura configurada para os exemplos segue a ideia de agendar uma consulta.

Dentro de cada slot foi configurado um output desejado, usado somente quando a entidade não é detectada. Também definimos um campo input simples para todos os slots.

Para esse agendamento, é necessário atender três variáveis que são representadas pelas entidades:

  • Especialidade

  • Data

  • Hora

Para o slot @especialidade

Salvamos nas variáveis um endereço HTTP e dado obtido pela entidade. Por fim, executamos uma chamada de API utilizando o endereço HTTP salvo na área anterior.

A ação "Limpar e sair dos slots" acontecerá se a resposta da API for diferente de 200. Se isso acontecer, além do slot ter a sua sinalização individual setada para false, o slot_complete a partir desse momento será false também. Em nosso caso, passamos pela ação "Limpar e Sair dos slot".

Para o slot @sys-date

Independente da terminologia de tempo que o usuário enviar (amanhã ou hoje, por exemplo), a entidade transformará na data equivalente no formato dd/mm/yyyy.

Para o slot @sys-time

Nesse slot, apenas salvamos algumas variáveis.

Nas ações, caso o usuário digite uma frase que não contenha informação de horário, ele irá "Limpar e repetir o slot".

Pergunta Padrão

A Pergunta Padrão não tem ações.

Casos notáveis

  1. Onde entramos com todos os dados de uma vez: "Consulta para amanhã às 15h com dentista"

2. Onde nenhum dado é informado: Quero agendar consulta"

Retângulos

Trabalhar com fluxos é uma boa forma de organizar de maneira lógica o seu assistente. Uma alternativa é usar os retângulos, que podem ser interconectados por meio das condições de saída de um nó ou, até mesmo, com um ponto de entrada.

Quando um nó tem como destino outro fluxo, ele é representado da seguinte forma:

Destinos

Aqui você pode definir a próxima ação do bot de acordo com o conjunto de variáveis.

Bibliotecas

Bibliotecas são chamadas por recursos externos. Para usar, basta mencionar entre os sinais de <? e ?> de acordo com a documentação de cada uma.

No momento estamos usando a Moment: ela faz análise, validação, manipulação e exibição de datas e horas em JavaScript. Essa biblioteca pode ser usada em qualquer momento do fluxo, seja em input, output, nas variáveis do contato, ações e eventos.

[
    {
        "default": {
            // No primeiro momento formato a data atual, considerando que é case-sensistive.
            // No segundo, faço a mesma coisa, mas com um adicional de passar uma data por variável de contexto e especifico o formato que essa data virá.
            "text": "Bom dia, hoje é dia <? moment().format('DD/MM') ?> e no dia <? moment($data_fatura, 'DD/MM/YYYY').format('DD/MM') ?> sua fatura irá vencer",
            "type": "text"
        },
    },
    {
        "default": {
            // Aqui é calculada uma diferença, em dias, entre as duas datas datas.
            "text": "O vencimento será daqui à <? moment($data_fatura, 'DD/MM/YYYY').diff(moment(), 'days') ?> dias!",
            "type": "text"
        }
    }
]

Last updated