AmazonLexの基礎

The following topics provide additional information. We recommend that you review them in order and then explore the Getting Started with Amazon Lex exercises.

とのことで、ざっと見てみる

前提知識

AmazonLexの概要(コアコンセプト·用語)を把握してみる - keiwt’s diary

Programming Model

Model Building API Operations

CloudFormation対応されるまでは叩くAPIコマンドをリビジョン管理

Runtime API Operations

PostContent

テキストと音声
  • fomats
Input: LPCM, Opus
Output: MPEG, OGG, PCM

※8kHz(コールセンター) and 16kHz

PostText

テキストのみ

Lambda Functions as Code Hooks

Customize user interaction

例: ユーザーの履歴に応じてピザのトッピングを表示

※ギガ・ミートしか頼まない人にはギガ・ミートを一番上に表示
※過去に注文した数の降順でトッピングを表示
※最近注文したものから表示

Validate the user's input

例: ピザ1000枚注文した場合
例: シーフード食べれない人がシーフードピザを注文した場合

※異常値等の排除

Fulfill the user's intent

例: ピザを注文する

Lambda functions as code hooks

※Intentのフック

Dialog code hook for initialization and validation

AmazonLexがユーザーのインプットを理解して、botから返答  
例: 承知致しました。ピザは3枚ですね。  
PutIntent時にdialogCodeHookを指定

Fulfillment code hook

例: ピザの注文フック  
PutIntent時にfulfillmentActivityを指定

Lambda関数の分け方

1つの関数でdialogとfulfillmentを実行させることは可能  
One Lambda function can do initialization, validation, and fulfillment.  

The event data that the Lambda function receives has a field
  that identifies the caller as either a dialog or fulfillment code hook.  

Elicit

https://ejje.weblio.jp/content/elicit

  • ElicitSlot
例: 必須ではないslot valueを聞くことができる
例: XXXクーポンをご利用なられる場合にはIDを教えてください。
  • ElicitIntent
例: 前のIntentが完了した後に新しいIntentを呼び出せる
例: お飲み物はいかがいたしましょうか?

Service Permissions

Amazon Lex uses AWS Identity and Access Management (IAM) service-linked roles.

service-linked roles

ユーザーに手動で作成させるとハマる人がいるので、AWSが事前に定義してくれているものです

AWSServiceRoleForLexBots

Role ARN: arn:aws:iam::${AWS::AccountId}:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots
Path: /aws-service-role/lex.amazonaws.com/
Attached policies: AmazonLexBotPolicy
Trusted entities: lex.amazonaws.com
※LexがPollyを呼び出すため
bot作成時に自動作成

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "polly:SynthesizeSpeech"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

AWSServiceRoleForLexChannels




botの連携先にテキストをPOSTするため
botをSlack等に連携させると自動的に作成

Creating Resource-Based Policies for AWS Lambda

Amazon Lexはリソースべーすのポリシーを使ってLambda関数を呼び出します

Resource-Based Polices forAWS Lambda

※Lambdaではなく、Lambda関数毎にアクセス権限を管理できます

Lambda 関数は、AWS Lambda のリソースの 1 つです。

Lambda 関数に添付されたアクセス権限ポリシーは、リソースベースのポリシー (または Lambda の Lambda 関数ポリシー) と呼ばれます。Lambda 関数ポリシーを使用して、Lambda 関数の呼び出し権限を管理できます

Principal: lex.amazonaws.com
SourceArn: ${IntentのArn}

Deleting Service-Linked Roles

依存リソース削除後に削除する

Managing Messages (Prompts and Statements)

Types of Messages

Prompt

ユーザーに返答を求めるもの

Statement

返答を求めないもの

動的な返答

  • SlotName
例: {PizzaTopping}

※ギガ・ミート

  • AttributeName
例: [DeliveryTime]

※14時

  • いつ定義するか
bot作成時

Contexts for Configuring Messages

Bot-level messages

  • clarification prompts
ユーザーのIntentが理解できないときのメッセージ
例: I did'n understand you.

※Intentに紐付いたLambdaがメッセージを返さない時にも使われる

  • hang-up messages
複数回ユーザーからのメッセージが理解できないときのメッセージ
例: Sorry, I'm not able to assist at this time.

※intent, slot, follow-up prompts, intent confirmations含む

Intent-level messages

  • Confirmation prompts and cancel statements
すべてのslot valueが出揃った後 && fulfill intent前  
確認でNoならキャンセルのメッセージ
  • Goodbye message or follow-up prompts
注文完了しました。ピザは{Hour}時にお届けいたします。
他に何かご質問や確認事項等ございますでしょうか。
↓
No
↓
この度はLexピザをご利用いただきましてありがとうございました。

※Fulfillment code hookが成功して、Lambda関数がメッセージを返さなかったときにも使われる

  • Prompts to elicit value slot values
ピザは何枚でしょうか
お届け日時の入力をお願い致します
トッピングを以下から選択してください
サイズを以下から選択してください

bot作成時に指定しても、IntentのLambdaで上書かれる

コンテキスト毎にメッセージを分ける場合

session attributeとslot valueを使って分岐させる

※参照なしのメッセージを1つは用意する
※参照が解決できないとBadRequestException

Supported Message Formats

テキスト
Speech Synthesis Markup Language (SSML)

※Accept HTTP headerをtext/plain; charset=utf-8にするとテキストのみ返す
※音声のみのbotにテキストを投げるとBadRequestExceptionになるので、テキストも用意する
※outputDialogModeがテキストの場合にはLambdaからPlainTextを返す

Response Cards

選択肢を返す

※PostTextのみ(音声は現時点では非対応)
※Intent作成時に設定
※動的にしたい場合にはLambda使う

対象

Conclusion statement
Confirmation prompt
Follow-up prompt
Rejection statement
Slot type utterances

※それぞれ1つのResponse Cardだけ

Defining Static Response Cards

API: PutBot
Console: Intent作成時

Generating Response Cards Dynamically

initialization and validation Lambda関数を使う
dialogActionセクションに指定

Managing Conversation Context

slot data that the user provides
request attributes set by the client application
session attributes that the client application and Lambda functions create

Session Attributes

Location
UserName

※Locationはユーザーから近いピザの店舗に使用
※UserNameは確認に使用する

PostText

"sessionAttributes": {
   "attributeName": "attributeValue",
   "attributeName": "attributeValue"
}

※{}で削除できる

PostContent

base64エンコードしてx-amz-lex-session-attributesヘッダーとして送信

※複雑なデータの場合: http://docs.aws.amazon.com/ja_jp/lex/latest/dg/context-mgmt.html#context-mgmt-complex-attributes

Request Attributes

自作 or 定義済みのものを使用

PostText

"requestAttributes": {
   "attributeName": "attributeValue",
   "attributeName": "attributeValue"
}

PostContent

base64エンコードしてx-amz-lex-request-attributesヘッダーとして送信

Setting Predefined Request Attributes

共通

x-amz-lex:time-zone: "Asia/Tokyo"→Regionを元にデフォルト値あり
x-amz-lex:user-id: 111111
x-amz-lex:channel-id: 11111
x-amz-lex:channel-name: "hoge"
x-amz-lex:channel-type: "Slack"
x-amz-lex:webhook-endpoint-url: "Amazon Lex endpoint for the channel"

channel-type特有のもの

http://docs.aws.amazon.com/ja_jp/lex/latest/dg/example1.html 参照

Session Timeout

デフォルト

5分

※0分~1440分(24時間)で指定可能

指定方法

ボット作成時 or 更新時にidleSessionTTLInSecondsで指定する

Sharing Information Between Intents

例: GetOrderStatus intentで注文した数が必要
session attributesを使う

Setting Complex Attributes

// To convert an object to a string.
var jsonString = JSON.stringify(object, null, 2);
// To convert a string to an object.
var obj = JSON.parse(JSON string);

var encodedAttributes = new Buffer(attributeString).toString("base64");
"sessionAttributes" : {
   "binaryData": "base64 encoded data"
}

Bot Deployment Options

AWS Mobile SDK
Facebook Messenger
Slack
Twilio

Built-in Intents and Slot Types

Built-in Intents

https://developer.amazon.com/ja/docs/custom-skills/standard-built-in-intents.html

AMAZON.CancelIntent
AMAZON.HelpIntent
AMAZON.LoopOffIntent
AMAZON.LoopOnIntent
AMAZON.NextIntent
AMAZON.PauseIntent
AMAZON.PreviousIntent
AMAZON.RepeatIntent
AMAZON.ResumeIntent
AMAZON.ShuffleOffIntent
AMAZON.ShuffleOnIntent
AMAZON.StartOverIntent
AMAZON.StopIntent

※ミュージックの再生程度のものしかまだない

サポート外

AMAZON.YesIntent
AMAZON.NoIntent
[https://developer.amazon.com/ja/docs/custom-skills/built-in-intent-library.html]  

現在非対応

ベースインテントにutterances or slotsを追加・削除すること
ビルトインインテントにスロットを設定すること

Built-in Slot Types

AMAZON.EmailAddress
AMAZON.Percentage
AMAZON.PhoneNumber
AMAZON.SpeedUnit
AMAZON.WeightUnit
AMAZON.NUMBER
AMAZON.TIME(Available)

AMAZON.LITERALは現在サポート外 ※バージョンはなく、DevelopersPreviewのため、突然変更される可能性あり

Alexa Skills Kit Slot Types

https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/built-in-intent-ref/slot-type-reference
※すべてサポート
※PutIntent時に指定する


Custom Slot Types

Genres: "comedy," "adventure," "documentary," etc.

シノニム

例: "funny" and "humorous" → "Comedy"

スロット値の拡張

スロット値とシノニムに似ている場合には自動的にそのスロット値に解決される

上限

スロット値とシノニムで10,000 / 1スロットタイプ
スロット値とシノニムで50,000 / 1ボット

参考

http://docs.aws.amazon.com/ja_jp/lex/latest/dg/how-it-works.html ※一番下のTopics

https://docs.aws.amazon.com/console/iam/service-linked-role

http://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html

http://docs.aws.amazon.com/ja_jp/polly/latest/dg/ssml.html

http://docs.aws.amazon.com/ja_jp/lex/latest/dg/lambda-input-response-format.html

http://docs.aws.amazon.com/ja_jp/lex/latest/dg/howitworks-manage-prompts.html#msg-prompts-resp-card-dynamic

http://docs.aws.amazon.com/ja_jp/lex/latest/dg/howitworks-manage-prompts.html#msg-prompts-resp-card-dynamic