ComenzarEmpieza gratis

Transiciones de estado pendientes

A menudo tendrás que desviarte brevemente del flujo de una conversación, por ejemplo para autenticar a un usuario, antes de volver al tema principal.

En estos casos, suele ser más sencillo —y más fácil de depurar— si guardas algunas acciones/estados como pendientes en lugar de añadir reglas cada vez más complicadas.

Aquí vas a definir un diccionario policy_rules, donde las claves son tuplas del estado actual y la intención recibida, y los valores son tuplas con el siguiente estado, la respuesta del bot y un estado para el que se establece una transición pendiente.

Este ejercicio forma parte del curso

Creación de chatbots en Python

Ver curso

Instrucciones del ejercicio

  • Completa el diccionario policy_rules rellenando los valores:
    • Un usuario empieza en el estado INIT.
    • Si el usuario está en el estado INIT e intenta hacer un pedido, debes pedir su número y crear una transición pendiente al estado AUTHED.
    • Esta es la única regla de la política que crea una transición pendiente, así que las demás simplemente tienen un valor de estado pendiente None.
  • El estado pending se ha añadido como segundo argumento de la función send_message(), que ahora devuelve el nuevo estado así como el estado pendiente. Llama a esta función send_message() dentro de send_messages(), desempaquetando la salida en las variables state y pending.
  • Pulsa "Submit Answer" para enviar los mensajes al bot.

Ejercicio interactivo práctico

Prueba este ejercicio y completa el código de muestra.

# Define the states
INIT=0
AUTHED=1
CHOOSE_COFFEE=2
ORDERED=3

# Define the policy rules
policy_rules = {
    (INIT, "order"): (____, "you'll have to log in first, what's your phone number?", ____),
    (INIT, "number"): (____, "perfect, welcome back!", None),
    (AUTHED, "order"): (____, "would you like Colombian or Kenyan?", None),    
    (CHOOSE_COFFEE, "specify_coffee"): (____, "perfect, the beans are on their way!", None)
}

# Define send_messages()
def send_messages(messages):
    state = INIT
    pending = None
    for msg in messages:
        state, pending = ____(____, ____, ____)

# Send the messages
send_messages([
    "I'd like to order some coffee",
    "555-1234",
    "kenyan"
])
Editar y ejecutar código