はじめに
下記のような構成で、connectのシステムを構築した際、
お問い合わせフローから、LambdaやLexを使用する際のパラメータの渡し方などのまとめます。
パラメータを問い合わせ属性
と呼びます。
Amazon Connectでは、顧客とのやり取りはそれぞれ問い合わせ として処理されます。やり取りには、音声通話、チャット、または Amazon Lex ボットを使用した自動的な対話があります。
各問い合わせは、特定のやり取りに固有の、いくつかのデータを保持することができます。このデータは、問い合わせ属性としてアクセスされます。
例:
- 顧客の名前。
- エージェントの名前
- 電話やチャットなど、問い合わせに使用されるチャネル
- その他
Connectのお問い合わせフローにLexとLambdaを使用可能にする設定
Connectのお問い合わせフロータブから、LexとLambdaが追加できます。
ConnectでのLexの連携設定
以下の2つの設定は、必須です!
1つめ
お問い合わせフローの顧客の入力を取得する
から以下のように、Lexで使用するbot名
とインテント
を選択します。
注意点として、使用したいインテント
を選択したとしても、bot
内のインテントは、すべて発動される可能性がありますので、1つのbotに多くのインテントを入れない方がよいです。
特に、インテントが発動するトリガー部分である発話が似ているインテントは、botごとを分けたほうがよいです。
2つめ
Lexの言語が日本語の場合、connectの音声設定も合わせる必要があります。
Lex側
connectの設定
-
言語
:日本語
-
音声
:Mizuki
-
言語属性を設定
:現在選択せれている言語を属性として使用します
#LexからLambdaに値を渡す
Lexで応答した情報(スロット値)をLambdaに渡すときは、以下のフローを作成します
顧客の入力を取得する
でLexの設定した後のフローにおいて、AWS Lambda 関数を呼び出す
を使用します。
例えばLexのスロットでスロット名:age
があった場合、Lambdaがそのageの値
を受け取るためには、以下のようにします。
AWS Lambda関数を呼び出す
属性を使用する
宛先キー:任意(Lambdaで受け取る値)
タイプ:Lexスロット
属性:age
タイムアウト値:8秒
タイムアウト値は、必ず8秒にしましょう。
3秒だと、間に合わずタイムアウトエラーになります。
属性
は、Lexのスロット名であるage
を選択し、タイプは、Lexスロット
を選択する必要があります。
このとき、Lambdaが受け取るjsonデータは以下のものになります。
(LambdaがConnectで受け取るjsonデータのキーは、すべて同じです。)
{
"Details": {
"ContactData": {
"Attributes": {},
"Channel": "VOICE",
"ContactId": "da689669-5a1b-48c9-bc85-4dfd31a9e416",
"CustomerEndpoint": {
"Address": "+09011111111",
"Type": "TELEPHONE_NUMBER"
},
"CustomerId": "",
"Description": "",
"InitialContactId": "da689669-5a1b-48c9-bc85-4dfd31a9e416",
"InitiationMethod": "INBOUND",
"InstanceARN": "arn:aws~~~",
"LanguageCode": "ja-JP",
"MediaStreams": {
"Customer": {
"Audio": ""
}
},
"Name": "",
"PreviousContactId": "da689669-5a1b-48c9-bc85-4dfd31a9e416",
"Queue": "",
"References": {},
"SystemEndpoint": {
"Address": "+xxxxxxxxxx",
"Type": "TELEPHONE_NUMBER"
}
},
"Parameters": {
"age": "20"
}
},
"Name": "ContactFlowEvent"
}
"Parameters": {"age": "20"}
値は、ここで受け取っていますね。
ageと20
を問い合わせ属性のキーと値
と呼びます。
Lambdaでこの値を受け取り方は、このようになります。
def lambda_handler(event, context):
age = event['Details']['Parameters']['age']
# age = 20
const age = event.Details.Parameters.age
Lambdaで値を受け取れるか確認する方法は、上記のjsonデータをlambdaのテストイベントにペーストして、テストを実行してみるとよいでしょう。
Lambdaで発信電話番号を受け取る
connectに電話してきた発信電話番号を受け取り、lambdaで使用する場合、以下の設定で受け取れます。
AWS Lambda関数を呼び出す
属性を使用する
宛先キー:任意(Lambdaで受け取る値)
タイプ:システム
属性:顧客電話番号
{
"Details": {
"ContactData": {
"Attributes": {},
"Channel": "VOICE",
"ContactId": "da689669-5a1b-48c9-bc85-4dfd31a9e416",
"CustomerEndpoint": {
"Address": "+09011111111",
"Type": "TELEPHONE_NUMBER"
},
省略
属性の顧客電話番号
のキーは、Address
になります。
user_phone = event["Details"]["ContactData"]["CustomerEndpoint"]["Address"]
#user_phone = +09011111111
const user_phone = event.Details.ContactData.CustomerEndpoint.Address
LambdaからLambdaに値を渡す
LambdaからLambdaに値を渡すには、関数のコードにreturn
が必要になります。
1つめのLambdaでreturn {"reservation": "false"}
した場合、2つ目のLambdaで値を受け取るには以下の設定になります。
AWS Lambda関数を呼び出す
属性を使用する
宛先キー:任意(Lambdaで受け取る値)
タイプ:外部
属性:reservation
Lambdaの値を受け取る場合、タイプは外部
になります。
2つめのLambdaで受け取るjsonデータは、Lexの時と同じです。
"Parameters": {"reservation": "true"}
値は、このように受け取ります。
reservation = event['Details']['Parameters']['reservation']
# reservation = true
複数受け取る場合、以下のようにパラメータをまとめましょう
Parameters = event['Details']['Parameters']
reservation = Parameters['reservation']
age = Parameters['age']
Lambdaで受け取る値は、属性でなく、テキストの使用もできます。
テキストの使用
も先程と同様に値を受け取れますので、省略します。
問い合わせ属性を音声に反映
Lambdaでreturn {"age": "20"}
し、その値をコンタクト属性の設定
を使用し、ユーザー定義として、属性を保存します。
その属性を使用し、プロンプトの再生
で音声を再生します。
コンタクト属性の設定
属性を使用する
宛先タイプ:ユーザー定義
宛先キー:任意(Lambdaで受け取る値)
タイプ:外部
属性:age
ユーザー定義
したものは、jsonデータのAttributes
内に入ります。
{
"Details": {
"ContactData": {
"Attributes": {
"age": "20"
},
プロンプトのテキストの中で「$」記号を使うと、コンタクト属性に設定
されている値をプロンプトに埋め込むことができます。
「$.Attributes」
で参照したい属性が「ユーザー定義」属性であることを指定し、最後のピリオドに続いて「属性名」を指定します。
プロンプトの再生
に以下のテキストを入れると、音声が属性の値を認識します。
お客様の年齢は、 $.Attributes.age 歳ですね。
お客様の年齢は、 20歳ですね。
注意点
プロンプトのテキストに 「$.Attributes.属性」
を埋め込む際、両端に半角スペースを入れないと、音声が認識せず、その箇所のみ無視されます。
↓ 半角スペース ↓ 半角スペース
お客様の年齢は、 $.Attributes.age 歳ですね。
ちなみに、ユーザー定義だけでなく、外部のタイプなども使用できます
- タイプ:ユーザー定義:$.Attributes.[宛先キー]
- タイプ:外部:$.External.[宛先キー]
- タイプ:Lexのインテント名:$.Lex.[宛先キー]
- タイプ:Lexのスロット名:$.Lex.Slots[宛先キー]
Lexの値も使用できるようです。
Amazon Lex での例
・ Amazon Lex ボットから属性を参照するには、参照する Amazon Lex ボットの一部を形式 $.Lex.[宛先キー] に含めて 、($.Lex.IntentName などとして) 使用します。
・ 顧客からの Amazon Lex ボットスロットへの入力を参照するには、$.Lex.Slots.slotName を使用します。この際、slotName はボットのスロット名と置き換えます。
Lambdaの実行結果によって、フローを分岐させる
年齢が20歳を超えているどうかでフローを分岐させたい場合があります。
Lambda返す値がreturn {"age": "20"}
もしくはreturn {"age": "19"}
の場合、フローを分岐させるためには、コンタクト属性を確認する
の設定が必要です。
コンタクト属性を確認する
確認する属性
宛先タイプ:ユーザー定義
属性:age
-
チェックする条件
:以上 20
ageが20以上の場合と20歳未満で分岐できました。
ちなみに、ageの属性値を外部タイプとして定義している場合
、$.External.age
が使えます。
Lambdaの外部タイプが無効になるパターン
下記フローのように、Lambdaを連続して使用すると、1つめのLambdaの外部タイプの値は、プロンプト再生に使用できません。(値を渡せません)
しかし、1つめのLambdaの後に、ユーザー定義でage
を定義することで、フロー内のどのタイミングでもage
を呼び出すことができます。
Lambdaのコードの注意点
Connectで実際にテストし、Lambda実行時にエラーになった場合、CloudWatch Logsでエラー原因を確認します。
その際、Lambdaのログは、エラーになっておらず、Connectのログを見ると、エラーになっている場合、Lambdaにreturn
を使用していない可能性があります。
return
がないと、connectが失敗するため、returnすることがなくても、適当な値をreturnしましょう。
参考記事
問い合わせ属性まとめ一覧↓
プロンプト再生のSSMLタイプを使用すると、音声の大きさや速度を調整できます。↓