ソリューション実装 AWS QnABotを使ってQ&Aボットを構築する

2021.10.17

いわさです。

AWSのソリューション実装にQnABotというものがありまして、2年近く前にre:Inventのワークショップレポートでも紹介されています。

今回、Q&Aボットのアーキテクチャを参考にしたくて探していたのですが、こちらのテンプレートを見つけまして、まずは東京リージョンで各サービス動くのかやLexの日本語対応状況もわかってなかったので導入だけしてみました。

結論からいうと、東京リージョンで日本語で利用出来ます。

最初10分でデプロイ出来ると記載していましたが、別の検証で再作成したところ誤りでしたので修正しました。ドキュメントに案内があるとおり30分ほどかかります。

デプロイと質問・回答データの登録

利用までのおおまかな流れとしては、

  • CloudFormationをデプロイ
  • Q&Aデータを登録

だけで利用開始出来ます。

CloudFormationデプロイ

以下のテンプレートURLを直接指定してデプロイ可能です。

https://solutions-reference.s3.amazonaws.com/aws-qnabot/latest/aws-qnabot-main.template

もちろんソリューション実装のページからテンプレート起動も可能です。

東京リージョンでデプロイし、Lex V2のロケールは日本語を設定します。
本日時点で日本語は対応されていました。

デプロイ中にパラメータで入力したメールアドレスへメールが届きます。
その情報を使ってコンテンツデザイナーと呼ばれる管理画面に管理者としてアクセスします。

データ登録

コンテンツデザイナーにログインします。
認証はCognitoを使っています。

ほとんどのソリューション実装ではログイン部分はCognito使われてますね。鉄板です。

クラスメソッド採用サイトの「よくある質問」を登録してみました。(大丈夫だろうか)

なお、登録データはAmazon OpenSearch Serviceへ登録されます。

ボット利用

CloudFormationスタックの出力タブにClientURLが出力されており、Lex Web UIへアクセス出来ます。

LexからのLambda経由でOpenSearchから回答を取得するようです。

音声入力した場合は回答テキストは読み上げされます。
この部分はAmazon Pollyが使われているようです。なるほど。

拡張機能の概要を紹介

2年前はVer2.5で現在はVer5.0です。
拡張機能の範囲も少し増えていたので、追加部分の概要だけ軽く触れたいと思います。

コンテンツデザイナーのサイドメニューからアクセス出来ます。
設定やデータのインポート、エクスポートを始め様々な拡張機能へのアクセスが提供されています。

Q&Aデータのインポート・エクスポート

インポートは、エクスポート形式のJsonまたはExcelによるインポートが可能です。
エクスポートは以下のJson形式です。

{
  "qna": [
    {
      "qid": "CM001",
      "a": "基本的には職種別採用をしておりますので、内定を提示した部門への配属となります。",
      "type": "qna",
      "q": [
        "入社後の配属はどのようにして決まるのでしょうか?"
      ]
    },
    {
      "qid": "CM002",
      "a": "自分から「他の技術をやりたいので異動したい」といった希望を出すことができます。必ず叶うわけではありませんが、複数の社員が実際に希望する部署に異動しています。",
      "type": "qna",
      "q": [
        "入社時に配属された事業部から別事業部へ移ることは可能でしょうか?"
      ]
    },
    {
      "qid": "CM003",
      "a": "2020年は年間で100名程度の方にご入社いただいています。",
      "type": "qna",
      "q": [
        "1年で何名ほど中途採用を行っていますか?"
      ]
    },
    {
      "qid": "CM004",
      "a": "一次面接はリモートでの実施が可能ですが、二次面接は原則として弊社が指定するオフィスにお越しいただいております。その場合の飛行機代・新幹線代は、クラスメソッドが負担いたします。\n\n※現在は一次面接・二次面接共に原則リモート実施となっております。",
      "type": "qna",
      "q": [
        "都内近郊ではなく遠方に住んでいますが、選考に進んだ際に交通費は支給されますか?"
      ]
    },
    {
      "qid": "CM005",
      "a": "エントリーフォームまたはjinji@classmethod.jpのメールアドレス宛にご連絡ください。",
      "type": "qna",
      "q": [
        "採用に関する問い合わせ窓口はどこですか?"
      ]
    },
    {
      "qid": "CM006",
      "a": "明らかに競合する事業等でなければ原則可能です。念のため、上長には一言お知らせください。",
      "type": "qna",
      "q": [
        "副業は可能ですか?"
      ]
    }
  ]
}

Lambdaフックを使った動的な回答の生成

任意のアイテムにLambda関数の関連付けることが出来、静的な回答ではなく質問が一致する度にLambda関数を実行して動的な回答を生成することが可能です。

Amazon Connect

ConnectにQnABotで構築したLexボットを追加することで、ConnectコンタクトフローでQnABotを使った回答が出来るようになります。
また、前述したLambdaフックを使ってQnABotがConnectを使用してアウトバウンドコールを発信するように構成することも出来ます。

Amazon Kendraの統合

Kendraは機械学習を用いた検索サービスです。
Kendraインデックスを使ったFAQの処理と、Kendraを使用して作成したインデックスを使って、Webページコンテンツに基づく回答を行うことが可能になります。

この機能は非常におもしろくて、現在触っているところです。
詳細は別途ご紹介したいと思います。

まとめ

  • CloudFormationのデプロイでQ&Aボットを構築可能
  • 管理コンソールが提供されるのでそのまま質問と回答を登録出来る。アイテムはインポート/エクスポートが可能
  • 他サービスとの統合を使うことで拡張させることが可能
    • Amazon Connect, Amazon Alexaとの統合が可能
    • Lambdaカスタム関数で動的な回答も可能
    • Amazon Kendraを統合させWebサイトのインデックスからの検出も可能
  • Kibanaダッシュボードでの可視化が可能

また、このアーキテクチャーでは様々なサービスが使われており、サービスの連携・統合機能も豊富なのでAWSでサーバーレスなQ&Aボットを構築したいのであればまずはこのソリューションのアーキテクチャーを参考にするのはとても良さそうだなと思いました。