簡易コールセンターをAmazon Lex、Amazon Polly、Amazon Connectを使って構築してみた

# はじめに
AIの活用法が次々と生まれている中で、AIとAWSを融合させればおもしろいことができるのではないかと思い、その前段階として、まずはAWSのみで簡単な対応しかできない簡易コールセンターを構築してみました。

# 完成イメージ
![スクリーンショット 2023-11-11 173521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/64bef824-318f-f5a9-3ec1-8de4d9f0b56f.png)

# 事前準備
## Amazon Connectインスタンスの作成
Amazon Connectのコンソール画面に遷移し、`インスタンスを追加する`を押下します。
### ステップ１
![スクリーンショット 2023-11-11 074309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/7acdf7c8-dd14-0333-7a09-354b0ddc0c6b.png)

- ID管理の項目で、`Amazon Connectにユーザーを保存`を選択します。
- アクセスURLには一意なインスタンス名を入力します。
- `次へ`を押下します。

### ステップ２
![スクリーンショット 2023-11-11 074152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/c5e866c6-c2a2-dc71-6cce-a6d98b74a63f.png)
- `管理者を指定`を選択します。
- ユーザー名などを入力します。
- `次へ`を押下します。
 
### ステップ３
![スクリーンショット 2023-11-11 074549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/25097697-59ab-a541-a6f5-3d669552c588.png)
- 着信と発信の両方を許可します。
- `次へ`を押下します。

### ステップ４
![スクリーンショット 2023-11-11 074809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/6789b9e6-26bf-db71-6e7c-815384313057.png)
- `Customer Profiles を有効化`のチェックを外します。
- `次へ`を押下します。

### ステップ５
- すべての設定と情報を確認します。
- `インスタンスの作成`を押下してインスタンスを作成します。

`正常に終了しました。`と表示されたら成功です。

## Amazon Connectの開始
![スクリーンショット 2023-11-11 080126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/ea602c13-5173-0a8f-d890-80743927c2e9.png)

`今すぐ始める`を押下すると、Amazon Connectのダッシュボードが別のブラウザタブで表示されます。
言語を日本語にします。
この画面の`今すぐ始める`を押下します。

### 電話番号の取得
![スクリーンショット 2023-11-11 080835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/e87dbcc3-6eac-0f26-d711-e034f500f76b.png)
- 電話番号を取得可能な国を選択します。※日本の電話番号を取得する場合は、AWS サポートからリクエストし、必要書類を提出する必要があります。
- タイプは DID (直通ダイヤル) を選択し、表示されるリストから番号を選択します。
- `次へ`を選択します。
※マイクへのアクセスを許可を求めるメッセージが表示された場合は、オーディオデバイスを確認し、許可を選択してください。
- `次へ`を選択します。
- ダイアログに表示される指示に従って、Amazon Connect インスタンスへの着信通話をテストします。
- テストが完了したら、`次へ`を選択します。

# Amazon Polly と Amazon Lex によるインタラクティブな対話
## Lex ボットの作成
Lexのコンソール画面に行き、`ボットを作成`を押下します。

### ボット設定を構成
![スクリーンショット 2023-11-11 115356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/0bcd97cc-64c3-1202-3285-8d76e8411fa4.png)

 - `空のボットを選択します。`を選択します。
 - 今回ボット名は、`PizzaOrder` と入力します。
 
![スクリーンショット 2023-11-11 115844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/dfcc8448-0b8c-4501-802b-bc58713a672b.png)

IAM アクセス許可 画面で、`基本的な Amazon Lex 権限を持つロールを作成します。`を選択します。

![スクリーンショット 2023-11-11 120136.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/6b52a16c-7cdb-3521-b723-35fb220dfc30.png)

- 児童オンラインプライバシー保護法 (COPPA) については、`いいえ`を選択します。
- アイドルセッションのタイムアウトは、デフォルト値のまま`5分`とします。
- 詳細設定 - オプションはデフォルトのまま、`次へ`を押下します。

### ボットに言語を追加
![スクリーンショット 2023-11-11 120433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/7f5eae38-9932-9f2e-525b-c730f73b368c.png)
- 言語を選択は、`日本語 (JP)`を選択します。
- 音声による対話 は、ニューラルテキスト読み上げの音声の `Takumi`を選択します。
- インテント分類信頼スコアのしきい値は、デフォルト値のまま`0.40`とします。
- `完了`を押下します。
- `ボット (PizzaOrder) が正常に作成されました`と表示されれば成功です。

### インテントの作成
![スクリーンショット 2023-11-11 120810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/acb50c8d-e75b-e778-c0c8-7878c0cc91a1.png)
- インテント名に`GetPizzaOrder`と入力します。

![スクリーンショット 2023-11-11 121156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/e4b34835-32a6-0b3e-8151-c05de69cf603.png)
- プレーンテキストに下記テキストを貼り付け、プレビューを表示します。
```
ピザを注文したい
ピザを注文する
ピザをください
```
- スロットセクションは、次のセクションでカスタムスロットのタイプを最初に設定するため、空のままにしておきます。
- `インテントを保存`を押下します。

![スクリーンショット 2023-11-11 121421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/df845894-ecf0-2675-5d89-11fde5332bf2.png)

- Amazon Lex のナビゲーションメニューで、インテントリストに戻るを選択します。

### スロットタイプの作成
![スクリーンショット 2023-11-11 121558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/c97056f4-10a1-416c-7146-8da20090c572.png)

- スロットタイプを選択します。
- カスタムスロットタイプを構築するため、`スロットタイプを追加`を選択します。
- `空のスロットタイプを追加`を選択します。

![スクリーンショット 2023-11-11 121809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/0a7eb613-b671-ba58-449c-37c0e10527e8.png)
- ダイアログボックスが表示されたら、スロットタイプ名に `PizzaSize` と入力し、追加を選択します。

![スクリーンショット 2023-11-11 122248.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/70633f26-d2bf-7653-1375-e0407aa13655.png)
- スロット値の解決で`スロット値に制限`を選択します。
- スロットタイプ値の下に、次の値のタイプを入力して価値を追加を選択します。
`スモール`
`ミディアム`
`ラージ`
また、類似の発言を認識するため、画像のように値も追加します。
- `スロットタイプを保存`を選択します。

前のステップを繰り返して、PizzaCrust と PizzaToppings の2つのスロットタイプを作成します。

### ボットスロットの追加
Amazon Lex のナビゲーションメニューで、`スロットタイプ`を選択します。
`インテント`を選択し、先ほど作成した`GetPizzaOrder` 
を選択します。

![スクリーンショット 2023-11-11 123212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/dfdba7bf-47f7-6632-fbbf-8d5dead74c23.png)
スロットの項目までスクロールし、`スロットの追加`
を選択します。

![スクリーンショット 2023-11-11 123421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/012a8d1f-f69a-1e21-da6c-bbd8d19d921a.png)

- スロットを追加ウィンドウで、前の手順で作成したスロットに関する詳細を入力します（下記表参照）。
- `このインデントには必須`チェックボックスにはすべてチェックを入れます。

| 名前 | スロットタイプ | プロンプト |
|:-----------|------------:|:------------:|
| PizzaSize  | PizzaSize   | ご希望のサイズをお知らせください |
| PizzaToppings     | PizzaToppings      | お好みのトッピングをお知らせください       |
| PizzaCrust       | PizzaCrust        | お好みの生地をお知らせください        |

![スクリーンショット 2023-11-11 124007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/fdf14bac-59f4-d425-3fe5-feb11270d830.png)
スロットセクションに、作成した3つのスロットが含まれていることを確認できます。

![スクリーンショット 2023-11-11 124421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/bbfc1a69-66a6-76cb-f13f-e50815c5ab7e.png)
フルフィルメントのフルフィルメントが成功した場合の項目で、以下のように入力します。
```
ご注文を確認します。ピザのサイズは {PizzaSize}、生地は {PizzaCrust}、トッピングは {PizzaToppings}、以上でご注文頂きました。
```
`インテントの保存`を押下します。

![スクリーンショット 2023-11-11 124709.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/a3be3439-8522-b946-0608-f36b6f153fd2.png)

`Build`を押下すると、設定したボットの構築処理が開始します。

`ボット (日本語 (JP)) で言語 PizzaOrder が正常に構築されました`と表示されれば成功です。

### ボットのテスト
`Test`を押下すると、ボットテスト用インタフェースが開きます。

![スクリーンショット 2023-11-11 125647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/a4df2778-9939-be9c-d869-67be9eea392b.png)
テスト用インターフェイスを使用して、テスト用の発話を入力し、ボットが想定通りに応答するかどうかを確認することができます。

### 新しいボットバージョンとエイリアスの公開
Amazon Lex のナビゲーションメニューで、インテントリストに戻るを選択し、ボットのバージョンを選択します。
![スクリーンショット 2023-11-11 130033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/81e18f36-67ac-f8f7-3aa1-4a5125c32bcd.png)
既存のボットの新しいバージョンを作成するため、`バージョンを作成`を選択します。

![スクリーンショット 2023-11-11 130541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/1a640b65-4423-bc0e-0df7-2cb11a199ccb.png)
バージョンを作成画面で、`作成`を選択します。

`1 のバージョン PizzaOrder が正常に作成されました`と表示されれば成功です。

![スクリーンショット 2023-11-11 130717.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/437698c5-a039-1218-397d-d1c1f9f9e939.png)
次に、デプロイ用の新しいエイリアスを作成する必要があります。
ナビゲーションメニューから、エイリアスを選択し、`エイリアスを作成`を選択します。

![スクリーンショット 2023-11-11 130856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/6565afbc-2313-44e9-01bb-3135d6301b60.png)
エイリアスを作成画面で、エイリアス名に `PizzaOrderProd` を入力します。

![スクリーンショット 2023-11-11 131013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/a4913faf-53ce-2bbc-46cf-0be95fc6b3dc.png)
バージョンに関連付ける - オプションで、前の手順で作成したバージョンを選択し、`作成`を押下します。

`エイリアス (PizzaOrderProd) を正常に作成しました`と表示されれば成功です。
エイリアス名は、Amazon Connect でボットを設定する際に使用しますので、メモしておきます。

## Amazon Connect インスタンスに Amazon Lex ボットを追加
### Amazon Connect インスタンスにボットを追加
- Amazon Connect サービスを開きます。
- ボットを追加するインスタンスの Amazon Connect インスタンスエイリアスを選択します。
- 左側のナビゲーションバーで問い合わせフローを選択します。

![スクリーンショット 2023-11-11 154615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/043af41a-8257-e987-ebc3-63932cf20d30.png)
Amazon Lex のセクションで、PizzaOrderボットを作成したリージョンとボット名、作成したエイリアスを選択します。
次に、`Amazon Lex ボットを追加`を選択します。

![スクリーンショット 2023-11-11 154755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/48bfd7a2-ed0b-ba31-6e03-27cb78ead716.png)
PizzaOrderのボットが、Lex ボットの一覧に表示されます。
これにより、Amazon Connect のコンタクトフローに Lex ボットを統合することができます。
ここまでの手順で、Amazon Connect インスタンスにボットの追加を完了しました。

## Lex ボットを使用したコンタクトフローの構築
### コンタクトフローの作成
AWS コンソールの Amazon Connect サービスから概要にあるリンクをたどり、Amazon Connect のコンソールを開きます。
![スクリーンショット 2023-11-11 155049.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/c3bcf7ea-676a-120e-0410-5ed23582e455.png)
ルーティングからフローのページに切り替え、`フローの作成`を選択します。

![スクリーンショット 2023-11-11 155629.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/23172089-84c4-c582-0a0c-31f7f50b0678.png)
名前の入力欄に、`PizzaOrder_Flow` と入力します。
ログ記録動作の設定ブロックをデザインペイン上に移動し、エントリポイントブロックに接続します。
音声の設定ブロックをデザインペイン上に移動し、ログ記録動作の設定ブロックの成功に接続します。

![スクリーンショット 2023-11-11 160029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/be58dcea-9e39-ef2e-f451-e93f18c2efc6.png)
音声の設定ブロックをクリックして編集します。
- 言語は、ドロップダウンから`日本語`を選択します。
- 音声は、`Takumi`を選択します。
- 発話スタイルを上書き - ニューラル チェックボックスを選択し、`ニューラル発話スタイル:なし` を選択します。
- `言語属性を設定` を選択します。
- `保存` を押下します。


`顧客の入力を取得する`ブロックをデザインペイン上に移動し、音声の設定ブロックの成功に接続します。

![スクリーンショット 2023-11-11 160443.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/0531edbf-5e73-08b4-56e5-5d2988163232.png)
顧客の入力を取得ブロックを編集します。
`テキスト読み上げまたはチャットテキスト`を選択し、`山田ピザにお電話ありがとうございます。どのようなご用件でしょうか？`と入力します。

`Amazon Lex` タブを選択し、名前のドロップダウンから `PizzaOrder`ボットを選択します。

![スクリーンショット 2023-11-11 160730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/1e7d30cf-b289-fdd2-9afe-ffeeb3b6e111.png)
- エイリアスは `PizzaOrderProd` を選択します。
- インテントの追加をクリックし、`GetPizzaOrder` と入力します。
- `保存` を押下します。

`コンタクト属性の設定`ブロックをデザインペイン上に移動します。
顧客の入力を取得するブロックの`GetPizzaOrder` の出力に接続します。

![スクリーンショット 2023-11-11 161629.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/c6ab11d2-6381-7408-69ab-fa24df841ac2.png)
コンタクト属性の設定ブロックを編集します。
- 名前空間 を `ユーザー定義済` として選択します。
- キーに `Size` と入力します。
- 値に `手動で設定`を選択し、`$.Lex.Slots.PizzaSize` と入力します。
- `別の属性の追加`を2回選択して、上の手順と同様に`Crust` 属性と `$.Lex.Slots.Crust`、`Toppings` 属性と`$.Lex.Slots.Toppings`の2つを追加します。
- 完了したら、`保存`を押下します。

`プロンプトの再生`ブロックをデザインペインに移動します。
コンタクト属性の設定ブロックからの `成功` と `エラー` 出力に接続します。

![スクリーンショット 2023-11-11 162026.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/00c5c42a-7250-9751-b7cd-7452d9bccdfe.png)
プロンプトの再生ブロックを編集します。
- テキスト読み上げまたはチャットテキストを選択し、`できたての $.Attributes.Size $.Attributes.Crust ピザを15分後にお届けします。ご注文ありがとうございました。`というテキストを入力します。
- `保存`を押下します。

`プロンプトの再生ブロック`をもう一つデザインペインに追加します。
顧客の入力を取得するブロックの`デフォルト`および`エラー`出力に接続します。

![スクリーンショット 2023-11-11 162411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/2852c6d5-ffa6-9c15-75cc-44e765049a6c.png)
プロンプトの再生ブロックを編集します。
- `テキスト読み上げまたはチャットテキストを選択し、申し訳ありません。エラーが発生しました。もう一度おかけ直しください。`というテキストを入力します。
- `保存`を押下します。

`切断`ブロックをデザインペイン上に移動し、プロンプトの再生ブロックの`成功`、`エラー`両方の出力に接続します。
これを2つのプロンプトの再生ブロックの両方に対して行います。

![スクリーンショット 2023-11-11 162716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/47882ea9-c050-35b2-3e75-e73b9737a56c.png)
コンタクトフローが完成しました。
想定通りのフローか確認し、右上の`公開`を押下します。

### コンタクトフローへの電話番号割り当て
画面左側のナビゲーションバーで `チャネル` > `電話番号` を選択します。

![スクリーンショット 2023-11-11 163132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/50bd5dc2-7378-ad29-f5a7-330fa880cad3.png)
- インスタンスに割り当てられた電話番号を選択し、前のステップで作成した `PizzaOrder_Flow` を選択します。
- `保存`を選択します。

### 顧客体験のテスト
割り当てた電話番号に電話をかけます。
すると、ピザが注文(!?)できるようになっています。

ここまでの手順で、Lex ボットを利用したコンタクトフローの構築が完了しました。

# まとめ
無事に簡易コールセンターを構築することができました。
ゆくゆくはChatGPTをかけあわせて何か作りたいと思います。

※参照
[AWS Workshop studio](https://catalog.workshops.aws/amazon-connect-lex-integration/ja-JP/2-workshop/200-lex-interactive)