1. Antes de comenzar
En este codelab, aprenderás a compilar un chatbot de venta minorista con Dialogflow CX, una plataforma de IA conversacional (CAIP) para compilar IUs conversacionales. Dialogflow CX puede implementar agentes virtuales, como chatbots, bots de voz y puertas de enlace telefónicas, y admite varios canales en más de 50 idiomas diferentes.
En este codelab, aprenderás a compilar un chatbot de sitio web para una tienda minorista. La empresa ficticia para la que estamos compilando el chatbot se llama G-Records. G-Records es un sello discográfico de rock con sede en California. El sello tiene 4 bandas de rock contratadas: Alice Googler, G's N' Roses, The Goo Fighters y The Google Dolls. G-Records vende artículos de la banda a todos los fanáticos del rock.
Al final de este codelab, podrás usar el chatbot para pedir camisetas o música, o bien para preguntar sobre tu pedido.
Qué aprenderás
Aprenderás los beneficios de Dialogflow CX en comparación con Dialogflow ES a través de la práctica. Incluye los siguientes conceptos:
- Cómo crear un agente virtual de Dialogflow CX en Google Cloud
- Aprende a crear flujos
- Aprende a crear entidades
- Aprende a crear intents
- Aprende a crear páginas y páginas de transición con controladores de estado
- Aprende a realizar transiciones de páginas con rutas de intents
- Obtén información para realizar transiciones de páginas con parámetros y rutas de condición
- Obtén más información para mostrar respuestas condicionales con funciones del sistema
- Más información para crear mensajes de resguardo
- Aprende a usar el simulador
- Aprende a crear casos de prueba y cobertura de pruebas
El diseño final del agente de Dialogflow CX se verá de la siguiente manera:
Requisitos
- Para crear un agente de Dialogflow CX, necesitarás una dirección de Gmail o Google Identity.
- Acceso a Google Cloud
2. Configuración del entorno
Crea un proyecto de Google Cloud
Dado que Dialogflow CX se ejecuta en Google Cloud, debes crear un proyecto de Google Cloud. En él, se organizan todos tus recursos de Google Cloud. Consiste en un conjunto de colaboradores, APIs habilitadas (y otros recursos), herramientas de supervisión, datos de facturación y controles de autenticación y acceso.
Cuando crees un proyecto nuevo, deberás ingresar un Nombre del proyecto. Además, deberás vincularlo a una cuenta de facturación y una organización existentes.
Se usa una cuenta de facturación para definir quién paga por un conjunto determinado de recursos y puede vincularse a uno o más proyectos. El uso del proyecto se cobra a la cuenta de facturación vinculada. En la mayoría de los casos, configuras la facturación cuando creas un proyecto. Para obtener más información, consulta la documentación de facturación. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud.
Habilita la API de Dialogflow
Para usar Dialogflow, tendrás que habilitar la API de Dialogflow en tu proyecto.
- Selecciona el proyecto para el que deseas habilitar la API y haz clic en Continuar.
- Contrae el menú de APIs y servicios y haz clic en Crear credenciales.
- Haz clic en Datos de la aplicación.
- Di No, no los uso, ya que por el momento no usas Kubernetes Engine, App Engine ni Cloud Functions.
- Haga clic en Listo.
Crea un agente de Dialogflow CX nuevo
Para crear un nuevo agente de Dialogflow CX, primero abre la consola de Dialogflow CX:
- Elige el proyecto de Google Cloud que creaste anteriormente.
- Haz clic en Create Agent.
Completa el formulario de configuración básica del agente:
- Puedes elegir cualquier nombre visible.
- Como ubicación, elige us-central1.
- Selecciona tu zona horaria preferida.
- Selecciona en - English como idioma predeterminado.
Haz clic en Crear.
Muy bien, ya está todo listo. Por fin, podemos comenzar a modelar nuestro agente virtual.
3. Flows
Los diálogos complejos suelen incluir varios temas de conversación. En el caso del chatbot que estamos creando para G-Records, para vender artículos de la banda, tendríamos diálogos sobre el catálogo de productos, el pago, el estado de los pedidos y las preguntas de atención al cliente. Podríamos dividir estos temas de conversación en flujos.
Los flujos permiten que los equipos trabajen en rutas de conversación individuales. Una buena práctica sería simplificar el flujo, para que se ajuste fácilmente a una pantalla y sea más modular.
Los flujos son un concepto nuevo para Dialogflow CX. Dialogflow Essentials tiene el concepto de agentes combinados, que son de alguna manera similares a los flujos. Sin embargo, usarías los flujos con mucha más frecuencia.
Más adelante en este lab, usaremos controladores de estado que pueden finalizar un flujo (para que vuelva al flujo siguiente o anterior), o bien puedes finalizar la sesión completa del agente.
Vamos a crear algunos flujos.
Cómo crear flujos
- En Dialogflow CX, haz clic en el ícono + > Crear flujo.
- Especifica el nombre:
Catalog
y presiona Intro.
Se creó tu primer flujo Catalog. Ahora, crea los otros flujos:
Order Process
My Order
Customer Care
Más adelante en este lab, configuraremos controladores de estado de la página, lo que garantizará que, en última instancia, la visualización se vea de la siguiente manera:
Simulador
En el lado derecho de la consola de Dialogflow CX, puedes probar el agente virtual con el simulador integrado. Puedes probar la conversación desde el principio o desde un flujo en particular.
- Haz clic en el botón Test Agent, en la parte superior derecha de la pantalla.
- En el campo de conversación con el agente, escribe lo siguiente:
Hello
El agente virtual responderá con un texto de bienvenida predeterminado: Saludos. ¿Cómo puedo ayudarte?
Modifiquemos este texto de bienvenida predeterminado.
Flujo de inicio predeterminado
Comencemos por crear una ruta de intents que se activará una vez que saludes al agente virtual.
- En la barra lateral izquierda Build > Flows, haz clic en Default Start Flow y selecciona el nodo del árbol Start.
Se abrirá la página Inicio. Se seleccionó automáticamente la página Inicio, en la sección de la barra lateral Build > Pages.
- En Start > Routes, haz clic en Default Welcome Intent.
Un intent categoriza la intención del usuario final para un turno de conversación. En Dialogflow CX, los intents pueden ser parte de un controlador de estado para enrutar la siguiente página activa o entrega.
- Quita todas las entradas El agente dice y agrega este texto nuevo:
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 optimizar la conversación, también necesitaremos algunos botones de respuesta rápida o chips de sugerencias.
- Haz clic en Agregar opción de diálogo > Carga útil personalizada y usa el siguiente fragmento de código.
- Usa el siguiente fragmento de código como carga útil personalizada y haz clic en Guardar.
Para obtener más información sobre las cargas útiles personalizadas, consulta la documentación.
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Which artists?"
},
{
"text": "Which products?"
},
{
"text": "About my order..."
}
]
}
]
]
}
- Prueba el intent de bienvenida en el simulador.
Es probable que te preguntes por qué no puedes ver ningún contenido enriquecido. Esto se debe a que el contenido enriquecido, como los chips de sugerencias, depende de una integración. Los siguientes pasos requieren una cuenta de facturación, pero puedes omitirlos si no tienes una.
- En la barra lateral izquierda, haz clic en Administrar > Integraciones.
- Elige Dialogflow Messenger y haz clic en Conectar.
- En la ventana emergente, haz clic en Habilitar.
Se mostrará otra ventana emergente, esta vez con el código JavaScript de integración que puedes pegar en tu sitio web para integrar el componente de Dialogflow Messenger en él. Como aún no tenemos un sitio web, probaremos el agente virtual directamente en la herramienta.
- Haz clic en el vínculo Probar ahora.
- Haz clic en el ícono del chatbot de la esquina inferior derecha para abrir la ventana de chat. Escribe
Hello
para iniciar la conversación.
Por ahora, cuando hagas clic en los chips de sugerencias, el agente virtual no entenderá lo que quieres decir. Esto se debe a que nuestro agente virtual aún no cambia de estado. Podemos hacerlo en Dialogflow CX con páginas. Continuemos con el lab. Primero, crearemos algunas entidades y intents.
4. Tipos de entidad
Los tipos de entidades se usan para controlar cómo se extraen los datos de la entrada del usuario final. Los tipos de entidades de Dialogflow CX son muy similares a los de Dialogflow ES. Dialogflow proporciona entidades del sistema predefinidas que pueden detectar coincidencias con muchos tipos de datos comunes. Por ejemplo, hay entidades del sistema que detectan coincidencias con fechas, horas, colores, direcciones de correo electrónico, etcétera. También puedes crear tus propias entidades personalizadas para detectar coincidencias en datos personalizados.
Comencemos por preparar todas las entidades personalizadas antes de diseñar las páginas en un flujo. Crearemos las siguientes entidades:
Cómo crear entidades
Creemos una entidad Artist.
- Haz clic en Administrar > Tipos de entidades.
- Haz clic en + Crear.
- Nombre visible:
Artist
- Entidades:
The Google Dolls
(con sinónimo:Google Dolls
)The Goo Fighters
(con sinónimo:Goo Fighters
)G's N' Roses
(con sinónimo:Gs and Roses
)Alice Googler
- Haz clic en Opciones avanzadas y marca Coincidencia parcial. (Si escribes mal el nombre de la banda, es posible que aún coincida con la entidad correcta).
- En Opciones avanzadas, también marca Ocultar en el registro. (Si escribes mal el nombre de la banda, se corregirá en el registro).
- Haga clic en Guardar.
También necesitaremos una entidad para el artículo Merch:
- Haz clic en Administrar > Tipos de entidades.
- Haz clic en + Crear.
- Nombre visible:
Merch
- Entidades:
T-shirt
Longsleeve
(con sinónimo:Longsleeve shirt
)Tour Movie
Digital Album
(con sinónimo:MP3 Album
,MP3
)CD
(con sinónimosDisc
,Physical CD
)
- Haga clic en Guardar.
También necesitaremos una entidad para el álbum:
- Haz clic en Administrar > Tipos de entidades.
- Haz clic en + Crear.
- Nombre visible:
Album
- Entidades:
Live
Greatest Hits
(con sinónimo:Hits
)
- Haga clic en Guardar.
También necesitaremos una entidad para los talles de ropa:
- Haz clic en Administrar > Tipos de entidades.
- Haz clic en + Crear.
- Nombre visible:
ShirtSize
- Entidades:
XS
(con sinónimo:Extra Small
)S
(con sinónimo:Small
)M
(con sinónimo:Medium
)L
(con sinónimo:Large
)XL
(con sinónimo:Extra Large
)2XL
(con sinónimo:Extra Extra Large
)3XL
- Haga clic en Guardar.
Y una entidad para los números de pedido, que suelen ser 4 alfanuméricos y 3 números. (como ABCD123)
- Haz clic en Administrar > Tipos de entidades.
- Haz clic en + Crear.
- Nombre visible:
OrderNumber
- Entidades de expresión regular
- Entidad: [A-Z]{4}[0-9]{3}
- Haga clic en Guardar.
La configuración de tu entidad debería ser similar a la siguiente:
@Artista:
@Merch:
@Álbum:
@ShirtSize:
@NúmerodePedido:
Una vez que las entidades personalizadas estén preparadas, podremos preparar los intents. Continuemos con el lab.
5. Intents
Un intent clasifica la intención de un usuario final para un turno de conversación. Se simplificaron de forma significativa en Dialogflow CX y ya no son un componente básico para el control de la conversación. Dialogflow CX solo usa intents para hacer coincidir lo que dicen los usuarios. En Dialogflow ES, debías vincular todo a un intent (parámetros, eventos, entrega, etc.). Los intents de Dialogflow CX solo contienen frases de entrenamiento y, por lo tanto, se pueden volver a usar. Ya no controla la conversación. Por lo tanto, el proceso de creación de intents será sencillo:
Las frases de entrenamiento en los intents pueden usar entidades para extraer entradas "variables". Por eso, es recomendable crear tus tipos de entidades con anticipación, lo que hicimos en la página anterior de pasos del lab.
Crear intents
Comencemos por preparar todos los intents antes de poder diseñar las páginas en un flujo.
- Haz clic en Administrar > Intents.
- Haz clic en + Crear.
Usa los siguientes detalles:
- Nombre visible:
redirect.artists.overview
- Descripción
Artists overview: The bands supported by the label
Desplázate hacia abajo y crea las siguientes frases de entrenamiento:
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
- Haz clic en Guardar.
- Ahora, continuemos y creemos todos los demás intents. Usa tu imaginación para crear más frases de entrenamiento. Una práctica recomendada sería tener al menos 10 frases de entrenamiento por intent para abarcar las diferentes formas en que un usuario podría activar ese intent. A los fines de este lab, tener menos también debería estar bien.
Ten en cuenta lo siguiente:
- Ten en cuenta que, a medida que ingreses tu frase de entrenamiento, Dialogflow CX anotará automáticamente tus entidades. Si no lo hace, es posible que debas actualizar tu entidad (agregar un sinónimo) o anotar la frase de entrenamiento de forma manual.
- Frases de entrenamiento más cortas: El sistema de NLU de Dialogflow también puede funcionar con frases de entrenamiento más cortas. Aquí te proporcionamos algunos ejemplos.
- Sobreentrenamiento: Si hay demasiadas frases de entrenamiento para un intent, es posible que se produzca un sobreentrenamiento y un resultado menos deseado. Se recomienda usar pruebas iterativas e incrementales, y agregar frases de entrenamiento en caso de que no haya un intent que coincida.
Nombre visible | Frases de entrenamiento |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ahora que nuestros elementos reutilizables (flujos, entidades e intents) están preparados, podemos crear páginas y controladores de estado para combinarlos.
6. Páginas y controladores de estado
Una conversación de Dialogflow CX (una sesión) se puede describir y visualizar como una máquina de estados finitos. Tomemos una máquina expendedora como ejemplo. Se podría modelar como una máquina de estado finito. Tiene los siguientes estados: Esperar monedas, Elegir caramelo, Dar caramelo y, dado un conjunto de entradas, se mueve entre esos estados. Por ejemplo, insertar una moneda mueve la máquina expendedora de Esperar monedas a Elegir dulces. Las páginas son la forma en que podemos modelar estos estados para un agente virtual de Dialogflow CX.
Cuando un usuario final interactúa con Dialogflow CX en una conversación, la conversación se mueve de una página a otra, de manera que, en cualquier momento determinado, solo una página es la actual, la actual se considera activa y también el flujo asociado con esa página.
Para cada flujo, puedes definir muchas páginas en las que tus páginas combinadas pueden manejar una conversación completa sobre los temas para los que se diseñó el flujo. Cada flujo tiene una página de inicio especial. Cuando se activa un flujo inicialmente, la página de inicio se convierte en la página actual. En cada turno de la conversación, la página actual se mantendrá igual o pasará a otra página. Este concepto te permitirá crear agentes más grandes con muchas páginas y varios turnos de conversación.
Las páginas contienen entregas (diálogos de entrada estática o webhooks), parámetros y controladores de estado. El control de la conversación se realiza a través de controladores de estado, lo que te permite crear varias rutas de transición para pasar a otra página de Dialogflow CX, incluso hacerla condicional (para la ramificación de conversaciones).
El estado de una conversación se controla mediante el control de las transiciones entre páginas con tres tipos diferentes de rutas:
- Rutas de intents: Cuando se debe hacer coincidir un intent (p. ej., cambiar de página según lo que diga un usuario final). (Líneas azules en el diagrama visual).
- Rutas de condición: Indica cuándo se debe verificar una condición (p.ej., cambiar de página en función de ciertos parámetros almacenados en la sesión) (líneas naranjas en el diagrama visual).
- Controladores de eventos: Cuando se debe controlar un evento de resguardo determinado (p. ej., no se controla ninguna entrada, no hay coincidencias, para desambiguar al usuario final en una ruta de intent o condición) (líneas verdes en el diagrama visual).
Los enunciados de la conversación (es decir, el contenido o la respuesta al usuario) se definen por entrega, que puede ser estática o dinámica:
- Entrega estática: Cuando se proporciona una respuesta de entrega estática
- Entrega dinámica: Cuando se llama a un webhook de entrega para respuestas dinámicas
Para nuestro bot de venta minorista, crearemos algunas rutas de intent y proporcionaremos algunas respuestas de entrega de entrada estática, que se presentarán al usuario en cuanto se active una página. Más adelante, crearemos parámetros con rutas de condiciones para recopilar la información que necesitarás para realizar un pedido de artículos.
Rutas de intents de la página
Cómo crear las páginas en el flujo de inicio predeterminado
Este es un diagrama de flujo del flujo de inicio predeterminado:
Hagamos clic aquí:
- Haz clic en Build > Default Start Flow.
- Haz clic en la página principal.
- Haz clic en el ícono + junto a Rutas.
- Agrega redirect.artists.overview.
- Desplázate hacia abajo hasta Transition y realiza la transición al flujo de Catalog.
- Haz clic en Guardar.
- Repite los pasos anteriores para
redirect.product.overview
y las otras 11 filas de esta tabla:
Página (en el flujo) | Rutas > Intent | Rutas > Transición a |
Iniciar |
| - |
Iniciar |
| Flujo: Catálogo |
Iniciar |
| Flujo: Catálogo |
Iniciar |
| Flujo: Catálogo |
Iniciar |
| Flujo: Catálogo |
Iniciar |
| Flujo: Catálogo |
Iniciar |
| Flujo: Catálogo |
Iniciar |
| Flujo: Atención al cliente |
Iniciar |
| Flujo: Atención al cliente |
Iniciar |
| Flujo: Atención al cliente |
Iniciar |
| Flujo: Mi pedido |
Iniciar |
| Flujo: Mi pedido |
Iniciar |
| Flujo: Mi pedido |
Iniciar |
| Página: Finalizar sesión |
El flujo de inicio predeterminado funcionará como un menú de opciones cuando llames a un centro de llamadas. Sin embargo, en este agente virtual, se entrena con lenguaje natural, con las frases de entrenamiento en intents. Por lo tanto, la interacción se basa en la conversación y no en las opciones de DTMF, y es más natural y humana.
Crea las páginas en el flujo de catálogo
La siguiente transcripción de chat pertenece al flujo de 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?"
El diálogo será diferente cuando elijas Música o Película de la gira. En el caso de la música, el diálogo se verá así:
> "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?"
En el caso de la película de la visita, el diálogo se verá de la siguiente manera:
> "Tour Movie"
"The Tour Movie of G's N' Roses costs $25. Shall I continue to order?
Este es un diagrama de flujo de todas las páginas del flujo de catálogo:
Observa la complejidad de este flujo:
- Podría omitir la pregunta sobre los artistas y preguntar de inmediato "¿Qué artículos de merchandising están disponibles?".
- Desde el flujo de inicio predeterminado, puedo preguntar: "Quiero comprar la camiseta de The Google Dolls" o "Quiero comprar algo". Esto significa que el agente virtual hará preguntas de seguimiento para completar los espacios de estos parámetros obligatorios. Te lleva directamente a la página del producto.
- El diálogo Precio proviene de la página Precio que se reutilizará.
- Aunque el diálogo de la película de la visita parece ser el más simple, en realidad haremos algo especial con él. Volveremos a utilizar esta parte del diálogo para que los usuarios finales también puedan ingresarla directamente en uno de los otros productos, si especializan toda la información a la vez:
> "I want The Goo Fighters longsleeve size S."
"The longsleeve of The Goo Fighters size S costs $30. Shall I continue to order?"
Primero, comencemos con la conexión de las páginas.
- Haz clic en Compilación > Catálogo.
- Haz clic en la página de inicio.
- Haz clic en el ícono + junto a Rutas.
- Agrega redirect.artists.overview
- Desplázate hacia abajo hasta Transición, selecciona Página y elige + Página nueva.
- Usa el nombre de la página:
Artist Overview
y presiona Guardar.
Ahora, terminemos el resto del flujo:
- Los pasos anteriores se pueden repetir con las siguientes páginas, intents y entregas. Toma el control de esta tabla. Página (Page) es la página que seleccionarás en el flujo; Rutas > Transición a (Routes > Transition To) es la página o el nuevo flujo que crearás y a la que harás la transición.
Página (en el flujo) | Rutas > Intent | Rutas > Transición a |
Inicio del catálogo |
| Descripción general del artista |
Inicio del catálogo |
| Producto |
Inicio del catálogo |
| Descripción general del producto |
Inicio del catálogo |
| Descripción general del producto |
Inicio del catálogo |
| Camisas |
Inicio del catálogo |
| Música |
Inicio del catálogo |
| Cerrar sesión |
Inicio del catálogo |
| Finalizar flujo |
Descripción general del artista |
| Descripción general del producto |
Ahora continuemos y agreguemos más entregas estáticas.
- En el flujo de catálogo, haz clic en la página Descripción general del artista.
- Haz clic en Editar entrega en la sección Entrega de entradas.
- Usa las siguientes entregas estáticas (Agent says):
The following bands are signed with G-Records: Alice Googler, G's N' Roses, The Goo Fighters and The Google Dolls.
- Haga clic en Guardar.
- En el flujo de catálogos, haz clic en la página Descripción general de productos.
- Haz clic en Editar entrega en la sección Entrega de entradas.
- Usa la siguiente entrega estática (el agente dice):
We sell shirts, music or the tour movie.
- Haga clic en Guardar.
Parámetros de página
Los parámetros se usan para capturar y hacer referencia a los valores que proporcionó el usuario final durante una sesión. Cada parámetro tiene un nombre y un tipo de entidad. @Artist
y @Merch
son los parámetros mínimos que debemos recopilar para realizar un pedido de artículos promocionales. En el caso de las camisetas o las camisas de manga larga, también debes recopilar @ShirtSize
y, en caso de que quieras pedir música, también necesitarás un nombre @Carrier
y @Album
.
Esos parámetros deberán marcarse como obligatorios. Una vez que sea necesario, te recomendamos que proporciones instrucciones personalizadas para recordar a tu usuario final y proporcionar las respuestas correctas para que se puedan recopilar estos parámetros. Existen algunos mecanismos en Dialogflow CX que pueden ayudarte con esto.
Por ejemplo, puedes proporcionar mensajes de entrega estática personalizados en la sección Parámetro. Si el parámetro es obligatorio, se mostrarán estas entregas de parámetros. Estos mensajes de respuesta se agregarán a la cola de respuestas. Durante el turno de un agente, es posible (y, a veces, conveniente) llamar a varias entregas, cada una de las cuales puede generar un mensaje de respuesta. Dialogflow mantiene estas respuestas en una cola de respuestas. Para obtener más información sobre el ciclo de vida de la página y el orden en que se agregarán estas entregas a la cola de respuestas, consulta la documentación de la página de Dialogflow CX.
Cómo crear los parámetros en la página Resumen del artista
Definiremos algunos parámetros de página:
- En el flujo del catálogo, haz clic en la página Descripción general del artista.
- Haz clic en el botón + en el bloque Parameters. Agrega el parámetro artist:
- Nombre visible:
artist
- Tipo de entidad:
@Artist
- Obligatorio: Marca
- Ocultar en el registro: Verificar
- Ahora agregaremos algunos mensajes de entrega de parámetros personalizados. Si el agente virtual aún no recopiló el parámetro artist, el usuario final recibirá esta respuesta del agente agregada a la cola de respuestas:
From which of these artists would you like to order merchandise?
- Se agregó una segunda opción de diálogo que proporcione chips de sugerencias enriquecidos. Haz clic en Agregar opción de diálogo y usa este código (en JSON):
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
Es posible controlar diferentes mensajes de entrega de resguardo en función de la cantidad de intentos que el usuario final intentó responder. Para ello, puedes usar los controladores de eventos de parámetros. Hay varios controladores de eventos integrados para elegir, como Parámetros no válidos, Frases demasiado largas, Sin entrada, Sin entrada 1er intento, 2º intento o Sin coincidencia. La diferencia entre la falta de entrada y la falta de coincidencia es que, si no hay entrada, el usuario nunca proporcionó una respuesta. En cambio, si no hay coincidencia, el usuario sí proporcionó una respuesta, pero Dialogflow CX no pudo establecer una coincidencia que coincida con una página.
- Desplázate hacia abajo hasta la sección Controladores de eventos de solicitud nuevas.
- Haz clic en Agregar controlador de eventos y selecciona el evento:
No-match default
. - Usa el siguiente envío de texto estático del 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?
- Haga clic en Guardar.
- Haz clic en Agregar controlador de eventos y selecciona el evento:
No-input default
. - Usa el siguiente evento estático de entrega de texto:
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?
- Haga clic en Guardar.
Rutas de condición de la página
Los parámetros son muy potentes en combinación con las rutas condicionales de la página. Cuando una condición se evalúa como verdadera, se llamará a la ruta de la página asociada. Una condición puede ser Un parámetro es igual a un valor específico, No puede faltar un parámetro, Un formulario que se completó y muchas más. Puedes encontrar más información sobre los Parámetros y las Condiciones en la documentación de Dialogflow CX.
Para nuestro agente virtual de venta minorista, necesitaremos recopilar una secuencia de parámetros, por lo que deberemos crear una condición para verificar si se completó un "formulario". Un formulario es una lista de parámetros que se deben recopilar del usuario final de la página. El agente virtual interactúa con el usuario final durante varios turnos de conversación hasta que haya recopilado todos los parámetros del formulario necesarios, que también se conocen como parámetros de página.
Dialogflow CX establece automáticamente los valores de parámetros proporcionados por el usuario final durante el proceso para completar formularios. Para verificar si se completó el formulario actual de la página, usa la siguiente condición: $page.params.status = "FINAL"
Crea las rutas condicionales en la página Resumen del artista
Crear una ruta condicional que realice la transición a la siguiente página una vez que se conozca el artista:
- En la página Descripción general del artista, haz clic en el ícono + en la sección Rutas.
- Desplázate hacia abajo hasta la sección Condición.
- Selecciona Al menos uno (O).
- A continuación, escribiremos una expresión que
- Parámetro:
$page.params.status
- Operador:
=
- Valor:
"FINAL"
- Ahora, crearemos un mensaje de entrega estático específico en la ruta para confirmar la elección del usuario final. Desplázate hacia abajo hasta el bloque Fulfillment y escribe los siguientes mensajes de entrega:
$session.params.artist, great choice! Rock on!
You want to rock with $session.params.artist merchandise. Awesome!
- Cuando la condición sea verdadera, debes realizar la transición a la página Descripción general del producto. Desplázate hacia abajo hasta la sección Transition y usa la siguiente página:
Product Overview
- Haga clic en Guardar.
Crea las rutas en la página Descripción general del producto
Ahora que sabemos cómo crear parámetros y rutas condicionales, creemos más parámetros para las siguientes páginas:
Descripción general del producto
- Crea el parámetro
artist
en la página Descripción general del producto:
- Nombre visible:
artist
- Tipo de entidad:
@Artist
- Obligatorio: Marca
- Ocultar en el registro: Verificar
- Entrega de la instrucción 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"
}
]
]
}
- Controlador 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?
- Carga útil personalizada:
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- Controlador 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?
- Carga útil personalizada:
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- Crea el parámetro
merch
:
- Nombre visible:
merch
- Tipo de entidad:
@Merch
- Obligatorio: Marca
- Ocultar en el registro: Verificar
- Entrega:
Which merchandise item do you want?
- Haz clic en Add dialogue option > Custom payload:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- Controlador de eventos >
No-match default
- Entrega del controlador de eventos:
We sell Shirts, Music or the Tour movie. Which of these items do you want?
- Carga útil personalizada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- Controlador de eventos >
No-input default
- Entrega del controlador 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?
- Carga útil personalizada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- Crea una ruta que realice la transición a la página Producto cuando se proporcione
artist
y el elementomerch
.
- Condición:
- Coincide con todas las reglas (Y)
- Expresión:
$session.params.artist != null
- Expresión:
$session.params.merch != null
- Entrega:
Alright! $session.params.merch of $session.params.artist, let's go!
- Transición: Página:
Product
- Crea una ruta para cuando el usuario diga "Camisas"
- Intención: redirect.shirts
- Transición: página:
Shirts
- Crea una ruta para cuando el usuario diga “Música”.
- Intent: redirect.music
- Transición: Página:
Music
- Crea una ruta para cuando el usuario solicite información sobre el precio
- Intent: redirect.price
- Transición: Crear página nueva:
Price
Cuando hayas establecido la configuración anterior, verás una visualización similar a la que se muestra a continuación. Ten en cuenta que las rutas de intents son azules en el diagrama y las rutas de condiciones son naranjas. Si bien no se muestran, los controladores de eventos son verdes y, cuando varios tipos de ruta de acceso realizan la transición a una página, la línea será gris.
Hasta ahora, aprendiste a crear flujos, entidades, intents y páginas con controladores de estado, como rutas de intents y rutas condicionales basadas en parámetros. Más adelante en este lab, usaremos la ramificación condicional en la entrega para proporcionar diferentes diálogos según la entrada.
Puedes usar las siguientes configuraciones para finalizar nuestro agente virtual.
Página Camisas:
- Crea las siguientes configuraciones en la página Camisas:
- Entrega de entrada:
Do you want a longsleeve or a t-shirt?
- Carga útil personalizada de entrega de entradas:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
},
{
"text": "Price?"
}
]
}
]
]
}
- Crea una ruta de intents:
redirect.price
con una transición a la páginaPrice
. - Crea el siguiente parámetro:
- Parámetro:
merch
- Tipo de entidad:@Merch
,Required
yRedact in log
- Parámetro > Controlador de eventos >
No-match default
- Parámetro > Entrega del controlador de eventos:
You can choose between a t-shirt or a longsleeve. Which of these do you want?
- Parámetro > Entrega del controlador de eventos Carga útil personalizada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
}
]
}
]
]
}
- Parámetro > Controlador de eventos >
No-input default
- Parámetro > Entrega del controlador de eventos:
I couldn't understand if you want the t-shirt or the longsleeve. Which of these do you want?
- Parámetro > Entrega del controlador de eventos Carga útil personalizada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
}
]
}
]
]
}
- Haz clic en la entrega de entrada y desplázate hacia abajo hasta Parámetros predeterminados. Cada vez que se active la página Camisas, el parámetro de categoría se establecerá en shirts:
Parámetro | Valor |
|
|
- Agrega una ruta condicional:
- Coincide con AL MENOS UNA regla (O)
- Expresión:
$session.params.merch = "T-shirt"
- Expresión:
$session.params.merch = "Longsleeve"
- Transición a una página nueva:
Shirt Size
Página de precios:
Dado que los mensajes de precios dependerán del artículo o la categoría de artículos promocionales elegidos (música o camisetas), corregiremos esta parte más adelante en el lab. Por ahora, es más que suficiente con ingresar un marcador de posición.
- Crea la siguiente configuración en la página Precio:
- Entrega de entrada:
PRICE TODO
Como puedes solicitar el precio desde varios lugares de la conversación, siempre deberías recibir una respuesta y volver a la parte anterior del diálogo para continuar con el pedido. Hay 5 lugares en el árbol de diálogo en los que puedes bifurcarte para obtener información sobre los precios. (Camisa, Talla de camisa, Música, Operador y también directo a través de una ruta de intent), por lo que necesitaremos algunas rutas condicionales para volver:
- Agrega una ruta condicional:
- Coincide con todas las reglas (Y)
- Expresión:
$session.params.category = "shirts"
- Expresión:
$session.params.merch = "null"
- Transición a una página nueva:
Shirts
- Agrega una ruta condicional:
- Coincide con todas las reglas (Y)
- Expresión:
$session.params.category = "shirts"
- Expresión:
$session.params.size = "null"
- Transición a una página nueva:
Shirt Size
- Agrega una ruta condicional:
- Coincide con todas las reglas (Y)
- Expresión:
$session.params.category = "music"
- Expresión:
$session.params.album = "null"
- Transición a una página nueva:
Music
- Agrega una ruta condicional:
- Coincide con todas las reglas (Y)
- Expresión:
$session.params.category = "music"
- Expresión:
$session.params.merch = "null"
- Transición a una página nueva:
Carrier
- Agrega una ruta condicional:
- Coincide con todas las reglas (Y)
- Expresión:
$session.params.category = "null"
- Transición a una página nueva:
Product Overview
Página de tallas de camisetas:
- Crea la siguiente configuración en la página Shirt Size:
- Entrega de entrada:
What shirt size do you want?
- Carga útil personalizada de entrega de entradas:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- Crea una ruta de intent:
redirect.price
con una transición a la páginaPrice
. - Crea el siguiente parámetro:
- Parámetro:
shirtsize
- Tipo de entidad:@ShirtSize
-Required
,Redact In Log
- Parámetro > Controlador de eventos >
No-match default
- Parámetro > Entrega del controlador de eventos:
Please tell me the shirt size, such as XL.
- Parámetro > Entrega del controlador de eventos Carga útil personalizada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- Parámetro > Controlador de eventos >
No-input default
- Parámetro > Entrega del controlador de eventos:
I couldn't understand the shirt size. What size do you want?
- Parámetro > Entrega del controlador de eventos Carga útil personalizada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- Agrega una ruta condicional:
- Coincidir con todas las reglas (Y)
- Expresión:
$page.params.shirtsize != "null"
- Transición a la página:
Product
Página de música:
- Crea la siguiente configuración en la página Music:
- Entrega de entrada:
We have a Greatest Hits Album or the Live Album. Which one do you want?
- Carga útil personalizada de entrega de entradas:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
},
{
"text": "Price?"
}
]
}
]
]
}
- Crea una ruta de intents:
redirect.price
con una transición a la página:Price
. - Crea el siguiente parámetro:
- Parámetro:
album
- Tipo de entidad:@Album
-Required
,Redact In Log
- Parámetro > Controlador de eventos >
No-match default
- Parámetro > Entrega del controlador de eventos:
You can choose between Greatest Hits and Live Album. Which of these do you want?
- Parámetro > Entrega del controlador de eventos Carga útil personalizada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
}
]
}
]
]
}
- Parámetro > Controlador de eventos >
No-input default
- Parámetro > Entrega del controlador de eventos:
I couldn't understand if you want the album: Greatest Hit or Live. Which of these do you want?
- Parámetro > Entrega del controlador de eventos Carga útil personalizada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
}
]
}
]
]
}
- Haz clic en la entrega de entradas y desplázate hacia abajo hasta Parámetros predefinidos. Cada vez que la página Música esté activa, el parámetro de categoría se establecerá en music:
Parámetro | Valor |
|
|
- Agrega una ruta condicional:
- Coincide con todas las reglas (Y)
- Expresión:
$page.params.album != "null"
- Transición a la página:
Carrier
Página del operador:
- Crea la siguiente configuración en la página Operador:
- Entrega de entrada:
Do you want this album on CD or MP3?
- Carga útil personalizada de entrega de entradas:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "MP3"
},
{
"text": "Price?"
}
]
}
]
]
}
- Crea una ruta de intents:
redirect.price
, que realiza la transición a la páginaPrice
. - Crea el siguiente parámetro:
- Parámetro:
merch
- Tipo de entidad:@Merch
-Required
,Redact In Log
- Parámetro > Controlador de eventos >
No-match default
- Parámetro > Entrega del controlador de eventos:
Do you want a physical CD or the digital album?
- Parámetro > Entrega del controlador de eventos: Carga útil personalizada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "Digital Album"
}
]
}
]
]
}
- Parámetro > Controlador de eventos >
No-input default
- Parámetro > Entrega del controlador de eventos:
I couldn't understand if you mean CD or MP3. Which one do you want?
- Parámetro > Entrega del controlador de eventos: Carga útil personalizada:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "MP3"
}
]
}
]
]
}
- Agrega una ruta condicional:
- Coincide con todas las reglas (Y)
- Expresión:
$page.params.merch != "null"
- Transición a la página:
Product
Página del producto:
- Crea los siguientes parámetros:
Nombre visible del parámetro | Tipo de entidad de parámetro | Verificaciones |
|
| Obligatorio, Ocultar en el registro |
|
| Obligatorio, Ocultar en el registro |
- El parámetro artist necesita la siguiente entrega del mensaje inicial, que se mostrará cuando no se conozca el artista.
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"
}
]
]
}
- También agrega un controlador de eventos
No-input default
con entrega:I couldn't understand what you just said. Ask me which artists are signed.
- Y un controlador de eventos
No-match default
con entrega:I missed that. Please ask me which artists are signed.
- El parámetro merch también necesita controladores de eventos de solicitud nueva.
- Agrega un controlador de eventos
No-input default
con entrega:I couldn't understand what you just said. Which merchandise item do you want?
- Y un controlador de eventos
No-match default
con entrega:I missed that. Which merchandise item do you want?
La siguiente ruta pasará a la página de confirmación cuando el artista sea conocido y el usuario elija una “Película de la gira”.
- Agrega una ruta condicional:
- Coincide con todas las reglas (Y)
- Expresión:
$session.params.artist != null
- Expresión:
$session.params.merch = "Tour Movie"
- Agrega un parámetro a los ajustes predeterminados de parámetros >
price = 25
- Transición a una página nueva:
Confirmation
La siguiente ruta pasará a la página de confirmación cuando el artista sea conocido, el usuario elija una "camiseta" y la talla de la camiseta.
- Agrega una ruta condicional:
- Expresión personalizada:
$session.params.artist != null AND $session.params.merch = "T-shirt" AND $session.params.shirtsize != null
- Agrega un parámetro a los ajustes predeterminados de parámetros >
price = 25
- Transición a la página:
Confirmation
La siguiente ruta pasará a la página de confirmación cuando el artista sea conocido, el usuario elija una "Manga larga" y elija la talla de la camiseta.
- Agrega una ruta condicional:
- Expresión personalizada:
$session.params.artist != null AND $session.params.merch = "Longsleeve" AND $session.params.shirtsize != null
- Ajustes predeterminados de los parámetros Agregar parámetro >
price = 30
- Transición a la página:
Confirmation
La siguiente ruta hará la transición a la página de confirmación cuando se conozca el artista y el usuario elija un "CD". También se elegirá el nombre del álbum.
- Agrega una ruta condicional:
- Expresión personalizada:
$session.params.artist != null AND $session.params.merch = "CD" AND $session.params.album != null
- Ajustes predeterminados de los parámetros Agregar parámetro >
price = 15
- Transición a la página:
Confirmation
La siguiente ruta hará la transición a la página de confirmación cuando se conozca el artista y el usuario elija un "Álbum digital" y el nombre del álbum.
- Agrega una ruta condicional:
- Expresión personalizada:
$session.params.artist != null AND $session.params.merch = "Digital Album" AND $session.params.album != null
- Agrega un parámetro a los ajustes predeterminados de parámetros >
price = 10
- Transición a la página:
Confirmation
A continuación, crearemos algunas condiciones avanzadas con instrucciones que detecten información faltante. La siguiente ruta regresará a la página de música cuando el artista sea conocido y el usuario elija un "CD" o un "álbum digital", pero no se haya elegido el nombre del álbum.
- Agrega una ruta condicional:
- Expresión personalizada:
$session.params.artist != null AND ($session.params.merch = "CD" OR $session.params.merch = "Digital Album") AND $session.params.album = null
- Entrega:
I would also need to know which album you would like to buy!
- Transición a la página:
Music
La última ruta hará la transición a la página de confirmación cuando se conozca el artista y el usuario elija una "Camiseta" o una "Camiseta de manga larga", pero no haya elegido el tamaño de la camiseta.
- Agrega una ruta condicional:
- Expresión personalizada:
$session.params.artist != null AND ($session.params.merch = "T-shirt" OR $session.params.merch = "Longsleeve") AND $session.params.shirtsize = null
- Entrega:
I would also need to know which shirt size you need!
- Transición a la página:
Shirt Size
En la siguiente parte del lab, usaremos las entregas condicionales para mostrar diferentes mensajes de entrega según la entrada.
7. Respuestas condicionales
Algunas respuestas mostrarán un diálogo diferente según la entrada. Los diálogos se ramificarán, lo que llamamos respuestas condicionales. Esto puede ser interesante cuando no usas entregas de webhook, en las que las respuestas condicionales se determinaron en el backend. Un ejemplo podría verse así:
if [condition]
[response]
elif [condition]
[response]
elif [condition]
[response]
else
[response]
endif
- Un ejemplo de [condition] podría ser:
$session.params.user-age >= 21
. Usa un formato similar al de las condiciones de las rutas. - Un [response] toma la respuesta de texto estático
- Las respuestas condicionales siempre comienzan con
if
. - Los bloques
elif
yelse
son opcionales
Dialogflow CX también puede usar funciones del sistema integradas. Por ejemplo, para dar formato a una hora o fecha, o para mostrar la hora actual ($sys.func.NOW()
)
Para finalizar el flujo del catálogo, corregiremos las páginas Confirmación y Precio.
Página de confirmación:
Ahora, crearemos la página de confirmación. Tiene los siguientes requisitos:
- Si merch es CD o Digital Album. Mostraremos los siguientes campos en la confirmación: artist, merch, album y price.
- Si el atributo merchandising es T-shirt o Longsleeve. En la confirmación, mostraremos los siguientes campos: artista, merchandising, tamaño y precio.
- De lo contrario (y, por lo tanto, si merch es Tour Movie). En la confirmación, mostraremos los siguientes campos: artista, merchandising y precio.
- Haz clic en la página Confirmación.
- Haz clic en Edit Fulfillment > Agent Responses > Add dialogue option > Conditional Response:
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
- Crea la siguiente ruta de intents:
- Intent:
confirm.proceed.order
- El agente dice:
Thank you for your order! Your merchandise will be shipped today!
- Agrega la opción de diálogo > Texto:
Here's the order number: ABCD123
. - Agregar opción de diálogo > Texto:
Have a good day!
- Transición:
End Session
- Selecciona la página Start y haz clic en el intent
redirect.end
. Crea la siguiente entrega:Thank you for contacting G-Records! Have a nice day!
- Selecciona la página Start y haz clic en el intent
redirect.home
. Crea el siguiente ajuste predeterminado de parámetros:restart = true
¡Genial! Hasta ahora, tenemos un chatbot de un minorista que funciona correctamente en el mundo real. En el siguiente lab, probaremos el rendimiento del agente virtual.
9. Prueba tu agente virtual
Puedes usar el simulador integrado para probar los diálogos de tu agente virtual. La ventaja de probar los flujos en el simulador es que verás una buena descripción general de los flujos, las páginas, los parámetros y los eventos (DTMF) que recopiló el simulador mientras recorrías tus flujos. Esto facilita las pruebas que las pruebas directamente en una integración, ya que esos tipos de información se ocultarán para el usuario final. Incluso es posible crear casos de prueba, guardarlos y volver a usarlos. Esto tiene mucho sentido cuando mantienes o editas tus flujos a lo largo del tiempo y quieres asegurarte de que ninguno de tus cambios afecte tu trabajo anterior.
También es posible exportar e importar casos de prueba creados anteriormente. Para ello, almacena las pruebas en Google Cloud Storage o de forma local. Si exportas una prueba, se descargará un archivo blob. Para obtener más información sobre el simulador y los casos de prueba, consulta la documentación del simulador o de los casos de prueba.
Antes de crear algunos casos de prueba, finalicemos el resto de nuestro agente virtual:
Crea el flujo de atención al cliente
- Ve al flujo de Atención al cliente y crea las siguientes transiciones de intents:
Página (en el flujo) | Rutas > Intent | Rutas > Transición a |
Inicio del servicio de atención al cliente |
| Envío |
Inicio del servicio de atención al cliente |
| Reembolso |
Inicio del servicio de atención al cliente |
| Intercambio |
Inicio del servicio de atención al cliente |
| Finalizar flujo |
Inicio del servicio de atención al cliente |
| Cerrar sesión |
- Crea las siguientes entregas de entrada para la página Envío:
Shipping physical merchandise items can take up to 2 weeks.
Is there anything else I can help you with?
- Crea las siguientes entregas de entradas para la página Refund:
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?
- Crea las siguientes entregas de entrada para la página Intercambio:
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?
- Selecciona la página Start y haz clic en el intent
redirect.end
. Crea la siguiente entrega:Thank you for contacting G-Records! Have a nice day!
- Selecciona la página Inicio y haz clic en el intent
redirect.home
. Crea el siguiente parámetro predeterminado:restart = true
Cómo crear casos de prueba
- Haz clic en el botón Test Agent, que se encuentra en el lado derecho de la pantalla.
Cuando abres el simulador por primera vez, debes seleccionar un entorno de agente y un flujo activo. En la mayoría de los casos, debes usar el entorno borrador y el flujo de inicio predeterminado.
- Tipo:
Hi
- Pregunta:
Which artists are signed with your label?
- Di:
The Google Dolls
- Di:
I am interested in buying a shirt
- Di:
A t-shirt
- Di:
Medium
- Ahora, haz clic en el botón para guardar el caso de prueba. Que puedes encontrar en la parte superior del simulador (junto a la flecha para deshacer y el ícono de papelera de restablecimiento).
- Proporciona los siguientes detalles:
- Nombre del caso de prueba:
Buy Google Dolls t-shirt size M
- Etiquetas: #catalog, #shirts, #t-shirt, #TheGoogleDolls
- Haga clic en Guardar.
Crear más casos de prueba
- Primero, borra el diálogo actual haciendo clic en el ícono de restablecimiento (papelera).
- Crea los siguientes casos de prueba:
Compra la camiseta de Alice Googler:
>"Buy the Alice Googler t-shirt."
>"XL"
- Nombre del caso de prueba:
Buy the Alice Googler t-shirt
- Etiquetas:
#catalog, #shirts, #t-shirt, #AliceGoogler
Comprar una camiseta talla M: (Ten en cuenta que no se mencionó el nombre del artista, pero debes omitir las páginas de descripción general de las bandas, de descripción general de los productos, de camisetas y de tallas de camisetas)
>"Buy a t-shirt size M"
>"The Google Fighters"
- Nombre del caso de prueba:
Buy a t-shirt size M
- Etiquetas:
#catalog, #shirts, #t-shirt, #TheGoogleFighters
- Descripción: (Ten en cuenta que no se mencionó el nombre del artista, pero debes omitir las páginas de descripción general de las bandas, de los productos, de las camisas y de las tallas de camisas)
Comprar música de Guns N' Roses (ten en cuenta que se omitirá la página de descripción general de las bandas y de los productos)
>"Purchase music of G's N' Roses"
>"Live"
>"CD"
- Nombre del caso de prueba:
Purchase music of G's N' Roses
- Etiquetas:
#catalog, #music, #CD, #GsNRoses, #live
- Descripción: (Ten en cuenta que se omitirán las páginas de descripción general de las bandas y de los productos)
Verifica la información de precios:
>"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"
- Nombre del caso de prueba:
Price info
- Etiquetas:
#catalog, #music, #tourmovie, #shirts
- Descripción: Información de precios de prueba en varios puntos del diálogo
Prueba casos de prueba grabados previamente
- Selecciona Administrar > Casos de prueba en el menú principal de Dialogflow, a la izquierda.
- Selecciona todos los casos de prueba y presiona el botón Run, que se encuentra sobre la tabla.
Dialogflow CX ejecutará todos los casos de prueba seleccionados en la grabación que se guardó como "Caso de prueba de referencia". Si los resultados son los mismos que los de la grabación, las pruebas se aprobarán. - Si algo cambió en los flujos, como páginas que no están configuradas correctamente o intents que te dirigieron a páginas incorrectas, las pruebas fallarán.
- En el simulador, haz la siguiente pregunta:
How long will shipping take?
- Anota el resultado y guarda el caso de prueba como
Shipping
con la etiqueta:#shipping
. - Ve al panel Manage > Test Cases y presiona el botón Run en la parte superior derecha de la cuadrícula para ejecutar solo el caso de prueba
Shipping
.
Esta prueba debería aprobarse.
- Vuelve al flujo de atención al cliente, selecciona la página Inicio y haz clic en el encabezado Rutas.
Se mostrará una pantalla con una cuadrícula que muestra todas las rutas.
- Quita el
redirect.shipping.info route
. - Ve al panel Administrar > Casos de prueba y presiona el botón Ejecutar en la parte superior derecha de la cuadrícula para ejecutar solo el caso de prueba
Shipping
.
Esta prueba debería fallar.
- Puedes hacer clic en la prueba con errores para ver los detalles.
En este caso, la prueba falló con el siguiente mensaje de error:
Page: Page mismatch:
Expected: Shipping
Actual: Start Page
Esto se debe a que la página ya no existe en el flujo. Esperábamos la página Shipping
, pero nunca salimos de la página Start
. (o tus usuarios finales recibirían un mensaje de resguardo).
En otras palabras, esta es una solicitud omitida, un resultado de la prueba de Falso negativo. No se pudo realizar la prueba. Esperábamos que se abriera la página Envíos, pero no sucede nada o se muestra un mensaje de resguardo.
- Regresa al flujo de atención al cliente y agrega
redirect.shipping.info
como una ruta de intent a la página Iniciar. No olvides pasar a la página Envíos y hacer clic en Guardar. - En el simulador, registra el siguiente caso de prueba:
I want to swap my item
y guárdalo comoSwapping
#swapping
. - Abre Administrar > Intents > redirect.refund.info y agrega la siguiente frase de entrenamiento:
I want to swap this item for a refund
Sin esa frase de entrenamiento, cuando un usuario pidiera cambiar un artículo por un reembolso, se activaría el intent redirect.swapping.info, pero no queremos proporcionar información sobre cómo cambiar artículos, sino sobre reembolsos.
- Crea el siguiente caso de prueba dorado:
I want to swap this item for a refund
en el simulador y guárdalo comoSwap for Refund
#refund
. - Regresa al intent Administrar > Intents > redirect.refund.info y quita la línea
I want to swap this item for a refund
. - Regresa a Manage > Test Cases, selecciona el caso de prueba Swap for Refund y haz clic en Run.
La prueba más reciente falló y se muestra el siguiente mensaje de error:
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
En otras palabras, esta es una solicitud de comprensión omitida, un resultado de la prueba de falso positivo. La prueba falló. Esperábamos la página Refund, pero se activó la página Swapping.
Cobertura
En Dialogflow CX, la cobertura de pruebas es una medida que se usa para describir el grado en que se ejecuta el diálogo del agente virtual (páginas e intents) cuando se ejecuta un conjunto de pruebas en particular. Se ejecutaron más diálogos durante las pruebas para un agente virtual con una alta cobertura de pruebas, lo que sugiere que tiene menos probabilidades de contener errores no detectados (como solicitudes sin comprender) en comparación con un agente virtual con baja cobertura de pruebas.
- Para ver un informe de cobertura de pruebas en todos los casos de pruebas, haz clic en Cobertura.
- Haz clic en la pestaña Transiciones.
De esta manera, podrás ver la cobertura de prueba de todas las transiciones de la página.
- Haz clic en la pestaña Intents.
Se mostrará la cobertura de prueba de todos los intents.
¡Felicitaciones! Ya creaste y probaste un ejemplo completo del mundo real de un bot de venta minorista. Vayamos a la siguiente página del lab para leer la conclusión y encontrar algunas referencias útiles.
10. Conclusión
Dialogflow CX es una plataforma de IA conversacional (CAIP) para crear agentes virtuales, como bots de chat o de voz. Dialogflow CX permite a tu equipo acelerar la creación de experiencias de conversación a nivel empresarial a través de compiladores de bots visuales, intents reutilizables y la capacidad de abordar conversaciones de varias vueltas.
En este codelab, aprendiste a crear un agente virtual de venta minorista del mundo real. Abordamos los siguientes conceptos:
- Flows
- Parámetros, entidades personalizadas y del sistema
- Páginas
- Controladores de estado, como rutas de intents y rutas de condiciones
- Mensajes de entrega estáticos y respuestas condicionales
- Intents de resguardo
- Simulador, casos de prueba y cobertura
Referencias
Para obtener más información sobre Dialogflow CX, consulta los siguientes blogs y la documentación.