[AIチャットボット]Amazon LexとAmazon Kendraを利用して、お問い合わせ内容を種別判定してみた

2024.04.05

はじめに

Amazon LexとAmazon Kendraを利用して、チャットでのお問い合わせ内容を種別判定する方法をまとめました。

お客さまのお問い合わせを種別判定し、種別ごとに担当者に振り分ける一次対応を想定したチャットボットシステムを構築する際に、Kendraが種別判定機能を担います。

種別判定は、一般的な生成AIモデルでも可能ですが、生成AIが利用できない企業様もいらっしゃいますので、今回はKendraで試してみます。

構成

構成としては、下記の通りです。

ユーザーがお問い合わせする際、種別判定までのフローは以下の通りです。

  1. 事前に複数のFAQファイルをS3に保存し、それらをKendraにインポートします。
  2. ユーザーからお問い合わせ内容をLexで受け取ります。インテントは、FallbackIntentが呼び出されます。
  3. 受け取った内容をKendraにクエリ実行します。返ってきた最も高い関連度のドキュメントからファイル名を特定します。
  4. そのファイル名から種別を判定します。

本ブログはKendraでの種別判定が主題ですので、種別判定後の担当者へのエスカレーション実装については、今回省略します。

LexのFallbackIntentについては、以下で詳細に解説していますので、ご確認下さい。

構築

以下のリソースを構築します。

  • S3
  • Kendra
  • Lambda
  • Lex

S3

S3バケットを作成し、以下の4つのファイルをアップロードします。

  • account_opening.txt
    • 口座開設に関するFAQ
  • application.txt
    • アプリケーションに関するFAQ
  • card_loss.txt
    • カードの紛失に関するFAQ
  • customer_info_change.txt
    • お客様情報の変更に関するFAQ

これらのファイルをKendraにインポートし、Lambdaでクエリ実行すると、お問い合わせ内容に対して最も関連度が高いドキュメントが返されます。

ドキュメントを返す際、参照されたファイル名も返されますので、それによって種別判定が可能です。

各ファイルの内容は以下の通りです。生成AIを利用して作成しました。

account_opening.txt

口座開設に関するFAQ

Q1. 口座開設に必要な本人確認書類を教えてください。 
A1. 口座開設時には、運転免許証、パスポート、健康保険証などの本人確認書類が必要となります。詳しくは最寄りの支店までお問い合わせください。

Q2. 未成年者が口座を開設する際の条件を教えてください。 
A2. 未成年者が口座を開設する場合は、親権者の同意が必要です。親権者の方の本人確認書類と印鑑も必要となります。

Q3. 非居住者でも口座を開設できますか? 
A3. はい、非居住者の方でも当行で口座を開設することが可能です。ただし、在留カードなど追加の書類が必要となる場合があります。

Q4. 口座開設時に印鑑は必要ですか? 
A4. 口座開設時には、届出印として印鑑が必要となります。認印がある印鑑をご用意ください。

application.txt

アプリケーションに関するFAQ

Q1. モバイルバンキングアプリのダウンロード方法を教えてください。 
A1. 各モバイル端末の公式ストア(App StoreまたはGoogle Play)から無料でダウンロードできます。ストア内で当行アプリ名を検索し、インストールしてください。

Q2. アプリのセキュリティ対策について教えてください。
A2. 当行アプリでは、生体認証、端末認証、VPN、アプリ起動時の認証コードの入力など、多層的なセキュリティ対策を講じております。お客様の大切な情報を万全に守ります。

Q3. アプリで利用できる主な機能を教えてください。 
A3. 残高照会、入出金明細の確認、振込・送金、投資信託の購入・解約、ローン申込など、様々な銀行取引がアプリ上で可能です。ATMや支店に行く手間が省けます。

Q4. アプリのアップデートはどのように行えばよいですか? 
A4. アプリのアップデートの際は、公式ストアに新しいバージョンがリリースされますので、そちらから手動でアップデートをお願いします。アップデートには最新のセキュリティ対策が含まれますので、必ずアップデートを行ってください。

card_loss.txt

カードの紛失に関するFAQ

Q1. クレジットカードを紛失した場合の対処方法を教えてください。 
A1. クレジットカードを紛失した場合は、速やかにカードロッサービスセンターに連絡し、カードの仮停止手続きを行ってください。警察への紛失届も必要となります。

Q2. カードを置き引きされた場合、どうすればよいですか? 
A2. カードを置き引きされた場合も、すぐにカードロッサービスセンターに連絡し、カードの仮停止と再発行の手続きを行ってください。警察への被害届も忘れずに提出してください。

Q3. 再発行の手続き方法と手数料を教えてください。 
A3. 再発行は最寄りの支店で手続きできます。手数料は1,100円(税込)かかります。インターネットバンキングからの手続きも可能です。

Q4. 暗証番号を忘れた場合、どうすればよいですか? 
A4. 暗証番号を忘れた場合は、最寄りの支店でカードの再発行手続きが必要です。その際、本人確認書類をご提示ください。

customer_info_change.txt

お客様情報の変更に関するFAQ

Q1. 住所変更の手続き方法を教えてください。 
A1. 住所変更の手続きは、最寄りの支店に「住所変更届」と本人確認書類(運転免許証など)をご持参ください。また、インターネットバンキングからもお手続きが可能です。

Q2. 氏名変更に必要な書類を教えてください。 
A2. 氏名変更の際は、「氏名変更届」と新しい本人確認書類(運転免許証、パスポートなど)が必要になります。支店またはインターネットバンキングからお手続きください。

Q3. 電話番号の変更方法を教えてください。 
A3. 電話番号の変更は、最寄りの支店にお越しいただくか、インターネットバンキングからお手続きください。口座名義人ご本人の本人確認書類が必要となります。

Q4. メールアドレスの変更はどのようにすればよいですか? 
A4. メールアドレスの変更は、インターネットバンキングからお手続きが可能です。ログイン後、「登録情報変更」からメールアドレスの変更手続きを行ってください。

Kendra

インデックス作成

インデックス名とIAMロールを入力します。

アクセス制御は特に設定しません。

Developer editionを選択します。

これでインデックスは作成完了です。

データソース追加

続いてデータソースは、Amazon S3 connectorを選択します。

データソース名を入力し、言語は日本語を選択します。

IAMロールを作成し、VPCは設定しません。

先ほど作成したS3を選択し、同期は全て同期、頻度はオンデマンドとします。

フィールドマッピングはデフォルトままです。

これでデータソースの設定は完了です。

Lambda

Lambdaは以下の設定です。

  • ランタイム:Python 3.12
  • タイムアウト:10秒
  • IAMの管理ポリシーを適用
    • AmazonKendraFullAccess

コードは以下の通りです。

import json
import boto3

def close(message_content):
    return {
        'messages': [{'contentType': 'PlainText', 'content': message_content}],
        "sessionState": {
            'dialogAction': {
                'type': 'Close',
            },
            'intent': {
                'name': 'FallbackIntent',
                'slots': {},
                'state': "Fulfilled"
            }
        }
    }
def get_retrieval_result(query_text, index_id):
    kendra_client = boto3.client('kendra')
    response = kendra_client.query(
        QueryText=query_text,
        IndexId=index_id,
        AttributeFilter={
            'EqualsTo': {
                'Key': '_language_code',
                'Value': {'StringValue': 'ja'},
            },
        },
    )
    results = [result for result in response['ResultItems'] if result['DocumentTitle']]
    print('Received results:' + json.dumps(results, ensure_ascii=False))
    
    if results:
        return results[0]['DocumentTitle']['Text']
    # FAQに該当しないお問い合わせ
    else:
        return "others"

def convert_inquiry_type(inquiry_type):
    INQUIRY_TYPE_MAPPING = {
        'account_opening.txt': '口座開設',
        'application.txt': 'アプリケーション',
        'card_loss.txt': 'カードの紛失',
        'customer_info_change.txt': 'お客様情報の変更',
        'others': 'その他'
    }
    return INQUIRY_TYPE_MAPPING.get(inquiry_type, inquiry_type)

def lambda_handler(event, context):
    print('Received event:' + json.dumps(event, ensure_ascii=False))
    input_text = event['inputTranscript']

    # Kendra index_id
    index_id = 'KendraのIndex ID'
    retrieval_result = get_retrieval_result(input_text, index_id)
    inquiry_type = convert_inquiry_type(retrieval_result)

    return close(f'お問い合わせ内容は、{inquiry_type}、ですね。担当者にかわります。')
  • 様々なお問い合わせに対応させるため、FallbackIntentが呼ばれるのが前提です。
  • お問い合わせ内容をそのままKendraにクエリ実行します。
  • KendraのインデックスIDは各自変更ください。
  • INQUIRY_TYPE_MAPPINGは、本来DynamoDBなどのDBに保存すべき場合もありますが、今回はコードとして記載します。
  • お問い合わせ内容に対して、Kendraが関連性のあるドキュメントを返さない場合、種別は「その他」と判定します。

Lex

ボットの作成

ボットを作成します。

ボット名を入力し、IAMロールは新規作成します。他はデフォルトです。

日本語を追加します。

これでボットが構築されます。

インテントの作成

続いてインテントを作成します。

インテントは、FallbackIntentを利用するのが前提です。ただし、FallbackIntentのみでボットのビルドはできませんので、ダミーとしてインテントを作成します。

インテント名は、inquiry、サンプル発話はダミーを入力します。

スロットは利用しませんが、作成しないといけませんのでダミーのスロットを作成します。

Lambdaの使用を有効化します。

Lambda関数を呼び出すため、インテント名FallbackIntentにも同様にチェックを入れます。

これでビルドすると完了です。

検証結果

それでは、Lexのコンソールでテストします。

テストとしては、質問文を入力し、お問い合わせ内容を判定します。

「お問い合わせ内容は、カードの紛失、ですね。担当者にかわります。」と返していますが、「担当者にかわります。」だけでもよいです。今回は、Kendraでの種別判定結果をテスト中に確認したいため、加えています。

判定結果は以下の通りです。

質問文は、生成AIに考えてもらいました。

質問文 Kendraでの種別判定 OK/NG
カードを紛失してしまい、不安です。どのように対応すべきでしょうか? カードの紛失 OK
残念ながらカードを盗まれてしまいました。早急に何か手続きが必要でしょうか? カードの紛失 OK
カードを無くしてしまい、新しいカードが必要になりました。再発行にはどのような手続きと費用がかかりますか? カードの紛失 OK
カードの暗証番号を完全に忘れてしまいました。暗証番号を再設定するにはどうすればよいでしょうか? カードの紛失 OK
新しく口座を作りたいのですが、必要な書類を教えてください。 お客様情報の変更 NG
(正:口座開設)
16歳の子供が口座を持ちたがっています。親の同意は必要でしょうか? 口座開設 OK
留学生ですが、日本で口座を開けますか?その際の条件を教えてください。 口座開設 OK
実印は持っていませんが、口座開設時に認印は必須でしょうか? 口座開設 OK
夫婦で口座を共有したいのですが、両方の本人確認書類が必要でしょうか? 口座開設 OK
親の口座から子供名義の口座を開設することは可能でしょうか? 口座開設 OK
銀行にお金を預けたい アプリケーション NG
(正:口座開設)
アプリのプッシュ通知を無効化する方法を教えてください。 アプリケーション OK
モバイルバンキングアプリはiPhoneとAndroidの両方で利用できますか? アプリケーション OK
アプリにログインする際の認証方式を教えてください。 アプリケーション OK
アプリ上で外貨預金の開設や解約はできますか? アプリケーション OK
バージョンアップでどのような新機能が追加されましたか? アプリケーション OK
結婚して姓が変わりました。何をすればよいか教えてください。 お客様情報の変更 OK
転勤で住所が変わります。住所変更手続きの際、本人確認書類以外に何か必要でしょうか? お客様情報の変更 OK
最近携帯電話番号を変更しました。番号変更手続きはオンラインでできますか? お客様情報の変更 OK
メールアドレスを変更したいのですが、インターネットバンキングでの手順を詳しく教えてください。 お客様情報の変更 OK
同居している両親の住所情報も一緒に変更できますか? お客様情報の変更 OK
離婚により旧姓に戻す場合も、氏名変更手続きが必要でしょうか? お客様情報の変更 OK
こんにちは その他 OK
預けたお金を引き出すことができません。 その他 OK
お金を借りる方法を教えて下さい お客様情報の変更 NG

(正:その他)

種別判定は、25問中22問が正しく種別判定されました。

比較的精度がよい印象です。FAQのテキストファイルの中身を充実させることで、より精度は上げられると推測します。

最後に

チャットでのお問い合わせ内容をAmazon Kendraで種別判定する方法についてまとめました。

精度も比較的よい印象ですね。

今回はチャットでの質問でしたが、Amazon Connectを利用した電話での質問を種別判定などもできますので、次回試してみます。