保留状態の遷移
会話の流れの中で、一時的に別の処理(たとえばユーザー認証)を挟んでから元の話題に戻る、というケースはよくあります。
こうした場合、ルールをどんどん複雑にするよりも、一部のアクションや状態を「保留(pending)」として保存しておく方が、シンプルでデバッグもしやすくなります。
ここでは、policy_rules 辞書を定義します。キーは現在の状態と受け取ったインテントのタプル、値は次の状態・ボットの応答・保留遷移先の状態のタプルです。
この演習はコースの一部です
Python でチャットボットを作る
演習の手順
policy_rules辞書の値を埋めて、完成させましょう。- ユーザーは
INIT状態からスタートします。 - ユーザーが
INIT状態で注文しようとした場合、番号を尋ねるとともに、AUTHED状態への保留遷移を設定します。 - 保留遷移を作成するのはこのポリシールールだけです。それ以外のルールでは、保留状態の値に
Noneを指定します。
- ユーザーは
send_message()関数の第2引数としてpending状態が追加されており、この関数は新しい状態と保留状態の両方を返します。send_messages()の中でこのsend_message()関数を呼び出し、戻り値をstateとpendingの変数にアンパックしましょう。- '回答を送信' をクリックして、ボットにメッセージを送りましょう!
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# 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"
])