Sugerencias sobre la creación de conversaciones

Obtención de sugerencias sobre las formas de manejar tareas comunes.

Adición de nodos

  • Añada un nombre de nodo que describa la finalidad del nodo.

    Hoy sabe lo que hace el nodo, pero es posible que en unos meses no lo recuerde. Y el nombre de nodo se muestra en el registro, lo que le puede ayudar a depurar una conversación más adelante.

  • Para recopilar la información necesaria para completar una tarea, utilice un nodo con ranuras en lugar de un grupo de nodos separados para obtener información de los usuarios. Consulte Obtención de información con ranuras.

  • Para un flujo de proceso complejo, informe a los usuarios sobre cualquier información que necesiten proporcionar al inicio del proceso.

  • Comprenda cómo avanza su asistente a través del árbol de diálogo y el impacto que tienen las carpetas, las ramas, los saltos y las digresiones sobre la ruta. Consulte Flujo de diálogo.

  • No añada saltos en todas partes. Aumentan la complejidad del flujo de diálogo y dificultan la depuración del diálogo más adelante.

  • Para saltar a un nodo que esté en la misma rama que el nodo actual, utilice Saltar entrada de usuario en lugar de Ir a.

    Esta opción impide que tenga que editar los valores del nodo actual cuando elimine o reordene los nodos hijo a los que se salta. Consulte Definición de lo que hay que hacer a continuación.

  • Antes de habilitar las digresiones hacia fuera de un nodo, pruebe los casos de ejemplo de usuario más comunes. Y asegúrese de que los nodos a los que probablemente se desvíe estén configurados para volver. Consulte Digresiones.

Adición de respuestas

  • Cree respuestas cortas y útiles.

  • Refleje la intención del usuario en la respuesta.

    Esto asegura a los usuarios que el bot les está entendiendo, o, si no es así, les ofrece la oportunidad de corregir un malentendido de inmediato.

  • Incluir enlaces a sitios externos en las respuestas si la respuesta depende de los datos que cambian con frecuencia.

  • Evite el uso excesivo de botones. El hecho de animar a los usuarios a elegir opciones predefinidas entre un conjunto de botones se asemeja menos a una conversación real y disminuye su capacidad para aprender lo que los usuarios realmente desean hacer. Si deja que los usuarios reales soliciten cosas con sus propias palabras, se puede utilizar la entrada para entrenar el sistema y generar mejores intenciones.

  • Evite utilizar un grupo de nodos cuando un nodo sea suficiente. Por ejemplo, añada varias respuestas condicionales a un solo nodo para que devuelva distintas respuestas en función de los detalles que especifique el usuario. Consulte Respuestas condicionales.

  • Redacte las respuestas cuidadosamente. Puede cambiar la forma en que alguien reacciona ante su sistema en función simplemente de la forma en que redacta una respuesta. El hecho de modificar una línea de texto puede evitar que tenga que escribir varias líneas de código para implementar una solución programática compleja.

Sugerencias para capturar información de la entrada de usuario

Puede resultar difícil saber la sintaxis que se utiliza en el nodo de diálogo para capturar con precisión la información que desea encontrar en la entrada del usuario. Estos son algunos enfoques que puede utilizar para abordar objetivos comunes.

  • Devolución de la entrada de usuario: Puede capturar el texto exacto utilizado por el usuario y devolverlo en su respuesta. Utilice la siguiente expresión SpEL en una respuesta para repetir el texto que el usuario ha especificado en la respuesta:

    You said: <? input.text ?>.

    Si la corrección automática está activada y quiere devolver la entrada del usuario original, antes de la corrección, puede utilizar <? input.original_text ?>. Sin embargo, asegúrese de utilizar una condición de respuesta que compruebe primero si existe el campo original_text.

  • Determinación del número de palabras en la entrada de usuario: Puede utilizar cualquiera de los métodos String admitidos en el objeto input.text. Por ejemplo, puede averiguar cuántas palabras hay en una expresión de usuario, utilice la siguiente expresión SpEL:

    input.text.split(' ').size()

  • Tratar con varias intenciones: un usuario especifica una entrada que expresa dos tareas separadas. I want to open a savings account and apply for a credit card. ¿Cómo reconoce y aborda el diálogo ambas intenciones? Consulte la entrada de blog Preguntas compuestas.

  • Cómo tratar con intenciones ambiguas: un usuario especifica una entrada que es lo suficientemente ambigua como para que el asistente encuentre dos o más nodos con intenciones que podrían abordarla. ¿Cómo sabe el diálogo qué rama de diálogo debe seguir? Si habilita la desambiguación, puede mostrar a los usuarios sus opciones y pedir al usuario que elija la correcta. Consulte Desambiguación para obtener más información.

  • Manejo de varias entidades en la entrada: Si solo desea evaluar el valor de la primera instancia detectada de un tipo de entidad, puede utilizar la sintaxis @entity == 'specific-value' en lugar del formato @entity:(specific-value).

    Por ejemplo, si utiliza @appliance == 'air conditioner', se evalúa solo el valor de la primera entidad @appliance detectada. Pero, si utiliza @appliance:(air conditioner), se expande a entity['appliance'].contains('air conditioner'), que coincide siempre que se detecta al menos una entidad @appliance con el valor 'air conditioner' en la entrada de usuario.

  • Ocultar datos del registro: puede impedir que la información se almacene en registros almacenándola en una variable de contexto y anidando la variable de contexto en la sección $private del contexto de mensaje. Por ejemplo, $private.my_info. Si almacena datos en el objeto privado, los oculta únicamente de los registros. La información sigue almacenada en el objeto JSON subyacente. No permita que esta información quede expuesta a la aplicación cliente.

  • Comprobación de la información personal: Si desea comprobar e impedir que un usuario envíe información de identificación personal (PII) a algún proceso posterior, puede añadir un nodo de diálogo condicionado por una entidad de patrón. Coloque el nodo al principio del árbol de diálogo para asegurarse de que comprueba primero la entrada. Por ejemplo, la entidad puede comprobar patrones de números de la seguridad social de EE.UU. o patrones de direcciones de correo electrónico. A continuación, puede responder con algo de tipo Please do not submit personally identifiable information. Can you reenter your request?. Si lo desea, puede restablecer el contexto para asegurarse de que no se conserve la información enviada por el usuario con información de identificación personal.

Sugerencias sobre el uso de condiciones

  • Comprobación de valores con caracteres especiales: Si desea comprobar si una variable de contexto o entidad contiene un valor, y el valor incluye un carácter especial, como un apóstrofo ('), debe delimitar con paréntesis el valor que desea comprobar. Por ejemplo, para comprobar si una variable de contexto o entidad contiene el nombre O'Reilly, debe delimitar el nombre con paréntesis.

    @person:(O'Reilly) y $person:(O'Reilly)

    Su asistente convierte estas referencias en estas expresiones SpEL completas:

    entities['person']?.contains('O''Reilly') y context['person'] == 'O''Reilly'

    SpEL utiliza un segundo apóstrofo para codificar como escape el apóstrofo individual en el nombre.

  • Comprobación de varios valores: SI desea comprobar más de un valor, puede crear una condición que utilice operadores OR (||) para obtener una lista de varios valores en la condición. Por ejemplo, para definir una condición que sea verdadera si la variable de contexto $state contiene las abreviaturas de Massachusetts, Maine o New Hampshire, puede utilizar esta expresión:

    $state:MA || $state:ME || $state:NH

  • Comprobación de valores numéricos: al comparar números, primero asegúrese de que la entidad o variable que está comprobando tiene un valor. Si la entidad o variable no tiene un valor de número, se trata como si tuviera un valor nulo (0) en una comparación de números.

    Por ejemplo, desea comprobar si un valor en dólares incluido en la entrada de usuario es inferior a 100. Si utiliza la condición @price < 100 y la entidad @price es nula, la condición se evalúa como true porque 0 es menor que 100, aunque nunca se haya definido el precio. Para evitar este tipo de resultado impreciso, utilice una condición como @price AND @price < 100. Si @price no tiene ningún valor, esta condición devuelve correctamente false.

  • Comprobación de intenciones con un patrón de nombre de intención específico: Puede utilizar una condición que busca intenciones que coinciden con un patrón. Por ejemplo, para encontrar los nombres de las intenciones detectadas que empiezan por 'User_', puede utilizar una sintaxis como la siguiente en la condición:

    intents[0].intent.startsWith("User_")

    Sin embargo, cuando lo hace, todas las intenciones detectadas se consideran, incluso aquellas con una confianza inferior a 0,2. Además, compruebe que las intenciones que se consideran irrelevantes en función de su puntuación de confianza no se devuelven. Para ello, cambie la condición tal como se indica:

    !irrelevant && intents[0].intent.startsWith("User_")

  • Cómo afecta la coincidencia aproximada al reconocimiento de entidades: Si utiliza una entidad como condición y está habilitada la coincidencia aproximada, @entity_name se evalúa como true solo si la confianza de la coincidencia supera el 30 %. Es decir, solo si @entity_name.confidence > .3.

Almacenamiento y reconocimiento de grupos de patrones de entidad en una entrada

Para almacenar el valor de una entidad de patrón en una variable de contexto, añada .literal al nombre de entidad. Con esta sintaxis se asegura de que en la variable se almacena el texto exacto de la entrada del usuario que coincide con el patrón especificado.

Añadir .literal
Variable Valor
correo electrónico <? @email.literal ?>

Para almacenar el texto de un grupo individual en una entidad de patrón donde se hayan definido grupos, especifique el índice de la matriz del grupo que desea almacenar. Por ejemplo, supongamos que el patrón de entidad se define como tal como sigue para la entidad @phone_number. (Recuerde, los paréntesis denotan grupos de patrón):

\b((958)|(555))-(\d{3})-(\d{4})\b

Para almacenar solamente el código de área del número de teléfono que se especifica en la entrada de usuario, puede utilizar la sintaxis siguiente:

Sólo código de área
Variable Valor
area_code <? @phone_number.groups[1] ?>

Los grupos se delimitan mediante la expresión regular que se utiliza para definir el patrón de grupo. Por ejemplo, si la entrada de usuario que coincide con el patrón definido en la entidad @phone_number es: 958-234-3456, se crean los grupos siguientes:

Detalles del grupo
Número de grupo Valor de motor de expresión regular Valor de diálogo Explicación
grupos[0] 958-234-3456 958-234-3456 El primer grupo es siempre la serie coincidente completa.
grupos[1] ((958)l(555)) 958 Serie que coincide con la expresión regular del primer grupo definido, que es ((958)l(555)).
grupos[2] (958) 958 Coincidencia con relación al grupo que se incluye como el primer operando en la expresión OR ((958)l(555))
grupos[3] (555) null Sin coincidencia con relación al grupo que se incluye como el segundo operando en la expresión OR ((958)l(555))
grupos[4] (\d{3}) 234 Serie que coincide con la expresión regular que se ha definido para el grupo.
grupos[5] (\d{4}) 3456 Serie que coincide con la expresión regular que se ha definido para el grupo.

Para ayudarle a averiguar qué número de grupo se debe utilizar para capturar la sección de la entrada en la que está interesado, puede extraer información sobre todos los grupos al mismo tiempo. Utilice la sintaxis siguiente para crear una variable de contexto que devuelve una matriz con todas las coincidencias de entidad de patrón agrupadas:

Matriz de grupos coincidentes
Variable Valor
array_of_matched_groups <? @phone_number.groups ?>

Utilice el panel "Pruébelo" para especificar algunos valores de prueba como número de teléfono. Para la entrada 958-123-2345, esta expresión establece $array_of_matched_groups en ["958-123-2345","958","958",null,"123","2345"].

Puede contar entonces cada valor en la matriz, empezando desde 0, para obtener el número de grupo para la misma.

Elementos de matriz
Valor de elemento de matriz Número de elemento de matriz
"958-123-2345" 0
"958" 1
"958" 2
nulo 3
"123" 4
"2345" 5

A partir del resultado, puede determinar que para capturar los últimos cuatro dígitos del número de teléfono, necesita el grupo #5, por ejemplo.

Para devolver la estructura JSONArray que se ha creado para representar la entidad del patrón agrupado, utilice la sintaxis siguiente:

JSON de grupos coincidentes
Variable Valor
json_matched_groups <? @phone_number.groups_json ?>

Esta expresión establece $json_matched_groups en la siguiente matriz JSON:

[
  {"group": "group_0","location": [0, 12]},
  {"group": "group_1","location": [0, 3]},
  {"group": "group_2","location": [0, 3]},
  {"group": "group_3"},
  {"group": "group_4","location": [4, 7]},
  {"group": "group_5","location": [8, 12]}
]

location es una propiedad de una entidad que utiliza un desplazamiento de caracteres que empieza por cero para indicar dónde empieza y acaba el valor de la entidad detectada en el texto de entrada.

Si espera recibir dos números de teléfono en la entrada, puede comprobar los dos números de teléfono. Si están presentes, utilice la siguiente sintaxis para capturar, por ejemplo, el código de área del segundo número.

JSON de grupos coincidentes
Variable Valor
second_areacode <? entities['phone_number'][1].groups[1] ?>

Si la entrada es I want to change my phone number from 958-234-3456 to 555-456-5678 (Deseo cambiar mi número de teléfono de 958-234-3456 a 555-456-5678), $second_areacode es 555.