Implementación de flujos de conversaciones
Estas son algunas de las mejores prácticas para implantar flujos de conversaciones en asistentes digitales.
Con un modelo bien diseñado, está listo para empezar a crear los flujos de conversación para las intenciones normales. Las conversaciones se definen mediante una serie de pasos del flujo de diálogo en las aptitudes de Oracle Digital Assistant.

Usar modo visual
Al crear una aptitud, tiene la opción de definirla para utilizar el modo de diseño Visual o el modo de diseño YAML heredado. Debe siempre utilizar el modo Visual, que también es la opción por defecto. El modo visual ofrece a continuación una serie de ventajas sobre el modo YAML heredado, incluidas las siguientes:
- Experiencia de diseño visual, con estados de flujo representados visualmente en un lienzo, editores de propiedades de componentes y validación en tiempo de diseño.
- La capacidad de dividir el flujo de diálogo general en varios flujos.
- Capacidad de crear flujos reutilizables que se pueden llamar desde otros flujos para manejar los elementos que utilizan varios flujos.
- Mucho legibilidad y mantenimiento más fáciles.
Conversaciones basadas en diálogo
Las conversaciones controladas por diálogo recopilan la información de usuario necesaria para completar una tarea navegando por un usuario a través de una serie de estados de flujo de diálogo. Cada estado está enlazado a un componente para presentar respuestas de bot y peticiones de datos de usuario, o para manejar condiciones, lógica y otras funcionalidades.
Con este enfoque, desarrollará el flujo de diálogo como un script de película que se deriva de los casos de uso que ha diseñado en la fase de planificación del proyecto. Debido a que los pasos individuales de una conversación están controlados por el flujo de diálogo, el flujo de diálogo puede volverse rápidamente bastante grande. Para evitar flujos de diálogo de tamaño no gestionable, debe dividir los casos de uso en diferentes aptitudes.
Uso de una convención de nomenclatura para nombres de estado de flujo de diálogo
Tenga en cuenta los nombres de los estados del flujo de diálogo como parte de la documentación. Si el nombre del estado del flujo de diálogo proporciona un contexto, a los revisores de código les resulta más fácil comprender lo que hace un estado del flujo de diálogo y a qué flujo de conversación pertenece. Por ejemplo:
promptForOrderNumber
findOrder
cancelOrder
Además, si la aptitud está en modo YAML, considere mantener estrechamente unidos los estados del flujo de diálogo relacionado en BotML para que sea más fácil seguir el curso de las acciones de una conversación al revisar el código.
Mejores prácticas para utilizar variables
Las variables contienen la información que una aptitud recopila de un usuario. Siempre que sea posible, utilice variables de un tipo de entidad para la información que desea recopilar. Haga esto por las siguientes razones:
-
La entrada de usuario se valida y los usuarios se vuelven a solicitar después de una entrada de datos no válida.
-
Los asistentes digitales manejan la navegación non sequitur, lo que significa que los usuarios pueden iniciar una nueva conversación mientras están en una conversación existente sin necesidad de codificarla.
-
Para las entidades incorporadas encapsuladas en una entidad de bolsa compuesta y para las entidades personalizadas, puede definir peticiones de datos, un mensaje de error de validación y una petición de datos de desambiguación (que se muestra automáticamente en los componentes Respuesta común y Entidades de resolución).
-
Se puede asignar un espacio a una variable de un tipo de entidad a partir de los mensajes de usuario iniciales si asocia la entidad a la intención. Para las aptitudes desarrolladas en el modo de diálogo Visual, este espacio se produce automáticamente con los componentes Respuesta común y Entidades de resolución. Para las aptitudes desarrolladas en el modo de diálogo YAML, utilice la propiedad
nlpResultVariable
en los componentes de entrada para obtener esta funcionalidad.
Uso de palabras clave en elementos de acción
Los componentes de respuesta común y los componentes personalizados permiten definir palabras clave para los elementos de acción. Con una palabra clave, los usuarios pueden invocar una acción enviando un acceso directo como un número o una abreviatura. Esto significa que no tienen que presionar un elemento de acción, que de todos modos no pudieron usar un canal o una voz de solo texto, ni escribir el texto completo de la etiqueta del elemento de acción que se muestra.
Tenga en cuenta lo siguiente al definir palabras clave mediante componentes personalizados o de respuesta común, incluidos los manejadores de eventos de entidades.
-
Las palabras clave no tienen que tener el mismo texto mostrado en la etiqueta.
-
Las palabras clave no son sensibles a mayúsculas/minúsculas. No es necesario definir una palabra clave en todas las posibles variantes sensibles a mayúsculas/minúsculas.
-
Si tiene previsto crear bots para varios idiomas, las palabras clave no se pueden definir solo en inglés. Para admitir palabras clave multilingües, puede hacer referencia a una cadena de grupo de recursos desde la propiedad
keyword
de los componentes de respuesta común (${rb('resource_key_name')}
). A continuación, la cadena del grupo de recursos contiene una lista de palabras clave separadas por comas. -
Proporcione pistas visuales que indiquen que se pueden utilizar palabras clave, como agregar un número de índice delante de la etiqueta.
Por ejemplo, un menú de acción para enviar o cancelar una indicación podría definirse con las siguientes etiquetas: "1. Send", "2. Cancelar". Y las palabras clave podrían definirse como "1,1., enviar" y "2,2., cancelar". Por lo tanto, para cancelar un pedido, el usuario puede escribir "cancel", "2" o "2".
Nota
Tenga en cuenta que, en este caso, "enviar" y "cancelar" también se deben definir como palabras clave porque las etiquetas son "1". Enviar" y "2. Cancelar", no solo "Enviar" un "Cancelar". -
Las palabras clave no funcionan si se usan en una oración. Si, por ejemplo, un usuario escribe "Prefiero cancelar mi pedido", "cancel" no se detecta como una palabra clave. Si espera que los usuarios utilicen una conversación en lugar de palabras clave para seleccionar una opción, considere los menús de acción basados en NLU como se explica en la siguiente sección.
Si se pregunta cómo crear palabras clave basadas en índices para elementos de acción creados dinámicamente, estas son las opciones:
-
Active la numeración automática en las aptitudes mediante el valor de configuración Activar numeración automática en acciones de devolución en flujos de tareas de la aptitud. Esto configura los componentes para agregar la palabra clave a la lista de palabras clave y el índice a la etiqueta.
-
Utilice expresiones FreeMarker de Apache para agregar el número de índice y/o hacer referencia a una cadena de grupo de recursos que contiene el valor del elemento de acción en su nombre.
Considerar menús de acción basados en NLU
Los menús de acción suelen utilizar elementos de acción que un usuario puede pulsar para realizar la navegación a una conversación específica o para enviar, confirmar o cancelar una operación. Cuando se pulsa un elemento de acción, se envía un mensaje a la aptitud con una carga útil opcional para actualizar variables y una cadena de acción para determinar el estado del flujo de diálogo al que se va a realizar la transición.
Si un usuario escribe un mensaje que no coincide con la etiqueta del elemento de acción o una palabra clave definida para un elemento de acción, se sigue la siguiente transición. Por ejemplo, imagine un par de elementos de acción que utilizan Enviar informe de gastos y Cancelar informe de gastos como etiquetas. Si un usuario escribe "Sí, enviar", se dispara la siguiente transición en lugar del elemento de acción marcado con Enviar informe de gastos. La razón por la que esto sucedería es porque una implantación que requiere que los usuarios pulsen un botón o un elemento de acción no es conversacional.
Para crear menús de acción sólidos y verdaderamente conversacionales, debe crearlos en función de entidades de lista de valores, donde los valores de lista indican la acción que se debe seguir y los sinónimos definen las posibles palabras clave que un usuario utilizaría en un mensaje para llamar a una acción.
Para ello, primero debe crear una entidad de lista de valores para la que, a continuación, defina una variable en el flujo de diálogo. A continuación, puede utilizar un componente de respuesta común o de resolución de entidades para mostrar la lista de opciones. La variable que cree se debe configurar como el valor de la propiedad de variable del componente. De esta forma, la siguiente transición se dispara cuando el usuario escribe "Yes, please send" y navega a un estado de flujo de diálogo que comprueba el valor almacenado en la variable.
El valor almacenado en la variable es uno de los valores definidos en la entidad de lista de valores. Mediante un componente Cambiar, puede definir el siguiente estado de flujo de diálogo con el que continúa la conversación.
Si el usuario introduce un mensaje que no está en la entidad de lista de valores o como uno de sus sinónimos, se vuelve a llamar al menú de acción. Puesto que ha utilizado una entidad de lista de valores, puede utilizar el mensaje de error definido para la entidad para ayudar a los usuarios a comprender lo que se espera de ellos. Además, dado que puede configurar varias peticiones de datos para la entidad de lista de valores, puede mostrar peticiones de datos alternativas e incluso mensajes que revelen gradualmente información adicional, incluida información sobre cómo cancelar la visualización del menú de acciones.
Si crea nombres de cadena de grupo de recursos para los valores de la entidad de lista de valores, puede asegurarse de que las etiquetas que se muestran en los elementos de acción se pueden traducir mediante una de las siguientes expresiones:
${rb(enumValue)}
${rb(enumValue.value.primaryLanguageValue)}
(si la propiedadfullEntityMatches
está definida entrue
para el componente de respuesta común)
Para definir de forma dinámica los valores de un elemento de acción, los componentes de respuesta común son más fáciles de utilizar. Si es cómodo programando gestores de eventos de entidades, también es posible utilizar Resolve Entities.
Con los menús de acción basados en NLU, los usuarios pueden pulsar un elemento de acción o escribir un mensaje que no tenga que ser la coincidencia exacta de una etiqueta de acción o palabra clave.
Interrupción de una Conversación Actual para una Nueva Conversación
Una pregunta frecuente es cómo configurar una conversación para que los usuarios puedan iniciar una conversación nueva o diferente cuando se les solicite entrada. Sin embargo, esta pregunta es más una decisión de diseño que debe tomar que sobre los conocimientos técnicos. Estas son las consideraciones de diseño:
-
¿Su aptitud se expone a través de un asistente digital? Si es así, la aptitud participa en el enrutamiento de non sequitur del asistente digital, que enruta los mensajes a otra aptitud u otra intención en la misma aptitud si el mensaje de usuario no se ha podido validar correctamente para el estado del flujo de diálogo actual. Para que se produzca esta navegación non sequitur, asegúrese de que la entrada del usuario se valida con una variable basada en entidad.
-
¿Su aptitud se muestra como una aptitud independiente? Si es así, entonces no hay navegación non sequitur incorporada, y usted necesita diseñar para ello. Para ello, utilice una variable basada en entidad para el estado del flujo de diálogo que desea que los usuarios se ramifiquen en una nueva conversación. A continuación, defina la propiedad
maxPrompts
del componente de entrada de usuario en 1 y configure la transición de accióncancel
para iniciar una nueva conversación. Sería un error apuntar directamente la transición de cancelación al estado de intención, ya que lo más probable es que cause un bucle interminable. Por lo tanto, antes de volver al estado de intención, asegúrese de utilizar un estado de flujo de diálogo configurado con el componente Restablecer variables para restablecer la variable de tiponlpresult
y otras variables necesarias para la conversación.
Aunque la creación de aptitudes independientes que se exponen directamente en un canal es una opción, no se recomienda. La razón principal es que se pierden todas las ventajas de las conversaciones y el desarrollo que obtiene al utilizar un asistente digital. Algunos de los beneficios que perdería son:
-
Navegación sin secuenciación, que es la capacidad del asistente digital de suspender una conversación actual para cambiar temporalmente el tema a otra conversación.
-
Desarrollo modular que permite dividir el esfuerzo de desarrollo en varias aptitudes, lo que permite un desarrollo incremental y mejoras en el bot.
-
Manejo automático de solicitudes de ayuda.
-
Reutilización de habilidades comúnmente necesarias, como preguntas frecuentes, charlas pequeñas e integración de agentes.
Conversaciones basadas en modelos
Las conversaciones basadas en modelos son una extensión de las conversaciones basadas en diálogos. Con las conversaciones basadas en modelos, se reduce la cantidad de código de flujo de diálogo que se escribe, lo que proporciona una navegación madura y centrada en objetos de dominio de las interacciones entre bots y usuarios.
La idea detrás de lo que denominamos conversación controlada por modelo es manejar la conversación resolviendo entidades de bolsa compuesta mediante los componentes Resolver entidades o Respuesta común. Las entidades de bolsa compuesta son similares a los objetos de dominio en el sentido de que agrupan un juego de entidades para formar un objeto real que representa un pedido, una reserva, un cliente o similares.
Cada entidad de la bolsa compuesta se resuelve automáticamente mediante un componente Resolver entidades o Respuesta común, lo que significa que se generan todas las respuestas y peticiones de datos del bot sin necesidad de crear estados de flujo de diálogo para cada una de ellas. Con las conversaciones basadas en modelos, se escribe menos código de flujo de diálogo y se obtiene más funcionalidad.
Método recomendado
Las mejores prácticas para crear conversaciones controladas por modelos son utilizar entidades de bolsa compuesta, manejadores de eventos de entidad y el componente Resolve Entities.
No hay nada de malo en utilizar el componente de respuesta común en lugar de ResolveEntities, pero, gracias a los manejadores de eventos de entidad, Resolve Entities es suficiente para la mayoría de las implantaciones.
-
Las entidades de bolsa compuesta son objetos de dominio que tienen elementos de bolsa para cada parte de la información que se va a recopilar de un usuario. Cada elemento de bolsa tiene peticiones de datos, mensajes de error y una petición de datos de desambiguación definida que se muestra si es necesario. Para los elementos de bolsa compuesta que se basan en entidades de lista de valores, también puede mostrar listas de selección múltiple. Una ventaja de las entidades de bolsa compuesta es su capacidad para recopilar la entrada del usuario para muchos de sus elementos de bolsa de un solo mensaje de usuario. Esta funcionalidad se denomina extracción en orden y está activada por defecto.
-
El componente Resolver entidades resuelve entidades mostrando las peticiones de datos definidas en la entidad, validando la entrada del usuario, mostrando los mensajes de error de validación definidos en la entidad y mostrando un cuadro de diálogo de desambiguación cuando los usuarios proporcionan más información de la esperada en un mensaje. Para las entidades de bolsa compuesta, el componente Resolver Entidades representa las interfaces de usuario para todos los elementos de bolsa de la entidad de bolsa compuesta en el orden en que se definen.
-
Un manejador de eventos de entidad es un componente JavaScript que se registra con una entidad de bolsa compuesta y contiene funciones a las que llama el componente Resolver entidades al resolver la entidad de bolsa compuesta. Este enfoque basado en eventos permite ejecutar una lógica de código personalizada e incluso llamar a servicios REST remotos mientras un usuario trabaja en una entidad de bolsa compuesta. Trataremos más detalladamente los gestores de eventos de entidades más adelante en esta guía.
Cómo diseñar conversaciones basadas en modelos
El mejor diseño para conversaciones basadas en modelos es minimizar el número de elementos de bolsa requeridos por una entidad de bolsa compuesta. Imagine entidades de bolsa compuesta como módulos conversacionales individuales que encadena hasta una conversación.
Consulte al usuario después de cada entidad de bolsa compuesta que resuelva para darle la oportunidad de continuar o interrumpir la conversación.
Por supuesto, esto no debe implementarse con una petición de datos como "debo continuar" seguida de un par de botones "sí" y "no". Deje que su diseñador de conversaciones cree una transición menos intrusiva que vincule dos módulos de conversación.
Grupos de recursos para mensajes y peticiones de datos
Al igual que con todos los mensajes y peticiones de datos, recomendamos encarecidamente el uso de cadenas de grupos de recursos para peticiones de datos y mensajes definidos en elementos de bolsa de entidad compuesta. A continuación se muestran algunos ejemplos de entidades de bolsa compuesta:
-
cbe.
<entity_name>.
bag_item_name.errorMessage
-
cbe.
<entity_name>.
bag_item_name.disambiguationMessage
-
cbe.
<entity_name>.
bag_item_name.prompt1
-
cbe.
<entity_name>.
bag_item_name.prompt2
Mejores prácticas de Apache FreeMarker
Apache FreeMarker es un potente lenguaje de expresión que puede utilizar en los flujos de diálogo, así como en las configuraciones de entidad y aptitud. Sin embargo, las expresiones FreeMarker de Apache se vuelven problemáticas cuando se vuelven demasiado complejas, lo que las hace propensas a errores y difíciles de usar debido a la falta de opciones de depuración.
Nuestra recomendación es evitar expresiones complejas de Apache FreeMarker de varias líneas y, en su lugar, considerar una de las siguientes opciones:
-
Divida expresiones FreeMarker complejas guardando valores en variables con nombres cortos antes de utilizarlas en la expresión.
-
Utilice las directivas
<#/if …>
para mejorar la legibilidad de las expresiones FreeMarker. -
Utilizar manejadores de eventos de entidad con entidades de bolsa compuesta para tratar el código de validación complejo o al calcular los valores que se van a asignar a una variable.
-
Compruebe si hay valores nulos para las variables a las que hace referencia mediante la expresión incorporada
?has_content
. Proporcione un valor por defecto razonable si la expresión se resuelve en false, por ejemplo,?has_content?then(…,<SENSIBLE_DEFAULT_VALUE>)
.
Lista de comprobación para implantar conversaciones
- ☑ Seleccione nombres sensibles y descriptivos para los flujos y estados de flujo.
- ☑ Utilice variables de tipo de entidad.
- ☑ Las peticiones de datos de entrada de usuario para las variables de tipo de entidad deben leer la petición de datos de la entidad.
- ☑ Cree conversaciones basadas en modelos.
- ☑ Cree menús de acción a partir de entidades de lista de valores.
- ☑ Evite expresiones complejas de Apache FreeMarker.
- ☑ Use grupos de recursos. No se debe agregar ningún mensaje de texto ni petición de datos directamente al flujo de diálogo.
- ☑ Cree flujos reutilizables para partes de la conversación que sean comunes a diferentes flujos.
Más información
- Video del campamento de diseño de Oracle Digital Assistant: El arte de la navegación en Oracle Digital Assistant
- Ejemplo de Oracle TechExchange: Conversación basada en modelos: aptitud para realizar pedidos de pasta
- Ejemplo de Oracle TechExchange: Conversación basada en modelos: aptitud para informes de gastos
- Tutorial: Desarrollo de Flujos de Diálogo
- Tutorial: Creación de entidades de bolsa compuesta
- Tutorial: Optimización de informes de estadísticas con marcadores de conversación