Lexを使って自動問い合わせ応対しよう！(1)

# はじめに
ヘルプデスクの対応、システムの改修、新しいツールの選定などなど、情シスってやることいっぱいですよね。
パンク気味になるとついつい問い合わせが漏れたり、一次対応が遅れがちになっちゃいます。
そこで！！今回はAmazon Lexを用いて私の代わりに一次対応させるbotを作って業務をじゃんじゃか楽にしちゃおうと思います！！！
今回は第一弾として想定される質問に対して一次応対できるようなbotを作ります！
(備忘録として書いたので過不足あれば教えてください！）


# Amazon Lexとは

Amazon Lexは、音声認識とテキスト理解を組み合わせた対話型AIサービスです。Alexaのような対話型の仕組みをアプリやウェブサイトに組み込むことが出来ます。
主な特徴:
    ・ユーザーの音声や文字入力を理解
    ・適切な応答を生成
    ・タスクを実行（予約受付など）
    
例えば、ユーザーが「予約したい」と言うと、システムは「何名様ですか？」と聞き返すなど、自然言語で対応します。これにより、カスタマーサービスの自動化や対話型インターフェースの作成が可能になるとのこと。

公式ページにはコンタクトセンターのIVRを8割も抑えてセルフサービスが約65%も増えたとの記載。もし本当なら凄すぎるし、まさしく求めていたものになります。

# Lexを使った自動問い合わせ応対システムの構築手順

※筆者がCLIを使わないので基本的にコンソールでの操作になります。

1. AWSアカウントとIAM設定

既存のAWSアカウントを使用し、必要に応じてOrganizationsを活用して複数環境を管理します。
IAMユーザーまたはロールに AmazonLexFullAccess ポリシーを付与します。必要に応じて、よりきめ細かなカスタムポリシーを作成します。

2. Amazon Lexコンソールでのボット作成

AWSマネジメントコンソールから直接アクセスして「ボットを作成」を選択します。今回はテンプレートなしのブランク状態を選択し、Botの名前を付けたらIAMとCOPPAの対応をします。今回はロールを新規作成し、COPPAもYesにしておきましょう。ほかの設定はそのまま次のページへ。
言語設定に関しては今回は日本語を設定します。
Intent classification confidence score thresholdに関してはとりあえず0.4に設定します。後々、CloudWatchログを見ながら調整します。

# インテントの設定
まずはインテントに名前をつけます。
今回は契約内容関連のインテントを作りたいので名前は、
"ITHelpDeskAssistant"としておきます。

次に”Sample utterances”を設定します、日本語だと
サンプル発話ですね。

下のボックスによく聞かれる内容を記載しましょう。私はこんな感じで契約についてよく聞かれる内容を記載しました。
![スクリーンショット 2024-09-19 100412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/aa8acdd8-60d5-18ec-4981-2eb094c9b390.png)


# スロットの設定
次にスロットの設定を行います。
正直ここが実装時に一番理解するまで時間がかかりました。

今回はトータル４つのスロットを作成するのですが、そのうちの２つはカスタムスロットになります。早速作成しましょう。

場所は左のナビゲーションメニュー内からアクセスできます。
分かりにくいので下図ご参考ください。
![スクリーンショット 2024-09-18 131900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/7bfe1626-8487-a157-1d93-9c6786e8c69e.png)
１つ目は名前を"ITIssueType"として、値のところによく聞かれる内容を追加していってください。ここに記載されていない内容を入力されても上手く回答できません。
２つ目は名前を"DeviceType"として、後々ユーザーからどのデバイスで問題が起きたかについて質問する際に使用します。値は「デスクトップPC,ノートPC、タブレット、スマートフォン、その他」とします。
次は名前と現場でモノを見られる時間を確認します。
この時、名前をローマ字で記載してもらうようお願いすることを忘れないようプロンプトに記載しましょう。
![スクリーンショット 2024-09-18 181745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/4ce964e9-eceb-5ccf-9fca-adb10bbb9a6c.png)
時間については下図のような設定で作っています。
![スクリーンショット 2024-09-18 181745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/008a6666-07d5-c725-5839-1f661df2edbf.png)
![スクリーンショット 2024-09-18 183018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/3e9fe44e-5239-d120-71a9-5773c2ac74f3.png)

# ConfirmationとFulfillment
Confirmationのプロンプト部分は上のスロットで回収してきた情報をユーザーに提示して確認を取ります。自分の場合だとプロンプトは次の通りになります。
「{UserName}さん、{DeviceType}で「{IssueType}」という問題が発生している旨承知しました。 {PreferredTime}頃に確認させていただくことでよろしいでしょうか？」

Fulfillment部分についてはAdvanced optionから"Use a Lambda function for fulfillment”のチェックが外れてる事を目視で確認してください。成功時の返信プロンプトは以下の通りになります。

"{UserName}様、ご報告ありがとうございます。{DeviceType}の「{IssueType}」という問題について承りました。 {PreferredTime}頃に担当者が確認させていただく可能性があります。 詳細については、担当者からメールでご連絡いたします。何かありましたら、お気軽にお問い合わせください。 ご協力ありがとうございました。"

また、失敗時の返信内容として以下を設定ください。
"申し訳ございません。システムに問題が発生しているようです。 お手数ですが、直接情シスにメールいただけますでしょうか。"

両方ともNext step in conversationが"End conversation"になっていることを確認してください。

# Build & Test
ここまで出来たら画面上部の"Build"をクリックしてbotを組み立てます。しばらく待つとBuild終了の旨が流れるので"Test"ボタンを押して実際にテストしてみましょう。

![スクリーンショット 2024-09-18 192253.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/f8f97d4d-ffa0-8380-332d-7be8adeeb30f.png)
![スクリーンショット 2024-09-18 192304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/47b9a181-b67f-1dd3-2019-1f431e9d0da8.png)
![スクリーンショット 2024-09-18 192310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/390e77db-a5e0-ec88-242a-97ef2df27982.png)

こんな感じでやりとりできれば成功です。

# おわりに
一回作り方を覚えるとめちゃくちゃ楽に作れて便利さが垣間見えました！次回は受領した内容を元に部署宛てにメールを飛ばしてリマインドする部分に着手したいです。