Amazon Lexで条件分岐とビジュアルビルダーがサポートされたのでやってみた

2022年8月頃にAmazon Lexのアップデートがあり、会話の条件分岐とビジュアルビルダーというものがリリースされました。
このアップデートによってもたらされたメリットとしては、それぞれ下記のものと考えています。

  • 会話の条件分岐
    以前まではLambdaによるコードベースでの条件分岐しかできなかったが、コードレスで条件分岐が可能になった。
  • ビジュアルビルダー
    Amazon Connectのように会話のフローを視覚的に管理することができるようになり、複雑な会話フローの構築も容易になった。

今回簡単なハンズオンを実施してみたので、それぞれの機能がどういったものか紹介していきます。

前提知識

ハンズオンとアップデートした機能を説明する前に、Amazon Lexの必要最低限の用語を解説したいと思います。

  • インテント
    一連のチャットフローの塊。プログラミングに例えるなら、関数のようなもの。もし複数の箇所で同じ処理を実施したい場合は、インテントとしてまとめておくと、それを呼び出すだけで同じ処理ができる。後の変更管理も容易。
  • ボット
    その名の通り、チャットボット全体を指す。「インテント」が部分的な塊なのに対して、「ボット」はインテントの塊を指す。インテント間をうまく連携させることで、全体的な一つのチャットボットとなる。これを「ボット」と呼ぶ。

ハンズオン概要

今回はホテルの予約をしたついでにおすすめの観光スポットを提示するようなチャットボットを試作してみました。
会話の流れは簡単に下記のような感じです。

基本的に1つのインテントで動いていますが、観光スポットを探す際は、東京と大阪の観光スポットを探すインテントに分岐します。
(赤い丸の部分です)

細かい作り込みなどは行なっていないので、高度なものは期待しないでください。。。

ハンズオン

今回のチャットボットは、Amazon Lexのサンプルの一つである「BookTrip」に独自の機能を付け加えていく形とします。
「BookTrip」の作成方法については、今回のアップデートで大きく変わった部分とは関係ないので、説明は割愛いたします。

今回は、ホテルの予約をした後、すぐに観光スポットを探すように作るので、「BookTrip」ボットの中の「BookHotel」インテントを中心に、それとは別に2つのインテントを作成し、連携させます。

今回作成するのは、東京の観光スポットを探す「Tokyo」インテントと、大阪の観光スポットを探す「Osaka」インテントになります。

インテントの追加

サンプルボットである「BookTrip」を作成したら、「インテント」の画面に遷移します。

サンプルを作成した後は、インテントは3つになると思います。そこに「Tokyo」「Osaka」インテントを追加します。
作り方はこれまでと変わり無いので、名前を「Tokyo」「Osaka」と指定するのだけ忘れずに実施してください。

インテントの編集

ここからアップデートの影響が出てくるので詳細に解説いたします。

作成したインテントを開き、編集するのですが、下の「Visual Editor」をクリックします。

そうすると、下記のページに遷移いたします。
これが、今回のアップデートによって追加されたビジュアルビルダーの機能になります。

上にオブジェクトがいくつかありますが、これらをエディターのところにドラッグ&ドロップすることで、会話フローを作成していくものです。

「Get slot value」の追加

今回は、「東京のどこを観光する予定ですか?」という質問をして、その返答に応じた観光スポットを提示するようにします。

では、ビジュアルエディターを使って、実際に作成していきましょう。
今回は別インテントから「Tokyo」インテントに遷移するので、緑の「Start」の部分は特に編集しません。
代わりに、「Start」の次に紫の「Get slot value」を挿入します。上のオブジェクトの「Get slot value」を「Start」の右側にドラッグ&ドロップしてください。

なぜこれを挿入したかというと、ここに質問を1つ追加し、その返答を変数に入れるためのオブジェクトになっており、この変数を元におすすめの観光地を提案するためです。

挿入した後は、それの右上のアイコンをダブルクリックします。そうすると、編集画面に遷移します。

それぞれの項目を入れていきます。私が入力した項目と括弧内にその説明を記します。

  • スロット名:StreetName
    (この質問の返答を保存する変数名のようなものです。任意に設定ください。)
  • スロットタイプ:destination
    (こちらはカスタムスロットタイプを選択してください。私はdestinationという名前で事前作成しておりました。)
  • このインテントには必須:チェックつける
    (観光地を提案するのに必要な情報なので、必須とします。)
  • Slot prompt:東京のどこを観光する予定ですか?
    (質問文になります。)
「Condition」の追加

先ほどの「Get slot value」で、東京のどこを観光するか聞いたので、その内容をもとに条件分岐して対応するようにします。
この条件分岐が今回のアップデートで追加されたところになります。

上のオブジェクトの「Condition」を、「Get slot value」の右側にドラッグ&ドロップしてください。

挿入した後は、それの右上のアイコンをダブルクリックします。そうすると、編集画面に遷移します。
「Get slot value」での入力内容に応じておすすめの観光スポットを提示するように編集します。

分岐をいくつか作成しますが、今回は4つ作成しました。「Default branch」以外は「Add conditional branch」を押下してブランチを追加していってください。

  1. Branch1 (浅草と入力されたら東京スカイツリーをお勧めするように返答します。)
      Branch name:Branch1
      Condition:{StreetName}=”浅草”
      Message:東京スカイツリーがおすすめです。
  2. Branch2 (お台場と入力されたらダイバーシティ東京プラザとお勧めするように返答します。)
      Branch name:Branch2
      Condition:{StreetName}=”お台場”
      Message:ダイバーシティ東京プラザがおすすめです。
  3. Branch3 (終了と入力されたら特に何も返答せず終了します。そのため、Messageは入力しません。)
      Branch name:Branch3
      Condition:{StreetName}=”終了”
  4. Default branch (上記3つに当てはまらない場所が入力されたら、この返答を返します。)
      Message:このサイトで探すのがおすすめです。https://www.gotokyo.org/jp/destinations/index.html
各ConditionにあるStreetNameは、「Get slot value」で目的地を聞いたと思うので、それが変数に保存されたものになります。その変数をもとに比較して条件分岐してると考えてください。
つながりの作成

各会話のつながりを矢印で結んでいきます。

各会話や、会話の中の分岐などには○があります。
その○から別の○を結ぶことで、会話のつながりを作成することが可能です。

やり方は簡単で、○をクリックし、別の○へドラッグ&ドロップします。
それをもとに「Tokyo」インテントで結んだ図は下記になります。

「End Conversation」と「Fall BackIntent」への分岐に関しては、各自でオブジェクトを追加してから実施してください。

ここまで実施することで、「Tokyo」インテントは作成完了です。
「Osaka」インテントは基本的には作成方法は同じです。
おすすめの観光場所については、私は下記のようにしました。

森ノ宮→大阪城公園
天王寺→天王寺動物園

もちろん、作成する人の好みになるので、お好きに作成してください。

「BookHotel」インテントの編集

本流となる「BookHotel」インテントから、「Tokyo」インテントと「Osaka」インテントに分岐して繋ぐための編集を行います。

「BookHotel」インテントの画面に遷移し、ビジュアルエディターを開きます。
すでに登録されているものに対して、下記3つを追加いたします。

①「Condition」の追加

すでに登録されているもので1番右にある「Confirmation」の右隣に「Condition」を追加します。
「Condition」については先述のとおり、Branchを登録して分岐を行います。

今回は目的地が東京の場合は「Tokyo」インテントに分岐し、目的地が大阪の場合は「Osaka」インテントに分岐します。それ以外の場合は、観光サイトを提示して終わります。

入力内容は下記のとおりです。

  1. Branch1 (東京と入力されたらTokyoインテントに分岐するようにします。この段階ではTokyoインテントの情報は含みません。)
      Branch name:Branch1
      Condition:{Location}=”東京”
  2. Branch2 (大阪と入力されたらTokyoインテントに分岐するようにします。この段階ではOsakaインテントの情報は含みません。)
      Branch name:Branch2
      Condition:{Location}=”大阪”
  3. Default branch (東京と大阪以外の場所が入力されたら、この返答を返します。)
      Message:こちらのサイトからお探しください。https://www.jalan.net/kankou/
②「Go to Intent」の追加

先ほどの「Condition」からTokyoインテントやOsakaインテントに分岐するために、「Go to Intent」を追加いたします。

ビジュアルビルダーの上の方から「Go to Intent」を選び、「Condition」の隣にドラッグ&ドロップします。
TokyoインテントとOsakaインテントがあるので2つ追加します。

追加後、「Go to Intent」の編集画面を開き、「Intent name」から該当のインテントを選択します。
今回2つ追加したので、それぞれ「Tokyo」と「Osaka」を選びます。

ここまでやった段階としては、下記のようになっております。

③矢印で結ぶ

「Condition」から2つの「Go to Intent」を矢印で結び分岐の遷移先を決めます。
先述したように○から○をドラッグ&ドロップで結ぶだけです。

また、Default Branchは、観光サイトを提示して終わりなので、新たに「End conversation」を追加して、遷移させます。

追加後は、下記のようになっております。

ここまで実施することで、「BookHotel」の編集が完了です。

編集後は、右下のオレンジの「インテントの保存」ボタンを忘れず押下しましょう。
そして、右上の「Build」ボタンの押下も忘れずにしましょう。

テストの実施

Buildが完了したら、テストを実施します。
Buildボタンの横の「Test」ボタンを押下してチャットの画面を開きます。

下記3枚は東京を目的地として、浅草を観光スポットにした場合の返答です。

下記は、大阪を目的地として、天王寺を観光スポットにした場合の返答です。それ以外の項目は上記3枚と同じです。

下記は、名古屋を目的地とした場合の返答です。東京や大阪のように独自のインテントを作っていないので、観光サイトのURLが提示されます。

感想

今回、条件分岐とビジュアルビルダーのハンズオンを行いました。
感想としては、ビジュアルビルダーによってかなり直感的にボットの構築ができるようになり、使いやすさを感じました。
条件分岐もLambdaコードを書く必要がなくなったことで、Amazon Lexを使う幅も広がるのではないかと期待しております。

これからもどんどん機能改良して、より良いチャットボットが作れるツールになっていって欲しいです!!

著者について

フロントエンドもバックエンドも両方少しずつ勉強して、フルスタックエンジニアを目指してます。
サーバレス開発の楽しさを実感中!

ANGEL Dojo 2021 ANGEL賞、ベストアーキテクチャ賞ダブル受賞
2023 Japan AWS Jr. Champions
2022〜24 Japan AWS All Certifications Engineers

齋藤友宏をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWSアプリケーション開発クラウドソリューション
シェアする
タイトルとURLをコピーしました