Implantació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, puede empezar a crear los flujos de conversación para las intenciones normales. Las conversaciones se definen mediante una serie de pasos de flujo de diálogo en las aptitudes de Oracle Digital Assistant.

Utilizar el modo visual

Al crear una aptitud, tiene la opción de definirla para que utilice el modo de diseño Visual o YAML heredado. Siempre debe utilizar el modo Visual, que también es la opción por defecto. El modo visual ofrece las siguientes 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 para crear flujos reutilizables a los que se puede llamar desde otros flujos para gestionar las cosas que utilizan varios flujos.
  • Mucho más fácil legibilidad y mantenimiento.

Conversaciones basadas en diálogo

Las conversaciones controladas por diálogo recopilan la información del 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 representar respuestas de bots y peticiones de datos de usuario, o para manejar condiciones, lógica y otras funcionalidades.

Con este enfoque, desarrolla el flujo de diálogo como un guión de película que deriva de los casos de uso que diseñó 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 que no se pueden gestionar en tamaño, 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

Considere los nombres de los estados del flujo de diálogo como parte de la documentación. Si el nombre del estado de 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 de 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 los estados de flujo de diálogo relacionados estrechamente juntos dentro de BotML para que sea más fácil seguir el curso de las acciones en una conversación al revisar el código.

Mejores Prácticas para el Uso de Variables

Las variables contienen la información que recopila una aptitud de un usuario. Siempre que sea posible, utilice variables de un tipo de entidad para la información que desea recopilar. Realice esto por los siguientes motivos:

  • 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 gestionan la navegación sin secuencia, 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 Resolver entidades).

  • Se puede colocar 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 Resolver entidades. 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 llamar a 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, o escribir el texto completo de la etiqueta del elemento de acción mostrada.

Tenga en cuenta lo siguiente al definir palabras clave mediante Common Response o componentes personalizados, 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 planea crear bots para varios idiomas, sus 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, por ejemplo, agregando un número de índice delante de la etiqueta.

    Por ejemplo, se podría definir un menú de acción para enviar o cancelar una indicación con las siguientes etiquetas: "1. Enviar", "2. Cancelar". Y las palabras clave podrían definirse como "1,1.,send" y "2,2.,cancel". 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 "Preferiría cancelar mi pedido", "cancelar" no se detecta como una palabra clave. Si espera que los usuarios utilicen la 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 sus 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 o para hacer referencia a una cadena de grupo de recursos que contenga el valor del elemento de acción en su nombre.

Consideración de 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 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 o dice "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 a seguir y los sinónimos definen 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 Common Response o Resolve Entities para mostrar la lista de opciones. La variable que cree debe estar configurada 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. Con un componente Switch, puede definir el siguiente estado del 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. Dado que ha utilizado una enitity 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 en la entidad de lista de valores, puede asegurarse de que las etiquetas mostradas en los elementos de acción se puedan traducir mediante una de las siguientes expresiones:

  • ${rb(enumValue)}
  • ${rb(enumValue.value.primaryLanguageValue)} (si la propiedad fullEntityMatches está definida en true para el componente de respuesta común)

Para definir dinámicamente los valores de un elemento de acción, es más fácil trabajar con los componentes de respuesta común. Si se siente cómodo con los manejadores de eventos de entidades de programación, también es posible utilizar Resolver entidades.

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 palabra clave o etiqueta de acción.

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 una entrada. Sin embargo, esta pregunta es más una decisión de diseño que debe tomar que sobre el conocimiento técnico. Estas son las consideraciones de diseño:

  • ¿Su aptitud se muestra a través de un asistente digital? Si es así, la aptitud participa en el enrutamiento sin secuencia del asistente digital, que enruta los mensajes a otra aptitud u otra intención de 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 sin secuencia, 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 no secuencial incorporada, y 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 puedan ramificar 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ón cancel para iniciar una nueva conversación. Sería un error señalar 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 tipo nlpresult y otras variables necesarias para la conversación.

Nota

Aunque la creación de aptitudes independientes que exponga directamente en un canal es una opción, no lo recomendamos. La razón principal es que se pierde todas las ventajas conversacionales y de desarrollo que obtiene al utilizar un asistente digital. Algunos de los beneficios que perdería son:
  • Navegación sin secuencia, que es la capacidad del asistente digital para 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 el desarrollo incremental y las mejoras del 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, reduce la cantidad de código de flujo de diálogo que escribe, lo que proporciona una navegación madura y centrada en objetos de dominio de las interacciones bot-usuario.

La idea detrás de lo que denominamos conversación controlada por modelo es manejar la conversación resolviendo entidades de bolsa compuesta mediante componentes Resolver entidades o Respuesta común. Las entidades de bolsa compuesta son similares a los objetos de dominio en que agrupan un juego de entidades para formar un objeto real que representa un pedido, reserva, cliente o similar.

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, escribe menos código de flujo de diálogo y obtén más funcionalidad.

Enfoque recomendado

Las mejores prácticas para crear conversaciones controladas por modelos son utilizar entidades de bolsa compuesta, manejadores de eventos de entidades y el componente Resolver entidades.

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 entidades, Resolver entidades 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 información que se recopila 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 entradas de usuario para muchos de sus elementos de bolsa a partir de un único mensaje de usuario. Esta funcionalidad se denomina extracción fuera de orden y está activada por defecto.

  • El componente Resolver entidades resuelve entidades mostrando peticiones de datos definidas en la entidad, validando la entrada del usuario, mostrando 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 están definidos.

  • Un manejador de eventos de entidad es un componente JavaScript que está registrado con una entidad de bolsa compuesta y contiene funciones que llama el componente Resolver entidades al resolver la entidad de bolsa compuesta. Este enfoque controlado por eventos permite ejecutar lógica de código personalizado e incluso llamar a servicios REST remotos mientras un usuario trabaja en una entidad de bolsa compuesta. A continuación, en esta guía, trataremos más a fondo los manejadores de eventos de entidades.

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 debería implementarse con un mensaje como "debo continuar" seguido de un par de botones "sí" y "no". Permita que el 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 para 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:

  • Desglose expresiones FreeMarker complejas guardando valores en variables con nombres abreviados antes de utilizarlas en la expresión.

  • Utilice las directivas <#/if ...> para mejorar la legibilidad de las expresiones FreeMarker.

  • Utilice manejadores de eventos de entidades con entidades de bolsa compuesta para tratar con códigos de validación complejos o al calcular los valores que se van a asignar a una variable.

  • Compruebe los valores nulos de 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 Control para Implantar Conversaciones

  • ☑ Seleccione nombres sensatos y descriptivos para los flujos y estados de flujo.
  • ☑ Utilice variables de tipo de entidad.
  • ☑ Las peticiones de datos de entrada de usuario para variables de tipo de entidad deben leer la petición de datos de la entidad.
  • ☑ Crea conversaciones basadas en modelos.
  • ☑ Cree menús de acción a partir de entidades de lista de valores.
  • ☑ Evite expresiones FreeMarker de Apache complejas.
  • ☑ 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 son comunes a diferentes flujos.