Knowledge bases for Amazon Bedrockのプロンプトテンプレートとチャンク数を調整し、電話での問い合わせから種別判定の精度とレスポンス速度を改善する

2024.06.26

はじめに

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

構成は以下の通りです。

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

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

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

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

引用

LambdaからKnowledge basesで種別判定を行う際、以下の問題点がありました。

  • 種別判定の精度
    • 検証結果では質問文に対して正しく種別判定されたのは、25問中21問であり、4問ミスがあった。(検証結果内容は後述します)
  • 入力トークン数
    • 検証時、Knowledge basesにおける回答モデルの入力トークン数が2400程度と多い。コストや処理時間に影響する
  • レスポンス速度
    • LambdaからKnowledge basesにリクエストし、実行完了までに6~8秒かかる。電話における6~8秒は長いと感じてしまう

本記事では、上記の問題点を改善するため、Knowledge basesにおいて以下の2つの対策を実施します。

  • チャンク数を減らす
    • チャンクとは、ドキュメントを効率的に検索・処理するために分割された、意味のある小さなテキスト単位です
    • 前回記事では、Knowledge basesのチャンキング戦略は、チャンク化なし(各ファイルを 1 つのチャンクとして扱う)にしています。
    • チャンク数を減らすことで、入力トークン数は削減し、レスポンス速度は向上する見込みです。ただし、種別判定の精度は、下がる可能性があります。
  • デフォルトプロンプトテンプレートをカスタマイズする
    • デフォルトプロンプトテンプレートを利用し、Knowledge basesで回答生成が生成されます。
    • デフォルトのプロンプトテンプレートを修正することで、精度向上やプロンプト数削減により、レスポンス速度の改善が見込まれます。

これら2つの改善策は、Knowledge basesにリクエストを送るLambda関数のコードを修正することで実装できます。

今回以下の記事を参考にしました。

Lambdaのコード

Lambdaの主な設定は以下の通りです。

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

チャンク数の設定やKnowledge basesのプロンプトテンプレートを修正する場合、2024/6/26時点ですと、boto3を最新バージョンにする必要があります。

ローカルから最新バージョンのboto3をzip化し、Lambda Layerにアップロードします。

$ mkdir python
$ python3 -m pip install -t ./python boto3
$ zip -r boto3.zip ./python

全体のコードは以下の通りです。LexからLambdaが呼ばれ、Knowledge basesで種別判定後、close関数で、お問い合わせ種別をLexのセッション属性としてConnectフローに返します。 詳細は、前回の記事をご参照ください。

今回実装したコードは以下の通りです。

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": 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"
    knowledgebaseId = "XXXXXX"

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

    promptTemplate = """お客様からのお問い合わせ内容を元に、ルール内のリストからもっとも適切な種別を選択し、JSON形式で出力してください。

    <rule>
        - お客様のお問い合わせ内容に対して参考ドキュメントは以下です。
            $search_results$
        - 参考ドキュメントから、もっとも適切な種別を以下の5つから選択ください。お問い合わせ内容に適した種別がない場合、その他(others)を選択ください
            - 口座開設(account_opening)
            - アプリケーション(application)
            - カードの紛失(card_loss)
            - お客様情報の変更(customer_info_change)
            - その他(others)
        - 選択した種別は、JSONのキーの値とします。JSONキー名は、inquiry_typeとします
        - JSON形式以外の出力はしないでください
    </rule>
    ## 出力例1
    {{
        "inquiry_type": "customer_info_change"
    }}
    ## 出力例2
    {{
        "inquiry_type": "others"
    }}
    """

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

    return json.loads(response['output']['text'])

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)

    return close(inquiry_type)

knowledgebaseIdは、作成したKnowledge basesのIDを入力下さい。

チャンク数の設定

vectorSearchConfigurationnumberOfResultsでチャンク数を設定できます。チャンク数は、2つにしました。

'retrievalConfiguration': {
    'vectorSearchConfiguration': {
        'numberOfResults': 2
    }
},

カスタムプロンプトテンプレートの活用

textPromptTemplateでカスタムプロンプトテンプレートを指定しています。

promptTemplate = """お客様からのお問い合わせ内容を元に、ルール内のリストからもっとも適切な種別を選択し、JSON形式で出力してください。

<rule>
    - お客様のお問い合わせ内容に対して参考ドキュメントは以下です。
        $search_results$
    - 参考ドキュメントから、もっとも適切な種別を以下の5つから選択ください。お問い合わせ内容に適した種別がない場合、その他(others)を選択ください
        - 口座開設(account_opening)
        - アプリケーション(application)
        - カードの紛失(card_loss)
        - お客様情報の変更(customer_info_change)
        - その他(others)
    - 選択した種別は、JSONのキーの値とします。JSONキー名は、inquiry_typeとします
    - JSON形式以外の出力はしないでください
</rule>

# ~略~

'generationConfiguration': {
        'promptTemplate': {
            'textPromptTemplate': promptTemplate 
        }
}
"""

Knowledge basesのプロンプトテンプレートでは、Knowledge basesで事前に定義されたプロンプトプレースホルダーと呼ばれる変数が利用できます。

例えば、プロンプト内のプロンプトプレースホルダー$search_results$は、ユーザークエリで取得した結果(ドキュメント検索結果)になります。

詳細は、ドキュメントをご参照ください。

ちなみに、プロンプトには、「適切な種別を以下の5つから選択ください。」という「5つ」というワードを入れています。このワードを入れない場合、精度が落ちたため入れています。

今回の上記のLambdaのコードで以下の対応ができました。

  • チャンク数を減らす
  • Knowledge basesのデフォルトプロンプトテンプレートをカスタマイズする

前回同様に、実際に質問文から種別判定し、判定結果を確認してみます。

検証結果

種別判定

前回の検証結果では、種別判定は、25問中21問が正しく種別判定されていました。

前回の検証結果

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

今回の種別判定では、25問中24問が正しく判定されました。これは前回と比較して精度が向上したことを示します。

入力トークン数

回答モデルの入力トークン数では、デフォルトプロンプトテンプレート利用時、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>

今回のカスタムテンプレートのプロンプト(質問文「カードを紛失してしまい、不安です。どのように対応すべきでしょうか?」の場合)

お客様からのお問い合わせ内容を元に、ルール内のリストからもっとも適切な種別を選択し、JSON形式で出力してください。

<rule>
    - お客様のお問い合わせ内容に対して参考ドキュメントは以下です。
        <search_results>
            <search_result>
                <content>
                Q1. クレジットカードを紛失した場合の対処方法を教えてください。  
                A1. クレジットカードを紛失した場合は、速やかにカードロッサービスセンターに連絡し、カードの仮停止手続きを行ってください。警察への紛失届も必要となります。  
                Q2. カードを置き引きされた場合、どうすればよいですか?  
                A2. カードを置き引きされた場合も、すぐにカードロッサービスセンターに連絡し、カードの仮停止と再発行の手続きを行ってください。警察への被害届も忘れずに提出してください。  
                Q3. 再発行の手続き方法と手数料を教えてください。  
                A3. 再発行は最寄りの支店で手続きできます。手数料は1,100円(税込)かかります。インターネットバンキングからの手続きも可能です。  
                Q4. 暗証番号を忘れた場合、どうすればよいですか?  A4. 暗証番号を忘れた場合は、最寄りの支店でカードの再発行手続きが必要です。その際、本人確認書類をご提示ください。
                </content>
                <source>1</source>
            </search_result>
            <search_result>
                <content>
                Q1. クレジットカードを紛失した場合の対処方法を教えてください。 
                A1. クレジットカードを紛失した場合は、速やかにカードロッサービスセンターに連絡し、カードの仮停止手続きを行ってください。警察への紛失届も必要となります。

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

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

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

    - 参考ドキュメントから、もっとも適切な種別を以下の5つから選択ください。お問い合わせ内容に適した種別がない場合、その他(others)を選択ください
        - 口座開設(account_opening)
        - アプリケーション(application)
        - カードの紛失(card_loss)
        - お客様情報の変更(customer_info_change)
        - その他(others)
    - 選択した種別は、JSONのキーの値とします。JSONキー名は、inquiry_typeとします
    - JSON形式以外の出力はしないでください
</rule>

## 出力例1
{{
    "inquiry_type": "customer_info_change"
}}

## 出力例2
{{
    "inquiry_type": "others"
}}

チャンク数を2に指定しているので、参照ドキュメントは2つになっており、デフォルトプロンプトテンプレートに比べ、カスタムしたプロンプトテンプレートの入力トークン数は少ないことが分かります。

レスポンス速度

LambdaからKnowledge basesにリクエストし、実行完了までにおおよそ3秒程度でした。

まとめ

問題点であった、種別判定の精度、トークン数、レスポンス速度は以下の通り改善されました。

  • 種別判定の精度
    • 検証結果では質問文に対して正しく種別判定されたのは、25問中21問 (84%) から25問中24問 (96%) に向上しました。
  • 入力トークン数
    • 入力トークン数は、半分以下まで削減できました。
    • 質問文「カードを紛失してしまい、不安です。どのように対応すべきでしょうか?」の場合、以下の通りです。
      • Amazon Titan Text Embeddings V2(次元数:256)
        • 入力トークン数:36 → 36
      • Claude V3 Sonnet
        • 入力トークン数:2425 → 1156
        • 出力トークン数:253 → 18(JSON形式のため)
  • レスポンス速度
    • LambdaからKnowledge basesにリクエストし、実行完了までに6~8秒から半分以下の3秒に改善されました。

最後に

Knowledge bases for Amazon Bedrockのプロンプトテンプレートとチャンク数を修正し、電話での問い合わせから種別を判定する精度とレスポンス速度を改善してみました。

この改善により、種別判定の精度が向上し、入力トークン数とレスポンス時間が大幅に削減されました。

本記事がKnowledge basesを利用する際の参考になれば幸いです。