Amazon Lex
開発者ガイド

プログラミングモデル

ボットは、Amazon Lex のプライマリリソースタイプです。Amazon Lex には、他のリソースタイプとして、インテントスロットタイプエイリアスボットチャネル関連付けがあります。

ボットを作成するには、Amazon Lex コンソールまたはモデル構築 API を使用します。コンソールのグラフィカルユーザーインターフェイスでは、アプリケーションの本番稼働準備が整ったボットを構築できます。必要に応じて、AWS CLI を介したモデル構築 API や独自のカスタムプログラムを使用してボットを作成することもできます。

作成したボットは、サポートされているプラットフォームのいずれかにデプロイします。または、独自のアプリケーションに統合します。ユーザーがボットとやり取りする場合、クライアントアプリケーションは Amazon Lex ランタイム API を使用してボットにリクエストを送信します。たとえば、ユーザーが「ピザを注文したい」と言うと、クライアントはランタイム API オペレーションのいずれかを使用して Amazon Lex にこの入力を送信します。ユーザーは、入力を音声またはテキストで提供できます。

インテントでは、Lambda 関数を作成して使用することもできます。これらの Lambda 関数コードフックを使用して、初期化、ユーザー入力の検証、インテントの達成などのランタイムアクティビティを実行できます。ここで示している各セクションで、さらに詳しく学習できます。

モデル構築 API オペレーション

ボット、インテント、スロットタイプをプログラムで作成するには、モデル構築 API オペレーションを使用します。ボットのリソースの管理、更新、削除にもモデル構築 API を使用できます。モデル構築 API オペレーションには以下が含まれます。

モデル構築 API では、Amazon Lex リソースを管理するためのカスタムツールを作成できます。たとえば、ボット、インテント、スロットタイプごとのバージョン数は 100 に制限されています。モデル構築 API を使用すると、ボットが制限に近づいたときに、古いバージョン自動的に削除するツールを構築できます。

リソースの更新が一度に 1 つのオペレーションでのみ実行されるように、Amazon Lex ではチェックサムを使用します。Put API オペレーション (—PutBotPutBotAliasPutIntent、または PutSlotType—) を使用してリソースを更新する場合は、リソースの最新のチェックサムをリクエストで渡す必要があります。2 つのツールで同時にリソースを更新しようとすると、両方から同じ最新のチェックサムが提供されます。最初に Amazon Lex に到達するリクエストは、リソースの最新のチェックサムと一致します。2 番目のリクエストが到着するまでには、チェックサムが異なっています。2 番目のツールは、PreconditionFailedException 例外を受け取り、更新は終了します。

Get オペレーション (—GetBotGetIntentGetSlotType—) には結果整合性があります。いずれかの Put オペレーションを使用してリソースを作成または変更した直後に Get オペレーションを使用すると、その更新は返されない場合があります。Get オペレーションは、前回の更新を返した後で再度リソースが変更されるまでの間に、必ず今回の更新されたリソースを返します。更新されたリソースが返されたかどうかは、チェックサムを調べて確認できます。

ランタイム API オペレーション

クライアントアプリケーションは、以下のランタイム API オペレーションを使用して Amazon Lex と通信します。

  • PostContent – 音声またはテキストの入力を受け取り、インテント情報とユーザーに伝えるテキストまたは音声のメッセージを返します。現在、Amazon Lex は以下の音声形式をサポートしています。

     

    入力音声形式 – LPCM および Opus

    出力音声形式 – MPEG、OGG、および PCM

     

    PostContent オペレーションは 8 kHz と 16 kHz のオーディオ入力をサポートしています。エンドユーザーが電話で Amazon Lex と話す形式のアプリケーション (自動化されたコールセンターなど) は、8 kHz のオーディオを直接渡すことができます。

     

  • PostText – テキストを入力として受け取り、インテント情報とユーザーに伝えるテキストメッセージを返します。

クライアントアプリケーションは、ランタイム API を使用して特定の Amazon Lex ボットを呼び出し、発話 (— ユーザーによるテキストまたは音声の入力) を処理します。たとえば、ユーザーが「ピザをください」と言ったとします。 クライアントは、Amazon Lex のランタイム API オペレーションのいずれかを使用して、このユーザー入力をボットに送信します。Amazon Lex は、ユーザー入力からユーザーのリクエストがボットで定義されている OrderPizza インテントに向けたものであることを認識します。Amazon Lex はユーザーとの会話から必要な情報あるいはスロットデータ (ピザのサイズ、トッピングや枚数など) を取得します。ユーザーがすべての必要なスロットデータを指定すると、Amazon Lex はインテント設定に応じ Lambda 関数のコードフックを呼び出してインテントを達成するか、インテントデータをクライアントに返します。

ボットで音声入力を使用している場合は、PostContent オペレーションを使用します。たとえば、自動化されたコールセンターアプリケーションでは音声を Amazon Lex ボットに送信することができるので、担当者が顧客の問い合わせに対応する必要がありません。電話から Amazon Lex に音声を直接送信するには、8 kHz オーディオ形式を使用できます。

Amazon Lex コンソールのテストウィンドウでは、PostContent API を使用してテキストおよび音声のリクエストを Amazon Lex に送信します。このテストウィンドウは「Amazon Lex の使用開始」の演習で使用します。

コードフックとしての Lambda 関数

Lambda 関数をコードフックとして呼び出すように Amazon Lex ボットを設定できます。コードフックは複数の目的で使用できます。

  • ユーザーとのやり取りをカスタマイズする — たとえば、Joe からピザのトッピングの種類を尋ねられたときに、Joe の好みに関する過去の知識に基づいてトッピングのサブセットを表示できます。

  • ユーザーの入力を検証する — Jen が営業時間外に花の受け取りを希望しているとします。Jen が入力した時間を検証して、適切なレスポンスを送信できます。

  • ユーザーのインテントを達成する — Joe からピザの注文に必要なすべての情報を得た後で、Amazon Lex は Lambda 関数を呼び出して最寄りのピザ店に注文できます。

インテントを設定する際に、以下の場所で Lambda 関数をコードフックとして指定します。

  • 初期化および検証用のダイアログのコードフック — この Lambda 関数はユーザー入力ごとに呼び出されます (Amazon Lex がユーザーのインテントを理解しているものとします)。

  • フルフィルメントコードフック — この Lambda 関数は、インテントを達成するために必要なすべてのスロットデータがユーザーから提供された後で呼び出されます。

次のスクリーンショットに示すように、インテントを選択して Amazon Lex コンソールでコードフックを設定します。


                    Lambda 関数のコードフックを示す Amazon Lex コンソール。

コードフックは、PutIntent オペレーションの dialogCodeHook フィールドおよび fulfillmentActivity フィールドでも設定できます。

1 つの Lambda 関数で、初期化、検証、およびフルフィルメントを実行できます。Lambda 関数が受信するイベントデータには、呼び出し元をダイアログまたはフルフィルメントのコードフックとして識別するフィールドがあります。この情報を使用して、コードの該当部分を実行できます。

Lambda 関数では、複雑なダイアログ間をナビゲートできるボットを構築できます。Amazon Lex に特定のアクションを実行するように指示するには、Lambda 関数のレスポンスの dialogAction フィールドを使用します。たとえば、必須ではないスロット値をユーザーから取得するよう Amazon Lex に指示するには、ElicitSlot ダイアログアクションを使用します。ElicitIntent ダイアログアクションを使用して、ユーザーが前のインテントを終了したときに、別のインテントを引き出すことができます。

詳細については、「Lambda 関数の使用」を参照してください。