💬

Dialogflowのcontextを使って会話を制御する。

2022/09/28に公開

概要

チャットボットの実装を進めていくと、ユーザーの入力から同じ種類のエンティティを抽出したときに、文脈に応じてチャットボットの返答を変えていきたいことにぶつかります。
その時にcontextを使って文脈毎に会話を制御することができます。

想定する状況

食べ物の通信販売をするECサイトに表示するチャットボットを想定します。

ユーザーが「かきをください」とチャットボットを入力したとします。
柿と牡蠣の両方を取り扱っている場合、どちらの情報を提供すればよいかが判断がつかなくなってしまいます。
この2つを判別するためにコンテキストを使用します。

作成するコンテキスト

コンテキストは以下の様に定義します。

コンテキスト物理名 コンテキスト内容
seafood 海産物の文脈を表す
fruit 果実の文脈を表す

パターン

文脈がないパターン

文脈がない場合、柿と牡蠣の判断がつかないため質問する返答を行います。
インテントは以下の様に作成します。

インテント名 インプットコンテキスト 返答
kaki-with-no-context - 柿と牡蠣のどちらですか?


contextを設定しない

海産物の文脈があるパターン

海産物のコンテキストがある場合、牡蠣と絞り込めますので牡蠣について返答します。

インテント名 インプットコンテキスト 返答
kaki-with-seafood-context seafood 牡蠣の要望ありがとうございます。


input contextにseafoodを記載

果実の文脈があるパターン

果実のコンテキストがある場合、柿と絞り込めますので柿について返答します。

インテント名 インプットコンテキスト 返答
kaki-with-fruit-context fruit 柿の要望ありがとうございます。


input contextにfruitを記載

文脈を作成する

インプットコンテキストを使用することで文脈に応じた返答ができる説明をしました。
では、インプットコンテキストに入ってくるコンテキストはどのように流れてくるのでしょうか?
それは、インテントにアウトプットコンテキストを設定することです。これで、文脈を設定することができます。

複数の文脈が流れた場合

海産物と果実のコンテキストが流れている場合、どのパターンが実行されるのでしょうか?
試したところ、kaki-with-fruit-contextとkaki-with-seafood-contextのそれぞれが実行されました。

「柿の要望ありがとうございます。」が表示される

「牡蠣の要望ありがとうございます。」が表示される

コンテキストによって同じ入力を分けるようにするには、分けるためのコンテキストが同時に流れないように管理をする必要があるようです。
コンテキストの管理方法は以下の方針があると思います。

  1. 一方が発生するインテントにおいて、もう一方のコンテキストを削除するように設定する。
    同時にseafoodとfruitのコンテキストが流れないように管理する方法です。
    全体的な会話からコンテキストの流れを管理するため、チャットボットの全体的な設計が必要です。

  2. 両方が発生した場合、優先して表示するインテントを決める
    インテントには優先度(priority)をつけることができます。
    この優先度をHighestにすることで、優先的に表示するインテントを設定できます。

    優先度を設定する
    優先度を記載するだけですので、インテントの数は増えないです。

  3. 両方のコンテキストを受けつけるインテントを作成する。
    両方のコンテキストが発生している時に実行するインテントです。
    コンテキストの組み合わせの数が増えるにつれてインテントの数が膨らむため、
    インテントの管理が難しくなります。

さいごに

同じエンティティ抽出をした際に、文脈に応じてチャットボットの返答を変える方法を記載しました。
インテントを増やすか、コンテキストで管理するかはプロジェクト毎で変わるかと思います。
難しい課題ですが、対処できると面白いです。


参考元
https://cloud.google.com/dialogflow/es/docs/contexts-input-output?hl=ja

Discussion