Amazon Web Services ブログ

クライアントの API を使用して、Amazon Lex のセッション状態を管理する

対話をサポートするためボットを構築しようとした人なら、会話の流れの管理がいかに難しいかを理解できるでしょう。リアルなユーザー (明らかにスクリプトをリハーサルしていないユーザー) の会話は、途中で本題からそれることがあります。リアルなユーザーは今話しているトピックに関連した質問することもあれば、まったく新しい会話を始めることもあります。自然な会話は動的であり、複数のトピックを扱うことがほとんどです。

この投稿では API を使用して、新しいインテントへの切り替えや以前のインテントへの復帰を含む会話のフローを管理する方法を見ていきます。次のスクリーンショットは、リアルなユーザーと人間のカスタマーサービスエージェントの会話の例を示しています。

上記の例の残高に関するユーザークエリ (「ちょっと待って。カードの残高合計はいくら?」) は、支払いという本題から逸脱しています。私たちはトピックを簡単に変更します。しかしボットは会話の脱線が発生したときにその会話状況を保存し、違う質問に答えてから、元のインテントに戻って、ユーザーに本題を思い出させる必要があります。

この例で言えば、ユーザーがカードで支払いをしたいことをボットは覚えておかなければなりません。支払いについてのデータを保存した後、コンテキストを切り替えて、同じカードの合計残高の情報を引き出しています。ユーザーに応答した後、支払いを続けます。この会話を 2 つの部分に分けるには、次のように行います。

図 2: 会話の脱線と再開

美味しそうな例を考えてみましょう。「フライドポテトも付いていますか?」と何回言ったかを考慮し、その後の会話を想像してみてください。

よく構成されたボットは、会話の脱線を検出できます。Lambda 関数を使用してサーバー側でインテントを切り替えたり、Amazon ElastiCache または Amazon DynamoDB で会話状態を維持したり、事前に入力されたスロットと新しいプロンプトで以前のインテントに戻ることができます。現在では、これらすべてを行うことが可能です。しかし実際のボットではコードを作成し管理する必要があります。これは天気をチェックするといったような簡単な作業ではありません。(ここで天気ボットを悪く言っているのではなく、正しい都市を見つけるだけなのに私の会話がそれて行ってしまうんです。)

それで、何が言いたいの?

今日からは、新しいセッション状態 API を使用して、この種の脱線や他にもおもしろそうなリダイレクトに対処する Amazon Lex ボットを構築できます。この API を使用すると、クライアントアプリケーションから直接 Amazon Lex ボットとのセッションを管理し、会話フローをきめ細かく制御できます。

この投稿での会話の実装には、GetSession API 呼び出しを Amazon Lex に発行して、会話の前のインテント履歴を取得します。その後、PutSession オペレーションを使用して、正しいインテントを使用するようにダイアログマネージャーに指示し、次のダイアログアクションを設定します。これにより、ダイアログの状態、スロット値、属性を管理して、会話を前のステップに戻すことが可能となります。

前出の例では、ユーザーが合計残高についてクエリすると、クライアントは GetSession に続いて PutSession を呼び出し、支払いを続行することで、会話の脱線を処理しています。GetSession オペレーションからの応答には、ユーザーがやり取りした最後の 3 つのインテントの状態の概要が含まれます。これにはインテント MakePayment (accountType: credit, amount: $100)、および AccountBalance が含まれます。次の図は、インテント履歴の GetSession 取得を示しています。

Python の GetSession リクエストオブジェクトは、次の属性を含んでいます。

response = client.get_session(
 botName='BankBot',
 botAlias='Prod',
 userId='ae2763c4'
)

Python の GetSession 応答オブジェクトは、次の属性を含んでいます。

{
 'recentIntentSummaryView': [
  {
   'intentName': 'AccountBalance',
   'slots': {
    'accountType': 'credit'
   },
   'confirmationStatus': 'None',
   'dialogActionType': 'Close',
   'fulfillmentState': 'Fulfilled'
  },
  {
   'intentName': 'MakePayment',
   'slots': {
    'accountType': 'credit',
    'amount': '100'
   },
   'confirmationStatus': 'None',
   'dialogActionType': 'ConfirmIntent'
  },
  {
   'intentName': 'Welcome',
   'slots': {},
   'confirmationStatus': 'None',
   'dialogActionType': 'Close',
   'fulfillmentState': 'Fulfilled'
  }
 ],
 'sessionAttributes': {},
 'sessionId': 'XXX',
 'dialogAction': {
  'type': 'Close',
  'intentName': 'AccountBalance',
  'slots': {
   'accountType': 'credit'
   },
  'fulfillmentState': 'Fulfilled'
 }
}

次に、アプリケーションは前のインテントを選択し、PutSession (MakePayment に対する) に続いて Delegate を呼び出します。次の図は、PutSession が会話を再開することを示しています。

Python の PutSession リクエストオブジェクト (MakePayment インテントに対する) は、次の属性を含んでいます。

response = client.put_session(
 botName='BankBot',
 botAlias='Prod',
 userId='ae2763c4',
 dialogAction={
  'type':'ElicitSlot',
  'intentName':'MakePayment',
  'slots': {
   'accountType': 'credit'
  },
  'message': 'Ok, so let’s continue with the payment.How much would you like to pay?',
  'slotToElicit': 'amount',
  'messageFormat': 'PlainText'
 },
 accept = 'text/plain; charset=utf-8'
)

Python の PutSession 応答オブジェクトは、次の属性を含んでいます。

{
 'contentType': 'text/plain;charset=utf-8',
 'intentName': 'MakePayment',
 'slots': {
  'amount': None,
  'accountType': 'credit'
 },
 'message': 'Ok, so let’s continue with the payment.How much would you like to pay?',
 'messageFormat': 'PlainText',
 'dialogState': 'ElicitSlot',
 'slotToElicit': 'amount',
 'sessionId': 'XXX'
}

セッション状態 API オペレーションを使用して、会話を開始することもできます。ボットに会話を開始させましょう。スロットなしで「Welcome」インテントを作成し、「ようこそ。ご用件は何でしょうか?」でユーザーに挨拶する応答メッセージを作成します。 Python の PutSession リクエストオブジェクト (「Welcome」インテントに対する) は、次の属性を含んでいます。

次に、PutSession オペレーションを呼び出し、インテントを「Welcome」に設定し、ダイアログアクションを Delegate に設定します。

 

response = client.put_session(
  botName='BankBot',
  botAlias='Prod',
  userId='ae2763c4',
  dialogAction={
    'type':'Delegate',
    'intentName':'Welcome'
  },
  accept='text/plain; charset=utf-8'
)

Python のPutSession 応答オブジェクトは、次の属性を含んでいます。

{
 'contentType': 'text/plain;charset=utf-8',
 'intentName': 'Welcome',
 'message': 'Welcome to the Banking bot.How may I help you?',
 'messageFormat': 'PlainText',
 'dialogState': 'Fulfilled',
 'sessionId': 'XXX'
}

これで SDK を使ってのセッション状態 API オペレーションを利用できるようになりました。上記の会話のコードをダウンロードして、簡単なアプリケーションを実装できます。

これらの手法を実際のボットに組み込む方法の詳細については、「 Amazon Lexドキュメント」および Amazon Lex のよくある質問のページをご参照ください。Amazon Lex を使ったボットの設計について、もっと詳しく知りたいなら、 2 部構成のチュートリアル「Building Better Bots Using Amazon Lex」をご参照ください。 ヒントとコツについては、「Alexa Design Guide」をご覧ください。.NET がある?  ご心配なく。「.NET と AWS Toolkit for Visual Studio でボットを進化させる」をご参照ください。


著者について

Minaxi Singla は Amazon AI のソフトウェア開発エンジニアとして、人間を相手にしているかのような体験を可能にするチャットボットを通じたマイクロサービスに取り組んでいます。仕事以外では、ソフトウェア設計について学んだり、ハリーポッターシリーズをもう一度読んだりしています。

 

 

Pratik Raichura は Amazon Lex チームのソフトウェア開発エンジニアです。Lex のカスタマーエクスペリエンスを向上させる、スケーラブルな分散システムの構築に取り組んでいます。余暇には、ソフトウェアアーキテクチャに関する本を読んだり、 AI を使ってスマートホーム化に挑戦しています。