Knowledge bases for Amazon Bedrockで、電話での問い合わせを内容に応じて担当者へ振り分けてみた

Knowledge bases for Amazon Bedrockで、電話での問い合わせを内容に応じて担当者へ振り分けてみた

Clock Icon2024.06.25

はじめに

本記事では、Amazon Connect、Knowledge bases for Amazon Bedrock、およびAmazon Lexを組み合わせて、電話での問い合わせ内容を種別判定し、最適な担当者に振り分ける方法とその精度結果をまとめました。

本システムは、コンタクトセンターでのAIチャットボットによる一次対応を想定しています。ユーザーのお問い合わせの種別を判定し、種別ごとに担当者に振り分ける機能を、Knowledge bases for Amazon Bedrockが担います。

お問い合わせの種別判定については、以前Amazon KendraやBedrockを利用して試みましたが、今回はKnowledge bases for Amazon Bedrockを使用します。

構成

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

Connectフロー内の構成は以下の通りです。

以下は、ユーザーのお問い合わせ内容を種別判定し、その内容に応じて担当者に振り分けるまでのフローです。

  1. 電話でユーザーがお問い合わせ内容を伝えます。
  2. ユーザーからお問い合わせ内容をLexで受け取ります。インテントは、FallbackIntentを呼びます。
  3. 受け取った内容をKnowledge bases for Amazon Bedrockで種別判定します。
    • 事前にお問い合わせの種別内容をデータソースであるS3バケットにアップロードしておきます。
    • Knowledge basesでは、生成された回答に対して参照したドキュメント情報もレスポンスされますので、ドキュメント情報内のファイル名を特定して種別判定します。
  4. お問い合わせの種別によって、適切な担当者に振り分けを行います。

構築

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

  • Knowledge bases for Amazon Bedrock
  • Lex
  • Lambda
  • Connect

Knowledge bases for Amazon Bedrock

以下の記事を参考にKnowledge basesを作成しました。

Knowledge bases for Amazon Bedrock (RAG)のイメージ図です。

引用

参考記事とは、2点異なる点があります。

1点目、Titan Text Embeddings モデルについては、Titan Text Embeddings G1ではなく、Amazon Titan Text Embeddings v2 モデルを採用しました。このモデルのベクトルディメンション(次元)数は256にしています。

2点目、Knowledge basesの設定でチャンキング戦略は、なしを選択します。

後述しますが、データソースのS3バケットには、ドキュメントをファイルごとに分けているためです。

チャンク化なし — Amazon Bedrock は各ファイルを 1 つのチャンクとして扱います。このオプションを選択した場合、ドキュメントを別々のファイルに分割して前処理することをお勧めします。引用

上記の記事で作成した各リソースは、全てバージニアリージョンです。

  • Knowledge bases
  • Pinecone(ベクトルDB、Serverless プラン)
  • S3バケット(データソース)
  • Secret Manager

利用するBedrockのモデルは以下の通りです

  • エンベディングモデル:Amazon Titan Text Embeddings V2(ディメンションの数:256)
  • 回答生成で利用するモデル:Claude V3 Sonnet

以降に作成するリソースのリージョンは、全て東京リージョンです。

  • Lex
  • Lambda
  • Connect

なお、PineconeのServerlessプランは、使用した分のみが課金対象となります。

Serverless プランでは、あらかじめコンピュート資源やストレージ資源を確保しておく必要がなく、課金は実際に消費した Read units (RUs) 、Write units (WUs)、Storage (GB 単位) に基づいて計算されます。そのため、トラフィックが少ないユースケースにおいても固定費を抑えてコスト効率の良いナレッジベースを構築することができます。例えば、Pinecone 社のホームページに掲載されている RAG ユースケースでは、初期アップロードされたベクトルデータのレコード数が 100 万レコード、月間のクエリ回数、書き込み回数がいずれも 1 万回でメタデータのサイズが 500 バイトである場合の月間コストは、 3.82 ドルと試算されています。引用

詳細な利用体系はこちら。https://www.pinecone.io/pricing/

S3バケット

Knowledge basesのデータソースとなるS3バケットには、以下の4つのファイルをアップロードします。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Lex

ボットの作成

ボットを作成します。

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

日本語を追加します。

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

インテントの作成

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

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

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

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

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

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

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

Lambda

Lambdaは以下の設定です。

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

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

import boto3
import json
import os

def elicit_intent():
    return {
        'messages': [{'contentType': 'PlainText', 'content': ','}],
        'sessionState': {
            'dialogAction': {
                'type': 'ElicitIntent',
            },
            'intent': {
                'name': 'FallbackIntent',
                'state': 'Fulfilled'
            }
        },
    }
def close(sessionAttributes):
    return {
        'messages': [{'contentType': 'PlainText', 'content': ','}],
        "sessionState": {
            "sessionAttributes": { 
                "inquiry_type": sessionAttributes
            },  
            'dialogAction': {
                'type': 'Close',
            },
            'intent': {
                'name': 'FallbackIntent',
                'slots': {},
                'state': "Fulfilled"
            }
        }
    }
def classify_inquiry(input_text):
    region = "us-east-1"
    modelId = "anthropic.claude-3-sonnet-20240229-v1:0"
    # modelId = "anthropic.claude-3-haiku-20240307-v1:0"
    knowledgebaseId = "XXXXXX"

    modelArn = f'arn:aws:bedrock:{region}::foundation-model/{modelId}'
    client = boto3.client(service_name='bedrock-agent-runtime', region_name=region)

    response = client.retrieve_and_generate(
        input={
            'text': input_text
        },
        retrieveAndGenerateConfiguration={
            'type': 'KNOWLEDGE_BASE',
            'knowledgeBaseConfiguration': {
                'knowledgeBaseId': knowledgebaseId,
                'modelArn': modelArn
            }
        }
    )
    print('Received response:' + json.dumps(response, ensure_ascii=False))

    if response['citations'][0]['retrievedReferences']:
        s3_uri = response['citations'][0]['retrievedReferences'][0]['location']['s3Location']['uri']
        file_name = os.path.basename(s3_uri)
        inquiry_type = os.path.splitext(file_name)[0]
    else:
        inquiry_type = "others"

    return inquiry_type

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

    inquiry_type = classify_inquiry(input_text)
    print('Received inquiry_type:' + json.dumps(inquiry_type, ensure_ascii=False))

    return close(inquiry_type)
  • Knowledge bases IDknowledgebaseIdは、各自入力ください。
  • 様々なお問い合わせに対応させるため、FallbackIntentが呼ばれるのが前提です。
  • close関数では、お問い合わせ種別をLexのセッション属性としてConnectフローに返します。
  • お問い合わせ内容に対して、生成された回答の参考ドキュメントを返さない場合、種別は「その他」と判定します。

Connectフロー

Connectフローは以下のとおりです。

Connectフロー (クリックすると展開します)
{
  "Version": "2019-10-30",
  "StartAction": "017a4c36-9944-41fc-81dc-b7418ef4fdb4",
  "Metadata": {
    "entryPointPosition": { "x": 38.4, "y": 44 },
    "ActionMetadata": {
      "017a4c36-9944-41fc-81dc-b7418ef4fdb4": {
        "position": { "x": 143.2, "y": 44.8 }
      },
      "7fb43c40-fee6-4e3d-87f1-d956529b9032": {
        "position": { "x": 353.6, "y": 44.8 },
        "children": ["e4458090-1bab-411e-8788-1eb9cd0d608a"],
        "overrideConsoleVoice": true,
        "fragments": {
          "SetContactData": "e4458090-1bab-411e-8788-1eb9cd0d608a"
        },
        "overrideLanguageAttribute": true
      },
      "e4458090-1bab-411e-8788-1eb9cd0d608a": {
        "position": { "x": 353.6, "y": 44.8 },
        "dynamicParams": []
      },
      "dcb79f59-cee4-48af-9832-ee97b9e4b178": {
        "position": { "x": 596.8, "y": 520.8 }
      },
      "ac1178f8-a26a-4a95-b40b-22f9b6d0c662": {
        "position": { "x": 359.2, "y": 254.4 },
        "parameters": {
          "Attributes": { "inquiry_type": { "useDynamic": true } }
        },
        "dynamicParams": ["inquiry_type"]
      },
      "d1a2eed0-afb1-4340-a72d-08cfc78065c7": {
        "position": { "x": 145.6, "y": 255.2 },
        "parameters": {
          "LexV2Bot": {
            "AliasArn": {
              "displayName": "TestBotAlias",
              "useLexBotDropdown": true,
              "lexV2BotName": "cm-hirai-knowledge-base-bedrock-inquiry"
            }
          }
        },
        "useLexBotDropdown": true,
        "lexV2BotName": "cm-hirai-knowledge-base-bedrock-inquiry",
        "lexV2BotAliasName": "TestBotAlias",
        "conditionMetadata": []
      },
      "685d59a0-7b1b-41cc-9d91-bf903933f9b2": {
        "position": { "x": 857.6, "y": 44 }
      },
      "2f96365a-82b1-4027-ae28-524aff2d5f47": {
        "position": { "x": 859.2, "y": 236.8 }
      },
      "52c238f2-44db-47de-bb64-cff7d433ff8d": {
        "position": { "x": 1142.4, "y": 596 }
      },
      "cc473769-73e7-481f-a746-494300bc1ec9": {
        "position": { "x": 600, "y": 160 },
        "conditionMetadata": [
          {
            "id": "c12da0da-742c-46bd-b3f6-4867b2805dbd",
            "operator": {
              "name": "Equals",
              "value": "Equals",
              "shortDisplay": "="
            },
            "value": "account_opening"
          },
          {
            "id": "38efa354-c895-47b1-bcac-d92bae4f2cc4",
            "operator": {
              "name": "Equals",
              "value": "Equals",
              "shortDisplay": "="
            },
            "value": "application"
          },
          {
            "id": "d2f34468-f9fd-432f-89cc-17e2a53f2f52",
            "operator": {
              "name": "Equals",
              "value": "Equals",
              "shortDisplay": "="
            },
            "value": "card_loss"
          },
          {
            "id": "e9660a6d-47a9-48c9-b452-442eb8c3fcd5",
            "operator": {
              "name": "Equals",
              "value": "Equals",
              "shortDisplay": "="
            },
            "value": "customer_info_change"
          }
        ]
      },
      "844fc6d3-6f7e-443c-aeaf-1502c340ca50": {
        "position": { "x": 859.2, "y": 436.8 }
      }
    },
    "Annotations": [],
    "name": "cm-hirai-knowledge-base-bedrock-inquiry",
    "description": "",
    "type": "contactFlow",
    "status": "published",
    "hash": {}
  },
  "Actions": [
    {
      "Parameters": { "FlowLoggingBehavior": "Enabled" },
      "Identifier": "017a4c36-9944-41fc-81dc-b7418ef4fdb4",
      "Type": "UpdateFlowLoggingBehavior",
      "Transitions": { "NextAction": "7fb43c40-fee6-4e3d-87f1-d956529b9032" }
    },
    {
      "Parameters": {
        "TextToSpeechVoice": "Takumi",
        "TextToSpeechEngine": "Neural",
        "TextToSpeechStyle": "None"
      },
      "Identifier": "7fb43c40-fee6-4e3d-87f1-d956529b9032",
      "Type": "UpdateContactTextToSpeechVoice",
      "Transitions": { "NextAction": "e4458090-1bab-411e-8788-1eb9cd0d608a" }
    },
    {
      "Parameters": { "LanguageCode": "ja-JP" },
      "Identifier": "e4458090-1bab-411e-8788-1eb9cd0d608a",
      "Type": "UpdateContactData",
      "Transitions": {
        "NextAction": "d1a2eed0-afb1-4340-a72d-08cfc78065c7",
        "Errors": [
          {
            "NextAction": "d1a2eed0-afb1-4340-a72d-08cfc78065c7",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": { "Text": "エラーになりました。電話を切ります。" },
      "Identifier": "dcb79f59-cee4-48af-9832-ee97b9e4b178",
      "Type": "MessageParticipant",
      "Transitions": {
        "NextAction": "52c238f2-44db-47de-bb64-cff7d433ff8d",
        "Errors": [
          {
            "NextAction": "52c238f2-44db-47de-bb64-cff7d433ff8d",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {
        "Attributes": {
          "inquiry_type": "$.Lex.SessionAttributes.inquiry_type"
        },
        "TargetContact": "Current"
      },
      "Identifier": "ac1178f8-a26a-4a95-b40b-22f9b6d0c662",
      "Type": "UpdateContactAttributes",
      "Transitions": {
        "NextAction": "cc473769-73e7-481f-a746-494300bc1ec9",
        "Errors": [
          {
            "NextAction": "dcb79f59-cee4-48af-9832-ee97b9e4b178",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {
        "Text": "お問い合わせ内容を、お伝え下さい。",
        "LexV2Bot": {
          "AliasArn": "arn:aws:lex:ap-northeast-1:xxxxxxxxxx:bot-alias/XXXXXXX/XXXXXXX"
        }
      },
      "Identifier": "d1a2eed0-afb1-4340-a72d-08cfc78065c7",
      "Type": "ConnectParticipantWithLexBot",
      "Transitions": {
        "NextAction": "dcb79f59-cee4-48af-9832-ee97b9e4b178",
        "Errors": [
          {
            "NextAction": "ac1178f8-a26a-4a95-b40b-22f9b6d0c662",
            "ErrorType": "NoMatchingCondition"
          },
          {
            "NextAction": "dcb79f59-cee4-48af-9832-ee97b9e4b178",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {
        "Text": "口座開設、アプリケーションの担当者に繋ぎます。"
      },
      "Identifier": "685d59a0-7b1b-41cc-9d91-bf903933f9b2",
      "Type": "MessageParticipant",
      "Transitions": {
        "NextAction": "52c238f2-44db-47de-bb64-cff7d433ff8d",
        "Errors": [
          {
            "NextAction": "52c238f2-44db-47de-bb64-cff7d433ff8d",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {
        "Text": "カード紛失、お客様情報の変更、の担当者に繋ぎます。"
      },
      "Identifier": "2f96365a-82b1-4027-ae28-524aff2d5f47",
      "Type": "MessageParticipant",
      "Transitions": {
        "NextAction": "52c238f2-44db-47de-bb64-cff7d433ff8d",
        "Errors": [
          {
            "NextAction": "52c238f2-44db-47de-bb64-cff7d433ff8d",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {},
      "Identifier": "52c238f2-44db-47de-bb64-cff7d433ff8d",
      "Type": "DisconnectParticipant",
      "Transitions": {}
    },
    {
      "Parameters": { "ComparisonValue": "$.Attributes.inquiry_type" },
      "Identifier": "cc473769-73e7-481f-a746-494300bc1ec9",
      "Type": "Compare",
      "Transitions": {
        "NextAction": "844fc6d3-6f7e-443c-aeaf-1502c340ca50",
        "Conditions": [
          {
            "NextAction": "685d59a0-7b1b-41cc-9d91-bf903933f9b2",
            "Condition": {
              "Operator": "Equals",
              "Operands": ["account_opening"]
            }
          },
          {
            "NextAction": "685d59a0-7b1b-41cc-9d91-bf903933f9b2",
            "Condition": { "Operator": "Equals", "Operands": ["application"] }
          },
          {
            "NextAction": "2f96365a-82b1-4027-ae28-524aff2d5f47",
            "Condition": { "Operator": "Equals", "Operands": ["card_loss"] }
          },
          {
            "NextAction": "2f96365a-82b1-4027-ae28-524aff2d5f47",
            "Condition": {
              "Operator": "Equals",
              "Operands": ["customer_info_change"]
            }
          }
        ],
        "Errors": [
          {
            "NextAction": "844fc6d3-6f7e-443c-aeaf-1502c340ca50",
            "ErrorType": "NoMatchingCondition"
          }
        ]
      }
    },
    {
      "Parameters": { "Text": "その他の担当者に繋ぎます。" },
      "Identifier": "844fc6d3-6f7e-443c-aeaf-1502c340ca50",
      "Type": "MessageParticipant",
      "Transitions": {
        "NextAction": "52c238f2-44db-47de-bb64-cff7d433ff8d",
        "Errors": [
          {
            "NextAction": "52c238f2-44db-47de-bb64-cff7d433ff8d",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    }
  ]
}

今回は、内容振り分け精度を確認したかったので、実際には人に繋げません。種別判定によって、各「プロンプトの再生」ブロックに分岐させています。

コンタクト属性の設定

Lexブロック内で呼び出したLambdaのclose関数で、お問い合わせ種別をLexのセッション属性(inquiry_type)としてConnectフローに返します。

次の「コンタクト属性の設定」ブロックで、返したお問い合わせ種別inquiry_typeを定義付けします。

コンタクト属性を確認する

「コンタクト属性の設定」ブロックで定義付けしたinquiry_type(お問い合わせ種別)を「コンタクト属性を確認する」ブロックで種別によって振り分けします。

オペレーターにつなぐ

オペレーターに繋げる場合、以下のフローと方法で実現できます。「作業キューの設定」と「キューへ転送」をブロックに追加します。

オペレーターに繋ぐ以外のケース

お問い合わせの種別によって、人に繋げるだけでなく、回答になるURLをSMSで送信したり、回答を自動応答するなど色々とカスタマイズ可能です。

事前にお問い合わせの種別によって回答の該当URLを設定しておき、回答になるURLをSMSやEメールで送信できます。

Knowledge basesでは、RAG手法を用いた回答ができますので、自動応答も可能です。

検証結果(Claude V3 Sonnet)

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

質問文は生成AIを使用して作成しました。

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

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

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

ちなみに、Claude V3 Sonnetのみで種別判定した以前の記事では、、25問中25問が正しく種別判定されました。Knowledge basesのデフォルトのプロンプトテンプレートを修正することで、精度を挙げられる可能性があります。

トークン数

検証した際のKnowledge basesでの各モデルのトークン数を見てみます。

お問い合わせ内容「カードを紛失してしまい、不安です。どのように対応すべきでしょうか?」の場合、以下の通りです。

  • Amazon Titan Text Embeddings V2(256)
    • 入力トークン数:36
  • Claude V3 Sonnet
    • 入力トークン数:2425
    • 出力トークン数:253

Claudeの入力トークン数が多いですね。ログを確認すると、Claudeのプロンプト内容は以下の通りです。ログでは1行なので、自分で行間を調整しています。

You are a question answering agent. I will provide you with a set of search results. The user will provide you with a question. Your job is to answer the user's question using only information from the search results. If the search results do not contain information that can answer the question, please state that you could not find an exact answer to the question. Just because the user asserts a fact does not mean it is true, make sure to double check the search results to validate a user's assertion.

Here are the search results in numbered order:
<search_results>
    <search_result>
        <content>
        アプリケーションに関するFAQ
        Q1. モバイルバンキングアプリのダウンロード方法を教えてください。 
        A1. 各モバイル端末の公式ストア(App StoreまたはGoogle Play)から無料でダウンロードできます。ストア内で当行アプリ名を検索し、インストールしてください。

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

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

        Q4. アプリのアップデートはどのように行えばよいですか? 
        A4. アプリのアップデートの際は、公式ストアに新しいバージョンがリリースされますので、そちらから手動でアップデートをお願いします。アップデートには最新のセキュリティ対策が含まれますので、必ずアップデートを行ってください。
        </content>
        <source>1</source>
    </search_result>
    <search_result>
        <content>
        お客様情報の変更に関するFAQ
        Q1. 住所変更の手続き方法を教えてください。 
        A1. 住所変更の手続きは、最寄りの支店に「住所変更届」と本人確認書類(運転免許証など)をご持参ください。また、インターネットバンキングからもお手続きが可能です。

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

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

        Q4. メールアドレスの変更はどのようにすればよいですか? 
        A4. メールアドレスの変更は、インターネットバンキングからお手続きが可能です。ログイン後、「登録情報変更」からメールアドレスの変更手続きを行ってください。        </content>
        <source>2</source>
    </search_result>
    <search_result>
        <content>
        お客様情報の変更に関するFAQ
        Q1. 住所変更の手続き方法を教えてください。 
        A1. 住所変更の手続きは、最寄りの支店に「住所変更届」と本人確認書類(運転免許証など)をご持参ください。また、インターネットバンキングからもお手続きが可能です。

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

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

        Q4. メールアドレスの変更はどのようにすればよいですか? 
        A4. メールアドレスの変更は、インターネットバンキングからお手続きが可能です。ログイン後、「登録情報変更」からメールアドレスの変更手続きを行ってください。
        </content>
        <source>3</source>
    </search_result>
    <search_result>
        <content>
        Q1. クレジットカードを紛失した場合の対処方法を教えてください。  
        A1. クレジットカードを紛失した場合は、速やかにカードロッサービスセンターに連絡し、カードの仮停止手続きを行ってください。警察への紛失届も必要となります。  

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

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

        Q4. 暗証番号を忘れた場合、どうすればよいですか?  
        A4. 暗証番号を忘れた場合は、最寄りの支店でカードの再発行手続きが必要です。その際、本人確認書類をご提示ください。
        </content>
        <source>4</source>
    </search_result>
    <search_result>
        <content>
        Q1. クレジットカードを紛失した場合の対処方法を教えてください。 
        A1. クレジットカードを紛失した場合は、速やかにカードロッサービスセンターに連絡し、カードの仮停止手続きを行ってください。警察への紛失届も必要となります。

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

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

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

If you reference information from a search result within your answer, you must include a citation to source where the information was found. Each result has a corresponding source ID that you should reference.

Note that <sources> may contain multiple <source> if you include information from multiple results in your answer.

Do NOT directly quote the <search_results> in your answer. Your job is to answer the user's question as concisely as possible.

You must output your answer in the following format. Pay attention and follow the formatting and spacing exactly:
<answer>
    <answer_part>
        <text>
        first answer text
        </text>
        <sources>
            <source>source ID</source>
        </sources>
    </answer_part>
    <answer_part>
        <text>
        second answer text
        </text>
        <sources>
            <source>source ID</source>
        </sources>
    </answer_part>
</answer>

データソースに保存されているファイルが複数インプットされています。

Claudeの入力トークン数を減らす方法としては以下が挙げられます。

  • チャンク数を減らす
    • 今回、S3バケット内のファイルが複数インプットされていましたので、減らすことで、プロンプト数も減らす事ができます。
    • チャンク数を1にした場合、入力トークン数は、2425から759に減りました。ただし、精度は下がる可能性があります。
  • 回答生成時のプロンプトを編集する

どちらの方法もAWSのブログで紹介されておりますので、ご参照ください。

レスポンス速度

Lambda(東京リージョン)の実行時間は、メモリ128MBの場合、7~9秒。メモリ512MBの場合、6~8秒でした。

電話での無音が5~10秒は長く感じます。

ちなみに、Claude V3 Sonnetのみで種別判定した以前の記事では、入力トークン数が1780程度で、メモリ512MBのLambdaの実行時間が2秒程度でした。

Knowledge basesの場合、Titan Text Embeddings V2とClaude V3 Sonnetの2つのモデルの利用や、ベクトルDBへの検索をしているので、どうしても遅くなってしまいます。先程の入力トークン数を減らす方法等でいくらか改善する可能性はあります。

引用

検証結果(Claude V3 Haiku)

ちなみに、Claude V3 Haikuを利用した場合、種別判定は、25問中14問が正しく種別判定されました。Claude V3 Sonnet を使うべきですね。

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

最後に

本記事では Knowledge bases for Amazon Bedrock を活用して、電話での問い合わせ内容を効率的に種別判定し、適切な担当者へ振り分ける方法を紹介しました。この手法により、顧客対応の迅速化と品質向上が期待できます。

また、Knowledge bases の活用は種別判定だけでなく、自動応答システムの構築にも応用可能です。

前回利用したKendra と比較して、Pinecone のサーバーレスタイプを利用することでランニングコストを抑えられる点も、システム構築時の重要な検討事項となるでしょう。

参考になれば幸いです。

追記:2024年6月26日
種別判定の精度、入力トークン数、レスポンス速度の改善記事を載せます。ご参照ください。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.