1. Antes de começar
Neste codelab, você vai aprender a criar um chatbot de varejo com o Dialogflow CX, uma plataforma de IA de conversação (CAIP, na sigla em inglês) para criar interfaces de conversação. O Dialogflow CX pode implementar agentes virtuais, como bots de chat, bots de voz, gateways telefônicos e pode oferecer suporte a vários canais em mais de 50 idiomas diferentes.
Neste codelab, vamos orientar você a criar um chatbot de site para um varejo. O negócio fictício para o qual estamos criando o chatbot se chama: G-Records. A G-Records é uma gravadora de rock com sede na Califórnia. A gravadora tem quatro bandas de rock contratadas: Alice Googler, G's N' Roses, The Goo Fighters e The Google Dolls. A G-Records vende produtos de bandas para todos os fãs de rock.
Ao final deste codelab, você poderá usar o chatbot para pedir camisetas ou músicas ou perguntar sobre seu pedido.
O que você vai aprender
Você vai aprender os benefícios do Dialogflow CX em comparação com o Dialogflow ES. Ele inclui os seguintes conceitos:
- Como criar um agente virtual do Dialogflow CX no Google Cloud
- Saiba como criar fluxos
- Saiba como criar entidades
- Saiba como criar intents
- Saiba como criar páginas e páginas de transição com manipuladores de estado
- Aprenda a fazer a transição de páginas com rotas de intent
- Aprenda a fazer a transição de páginas com parâmetros e rotas de condição
- Saiba como retornar respostas condicionais com funções do sistema
- Saiba como criar mensagens alternativas
- Aprenda a usar o simulador
- Aprenda a criar casos de teste e cobertura de teste
O design final do agente do Dialogflow CX vai ficar assim:
O que é necessário
- Você vai precisar de um endereço do Google Identity / Gmail para criar um agente do Dialogflow CX.
- Acesso ao Google Cloud.
2. Configuração do ambiente
Criar um projeto do Google Cloud
Como o Dialogflow CX é executado no Google Cloud, é necessário criar um projeto do Google Cloud. Um projeto organiza todos os seus recursos do Google Cloud. Ele consiste em um conjunto de colaboradores, APIs ativadas (e outros recursos), ferramentas de monitoramento, informações de faturamento e controles de autenticação e acesso.
Ao criar um novo projeto, é preciso digitar o Nome do projeto. Além disso, será preciso vinculá-la a uma conta de faturamento e a uma organização.
Uma conta de faturamento é usada para definir quem paga por determinado conjunto de recursos e pode ser vinculada a um ou mais projetos. O uso do projeto é cobrado na conta de faturamento vinculada. Na maioria dos casos, você configura o faturamento ao criar um projeto. Para mais informações, consulte a documentação do faturamento. Verifique se o faturamento está ativado para seu projeto do Cloud.
ativar a API Dialogflow
Para usar o Dialogflow, você precisa ativar a API Dialogflow para seu projeto.
- Selecione o projeto em que você quer ativar a API e clique em Continuar.
- Contraia o menu de APIs e serviços e clique em Criar credenciais.
- Clique em Dados do app.
- Responda Não, não estou usando, porque você não está usando o Kubernetes Engine, o App Engine ou o Cloud Functions.
- Clique em Concluir.
Criar um agente do Dialogflow CX
Para criar um novo agente do Dialogflow CX, abra o Console do Dialogflow CX:
- Escolha o projeto do Google Cloud criado anteriormente.
- Clique em Criar agente.
Preencha o formulário para as configurações básicas do agente:
- Você pode escolher qualquer nome de exibição.
- Como local, escolha: us-central1
- Selecione o fuso horário.
- Selecione en - English como idioma padrão
Clique em Criar.
Tudo pronto! Finalmente, podemos começar a modelar nosso agente virtual.
3. Fluxos
Caixas de diálogo complexas geralmente envolvem vários tópicos de conversa. No caso do chatbot que estamos criando para a G-Records, para vender produtos da banda, teríamos diálogos sobre o catálogo de produtos, pagamento, status do pedido e perguntas de atendimento ao cliente. Podemos dividir esses tópicos de conversa em fluxos.
Os fluxos permitem que as equipes trabalhem em caminhos de conversa individuais. Uma boa prática seria simplificar o fluxo para que ele se encaixe facilmente em uma tela e seja mais modular.
Os fluxos são um conceito novo no Dialogflow CX. O Dialogflow Essentials tem o conceito de megaagentes, que são semelhantes aos fluxos. No entanto, você usaria fluxos com muito mais frequência.
Mais adiante neste laboratório, vamos usar gerenciadores de estado que podem encerrar um fluxo (para que ele volte para um fluxo anterior ou seguinte) ou encerrar a sessão completa do agente.
Vamos criar alguns fluxos.
Como criar fluxos
- No Dialogflow CX, clique no ícone + > Criar fluxo.
- Especifique o nome:
Catalog
e pressione Enter.
Seu primeiro fluxo, Catalog, foi criado. Agora, crie os outros fluxos:
Order Process
My Order
Customer Care
Mais adiante neste laboratório, vamos definir processadores de estado da página. Isso vai garantir que a visualização fique assim:
Simulador
No lado direito do console do Dialogflow CX, você pode testar o agente virtual com o simulador integrado. Você pode testar a conversa desde o início ou em um fluxo específico.
- Clique no botão Test Agent no canto superior direito da tela.
- No campo "Fale com o agente", escreva:
Hello
O agente virtual vai responder com uma mensagem de boas-vindas padrão: Olá! Como posso ajudar?
Vamos modificar esse texto de boas-vindas padrão.
Fluxo inicial padrão
Vamos começar criando uma Rota de intent que será acionada quando você cumprimentar o agente virtual.
- Na barra lateral Build > Flows à esquerda, clique em Default Start Flow e selecione o nó da árvore Start.
A página Início será aberta. Ela selecionava automaticamente a página inicial na seção da barra lateral Build > Pages.
- Em Iniciar > Rotas, clique em Intent de boas-vindas padrão.
Uma intent categoriza a intenção do usuário final em cada conversa. No Dialogflow CX, as intenções podem fazer parte de um manipulador de estado para encaminhar a próxima página ativa ou fulfillment
- Remova todas as entradas Agente diz e adicione este novo texto:
Welcome, I am the virtual agent of G-Records, a fictional rock label. You can order artists merchandise, ask questions about your order or shipping, and I can tell you more which artists are currently signed with us. How can I help?
Para agilizar a conversa, também precisamos de alguns botões de resposta rápida / ícones de sugestão.
- Clique em Adicionar opção de diálogo > Payload personalizado e use o snippet de código abaixo.
- Use o snippet de código abaixo como um payload personalizado e clique em Salvar.
Para saber mais sobre payloads personalizados, consulte a documentação.
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Which artists?"
},
{
"text": "Which products?"
},
{
"text": "About my order..."
}
]
}
]
]
}
- Teste a intent de boas-vindas no simulador.
Você provavelmente está se perguntando por que não consegue acessar o conteúdo rico. Isso ocorre porque o conteúdo rico, como os ícones de sugestão, depende de uma integração. As etapas a seguir exigem uma conta de faturamento, mas você pode pular se não tiver uma.
- Na barra lateral esquerda, clique em Gerenciar > Integrações.
- Escolha Dialogflow Messenger e clique em Conectar.
- No pop-up, clique em Ativar.
Outro pop-up será mostrado, desta vez com o código JavaScript de integração que você pode colar no site para integrar o componente do Dialogflow Messenger. Como ainda não temos um site, vamos testar o agente virtual diretamente na ferramenta.
- Clique no link Quero testar.
- Clique no ícone do chatbot no canto inferior direito para abrir a janela de chat. Escreva
Hello
para iniciar a conversa.
Por enquanto, quando você clica nos ícones de sugestão, o agente virtual não entende o que você quer dizer. Isso ocorre porque nosso agente virtual ainda não está alternando entre estados. Isso pode ser feito no Dialogflow CX com páginas. Para continuar o laboratório, primeiro vamos criar algumas Entities e Intents.
4. Tipos de entidade
Os tipos de entidade são usados para controlar como os dados da entrada do usuário final são extraídos. Os tipos de entidade do Dialogflow CX são muito semelhantes aos tipos de entidade do Dialogflow ES. O Dialogflow fornece entidades predefinidas do sistema que podem corresponder a muitos tipos comuns de dados. Por exemplo, há entidades do sistema que correspondem a datas, horários, cores, endereços de e-mail e assim por diante. Também é possível criar entidades personalizadas para corresponder a dados específicos.
Vamos começar preparando todas as entidades personalizadas antes de projetar as páginas em um fluxo. Vamos criar as seguintes entidades:
Como criar entidades
Vamos criar uma entidade Artist.
- Clique em Gerenciar > Tipos de entidade.
- Clique em + Criar.
- Nome de exibição:
Artist
- Entidades:
The Google Dolls
(com o sinônimo:Google Dolls
)The Goo Fighters
(com sinônimo:Goo Fighters
)G's N' Roses
(com sinônimo:Gs and Roses
)Alice Googler
- Clique em "Opções avançadas" e marque a caixa de seleção Correspondência parcial. Se você digitar o nome da banda errado, é possível que ele ainda corresponda à entidade correta.
- Nas opções avançadas, marque também Reescrever no registro. (Se você digitar o nome da banda errado, o nome no registro será corrigido.)
- Clique em Salvar.
Também vamos precisar de uma entidade para o item Merch:
- Clique em Gerenciar > Tipos de entidade.
- Clique em + Criar.
- Nome de exibição:
Merch
- Entidades:
T-shirt
Longsleeve
(com sinônimo:Longsleeve shirt
)Tour Movie
Digital Album
(com sinônimo:MP3 Album
,MP3
)CD
(com sinônimosDisc
,Physical CD
)
- Clique em Salvar.
Também vamos precisar de uma entidade para o álbum:
- Clique em Gerenciar > Tipos de entidade.
- Clique em + Criar.
- Nome de exibição:
Album
- Entidades:
Live
Greatest Hits
(com o sinônimo:Hits
)
- Clique em Salvar.
Também vamos precisar de uma entidade para os tamanhos de roupas:
- Clique em Gerenciar > Tipos de entidade.
- Clique em + Criar.
- Nome de exibição:
ShirtSize
- Entidades:
XS
(com sinônimo:Extra Small
)S
(com o sinônimo:Small
)M
(com o sinônimo:Medium
)L
(com sinônimo:Large
)XL
(com o sinônimo:Extra Large
)2XL
(com sinônimo:Extra Extra Large
)3XL
- Clique em Salvar.
E uma entidade para números de pedidos, que geralmente são quatro dígitos alfanuméricos e três números. (como ABCD123)
- Clique em Gerenciar > Tipos de entidade.
- Clique em + Criar.
- Nome de exibição:
OrderNumber
- Entidades regexp
- Entidade: [A-Z]{4}[0-9]{3}
- Clique em Salvar.
A configuração da entidade vai ser semelhante a esta:
@Artist:
@Merch:
@Album:
@ShirtSize:
@OrderNumber:
Depois que as entidades personalizadas forem preparadas, poderemos preparar as intents. Vamos continuar o laboratório.
5. Intents
Uma intent categoriza a intenção do usuário final em cada conversa. Elas foram simplificadas drasticamente no Dialogflow CX, que não é mais um bloco de construção para o controle de conversação. O Dialogflow CX usa apenas intents para corresponder ao que os usuários estão dizendo. No Dialogflow ES, você precisava vincular tudo a uma intent (parâmetros, eventos, fulfillment etc.). As intents no Dialogflow CX contêm apenas frases de treinamento e, portanto, são reutilizáveis. Ele não controla mais a conversa. O processo de criação de intents é simples:
As frases de treinamento nas intents podem usar Entidades para extrair a entrada de "variável". Por isso, é uma prática recomendada criar os tipos de entidade com antecedência, como fizemos na página anterior das etapas do laboratório.
Como criar intents
Vamos começar preparando todas as intents antes de projetar as páginas em um fluxo.
- Clique em Gerenciar > Intents.
- Clique em + Criar.
Use os seguintes detalhes:
- Nome de exibição:
redirect.artists.overview
- Descrição
Artists overview: The bands supported by the label
Role para baixo e crie as seguintes frases de treinamento:
Which bands are signed?
Which bands
Which artists
Which artists are part of the record label
Who is part of the label
From which bands can I buy merchandise
Band merchandise
Which music do you have?
I would like to know who are signed to the label
Who are supported by the label
From who can I buy shirts
What music can I order
Can I get an overview of all the artists
- Clique em Salvar.
- Agora vamos continuar e criar todas as outras intents. Use sua própria imaginação para criar mais frases de treinamento. Uma prática recomendada é ter pelo menos 10 frases de treinamento por intent para cobrir as diferentes maneiras de acionar essa intent. Para os fins deste laboratório, ter menos também é aceitável.
Confira alguns pontos importantes:
- Ao inserir a frase de treinamento, o Dialogflow CX vai anotar automaticamente as entidades. Se não fizer isso, talvez seja necessário atualizar sua entidade (adicionando um sinônimo) ou anotando manualmente a frase de treinamento.
- Frases de treinamento mais curtas: o sistema PLN do Dialogflow também funciona com frases de treinamento mais curtas, e aqui estão alguns exemplos.
- Excesso de treinamento: muitas frases de treinamento para uma intent podem causar treinamento excessivo e um resultado menos desejável. É recomendável usar testes iterativos e incrementais e adicionar frases de treinamento no caso de não haver uma intent correspondente.
Nome de exibição | Frases de treinamento |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Agora que nossos elementos reutilizáveis (fluxos, entidades e intents) estão preparados, podemos criar páginas e processadores de estado.
6. Páginas e manipuladores de estado
Uma conversa do Dialogflow CX (uma sessão) pode ser descrita e visualizada como uma máquina de estado finita. Por exemplo, uma máquina de venda automática pode ser modelada como uma máquina de estados finitos. Ele tem os seguintes estados: "Aguardando moedas", "Selecionar doces", "Dar doces" e, segundo um conjunto de entradas, ele se move entre esses estados. Por exemplo, inserir uma moeda muda a máquina de venda automática de "Esperando moedas" para "Selecione a bala". Páginas são como podemos modelar esses estados para um agente virtual do Dialogflow CX.
À medida que um usuário final interage com o Dialogflow CX em uma conversa, ela passa de página para página. Portanto, a qualquer momento, exatamente uma página é a página atual, a página atual é considerada ativa e o fluxo associado a essa página também é considerado ativo.
Para cada fluxo, você define muitas páginas. As páginas combinadas podem processar uma conversa completa sobre os tópicos para os quais o fluxo foi projetado. Cada fluxo tem uma página inicial especial. Quando um fluxo se torna ativo inicialmente, a página inicial se torna a página atual. Para cada turno de conversa, a página atual permanecerá a mesma ou fará a transição para outra. Com esse conceito, você poderá criar agentes maiores com muitas páginas e várias conversas.
As páginas contêm fulfillments (caixas de diálogo de entrada estáticas e/ou webhooks), parâmetros e gerenciadores de estado. O controle de conversas acontece com gerenciadores de estado, que permitem criar várias rotas de transição para fazer a transição para outra página do Dialogflow CX, inclusive tornando-as condicionais (para ramificações de conversas).
O estado de uma conversa é controlado processando transições entre páginas com três tipos diferentes de rotas:
- Rotas de intent: quando uma intent precisa ser correspondida (por exemplo, mudança de página com base no que um usuário final diz). (Linhas azuis no diagrama visual.)
- Rotas de condição: quando uma condição precisa ser verificada (por exemplo, mudar a página com base em determinados parâmetros armazenados na sessão) (linhas laranja no diagrama visual).
- Manipuladores de evento: quando um determinado evento substituto precisa ser manipulado (por exemplo, processando sem entrada ou sem correspondência, para remover a ambiguidade do usuário final para uma rota de intent ou condição) (linhas verdes no diagrama visual).
Os enunciados de conversa (ou seja, o conteúdo ou a resposta ao usuário) são definidos pelo fulfillment, que pode ser estático ou dinâmico:
- Fulfillment estático: quando uma resposta de fulfillment estática é fornecida.
- Fulfillment dinâmico: quando um webhook de fulfillment é chamado para respostas dinâmicas.
Para o bot de varejo, vamos criar algumas rotas de intent e fornecer algumas respostas de preenchimento de entrada estática, que serão apresentadas ao usuário assim que uma página for ativada. Mais tarde, criaremos parâmetros com rotas de condição para coletar as informações necessárias para fazer um pedido de mercadoria.
Rotas de intent da página
Como criar as páginas no fluxo inicial padrão
Confira um fluxograma do fluxo de início padrão:
Vamos clicar juntos:
- Clique em Build > Default Start Flow.
- Clique na Página inicial.
- Clique no ícone + ao lado de Rotas.
- Adicionar redirect.artists.overview
- Role para baixo até Transition e faça a transição para o fluxo Catalog.
- Clique em Salvar.
- Repita as etapas acima para
redirect.product.overview
e as outras 11 linhas desta tabela:
Página (in-flow) | Rotas > Intent | Rotas > Transição para |
Iniciar |
| - |
Iniciar |
| Fluxo: catálogo |
Iniciar |
| Fluxo: catálogo |
Iniciar |
| Fluxo: catálogo |
Iniciar |
| Fluxo: catálogo |
Iniciar |
| Fluxo: catálogo |
Iniciar |
| Fluxo: catálogo |
Iniciar |
| Fluxo: atendimento ao cliente |
Iniciar |
| Fluxo: atendimento ao cliente |
Iniciar |
| Fluxo: atendimento ao cliente |
Iniciar |
| Fluxo: minha ordem |
Iniciar |
| Fluxo: minha ordem |
Iniciar |
| Fluxo: minha ordem |
Iniciar |
| Página: Encerrar sessão |
O fluxo inicial padrão vai funcionar como um menu de opções ao ligar para um call center. No entanto, nesse agente virtual, ele é treinado com o Natural Language, com as frases de treinamento em intents. Portanto, a interação é orientada pela conversa e não pelas opções DTMF, sendo mais natural e humana.
Como criar as páginas no fluxo do catálogo
A transcrição do chat a seguir pertence ao fluxo do catálogo:
> "Hi"
"Welcome, I am the virtual agent of G-Records, a fictional rock label.
You can order artists merchandise, ask questions about your order or shipping,
and I can tell you more which artists are currently signed with us. How can I help?"
> "Which bands are signed with this record label?"
"The following bands are signed with G-Records:
Alice Googler, G's N' Roses, The Goo Fighters and The Google Dolls.
From which of these artists would you like to order merchandise?"
> "Alice Googler"
"You want to rock with Alice Googler merchandise. Awesome!
We sell shirts, music or the tour movie.
Which merchandise item do you want?"
"(Suggestion chips: [Shirts] [Music] [Tour Movie])"
> "I would like to buy a Shirt"
"Do you want a longsleeve or a t-shirt?"
"(Suggestion chips: [T-shirt, Longsleeve, Price?])"
> "What's the price difference?"
"A t-shirt costs $25 and a longsleeve costs $30.
Do you want a longsleeve or a t-shirt?"
> "A t-shirt",
"What shirt size do you want?"
"(Suggestion chips: [XS, S, M, L, XL, 2XL, 3XL])"
> "M"
"A T-shirt of Alice Googler size: M costs $25. Shall I continue to order?"
A caixa de diálogo será diferente quando você escolher Música ou Tour Movie: para Música, a caixa de diálogo vai ser assim:
> "Music"
"We have a Greatest Hits Album or the Live Album. Which one do you want?"
"(Suggestion chips: [Greatest Hits, Live, Price?])"
> "The Live Album"
"Do you want this album on CD or MP3?"
"(Suggestion chips: [CD, MP3])"
> "What's the price difference?"
"A CD costs $15. The digital album on MP3 costs $10.
Do you want this album on CD or MP3?"
> "Digital Album",
"The Digital Album: Alice Googler - Live costs $10. Shall I continue to order?"
Para o Tour Movie, a caixa de diálogo vai ficar assim:
> "Tour Movie"
"The Tour Movie of G's N' Roses costs $25. Shall I continue to order?
Confira um fluxograma de todas as páginas no fluxo do catálogo:
Observe a complexidade desse fluxo:
- Eu poderia pular a pergunta Quais artistas? e perguntar imediatamente "Quais itens de merchandising estão disponíveis?".
- No fluxo inicial padrão, eu poderia perguntar: "Quero comprar uma camiseta do The Google Dolls" ou "Quero comprar algo". Isso significa que o agente virtual fará perguntas complementares para preencher os slots desses parâmetros obrigatórios. Ele vai diretamente para a página do produto.
- A caixa de diálogo "Price" vem da página de preço que será reutilizada.
- Embora o diálogo do vídeo do tour pareça o mais simples, vamos fazer algo especial com ele. Vamos reutilizar essa parte do diálogo para que os usuários finais também possam inseri-la diretamente em um dos outros produtos, se eles especializarem todas as informações de uma vez:
> "I want The Goo Fighters longsleeve size S."
"The longsleeve of The Goo Fighters size S costs $30. Shall I continue to order?"
Primeiro, vamos conectar as páginas.
- Clique em Build > Catalog.
- Clique na Página inicial.
- Clique no ícone + ao lado de Rotas.
- Adicionar redirect.artists.overview
- Role para baixo até Transição, selecione Página e escolha: + nova página
- Use o nome da página:
Artist Overview
e clique em Salvar.
Agora vamos concluir o restante do fluxo:
- As etapas anteriores podem ser repetidas com as páginas, intents e fulfillments a seguir. Assuma esta tabela. Página é a página que você vai selecionar no fluxo. Rotas > Fazer transição para é o novo fluxo ou a página para a qual você vai fazer a transição.
Página (in-flow) | Rotas > Intent | Rotas > Transição para |
Início do catálogo |
| Visão geral do artista |
Início do catálogo |
| Produto |
Início do catálogo |
| Visão geral do produto |
Início do catálogo |
| Visão geral do produto |
Início do catálogo |
| Camisas |
Início do catálogo |
| Música |
Início do catálogo |
| Encerrar sessão |
Início do catálogo |
| Fluxo final |
Visão geral do artista |
| Visão geral do produto |
Agora vamos continuar e adicionar mais fulfillments estáticos.
- No fluxo do catálogo, clique na página Visão geral do artista.
- Clique em Editar fulfillment na seção Fulfillment de entrada.
- Use as seguintes fulfillments estáticas (Agente diz):
The following bands are signed with G-Records: Alice Googler, G's N' Roses, The Goo Fighters and The Google Dolls.
- Clique em Salvar.
- No fluxo do catálogo, clique na página Visão geral do produto.
- Clique em Editar fulfillment na seção Fulfillment da entrada.
- Use o atendimento estático a seguir (Agente diz):
We sell shirts, music or the tour movie.
- Clique em Salvar.
Parâmetros de página
Os parâmetros são usados para capturar e fazer referência a valores fornecidos pelo usuário final durante uma sessão. Cada parâmetro tem um nome e um tipo de entidade. @Artist
e @Merch
são os parâmetros mínimos que precisamos coletar para fazer um pedido de produtos. Para camisetas ou camisas de manga comprida, você também precisa coletar @ShirtSize
. Caso queira pedir músicas, também precisará de um nome @Carrier
e @Album
.
Esses parâmetros precisam ser marcados como obrigatórios. Quando necessário, você pode fornecer comandos personalizados para lembrar do usuário final e fornecer as respostas corretas para que esses parâmetros possam ser coletados. Há alguns mecanismos no Dialogflow CX que podem ajudar você com isso.
Por exemplo, forneça mensagens de fulfillment estático personalizadas na seção Parâmetro. Se o parâmetro for obrigatório, esses fulfillments serão mostrados. Essas mensagens de resposta serão adicionadas à fila de respostas. Durante a rodada de um agente, é possível (e às vezes desejável) chamar vários fulfillments, e cada um deles pode gerar uma mensagem de resposta. O Dialogflow mantém essas respostas em uma fila de respostas. Para saber mais sobre o ciclo de vida da página e a ordem em que esses fulfillments serão adicionados à fila de respostas, leia as documentações da página do Dialogflow CX.
Criar os parâmetros na página "Visão geral do artista"
Vamos definir alguns parâmetros de página:
- No fluxo Catálogo, clique na página Visão geral do artista.
- Clique em + no bloco Parâmetros. Adicione o parâmetro artist:
- Nome de exibição:
artist
- Tipo de entidade:
@Artist
- Obrigatório: marque a caixa
- Editar no registro: verificar
- Agora vamos adicionar algumas mensagens de atendimento de parâmetro personalizado. Se o parâmetro artist ainda não tiver sido coletado pelo agente virtual, o usuário final receberá esta resposta do agente adicionada à fila:
From which of these artists would you like to order merchandise?
- Adicione uma segunda opção de diálogo que ofereça ícones de sugestão avançados. Clique em Adicionar opção de diálogo e use este código (em JSON):
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
É possível processar diferentes solicitações de fulfillment substituto com base na quantidade de tentativas que o usuário final fez para responder. Isso é feito com manipuladores de eventos de parâmetros. Existem vários manipuladores de eventos integrados para você escolher, como Parâmetros inválidos, Enunciados muito longos, Sem entrada, Nenhuma entrada, 2a tentativa ou Sem correspondência. A diferença entre "sem entrada" e "sem correspondência" é que, com "sem entrada", o usuário nunca forneceu uma resposta, enquanto com "sem correspondência", o usuário forneceu uma resposta, mas o Dialogflow CX não conseguiu fazer a correspondência com uma página.
- Role para baixo até a seção Gerenciadores de eventos de nova solicitação.
- Clique em Adicionar manipulador de eventos e selecione o evento:
No-match default
- Use o seguinte envio de texto estático de evento:
I missed that. Please, specify the artist. You can choose between: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- Clique em Salvar.
- Clique em Adicionar manipulador de eventos e selecione o evento:
No-input default
- Use o seguinte fulfillment de texto estático de evento:
I am sorry, I could understand the artist's name. You can choose between Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- Clique em Salvar.
Rotas de condição da página
Os parâmetros são muito eficientes em combinação com as Rotas condicionais de página. Quando uma condição é avaliada como verdadeira, a rota de página associada é chamada. Por exemplo, um parâmetro é igual a um valor específico, um parâmetro não pode estar ausente, um formulário que foi preenchido e muito mais. Confira mais informações sobre parâmetros e condições na documentação do Dialogflow CX.
Para nosso agente virtual de varejo, é necessário coletar uma sequência de parâmetros. Portanto, precisamos criar uma condição para verificar se um "formulário" foi preenchido. Um formulário é uma lista de parâmetros que precisam ser coletados do usuário final para a página. O agente virtual interage com o usuário final em várias rodadas de conversas até coletar todos os parâmetros obrigatórios do formulário, também conhecidos como parâmetros de página.
O Dialogflow CX define automaticamente os valores de parâmetro fornecidos pelo usuário final durante o preenchimento do formulário. Para verificar se o formulário completo da página atual está preenchido, use a seguinte condição: $page.params.status = "FINAL"
Criar as rotas condicionais na página "Visão geral do artista"
Vamos criar uma rota condicional, que passará para a próxima página, assim que o artista for conhecido:
- Na página Visão geral do artista, clique no ícone + na seção Rotas.
- Role a tela para baixo até a seção Condição.
- Selecione Pelo menos uma (OU)
- Em seguida, vamos escrever uma expressão que
- Parâmetro:
$page.params.status
- Operador:
=
- Valor:
"FINAL"
- Agora, vamos criar uma mensagem de conclusão estática específica na rota, confirmando a escolha do usuário final. Role para baixo até o bloco Fulfillment e escreva as seguintes mensagens de fulfillment:
$session.params.artist, great choice! Rock on!
You want to rock with $session.params.artist merchandise. Awesome!
- Quando a condição for verdadeira, você vai precisar fazer a transição para a página Visão geral do produto. Role para baixo até a seção Transition e use a página a seguir:
Product Overview
- Clique em Salvar.
Como criar as rotas na página "Visão geral do produto"
Agora que sabemos como criar parâmetros e rotas condicionais, vamos criar mais parâmetros para as seguintes páginas:
Visão geral do produto
- Crie o parâmetro
artist
na página Visão geral do produto:
- Nome de exibição:
artist
- Tipo de entidade:
@Artist
- Obrigatório: marque a caixa
- Editar no registro: verificar
- Fulfillment da solicitação inicial:
From which of these artists would you like to order merchandise?
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- Gerenciador de eventos >
No-match default
:To buy merchandise you can choose between the following artists: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- Payload personalizado:
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- Gerenciador de eventos >
No-input default
:To buy merchandise you can choose between the following artists: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist were you trying to mention?
- Payload personalizado:
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- Crie o parâmetro
merch
:
- Nome de exibição:
merch
- Tipo de entidade:
@Merch
- Obrigatório: marque a caixa
- Editar no registro: verificar
- Fulfillment:
Which merchandise item do you want?
- Clique em: Adicionar opção de diálogo > Payload personalizado:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- Manipulador de eventos >
No-match default
- Fulfillment do manipulador de eventos:
We sell Shirts, Music or the Tour movie. Which of these items do you want?
- Payload personalizado:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- Manipulador de eventos >
No-input default
- Fulfillment do manipulador de eventos:
I couldn't understand which merchandise item you wanted to buy. You can choose between: Shirts, Music or the Tour movie. Which item do you want?
- Payload personalizado:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- Crie uma rota que fará a transição para a página Product (produto) quando o
artist
e o itemmerch
forem fornecidos.
- Condição:
- Corresponder a todas as regras (AND)
- Expressão:
$session.params.artist != null
- Expressão:
$session.params.merch != null
- Fulfillment:
Alright! $session.params.merch of $session.params.artist, let's go!
- Transição: página:
Product
- Criar uma rota para quando o usuário disser "Camisetas"
- Intenção: redirect.shirts
- Transição: página:
Shirts
- Criar uma rota para quando o usuário disser "Música"
- Intent: redirect.music
- Transição: página:
Music
- Criar uma rota para quando o usuário pedir informações de preço
- Intent: redirect.price
- Transição: criar nova página:
Price
Depois de definir a configuração acima, você vai ver uma visualização semelhante à imagem abaixo. As rotas de intent são azuis no diagrama, e as rotas de condição são laranja. Embora não estejam representados, os manipuladores de eventos são verdes e, quando vários tipos de rota fazem a transição para uma página, a linha fica cinza.
Até agora, você aprendeu a criar fluxos, entidades, intents e páginas com gerenciadores de estado, como Rotas de intent e Rotas condicionais com base em parâmetros. Mais adiante neste laboratório, vamos usar a ramificação condicional no fulfillment para fornecer diferentes diálogos com base na entrada.
Use as configurações a seguir para finalizar o agente virtual.
Página de camisas:
- Crie as seguintes configurações na página Shirts:
- Fulfillment de entrada:
Do you want a longsleeve or a t-shirt?
- Payload personalizado de fulfillment de entrada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
},
{
"text": "Price?"
}
]
}
]
]
}
- Crie uma rota de intent:
redirect.price
com uma transição para a páginaPrice
- Crie o seguinte parâmetro:
- Parâmetro:
merch
: tipo de entidade:@Merch
,Required
eRedact in log
- Parâmetro > Gerador de eventos >
No-match default
- Parâmetro > Fulfillment do manipulador de eventos:
You can choose between a t-shirt or a longsleeve. Which of these do you want?
- Parâmetro > Fulfillment do gerenciador de eventos: payload personalizado:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
}
]
}
]
]
}
- Parâmetro > Gerador de eventos >
No-input default
- Parâmetro > Fulfillment do manipulador de eventos:
I couldn't understand if you want the t-shirt or the longsleeve. Which of these do you want?
- Parâmetro > Fulfillment do gerenciador de eventos: payload personalizado:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
}
]
}
]
]
}
- Clique no preenchimento de entrada e role a tela até Predefinições de parâmetros. Sempre que a página "Shirts" for ativada, o parâmetro de categoria será definido como shirts:
Parâmetro | Valor |
|
|
- Adicionar uma rota condicional:
- Corresponder pelo menos uma regra (OU)
- Expressão:
$session.params.merch = "T-shirt"
- Expressão:
$session.params.merch = "Longsleeve"
- Transição para uma nova página:
Shirt Size
Página de preços:
Como as mensagens de preços dependem do item ou da categoria de produtos escolhidos (música ou camisetas), vamos corrigir essa parte mais tarde no laboratório. Por enquanto, basta inserir um marcador de posição.
- Crie as seguintes configurações na página Preço:
- Fulfillment de entrada:
PRICE TODO
Como você pode solicitar o preço de vários lugares da conversa, ele precisa sempre fornecer uma resposta e transferir de volta à parte anterior do diálogo para continuar o pedido. Há cinco lugares na árvore de diálogo em que você pode fazer ramificações para receber informações de preço. (Shirt, Shirt Size, Music, Carrier e também direto por uma rota de intent), então vamos precisar de algumas rotas condicionais para voltar:
- Adicione uma rota condicional:
- Corresponder a todas as regras (AND)
- Expressão:
$session.params.category = "shirts"
- Expressão:
$session.params.merch = "null"
- Transição para uma nova página:
Shirts
- Adicionar uma rota condicional:
- Corresponder a todas as regras (AND)
- Expressão:
$session.params.category = "shirts"
- Expressão:
$session.params.size = "null"
- Transição para uma nova página:
Shirt Size
- Adicionar uma rota condicional:
- Corresponder a todas as regras (AND)
- Expressão:
$session.params.category = "music"
- Expressão:
$session.params.album = "null"
- Transição para uma nova página:
Music
- Adicionar uma rota condicional:
- Corresponder a todas as regras (AND)
- Expressão:
$session.params.category = "music"
- Expressão:
$session.params.merch = "null"
- Transição para uma nova página:
Carrier
- Adicionar uma rota condicional:
- Corresponder a todas as regras (AND)
- Expressão:
$session.params.category = "null"
- Transição para uma nova página:
Product Overview
Página de tamanho de camisa:
- Crie as seguintes configurações na página Tamanho da camisa:
- Fulfillment de entrada:
What shirt size do you want?
- Payload personalizado de fulfillment de entrada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- Crie uma rota de intent:
redirect.price
com uma transição para a páginaPrice
. - Crie o seguinte parâmetro:
- Parâmetro:
shirtsize
- Tipo de entidade:@ShirtSize
-Required
,Redact In Log
- Parâmetro > Gerador de eventos >
No-match default
- Parâmetro > Fulfillment do manipulador de eventos:
Please tell me the shirt size, such as XL.
- Parâmetro > Fulfillment do gerenciador de eventos: payload personalizado:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- Parâmetro > Gerador de eventos >
No-input default
- Parâmetro > Fulfillment do manipulador de eventos:
I couldn't understand the shirt size. What size do you want?
- Parâmetro > Fulfillment do manipulador de eventos Payload personalizado:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- Adicionar uma rota condicional:
- Corresponder a todas as regras (AND)
- Expressão:
$page.params.shirtsize != "null"
- Transição para a página:
Product
Página de música:
- Crie as seguintes configurações na página Música:
- Fulfillment de entrada:
We have a Greatest Hits Album or the Live Album. Which one do you want?
- Payload personalizado de fulfillment de entrada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
},
{
"text": "Price?"
}
]
}
]
]
}
- Crie uma Rota de intent:
redirect.price
com uma transição para a páginaPrice
. - Crie o seguinte parâmetro:
- Parâmetro:
album
- Tipo de entidade:@Album
-Required
,Redact In Log
- Parâmetro > Gerador de eventos >
No-match default
- Parâmetro > Fulfillment do manipulador de eventos:
You can choose between Greatest Hits and Live Album. Which of these do you want?
- Parâmetro > Fulfillment do gerenciador de eventos: payload personalizado:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
}
]
}
]
]
}
- Parâmetro > Gerador de eventos >
No-input default
- Parâmetro > Fulfillment do manipulador de eventos:
I couldn't understand if you want the album: Greatest Hit or Live. Which of these do you want?
- Parâmetro > Fulfillment do gerenciador de eventos: payload personalizado:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
}
]
}
]
]
}
- Clique no preenchimento de entrada e role a tela até Pré-configurações de parâmetro. Sempre que a página "Música" for ativada, o parâmetro de categoria será definido como música:
Parâmetro | Valor |
|
|
- Adicionar uma rota condicional:
- Corresponder a todas as regras (AND)
- Expressão:
$page.params.album != "null"
- Transição para a página:
Carrier
Página da operadora:
- Crie as configurações a seguir na página Transportadora:
- Fulfillment de entrada:
Do you want this album on CD or MP3?
- Payload personalizado de fulfillment de entrada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "MP3"
},
{
"text": "Price?"
}
]
}
]
]
}
- Crie uma rota de intent:
redirect.price
, que faz a transição para a páginaPrice
. - Crie o seguinte parâmetro:
- Parâmetro:
merch
- Tipo de entidade:@Merch
-Required
,Redact In Log
- Parâmetro > Gerador de eventos >
No-match default
- Parâmetro > Fulfillment do manipulador de eventos:
Do you want a physical CD or the digital album?
- Parâmetro > Fulfillment do gerenciador de eventos: payload personalizado:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "Digital Album"
}
]
}
]
]
}
- Parâmetro > Manipulador de eventos >
No-input default
- Parâmetro > Fulfillment do manipulador de eventos:
I couldn't understand if you mean CD or MP3. Which one do you want?
- Parâmetro > Fulfillment do manipulador de eventos: payload personalizado:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "MP3"
}
]
}
]
]
}
- Adicionar uma rota condicional:
- Corresponder a todas as regras (AND)
- Expressão:
$page.params.merch != "null"
- Transição para a página:
Product
Página do produto:
- Crie os parâmetros a seguir:
Nome de exibição do parâmetro | Tipo de entidade do parâmetro | Verificações |
|
| Obrigatório, Editar no registro |
|
| Obrigatório, edite no registro |
- O parâmetro artist precisa do seguinte fulfillment inicial, que será mostrado quando o artista não for conhecido.
You didn't mention which artist you are interested in. You can ask me to buy the $session.params.merch of the artist you like or ask which artists we signed. How can I help?
{
"richContent": [
[
{
"options": [
{
"text": "Which artists?"
}
],
"type": "chips"
}
]
]
}
- Também adicione um manipulador de eventos
No-input default
com fulfillment:I couldn't understand what you just said. Ask me which artists are signed.
- E um manipulador de eventos
No-match default
com fulfillment:I missed that. Please ask me which artists are signed.
- O parâmetro merch também precisa de manipuladores de eventos de reprompt.
- Adicionar um manipulador de eventos
No-input default
com fulfillment:I couldn't understand what you just said. Which merchandise item do you want?
- E um manipulador de eventos
No-match default
com fulfillment:I missed that. Which merchandise item do you want?
A próxima rota vai fazer a transição para a página de confirmação quando o artista for conhecido e o usuário escolher um "Tour Movie".
- Adicionar uma rota condicional:
- Corresponder a todas as regras (AND)
- Expressão:
$session.params.artist != null
- Expressão:
$session.params.merch = "Tour Movie"
- Predefinições de parâmetros Adicionar parâmetro >
price = 25
- Transição para uma nova página:
Confirmation
O próximo trajeto passará para a página de confirmação quando o artista for conhecido e o usuário escolher uma "Camiseta" e o tamanho da camisa.
- Adicionar uma rota condicional:
- Expressão personalizada:
$session.params.artist != null AND $session.params.merch = "T-shirt" AND $session.params.shirtsize != null
- Predefinições de parâmetro > Adicionar parâmetro >
price = 25
- Transição para a página:
Confirmation
A próxima rota vai fazer a transição para a página de confirmação quando o artista for conhecido e o usuário escolher uma "Longa" e o tamanho da camisa.
- Adicionar uma rota condicional:
- Expressão personalizada:
$session.params.artist != null AND $session.params.merch = "Longsleeve" AND $session.params.shirtsize != null
- Predefinições de parâmetro > Adicionar parâmetro >
price = 30
- Transição para a página:
Confirmation
A próxima rota vai fazer a transição para a página de confirmação quando o artista for conhecido e o usuário escolher um "CD" e o nome do álbum.
- Adicionar uma rota condicional:
- Expressão personalizada:
$session.params.artist != null AND $session.params.merch = "CD" AND $session.params.album != null
- Predefinições de parâmetro > Adicionar parâmetro >
price = 15
- Transição para a página:
Confirmation
A próxima rota vai fazer a transição para a página de confirmação quando o artista for conhecido e o usuário escolher um "Álbum digital" e o nome do álbum.
- Adicionar uma rota condicional:
- Expressão personalizada:
$session.params.artist != null AND $session.params.merch = "Digital Album" AND $session.params.album != null
- Predefinições de parâmetros Adicionar parâmetro >
price = 10
- Transição para a página:
Confirmation
Em seguida, vamos criar algumas condições avançadas com avisos que detectam informações ausentes. A próxima rota vai voltar para a página da música quando o artista for conhecido e o usuário escolher um "CD" ou um "Álbum digital", mas o nome do álbum não for escolhido.
- Adicionar uma rota condicional:
- Expressão personalizada:
$session.params.artist != null AND ($session.params.merch = "CD" OR $session.params.merch = "Digital Album") AND $session.params.album = null
- Fulfillment:
I would also need to know which album you would like to buy!
- Transição para a página:
Music
E a última rota vai fazer a transição para a página de confirmação quando o artista for conhecido e o usuário escolher uma "camiseta" ou uma "manga longa", mas quando o tamanho da camiseta não for escolhido.
- Adicione uma rota condicional:
- Expressão personalizada:
$session.params.artist != null AND ($session.params.merch = "T-shirt" OR $session.params.merch = "Longsleeve") AND $session.params.shirtsize = null
- Fulfillment:
I would also need to know which shirt size you need!
- Transição para a página:
Shirt Size
Na próxima parte do laboratório, vamos usar fulfillments condicionais para enviar mensagens de fulfillment diferentes dependendo da entrada.
7. Respostas condicionais
Algumas respostas vão retornar uma conversa diferente com base na entrada. Os diálogos vão se ramificar, e chamamos isso de respostas condicionais. Isso pode ser interessante quando você não usa fulfillments de webhook, em que as respostas condicionais foram determinadas no back-end. Um exemplo pode ser:
if [condition]
[response]
elif [condition]
[response]
elif [condition]
[response]
else
[response]
endif
- Um exemplo de [condition] pode ser:
$session.params.user-age >= 21
. Ele usa uma formatação semelhante às condições nas rotas. - Uma [resposta] usa a resposta de texto estático
- As respostas condicionais sempre começam com
if
- Os blocos
elif
eelse
são opcionais
O Dialogflow CX também pode usar funções do sistema integradas. Por exemplo, para formatar uma data ou hora ou mostrar a hora atual ($sys.func.NOW()
).
Vamos finalizar o fluxo do catálogo corrigindo as páginas de Confirmação e Preço.
Página de confirmação:
Agora vamos criar a página de confirmação. Ele tem os seguintes requisitos:
- Se o merch for CD ou álbum digital. Os seguintes campos serão mostrados na confirmação: artista, merch, álbum e preço.
- Se o produto for camiseta ou manga longa. Vamos mostrar os seguintes campos na confirmação: artista, merch, tamanho e preço.
- Caso contrário (e, portanto, se merch for Filme da turnê). Os seguintes campos serão mostrados na confirmação: artista, merch e preço.
- Clique na página de Confirmação.
- Clique em Editar atendimento > Respostas do agente > opção Adicionar diálogo > Resposta condicional:
if ($session.params.merch = "CD" OR $session.params.merch = "Digital Album")
The $session.params.merch: $session.params.artist - $session.params.album costs $$session.params.price. Shall I continue to order?
elif ($session.params.merch = "T-shirt" OR $session.params.merch = "Longsleeve")
A $session.params.merch of $session.params.artist size: $session.params.shirtsize costs $$session.params.price. Shall I continue to order?
elif $session.params.merch = "Tour Movie"
The $session.params.merch of $session.params.artist costs $$session.params.price. Shall I continue to order?
else
It looks like something went wrong with your order. You can say "Reset", to restart the order process.
endif
- Create the following Custom payload:
- Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Yes, confirm"
}
],
"type": "chips"
}
]
]
}
Next, create two intent routes:
confirm.proceed.order
transitions to:Order Process
Flow.decline.proceed.order
transitions toEnd Flow
When the user declines the order, and does not want to proceed the order process, we will have to transition back to the welcome page, but all the parameters have to be cleared. We can do this by specifically setting null to all the possible parameters. You can do this with Parameter presets.
- In the decline.proceed.order intent route, scroll down to Parameter presets and add the following parameters:
Parameter | Value |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Notice that we have created an additional parameter called restart
. If this parameter is present, the Default Start Flow, should know to continue the conversation by showing a customized message.
- Click on the Default Start Flow, Start Page, and create another Conditional Route:
$session.params.restart = "true"
- Fulfillment:
"Welcome back, as the virtual agent of G-Records, I can help you order artists merchandise, you can ask questions about your order or shipping, and I can tell you more which artists are currently signed with us. How can I help?"
- Custom payload:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Which artists?"
},
{
"text": "Which products?"
},
{
"text": "About my order..."
}
]
}
]
]
}
- Select the Start Page and click on the
redirect.end
intent. Create the following fulfillment:Thank you for contacting G-Records! Have a nice day!
Price Page:
Let's also fix the Price TODOs. The price information will be static for now. Click on the Price Page in the Catalog Flow, and use the following entry fulfillment:
- Delete the Agent Says entry fulfillment.
- Create a new Conditional Response:
if $session.params.category = "shirts"
A t-shirt costs $25 and a longsleeve costs $30.
elif $session.params.category = "music"
A CD costs $15. The digital album on MP3 costs $10.
else
A t-shirt costs $25 and a longsleeve costs $30. A CD costs $15 and a digital album on MP3 $10. In case you are interested in the Tour Movie, that one is $25.
endif
Well done, by now you completed the Catalog flow. Your flow should look similar to this diagram:
8. Wrapping up the agent
We are almost at the end of this lab. Let's configure the last flows together, and take in practice all the new things that we have learned.
Creating the My Order Flow
- Go to the My Order Flow, and create the following intent transitions:
Page (In Flow) | Routes > Intent | Routes > Transition To |
My Order Start |
| My Order |
My Order Start |
| My Order Status |
My Order Start |
| My Order Cancellation |
My Order Start |
| End Session |
My Order Start |
| End Flow |
My Order |
| My Order Status |
My Order |
| My Order Cancellation |
Default Start Flow |
| Flow: My Order |
Default Start Flow |
| Flow: My Order |
- Let's create the following entry fulfillment for the My Order Page:
- Entry fulfillment:
I can look up the status of your order, or I can cancel an order.
- In the My Order Page create the following parameter:
- Displayname:
ordernumber
- Entity Type:
@OrderNumber
- Required: checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123.
- Event Handler:
No-match default
:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Event Handler:
No-input default
:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Create the following conditional route:
- Customize Expression:
$page.params.status = "FINAL"
- Fulfillment:
And do you want to Cancel your order, or should I look up the status?
- Click on Add state handler > Event Handlers and create the Event Handler:
No-input default
- Fulfillment:
I'm sorry, what was that? Would you like me to cancel an order or look up the status?
- Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Status"
},
{
"text": "Cancel"
}
],
"type": "chips"
}
]
]
}
- Create the Event Handler:
No-match default
- Fulfillment:
Would you like me to cancel an order or lookup the status?
- Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Status"
},
{
"text": "Cancel"
}
],
"type": "chips"
}
]
]
}
- In the My Order Status Page create the following parameter:
- Displayname:
ordernumber
- Entity Type:
@OrderNumber
- Required checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123.
- Event Handler:
No-match default
:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Event Handler:
No-input default
:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- In the My Order Status Page create the following conditional route:
- Customize Expression:
$session.params.ordernumber != null
- Fulfillment:
Your order $session.params.ordernumber has been shipped, it can take up to approx 2 weeks before you will receive your items.
- Add dialogue option > Text:
Is there anything else I can help you with?
- In the My Order Cancelation Page create the following parameter:
- Displayname:
ordernumber
- Entity Type:
@OrderNumber
- Required checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123.
- Event Handler:
No-match default
:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Event Handler:
No-input default
:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- In the My Order Cancelation Page create the following conditional route:
- Customize Expression:
$session.params.ordernumber != null
- Fulfillment:
Your order $session.params.ordernumber has been canceled.
- Add dialogue option > Text:
Is there anything else I can help you with?
- Test the flow and create the following two test scenarios:
>"About my order"
>"ABCD123"
>"Status"
And:
>"What's the status of order DEFG222"
- Select the Start Page and click on the
redirect.end
intent. Create the following fulfillment:Thank you for contacting G-Records! Have a nice day!
- Select the Start Page and click on the
redirect.home
intent. Create the following parameter preset:restart = true
Default Negative intents (Fallback)
When you create a virtual agent, a default negative intent is created for you. You can add training phrases to this intent that act as negative examples that will trigger a No-match event. There may be cases where end-user input has a slight resemblance to training phrases in normal intents, but you do not want these inputs to match any normal intents.
- Try in the simulator:
I don't like Alice Googler
.
You will see that the virtual agent answers with the Product Overview Page, to continue ordering Alice Googler merchandise. However, your end user does not like that artist. Let's use the Default Negative Intent for this.
- Go to Manage > Intents and select the Default Negative Intent.
- Add the following training phrases that will trigger the No-match event.
I don't like Alice Googler
I am not a fan of G's N' Roses
I can't stand the music of the Google Dolls
- Hit Save and test the following sentence in the simulator:
I am really not a fan of the Goo Fighters
This time the No-match
event was triggered, you stayed on the Start Page.
Default Fallback Messages
- Click the Default Start Flow, select the
sys.no-input-default
event handler.
The No-input fallback basically means: No text or speech answers were detected. Likely no answers were given, or the system couldn't hear it. Therefore, let's make the fallback messages more specific. Use the tab key, to create alternative dialogues:
- Remove all answers, and add these text dialogues:
I'm sorry, I didn't receive an answer. Can you say it again?
I missed your answer, can you say it again?
Sorry, I didn't hear anything. Can you say it again?
I couldn't hear what you were saying, what was that?
I'm sorry, I missed your answer. What were you trying to say?
Don't forget to click Save.
- Click the Default Start Flow, select the
sys.no-match-default
event handler.
The No Match fallback basically means: Text or speech answers were detected but nothing in Dialogflow CX got matched.
- Remove all answers, and add these text dialogues:
Sorry, I didn't get that. Can you please rephrase?
I'm sorry, I don't understand. Can you please rephrase?
I don't understand, please rephrase.
Sorry, I didn't get that. What was that?
I didn't get that, can you please rephrase?
Don't forget to click Save.
- It's advised to repeat these steps for the Catalog, My Order, Order Process and Customer Care flows.
Here's a tip: when creating fallback messages, make them more explicit, by rephrasing the previous question or by mentioning an example. You could create these type of No-match and No-input events on Page level when creating parameters. In our labs, we have already done this.
Creating the Order Process Flow
- Go to the Order Process Flow, and create the following intent transitions:
Page (In Flow) | Routes > Intent | Routes > Transition To |
Order Process Start |
| End Session |
Order Process Start |
| End Flow |
Order Process Start |
| New Page: Shipping Details |
- Let's create the following entry fulfillment for the Shipping Details Page:
- Entry fulfillment:
To complete your order I will first need to collect your shipping details.
- Create the following parameters:
These parameters will make use of built-in system entities. System entity support differs for each language. See the docs for more information.
Parameter Display name | Entity | Required? | Initial prompt fulfillment | No-match default | No-input default |
| @sys.person | Required |
|
|
|
| @sys.person | Required |
|
|
|
| @sys.address | Required |
|
|
|
| @sys.any | Required |
|
|
|
| @sys.geo-city | Required |
|
|
|
| @sys.geo-country | Required |
|
|
|
| @sys.email | Required |
|
|
|
- Create the following conditional route:
- Customize Expression:
$page.params.status = "FINAL"
- Transition to new Page:
Payment Details
- Create the following entry fulfillment.
Let's fake it that this virtual agent makes use of Google Pay. Don't worry this tutorial won't make real transactions. Create the following entry dialogues:
- Agent Says:
Alright $session.params.firstname! We will make use of Google Pay, that's connected to your email account: $session.params.email.
- Conditional Response
if $session.params.merch != "Digital Album"
Shipping costs an additional 5 dollars. This will make the total price $$sys.func.TO_TEXT($sys.func.ADD($session.params.price, 5)).
Your merchandise will be shipped to:
$session.params.firstname $session.params.lastname
$session.params.address
$session.params.zipcode $session.params.city
$session.params.country
To continue the order process please explicitly say "I confirm". Do you want to confirm your $session.params.artist $session.params.merch order?
else
The total costs will be: $$session.params.price.
After purchasing the digital album, you will receive an email with the download link.
To continue the order process please explicitly say "I confirm".
Do you want to confirm your $session.params.artist $session.params.merch order?
endif
- Crie a seguinte Intent Route
- Intent:
confirm.proceed.order
- Mensagem do agente:
Thank you for your order! Your merchandise will be shipped today!
- Adicionar opção de diálogo > Texto:
Here's the order number: ABCD123
. - Adicionar opção de diálogo > Texto:
Have a good day!
- Transição:
End Session
- Selecione a página Start e clique na intent
redirect.end
. Crie o fulfillment a seguir:Thank you for contacting G-Records! Have a nice day!
- Selecione a página Start e clique na intent
redirect.home
. Crie a seguinte predefinição de parâmetro:restart = true
Incrível! Agora temos um chatbot de varejo totalmente funcional. No próximo laboratório, vamos testar o desempenho do agente virtual.
9. testar seu agente virtual
Use o simulador integrado para testar os diálogos do agente virtual. A vantagem de testar os fluxos no simulador é que você terá uma boa visão geral dos fluxos, páginas, parâmetros e eventos (DTMF) que o simulador coletou ao percorrer seus fluxos. Isso facilita o teste do que testar diretamente em uma integração, já que esses tipos de informações serão ocultados do usuário final. É possível até mesmo criar, salvar e reutilizar casos de teste. Isso faz muito sentido quando você mantém ou edita seus fluxos ao longo do tempo e quer ter certeza de que nenhuma das mudanças vai afetar seu trabalho anterior.
Também é possível exportar e importar casos de teste feitos anteriormente, armazenando os testes no Google Cloud Storage ou localmente. A exportação de um teste faz o download de um arquivo blob. Para saber mais sobre o simulador e os casos de teste, consulte a documentação do simulador / casos de teste.
Antes de criar alguns casos de teste, vamos finalizar o restante do nosso agente virtual:
Como criar o fluxo de atendimento ao cliente
- Acesse o fluxo de Atendimento ao cliente e crie estas transições de intent:
Página (in-flow) | Rotas > Intent | Rotas > Transição para |
Início do atendimento ao cliente |
| Frete |
Início do atendimento ao cliente |
| Reembolso |
Início do atendimento ao cliente |
| Troca |
Início do atendimento ao cliente |
| Fluxo final |
Início do atendimento ao cliente |
| Encerrar sessão |
- Crie os seguintes fulfillments de entrada para a página Frete:
Shipping physical merchandise items can take up to 2 weeks.
Is there anything else I can help you with?
- Crie os seguintes cumprimentos de entrada para a página Reembolso:
We offer free returns and refunds. We provide one free return label for each order. You can use it within 30 days from receiving your order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.
Is there anything else I can help you with?
- Crie os seguintes fulfillments de entrada para a página Troca:
If you would like to change your item for a different one, please return your unwanted item and place a new order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.
Is there anything else I can help you with?
- Selecione a página Start e clique na intent
redirect.end
. Crie a seguinte conclusão:Thank you for contacting G-Records! Have a nice day!
- Selecione a página Start e clique na intent
redirect.home
. Crie a seguinte predefinição de parâmetro:restart = true
Criar casos de teste
- Clique no botão Test Agent no lado direito da tela.
Ao abrir o simulador pela primeira vez, é preciso selecionar um ambiente de agente e um fluxo ativo. Na maioria dos casos, é preciso usar o ambiente de rascunho e o fluxo inicial padrão.
- Tipo:
Hi
- Pergunta:
Which artists are signed with your label?
- Diga:
The Google Dolls
- Diga:
I am interested in buying a shirt
- Diga:
A t-shirt
- Diga:
Medium
- Agora clique no botão de salvar o caso de teste. que você encontra na parte de cima do simulador (ao lado da seta de refazer e do ícone de lixeira de redefinição).
- Informe os seguintes detalhes:
- Nome do caso de teste:
Buy Google Dolls t-shirt size M
- Tags: #catalog, #shirts, #t-shirt, #TheGoogleDolls
- Clique em Salvar.
Vamos criar mais casos de teste.
- Primeiro, apague a caixa de diálogo atual clicando no ícone Redefinir (caixa de thrash).
- Crie os seguintes casos de teste:
Compre a camiseta da Alice Googler:
>"Buy the Alice Googler t-shirt."
>"XL"
- Nome do caso de teste:
Buy the Alice Googler t-shirt
- Tags:
#catalog, #shirts, #t-shirt, #AliceGoogler
Comprar uma camiseta tamanho M: (o nome do artista não foi mencionado, mas você quer pular as páginas de visão geral das bandas, de produtos, de camisetas e de tamanhos de camisetas)
>"Buy a t-shirt size M"
>"The Google Fighters"
- Nome do caso de teste:
Buy a t-shirt size M
- Tags:
#catalog, #shirts, #t-shirt, #TheGoogleFighters
- Descrição: (Observe que o nome do artista não foi mencionado, mas você quer pular as páginas de visão geral das bandas, de produtos, de camisas e de tamanhos de camisas)
Compre a música "G's N' Roses". Isso vai pular a página de visão geral das bandas e dos produtos.
>"Purchase music of G's N' Roses"
>"Live"
>"CD"
- Nome do caso de teste:
Purchase music of G's N' Roses
- Tags:
#catalog, #music, #CD, #GsNRoses, #live
- Descrição: isso pula a página de visão geral das bandas e dos produtos.
Confira as informações de preço:
>"Which products"
>"Shirts"
>"What's the price difference?"
>"Longsleeve"
>"What does it cost?"
>"M"
>"The Google Dolls"
>"No"
>"Which bands"
>"The Gooo Fighters"
>"Music"
>"How much does it cost?"
>"Greatest Hits"
>"What's the price difference?"
>"Mp3"
>"No"
>"I want to buy the tour movie"
>"Alice Googler"
>"Yes"
- Nome do caso de teste:
Price info
- Tags:
#catalog, #music, #tourmovie, #shirts
- Descrição: testar informações de preço em vários pontos da caixa de diálogo
Testar casos de teste pré-gravados
- Selecione Gerenciar > Casos de teste no menu principal do Dialogflow à esquerda.
- Selecione todos os casos de teste e pressione o botão Run acima da tabela.
O Dialogflow CX vai executar todos os casos de teste selecionados com base na gravação que foi salva como "Caso de teste ouro". Se os resultados forem os mesmos de quando você a salvou, os testes serão aprovados. - Se algo mudou nos fluxos, como páginas que não estão configuradas corretamente ou intents que direcionaram você para as páginas erradas, os testes vão falhar.
- No simulador, faça a seguinte pergunta:
How long will shipping take?
- Anote o resultado e salve o caso de teste como
Shipping
com a tag:#shipping
. - Acesse o painel "Gerenciar > Casos de teste" e pressione o botão Run no canto superior direito da grade para executar apenas o caso de teste
Shipping
.
O teste será aprovado.
- Volte ao fluxo de atendimento ao cliente, selecione a página Start e clique no cabeçalho Routes.
Será exibida uma tela com uma grade que mostra todos os trajetos.
- Remova o
redirect.shipping.info route
. - Acesse o painel "Gerenciar > Casos de teste" e pressione o botão Run no canto superior direito da grade para executar apenas o caso de teste
Shipping
.
O teste vai falhar.
- Clique no teste com falha para conferir os detalhes.
Nesse caso, o teste falhou com a mensagem de erro abaixo:
Page: Page mismatch:
Expected: Shipping
Actual: Start Page
Isso acontece porque a página não existe mais no fluxo. Esperávamos a página Shipping
, mas não saímos da página Start
. ou os usuários finais receberiam uma mensagem alternativa.
Em outras palavras, essa é uma solicitação perdida, um resultado de teste falso negativo. O teste falhou. A página Frete era esperada, mas nada acontece ou uma mensagem de fallback é mostrada.
- Volte para o fluxo de atendimento ao cliente e adicione o
redirect.shipping.info
como uma rota de intenção à página Start. Não se esqueça de acessar a página Entrega e clicar em Salvar. - No simulador, registre o seguinte caso de teste:
I want to swap my item
e salve-o comoSwapping
#swapping
. - Abra Gerenciar > Intenções > redirect.refund.info e adicione a seguinte frase de treinamento:
I want to swap this item for a refund
Sem essa frase de treinamento, quando um usuário pedia a troca de um item para receber um reembolso, ele acessava a intent redirect.swapping.info, mas não queremos fornecer informações sobre a troca de itens, e sim sobre reembolsos.
- Crie o seguinte caso de teste dourado:
I want to swap this item for a refund
no simulador e salve-o comoSwap for Refund
#refund
. - Volte para a intent Gerenciar > Intents > redirect.refund.info e remova a linha
I want to swap this item for a refund
. - Volte para Gerenciar > Casos de teste, selecione o caso de teste Troca por reembolso e execute.
Seu teste mais recente falhou com a seguinte mensagem de erro:
If you would like to change your item for a different one, please return your unwanted item and place a new order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.`
Is there anything else I can help you with?
Page: Page mismatch:
Expected: Refund
Actual: Swapping
Em outras palavras, essa é uma solicitação mal compreendida, um resultado de teste falso positivo. O teste falhou. A página Refund era esperada, mas a página Swapping ficou ativa.
Cobertura
No Dialogflow CX, a cobertura de teste é uma medida usada para descrever o grau em que o diálogo do agente virtual (páginas e intents) é executado quando um conjunto de testes específico é executado. Um agente virtual com alta cobertura de teste, medida em porcentagem, teve mais diálogos executados durante o teste, o que sugere que ele tem uma chance menor de conter bugs não detectados (como solicitações não compreendidas) em comparação com um agente virtual com baixa cobertura de teste.
- Para visualizar um relatório de cobertura de teste para todos os casos de teste, clique em Cobertura.
- Clique na guia Transições.
Isso vai mostrar a cobertura de teste de todas as transições de página.
- Clique na guia Intents.
Isso vai mostrar a cobertura de teste de todas as intents.
Parabéns! Agora você já criou e testou um exemplo real completo de um bot de varejista. Vamos para a próxima página do laboratório para ler a conclusão e encontrar algumas referências úteis.
10. Conclusão
O Dialogflow CX é uma plataforma de IA de conversação (CAIP, na sigla em inglês) para criar agentes virtuais, como bots de chat ou de voz. O Dialogflow CX capacita sua equipe a acelerar a criação de experiências de conversação de nível empresarial com criadores de bots visuais, intents reutilizáveis e a capacidade de lidar com conversas em vários turnos.
Neste codelab, você aprendeu a criar um agente virtual de varejo do mundo real. Abordamos os seguintes conceitos:
- Fluxos
- Parâmetros, entidades personalizadas e do sistema
- Pages
- Processadores de estado, como rotas de intent e de condição
- Mensagens de fulfillment estáticas e respostas condicionais
- Intents substitutas
- Simulador, casos de teste e cobertura
Referências
Para saber mais sobre o Dialogflow CX, confira os blogs e a documentação a seguir.