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
Instrucciones del ejercicio
- Completa el diccionario
policy_rulesrellenando los valores:- Un usuario empieza en el estado
INIT. - Si el usuario está en el estado
INITe intenta hacer un pedido, debes pedir su número y crear una transición pendiente al estadoAUTHED. - 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.
- Un usuario empieza en el estado
- El estado
pendingse ha añadido como segundo argumento de la funciónsend_message(), que ahora devuelve el nuevo estado así como el estado pendiente. Llama a esta funciónsend_message()dentro desend_messages(), desempaquetando la salida en las variablesstateypending. - 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"
])