Amazon Q in Connectで「コンテンツ検索」と「リアルタイムレコメンデーション」を試してみた

# はじめに

**[Amazon Connect](https://aws.amazon.com/jp/connect/)** はAWSが提供するクラウドベースのコンタクトセンターサービスです。
2017年にローンチして、2018年には東京リージョンでも利用できるようになりました。
私も過去に記事を書いています。

https://qiita.com/hamham/items/46aa03e7977b32d5ad14

一方、**[Amazon Q](https://aws.amazon.com/jp/q/)** はAWSで使えるAIアシスタント（チャットボット）で2023年11月に登場したばかりのサービスです。
マネージメントコンソールからも利用することができ、チャット形式で質問することが可能です。
ただし、**2024年5月時点で日本語対応はしていません。**

今回扱う **[Amazon Q in Connect](https://aws.amazon.com/jp/connect/q/)** は、名前の通りAmazon ConnectでAmazon Qを使えるサービスになります

この記事ではAmazon Q in Connectの環境を構築して、**「コンテンツ検索」** と **「リアルタイムレコメンデーション」** を試してみます。

# Amazon Q in Connectの活用シーン

Amazon ConnectとAmazon Qの組み合わせがなぜ効果的かを説明します。

コンタクトセンターのオペレータは様々な問い合わせに対応します。
コンタクトセンターに問い合わせて「少々お待ち下さい」と、電話を保留にされた経験は誰しもがあると思いますが、その時はオペレータがマニュアルを探して調べたり、詳しい人にエスカレーションして質問したりしています。

オペレータがAmazon Q in Connectを活用すれば、AIが返答してくれるため、マニュアルを探したり、エスカレーションしたりする時間を大幅に削減することできます。

Amazon Q in Connectは情報ソースとして以下を利用できます。
- S3バケット
- Salesforce
- Zendesk
- ServiceNow
- SharePoint

# ハンズオン（環境をつくる）

ここからはハンズオン形式で紹介します。
Amazon Q in Connectは東京リージョンでも利用できますので、東京リージョンでやっていきます

### Amazon Connectインスタンスの作成

まずはAmazon Connectのインスタンスを作ります。
下記の画面から任意のアクセスURLをつけて作成します。

今回は「管理者なし」、他もデフォルト設定で進めます

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/471ceb2b-53c6-4f3d-1ae7-cfb9021d6eaa.png)

### KMSキーの作成

キーのタイプを「対象」にして任意の名前をつけます

![kms.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/bbee98e2-96ea-0ca6-b54b-5122ac30133a.png)

作成後に、Amazon Q in Connect ドメインのキーポリシーで、次のアクセス許可をconnect.amazonaws.com サービスプリンシパルに付与します

- kms:GenerateDataKey*
- kms:DescribeKey
- kms:Decrypt

以下が参考となるJSONです。

```json
{
    "Id": "key-consolepolicy-3",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::your_accountId:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "connect.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        }
    ]
}   
```

### コンテンツ格納用のS3バケットの作成

マニュアルなど、コンテンツ格納用のS3バケットを作成します。
こちらも任意のバケット名をつけます。暗号化タイプはここではデフォルトの「Amazon S3 マネージドキーを使用したサーバー側の暗号化 (SSE-S3)」 とします

### Amazon Qのドメイン追加

Amazon Connectのインスタンスでドメインの追加を行います。任意のドメイン名を付けて、ここでは暗号化設定のカスタマイズのチェックボックスはOFFにします。

![aQ_domain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/8df78d6a-9526-b9c5-ebc7-57f354d69a36.png)

### ドメインの統合

ドメインを追加したら統合設定を行います。
ここではソースはS3を指定し、任意の統合名を付けます。
さきほど作成したS3バケットとKMSキーを指定します。

![tougou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/958d18b1-6c4e-7c89-e03d-92f19c778c1b.png)

### S3へのコンテンツのアップロード

S3バケットにコンテンツとなるマニュアルをアップロードします。
なおAmazon Q in Connectで検索対象とできるファイルは **[管理者ガイド](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/enable-q.html)** に書かれている4種類です。
- HTML ファイル
- Word ファイル
- PDF ファイル
- テキストファイル

また、**ファイルのサイズは1MB以下** であることが必要です。はじめはこの仕様に気づいておらずハマりました
冒頭にも触れましたが、まだ日本語対応していないので試す場合は英語のファイルにしましょう。

ここでは例として、**[テスラモデル3の操作マニュアル](https://www.tesla.com/ownersmanual/model3/en_jp/)** のPDFをダウンロードして、これをS3にアップロードします。

※なお、マニュアルが292ページ、ファイルサイズが約8MBあったため、1ファイルあたり1MB以下になるようファイルを20個に分割しました

# コンテンツの検索を試す

これはAmazon Qのチャット画面から自然な文章でコンテンツを検索する機能です。
公式ドキュメントは **[こちら](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/search-for-answers.html)** です

### Amazon ConnectのエージェントWorkspaceの起動

ここでAmazon Connectのインスタンスの管理画面に入り、エージェントWorkspace（≒オペレータが受電するときに使う画面）を起動します

![connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/a0f65468-a207-bac0-ea23-e553a68ed8ae.png)

ここで右側にAmazon Qとのチャットボックスが出てきます

![Agent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/4139ccf3-8318-d188-88ca-dd1c016cae5c.png)


### Amazon Q in Connectに聞いてみる

Amazon Q in Connectに対して、
**"What can I do with the touch screen?"（タッチスクリーンで何ができますか？）** 
と聞いてみます。

![tesla.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/d5694e43-268f-7bb6-a277-d30e5aaacc16.png)


ちゃんとさきほど格納したPDFファイルを参照した上で、

**"The touch screen in the vehicle can be used to control navigation, view maps, check vehicle status and messages, adjust climate controls, and access entertainment features like media."**
**（車内のタッチ スクリーンを使用して、ナビゲーションの制御、地図の表示、車両のステータスとメッセージの確認、空調制御の調整、メディアなどのエンターテイメント機能へのアクセスを行うことができます。）** 
と回答が返ってきました。回答としては正しそうです。


### 回答までの時間を計測する
今回は**PDFが20ファイル、総ファイルサイズが8MB程度**で試しています。
同じ質問を5回ほどしてみましたがAmazon Qが回答するまでに要する時間は5回とも**約9秒**でした。なお、回答結果は毎回微妙に異なりました。
ChatGPTなどはリアルタイムで文章を生成して画面に表示していきますが、Amazon Qは回答の生成が完全に終わってから全文を画面に表示します。なので体感として遅いと感じます。

試しに、**800KB程度のhtmlファイル**を1つだけおいてコンテンツ検索を試してみたところ、回答までに要する時間は**約7秒**でした。
**1KB以下のテキストファイル**を1つだけおいてコンテンツ検索を試してみたところ、回答までに要する時間は**約4.5秒**でした。

ファイル数やファイルサイズによっても変わってくるようです。

# リアルタイムのレコメンデーションを試す

これは顧客とオペレーターの通話音声の内容をもとに、リアルタイムでAmazon Qがリコメンドしてくれる機能です
公式ドキュメントは **[こちら](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/use-realtime-recommendations.html)** です

通話音声を取得する部分など、内部的には **[Amazon Connect Contact Lens](https://aws.amazon.com/jp/connect/contact-lens/)** が利用されています。

Amazon Connect Contact Lensについては過去記事も書いていますので、下準備として必要な作業は以下も参照ください。

https://qiita.com/hamham/items/9430e73e85098112adc0

### フローを作成する

Amazon Connectのフロー作成画面で、Amazon Qのブロックがあるのでこれを使います。
ドメインはさきほど作成したドメインを選択します

![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/64702b75-0091-7c65-39f5-2f248df1ce2c.png)

最終的に以下のようにBasic Queueに着信するフローを作成して、保存・公開します

![flow2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/44ddf1fb-ca8b-3af6-fc76-9915402c4605.png)


### 電話番号を取得する

2024年5月時点で、日本の電話番号（03、050など）を取得するにはサポートケースを作成した上で、身分証明書を送る必要があります。

![denwa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/5bbc3005-f531-8648-2315-7e00b7ee4b81.png)

少し試したいのであれば、アメリカなど海外の電話番号を取得するほうが簡単です。東京リージョンでも海外の電話番号は取得できます。
ただし、海外の電話番号にかければ当然ながら国際電話扱いになるので通話料金に注意が必要です。
料金無料通話（≒フリーダイヤル）の電話番号だと、通話料金はAWS利用料に含まれる形になりますが、日本からだと着信しないケースが多いと思われます

電話番号が取得できたら、さきほど作成した着信フローに紐づけします

### オペレータに着信させる

エージェントワークスペースでステータスを**Available**にして、さきほど取得した番号に電話をかけます。
着信したら **「通話を受信」** をクリックします

![tyakushin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/80493c93-19b3-1523-6b6b-baee1b7ea005.png)


### リアルタイムレコメンデーションの発動

はじめはなかなかレコメンデーションが発動しなかったのですが、**"How do I ..."** や **"I need to ..."** などのフレーズだと発動しやすいということで試したところようやく成功しました。

![recom2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/d24479a2-d442-ab9c-dc9a-2d330db42b82.png)

Costomer（顧客）の発話である

**"How do I get my car to move?（車を動かすにはどうしたらいいですか？）"** 

という質問に対して、リアルタイムでAmazon QがResponseとSolutionを返しています。
どちらも内容はよく似ていますがResponseの方をみてみます。

**"To get your car moving, press the brake pedal to shift into drive or reverse as shown on the touchscreen. Then press the accelerator to start moving in the selected direction."**
**（車を動かすには、ブレーキペダルを踏んで、タッチスクリーンに表示されているドライブモードまたはリバースモードに切り替えます。次に、アクセルペダルを踏んで、選択した方向に動き始めます。）**

通常の車はシフトレバーを使ってドライブモードを切り替えるのが一般的ですが、テスラの新型モデル3はタッチスクリーンを使ってドライブモードやリバースモードを切り替えます。ということでS3バケットに格納したマニュアルを参照したうえで回答を生成していることがわかります。

なお、顧客の発話をAmazon Qが認識するまでに約3秒、そこから回答を生成して画面に表示するまでに約9秒、合計で12秒ほどかかりました。

# さいごに

ここまで試してきた限り、可能性を感じるサービスです。
以下のような制約がクリアになれば、日本のコールセンターでも活用が進むと思うので期待したいです
- 日本語対応してほしい
- 1MB以上のファイルを扱えるようにしてほしい
- パワポ、Excelなど扱えるファイルフォーマットを増やしてほしい
- 発話の認識速度、回答生成の速度をもっとあげてほしい
- 精度を向上してほしい（ナレッジベース for Bedrockとの連携など）


# 参考にしたサイト

https://dev.classmethod.jp/articles/amazon-q-in-connect-setting-search-content/

https://tech-blog.cloud-config.jp/2023-12-22-amazon-q-in-connect-difference

https://qiita.com/minorun365/items/24dfb0ea3afde6ed0a56