【Amazon Connect】「今あなたの前には◯人います」と伝える仕組みを作ってみた

コールセンターに電話する際のストレス「いつ繋がるか分からない😡」を解消すべく、
Amazon Connectを使うコールセンターで、待ち呼を数えて伝える仕組みを作りました。

こんにちは！ネットプロテクションズの門間です。
「[祝日判定をカスタマーサービスが作ってみた](https://qiita.com/Miku_Momma/items/3461bc14736f785d4449)」に続いて開発第二弾です。

[Amazon Connect Advent Calendar 2024](https://qiita.com/advent-calendar/2024/amazon-connect)の18日目として寄稿させていただきます。
よろしくお願いします！

https://qiita.com/advent-calendar/2024/amazon-connect


# どれくらい待たされるかわからないと、みんな苦しい
問い合わせ窓口に電話する際、みなさんも一度は思ったことがあると思います。
どれくらい待てばいいんだろう。自分の前に何人待っているんだろう。

お客様にとって、オペレーターに繋がるか分からない不安と、急に繋がるかもしれない緊張がずっと続くのは大きなストレスです。対応するオペレーターも、最初からイライラMAXのお客様と対峙するのは、なかなかに辛いものがあります。また、待ち時間がわからないことによって「何度もかけて切ってを繰り返す」をされてしまうと、放棄呼も増えてしまいます。

CTIツールには、待機順番の案内が標準機能として実装されている場合があります。
Amazon Connectは自分たちで仕組みを作る必要があり、私の場合はAmazon Connectだけでは完結できなかったため、Lambdaを用いて案内の仕組みを作りました。
（※待ち呼を数えたいキューが1つしかない場合は、コンタクトフローの「キューの状態を確認する」を使って、Amazon Connectのみで案内を完結させられます。）

# 概要
案内のタイミングでAmazon ConnectからLambdaを呼び出し、LambdaにAmazon ConnectのAPIを叩かせた上で、取得した待ち呼の人数をコンタクト属性としてAmazon Connectに返却しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191709/c1e67bd7-2a75-95f4-b985-b260a51621a4.png)

### 実際の使い方
1度の電話で2回この仕組みを呼び出しています。
1回目:電話をかけていただいた最初のタイミング。待ち呼が多いようなら「◯人待ってるので、お待たせする可能性がございます」と最初に伝え、期待値調整をしています。
2回目:IVRでの自動音声の後、キューに入る直前に、「お客様の前にあと◯人待っています」と伝えています。

# 待ち時間の途中で、再度順番を伝えるのは難しい
Amazon Connectから待ち呼人数を取得する際には、Amazon Connectのリアルタイムメトリクス「キュー内の問い合わせ」を使います。コンタクトフローでいう「キューの状態を確認する」と同義であり、APIとしてはCurrentMetricDataの中にある、CONTACTS_IN_QUEUE（キューに入っているコンタクトの数）を取得します。

ただ、この値は「現時点でそのキューに何人いるのか」という情報です。
「自分より前に何人いるのか」という値ではないのです。

待ち時間の途中で順番を伝えることは技術的に不可能ではありませんが、かなり複雑性が増します。
今回はLambda1つのシンプルな仕組みにするため、ガイダンスの最初とキューに入る直前の二箇所でのみ案内する設計としました。


# Lambda実装イメージ
待ち呼人数の取得には、Amazon ConnectのGetCurrentMetricDataというAPIを叩きます。
以下が公式ドキュメントです。

https://docs.aws.amazon.com/ja_jp/connect/latest/APIReference/API_GetCurrentMetricData.html

コードのイメージはこんな感じです。
（※かなり省略・簡易化して、ファイルも1つにしています）

```ruby:Amazon ConnectのAPIを叩いて、Amazon Connectに返すLambda.rb
require 'json'
require 'aws-sdk'

def lambda_handler(event:, context:)
    # 取得に必要なものはAmazon ConnectのインスタンスIDとキューID
    instance_id = "インスタンスID"
    queues = ["キューIDその1","キューIDその2","キューIDその3"]

    # Amazon ConnectのAPIから現在の待ち呼人数を取得する
    client = Aws::Connect::Client.new(region: "ap-northeast-1")
    response = client.get_current_metric_data({
        instance_id: instance_id,
        filters: {
            queues: queues
        },
        current_metrics: [{
            name: "CONTACTS_IN_QUEUE",
            unit: "COUNT"
        }]
    })

    #結果のうち、人数の箇所だけを取得して、整数に変換
    result = if metric_results.empty?
               0
             else
               metric_results[0][:collections][0][:value].to_i
             end

    # Amazon Connectに、問い合わせ属性（外部）machikoとして、レスポンスを返す
    lambda_response = { machiko: result }
end
```

とてもシンプルな仕組みで、応用すればSlackに通知なども可能です。
（そうだ、LambdaとAmazon Connectの連携も忘れずに！！）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191709/f6b4aeee-ef92-99db-896c-84b4c1359e82.png)



# Amazon Connect実装イメージ
では、実際に実装を進めていきましょう！
ガイダンスの最初に行う案内は、機能としてモジュールに切り分け、大まかな人数で分岐させています。
属性の確認の分岐は上から判断していくので、>=5と>10の順番を逆にしないように気をつけています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191709/b3c90cac-aea4-43ac-94de-4077b40ff237.png)

キューに入る直前の案内では、実際の人数を伝えるため、変数として扱って読み上げさせています。
読み上げの前に、日本語対応の音声の設定をしましょう。（でないと、アメリカ人対応の音声が無理に日本語を読み上げることになります。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191709/8a9dcb57-6dec-7ade-ba99-b6a157f465fb.png)

読み上げは、プロンプトの再生を画像↓のように設定しました。
（SSMLが正しく読んでくれるかどうかは、それぞれの環境で微調整が必要かもしれません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191709/45647510-6a3b-fc54-d455-ba3555b867cb.png)

1人あたりの処理時間のおおよそが分かる場合は、
待っている人数によって「ただいま混み合っておりまして、約◯分程度お待ちいただきます」などの案内も良いかもしれません。

# 最後に
カスタマーサービスだけど開発に挑戦~~させられ~~した第二弾、こうして見るとシンプルではありますが、「開発」というハードルを超えてCSがスピーディーに実装できたことで、現場の皆さんに大喜びいただけて嬉しかったです。

Amazon Connectのポテンシャルをもっと引き出せるよう、これからも色々な挑戦をしていきたいと思っています。

アドベントカレンダーに参加させていただき、ありがとうございました！

皆様、素敵なクリスマスをお過ごしくださいね🎄
ではまた！