【Amazon Connect】Amazon Bedrockを利用した音声認識による顧客の振り分け


## はじめに

Amazon Connect は AWS が提供するクラウド型コンタクトセンターサービスです。
例えば、ホテルの予約の電話で「予約のお問い合わせは1を、キャンセルのお問い合わせは2を押してください。」といったアナウンスを聞いたことがあるかもしれません。
このようなシステムをAmazon Connectで構築することが可能です。

しかし、スマホを耳から離してボタンを押すのは少し面倒ですよね。特にスマホが普及している現代では、音声認識を活用したより便利な仕組みが求められています。

本記事では、数値ボタンを押すことなく、AIを利用した音声認識で問い合わせ窓口を自動振り分けする仕組みを紹介します。

:::note info
Amazon Connectのリソース作成方法やLexの詳細な作成方法については省略しております。
ご注意ください。
:::

:::note info
Amazon Connectでは「キュー」と呼ばれるリソースを窓口として設定し、顧客の要望に応じて適切なキュー（窓口）にルーティングします。詳しくはこちらをご参照ください
 [AWS Black Belt資料](https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AmazonConnect-ContactRouting_0131_v1.pdf)
:::

## 目次

- [本記事のユースケース](#本記事のユースケース)
- [使用リソース](#使用リソース)
- [処理の解説](#処理の解説)
- [アーキテクチャ図](#アーキテクチャ図)
- [構築手順](#構築方法)
- [テスト結果](#テスト結果)
- [まとめ](#まとめ)

## 本記事のユースケース

本記事では、商品の購入または返品・交換をユースケースとします。具体的には以下のようなシナリオを想定しています。

- **購入**: 「この商品を注文したい」「商品の在庫を確認したい」
- **返品・交換**: 「届いた商品が壊れている」「サイズが合わないので交換したい」


## 使用リソース

本機能で使用するAWSサービスは以下の通りです。

- **Amazon Connect**: 顧客の入電を受け付け、問い合わせフローを管理
- **Amazon Lex**: 顧客の発話を取得し、音声認識を実施
- **Amazon DynamoDB**:  
  - **コンタクトテーブル**: 問い合わせごとのレコードを保存  
  - **カテゴリーテーブル**: 振り分け先のキュー ARN とカテゴリー名を保存
- **AWS Lambda**:  
  - **create_contact_table**: 問い合わせレコードを作成  
  - **get_contact_table**: 問い合わせIDからカテゴリー名を取得  
  - **get_category_table**: カテゴリー名からキューARNを取得  
  - **auto_dicide_queue**: 顧客の発話を解析し、適切なカテゴリーを判断
- **Amazon Bedrock**: 顧客の発話を解析し、カテゴリーを判断


## 処理の解説

顧客が電話をかけてからオペレーターにつながるまでの処理を以下に示します。
下記にアーキテクチャ図も記載していますので、参考にしてください。

- ①顧客がAmazon Connectに入電する
- ②初期設定として音声の設定やログの設定ブロックを通過する
- ③「create_contact_table」LambdaでDynamoDBのコンタクトテーブルに問い合わせごとのレコードを作成する
- ④Amazon Lexで顧客の発話を受け取る
- ⑤Amazon Lexから「auto_decide_queue」Lambdaを呼び出し、以下の処理を実施する
    - ④-1 カテゴリーテーブルのDynamoDBからカテゴリー一覧を取得する
    - ⑤-2 顧客の発話とカテゴリー一覧をBedrockに投げ、どのカテゴリーか判断させる
    - ⑤-3 判断されたカテゴリーをコンタクトテーブルのDynamoDBに保存する
    - Lambdaの処理を終了し、Amazon Connectのフローに戻す
- ⑥Amazon Connectからget_contactのLambdaを呼び出す
    - Lambdaで、コンタクトテーブルに保存されているカテゴリーを取得する
    - Amazon Connect側にカテゴリー名を渡す
- ⑦Amazon Connectからget_categoryを呼び出す
    - Lambdaで⑥のカテゴリー名を基に、該当キューARNを取得する
    - Amazon Connect側にキューARNを渡す
- ⑧「作業キューの設定」ブロックで、Lambdaで取得したキューのARNを設定する
- ⑨該当キューがルーティングプロファイルに設定されているオペレーターにつながる


## アーキテクチャ図

### Amazon Connectフロー内処理

![音声認識による自動キュー振り分け_アマコネフロー_v1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/7333cd3b-2d9c-4568-bfea-9d277503179f.png)

### 窓口振り分け機能のアーキテクチャ図

![音声認識による自動キュー振り分け.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/68fe8176-e0c3-44a8-9595-9f5ab6059af2.png)


## 構築方法

### 1. キューの作成

以下3つのキューを作成します。

- 購入
- 返品・交換
- その他（想定外の発話に対応するため）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/dc699e9a-762f-4f4a-8128-ed87f746d839.png)



### 2. DynamoDBカテゴリーテーブルの作成

- **パーティションキー**: category（文字列）  
- **項目**: queueARN（キューのARNを保存）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/b19872b2-d50b-4904-be99-6e4f503c3a0e.png)

---

### 3. DynamoDBコンタクトテーブルの作成

- **パーティションキー**: contactId（文字列）  
- **項目**: category（カテゴリー名を保存）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/b7f5951c-a0ab-4680-a605-47f79acca63d.png)


### 4. AWS Lambdaの作成

- **auto_decide_queue** Lambdaの処理フロー:  
  1. eventからcontactIdを取得  
  2. カテゴリーテーブルからカテゴリー一覧を取得  
  3. 発話をAmazon Bedrockで解析し、カテゴリーを判断  
  4. 判断結果をコンタクトテーブルに保存  

:::note info
以下のLambdaに関しては単純なDynamoDBのレコード作成や取得に関するものなので、省略しています。
  - **create_contact_table**: 問い合わせレコードを作成  
  - **get_contact_table**: 問い合わせIDからカテゴリー名を取得  
  - **get_category_table**: カテゴリー名からキューARNを取得  
:::

### 5. Amazon Lexの作成

Lexの作成は以下を参考にしてもらえればと思います。

https://qiita.com/oho-kiyotaka/items/ef5798c5dd71dadb5610

https://qiita.com/hirota_kodai/items/d1adcc39519f98efd017


- **インテント名**: queue_devide  
- **スロットタイプ**: FreeFormInput  
- **プロンプト**: 「こちら商品の購入もしくは返品・交換の窓口でございます。商品の購入、返品、交換のいずれをご希望でしょうか。」

:::note info
本記事では、Amazon Lexを利用した音声認識機能を記載していますが、Kinesis Data StreamsとAmazon Bedrockを組み合わせた方法で実装することも可能です。
:::

## テスト結果

Amazon Connectに入電のテストは記事ではわかりづらいため、Amazon Lexでの窓口振り分けテストを実施しました。
AI を使って発話パターンを生成し、10回のテストを行った結果、すべて想定通りの振り分けが行われました。

| 発話 | 想定 | 結果 |
|------|------|------|
| この商品を注文したいのですが、どうすればいいですか？ | 購入 | 購入 |
| この品物を手に入れたいのですが、在庫はありますか？ | 購入 | 購入 |
| この商品の値段を教えてください。もし問題なければすぐに欲しいです。 | 購入 | 購入 |
| この製品の新しいバージョンが出たら、ぜひ手に入れたいのですが、予約は可能ですか？ | 購入 | 購入 |
| このアイテムを買い物かごに入れたのですが、どうすれば購入できますか？ | 購入 | 購入 |
| 届いた品物が動かないのですが、どうすれば良いでしょうか？ | 返品・交換 | 返品・交換 |
| サイズが合わなかったので、別のサイズに変えてもらえますか？ | 返品・交換 | 返品・交換 |
| 注文したものと違う品物が届いたのですが、正しいものと取り替えてもらえますか？ | 返品・交換 | 返品・交換 |
| 品物を送り返したいのですが、どうすれば良いでしょうか？ | 返品・交換 | 返品・交換 |
| 別のものと取り替えてもらいたいのですが、どのようにすれば良いですか？ | 返品・交換 | 返品・交換 |

## まとめ

本記事では、Amazon Connect、Amazon Lex、Amazon Bedrockを利用した音声認識による窓口振り分けを紹介しました。
Amazon Bedrockを活用することで、Amazon Lex のシノニム登録作業を省き、柔軟な発話解析が可能になります。
これにより、作業時間を短縮しつつ、コストを抑えた実装が実現できます。

また、Kinesis Data Streamsを利用した音声認識の実装も可能ですが、Amazon Lexを利用することでコストを抑えられる利点があります。