複数の質問に対するAmazon Bedrock Claudeの各回答の精度を一括評価するAWS Lambdaを作成してみた

複数の質問に対するAmazon Bedrock Claudeの各回答の精度を一括評価するAWS Lambdaを作成してみた

Clock Icon2024.07.05

はじめに

複数の質問に対するAmazon Bedrock Claudeの各回答の精度を一括評価するAWS Lambdaを作成してみました。

前回の記事では、Amazon Connect、Amazon Bedrock、およびAmazon Lexを統合し、生成AIを用いて電話での問い合わせ内容を種別判定し、最適な担当者に振り分けるシステムの構築方法と、その精度評価について解説しました。

構成や処理の流れの詳細

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

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

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

  1. 電話でユーザーがお問い合わせ内容を伝えます。
  2. ユーザーからお問い合わせ内容をLexで受け取ります。インテントは、FallbackIntentを呼びます。
  3. 受け取った内容をBedrockのClaudeに渡し、種別判定を実行します。事前にお問い合わせの種別内容をプロンプトにインプットさせておきます。
  4. お問い合わせの種別によって、適切な担当者に振り分けを行います。

https://dev.classmethod.jp/articles/amazon-connect-bedrock-inquiry-type/

BedrockのClaudeを使用するにあたり、問い合わせ内容(質問)を「入力」とし、その種別判定結果を「出力」とするプロンプトを設計しました。

プロンプトと質問に対する種別判定結果の正答数

利用モデルがClaude 3 Sonnetの場合のプロンプト

    prompt = f"""\n\nHuman:お客様からのお問い合わせ内容を元に、ルール内のリストからもっとも適切な種別を選択し、JSON形式で出力してください。
    <rule>
        - お客様のお問い合わせ内容に最も適した種別を次のリストから選択してください。お問い合わせ内容に適した種別がない場合、その他を選択ください
            - 口座開設(account_opening)
                Q1. 口座開設に必要な本人確認書類を教えてください。 
                A1. 口座開設時には、運転免許証、パスポート、健康保険証などの本人確認書類が必要となります。詳しくは最寄りの支店までお問い合わせください。
                Q2. 未成年者が口座を開設する際の条件を教えてください。 
                A2. 未成年者が口座を開設する場合は、親権者の同意が必要です。親権者の方の本人確認書類と印鑑も必要となります。
                Q3. 非居住者でも口座を開設できますか? 
                A3. はい、非居住者の方でも当行で口座を開設することが可能です。ただし、在留カードなど追加の書類が必要となる場合があります。
                Q4. 口座開設時に印鑑は必要ですか? 
                A4. 口座開設時には、届出印として印鑑が必要となります。認印がある印鑑をご用意ください。
            - アプリケーション(application)
                Q1. モバイルバンキングアプリのダウンロード方法を教えてください。 
                A1. 各モバイル端末の公式ストア(App StoreまたはGoogle Play)から無料でダウンロードできます。ストア内で当行アプリ名を検索し、インストールしてください。
                Q2. アプリのセキュリティ対策について教えてください。
                A2. 当行アプリでは、生体認証、端末認証、VPN、アプリ起動時の認証コードの入力など、多層的なセキュリティ対策を講じております。お客様の大切な情報を万全に守ります。
                Q3. アプリで利用できる主な機能を教えてください。 
                A3. 残高照会、入出金明細の確認、振込・送金、投資信託の購入・解約、ローン申込など、様々な銀行取引がアプリ上で可能です。ATMや支店に行く手間が省けます。
                Q4. アプリのアップデートはどのように行えばよいですか? 
                A4. アプリのアップデートの際は、公式ストアに新しいバージョンがリリースされますので、そちらから手動でアップデートをお願いします。アップデートには最新のセキュリティ対策が含まれますので、必ずアップデートを行ってください。
            - カードの紛失(card_loss)
                Q1. クレジットカードを紛失した場合の対処方法を教えてください。 
                A1. クレジットカードを紛失した場合は、速やかにカードロッサービスセンターに連絡し、カードの仮停止手続きを行ってください。警察への紛失届も必要となります。
                Q2. カードを置き引きされた場合、どうすればよいですか? 
                A2. カードを置き引きされた場合も、すぐにカードロッサービスセンターに連絡し、カードの仮停止と再発行の手続きを行ってください。警察への被害届も忘れずに提出してください。
                Q3. 再発行の手続き方法と手数料を教えてください。 
                A3. 再発行は最寄りの支店で手続きできます。手数料は1,100円(税込)かかります。インターネットバンキングからの手続きも可能です。
                Q4. 暗証番号を忘れた場合、どうすればよいですか? 
                A4. 暗証番号を忘れた場合は、最寄りの支店でカードの再発行手続きが必要です。その際、本人確認書類をご提示ください。
            - お客様情報の変更(customer_info_change)
                Q1. 住所変更の手続き方法を教えてください。 
                A1. 住所変更の手続きは、最寄りの支店に「住所変更届」と本人確認書類(運転免許証など)をご持参ください。また、インターネットバンキングからもお手続きが可能です。
                Q2. 氏名変更に必要な書類を教えてください。 
                A2. 氏名変更の際は、「氏名変更届」と新しい本人確認書類(運転免許証、パスポートなど)が必要になります。支店またはインターネットバンキングからお手続きください。
                Q3. 電話番号の変更方法を教えてください。 
                A3. 電話番号の変更は、最寄りの支店にお越しいただくか、インターネットバンキングからお手続きください。口座名義人ご本人の本人確認書類が必要となります。
                Q4. メールアドレスの変更はどのようにすればよいですか? 
                A4. メールアドレスの変更は、インターネットバンキングからお手続きが可能です。ログイン後、「登録情報変更」からメールアドレスの変更手続きを行ってください。
            - その他(others)
    </rule>
    ## 例1
    {{
      "inquiry_type": "customer_info_change"
    }}
    ## 例2
    {{
      "inquiry_type": "others"
    }}
    <sentence>
        {input_text}
    </sentence>
    Assistant:{{
    """

質問に対する種別判定結果

質問文 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
こんにちは その他 OK
預けたお金を引き出すことができません。 その他 OK
お金を借りる方法を教えて下さい その他 OK

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

AWS Lambda関数内でプロンプトを実装する過程で、以下の点が課題となりました。

  • 様々な問い合わせ内容(質問)に対して、正しい種別判定がされたかを確認するには、質問ごとにLambdaを1回実行する必要がありました
    • 質問が25個の場合、25回実行していました
  • プロンプトの修正前後で、多数の質問に対する種別判定の正答率を比較したい場合、質問ごとにLambdaを実行する必要がありました

上記の課題を解決するため、今回は質問セット(質問と期待される種別)を複数(今回は25個)用意し、生成AIモデルが各質問に対して、それぞれ正しい種別判定がされたかを1回のLambda実行でテストできる方法を紹介します。

これにより、以下のことが実現できます。

  • 複数の質問セットをLambdaの1度の実行で評価できる
  • プロンプトを修正した際、修正前と修正後で質問に対する回答精度の比較を簡単に行うことができる
  • 同じプロンプトに対して、異なるモデル間でのパフォーマンス比較を容易にできる

注意点としては、出力が文章ではなく、事前に用意した特定のワード(期待される種別など)である場合に限ります。

利用ケースは、以下が挙げられます。

  • 新規AIモデル導入時の初期評価
  • プロンプトエンジニアリングの効果測定
  • 異なるAIモデル間のパフォーマンス比較

Lambda

以下の通り、Lambda関数内のファイルは、コード、プロンプト、質問セットの3つに分けています。

.
├── lambda_function.py
├── prompt_body.txt
└── question.csv
  • lambda_function.py
    • 今回利用するLambdaのコード
  • prompt_body.txt
    • 前回の記事のプロンプト
  • question.csv
    • 前回の記事の質問セット


AWSマネジメントコンソールでのLambda画面

以下がプロンプト内容です。(prompt_body.txt)

prompt_body.txt
お客様からのお問い合わせ内容(inquiryタグ)を元に、ルール内のリストからもっとも適切な種別を選択し、JSON形式で出力してください。
<rule>
    - お問い合わせ内容が明確でない場合や、複数の種別に関連する可能性がある場合は、最も関連性が高いと思われる種別を選択してください。
        - 口座開設(account_opening)
            Q1. 口座開設に必要な本人確認書類を教えてください。 
            A1. 口座開設時には、運転免許証、パスポート、健康保険証などの本人確認書類が必要となります。詳しくは最寄りの支店までお問い合わせください。
            Q2. 未成年者が口座を開設する際の条件を教えてください。 
            A2. 未成年者が口座を開設する場合は、親権者の同意が必要です。親権者の方の本人確認書類と印鑑も必要となります。
            Q3. 非居住者でも口座を開設できますか? 
            A3. はい、非居住者の方でも当行で口座を開設することが可能です。ただし、在留カードなど追加の書類が必要となる場合があります。
            Q4. 口座開設時に印鑑は必要ですか? 
            A4. 口座開設時には、届出印として印鑑が必要となります。認印がある印鑑をご用意ください。
        - アプリケーション(application)
            Q1. モバイルバンキングアプリのダウンロード方法を教えてください。 
            A1. 各モバイル端末の公式ストア(App StoreまたはGoogle Play)から無料でダウンロードできます。ストア内で当行アプリ名を検索し、インストールしてください。
            Q2. アプリのセキュリティ対策について教えてください。
            A2. 当行アプリでは、生体認証、端末認証、VPN、アプリ起動時の認証コードの入力など、多層的なセキュリティ対策を講じております。お客様の大切な情報を万全に守ります。
            Q3. アプリで利用できる主な機能を教えてください。 
            A3. 残高照会、入出金明細の確認、振込・送金、投資信託の購入・解約、ローン申込など、様々な銀行取引がアプリ上で可能です。ATMや支店に行く手間が省けます。
            Q4. アプリのアップデートはどのように行えばよいですか? 
            A4. アプリのアップデートの際は、公式ストアに新しいバージョンがリリースされますので、そちらから手動でアップデートをお願いします。アップデートには最新のセキュリティ対策が含まれますので、必ずアップデートを行ってください。
        - カードの紛失(card_loss)
            Q1. クレジットカードを紛失した場合の対処方法を教えてください。 
            A1. クレジットカードを紛失した場合は、速やかにカードロッサービスセンターに連絡し、カードの仮停止手続きを行ってください。警察への紛失届も必要となります。
            Q2. カードを置き引きされた場合、どうすればよいですか? 
            A2. カードを置き引きされた場合も、すぐにカードロッサービスセンターに連絡し、カードの仮停止と再発行の手続きを行ってください。警察への被害届も忘れずに提出してください。
            Q3. 再発行の手続き方法と手数料を教えてください。 
            A3. 再発行は最寄りの支店で手続きできます。手数料は1,100円(税込)かかります。インターネットバンキングからの手続きも可能です。
            Q4. 暗証番号を忘れた場合、どうすればよいですか? 
            A4. 暗証番号を忘れた場合は、最寄りの支店でカードの再発行手続きが必要です。その際、本人確認書類をご提示ください。
        - お客様情報の変更(customer_info_change)
            Q1. 住所変更の手続き方法を教えてください。 
            A1. 住所変更の手続きは、最寄りの支店に「住所変更届」と本人確認書類(運転免許証など)をご持参ください。また、インターネットバンキングからもお手続きが可能です。
            Q2. 氏名変更に必要な書類を教えてください。 
            A2. 氏名変更の際は、「氏名変更届」と新しい本人確認書類(運転免許証、パスポートなど)が必要になります。支店またはインターネットバンキングからお手続きください。
            Q3. 電話番号の変更方法を教えてください。 
            A3. 電話番号の変更は、最寄りの支店にお越しいただくか、インターネットバンキングからお手続きください。口座名義人ご本人の本人確認書類が必要となります。
            Q4. メールアドレスの変更はどのようにすればよいですか? 
            A4. メールアドレスの変更は、インターネットバンキングからお手続きが可能です。ログイン後、「登録情報変更」からメールアドレスの変更手続きを行ってください。
        - その他(others)
</rule>
<example1>
{
    "inquiry_type": "customer_info_change"
}
</example1>
<example2>
{
    "inquiry_type": "others"
}
<example2>

以下が質問セットです。(question.csv)

1行目のquestionは質問で、質問に対して求めているの種別をinquiry_typeに記載しています。

Claudeが、questionに対して、出力がinquiry_typeと同じ値であれば、正解と評価します。

今回は、25問を用意しており、1度のLambda実行で各質問に対する種別判定(回答)をします。

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

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

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

以下がLambdaのコードです。(lambda_function.py)

lambda_function.py
import json
import boto3
import csv
import os

PROMPT_FILE = 'prompt_body.txt'
CSV_FILE = 'question.csv'
MODEL_ID = 'anthropic.claude-3-5-sonnet-20240620-v1:0'
# MODEL_ID = 'anthropic.claude-3-sonnet-20240229-v1:0'
# MODEL_ID = 'anthropic.claude-3-haiku-20240307-v1:0'
# MODEL_ID = 'anthropic.claude-instant-v1'
# MODEL_ID = 'anthropic.claude-v2:1'

def read_prompt_body():
    prompt_path = os.path.join(os.path.dirname(__file__), PROMPT_FILE)
    with open(prompt_path, 'r', encoding='utf-8') as file:
        return file.read().strip()

def get_inquiry_type_from_bedrock(input_text, prompt_body):
    bedrock_runtime = boto3.client('bedrock-runtime', region_name='us-east-1')
    prompt = f"{prompt_body}\n<inquiry>\n{input_text}\n</inquiry>"
    print('prompt:', json.dumps(prompt, ensure_ascii=False))

    body = json.dumps({
        "anthropic_version": "bedrock-2023-05-31",
        "messages": [
            {
                "role": "user",
                "content": prompt
            },
            {
                "role": "assistant",
                "content": "{"
            }
        ],
        "max_tokens": 400,
        'temperature': 0,
    })

    response = bedrock_runtime.invoke_model(
        modelId=MODEL_ID,
        accept='application/json',
        contentType='application/json',
        body=body
    )

    response_body = json.loads(response.get('body').read())
    response_text = "{" + response_body["content"][0]["text"]

    print('Response text:', json.dumps(response_text, ensure_ascii=False))

    try:
        json_response = json.loads(response_text)
        return json_response['inquiry_type']
    except json.JSONDecodeError as e:
        print(f"JSON decode error: {e}")
        return "error_decoding_json"

def evaluate_inquiries_from_csv(csv_path, prompt_body):
    results = []
    with open(csv_path, 'r', encoding='utf-8') as csv_file:
        csv_reader = csv.DictReader(csv_file)
        for row in csv_reader:
            question = row['question']
            csv_inquiry_type = row['inquiry_type']
            classified_inquiry_type = get_inquiry_type_from_bedrock(question, prompt_body)
            comparison_result = "OK" if csv_inquiry_type == classified_inquiry_type else "NG"
            results.append({
                'question': question,
                'csv_inquiry_type': csv_inquiry_type,
                'classified_inquiry_type': classified_inquiry_type,
                'comparison_result': comparison_result
            })

    print('results:', json.dumps(results, ensure_ascii=False))
    return results

def calculate_classification_accuracy(results):
    correct_count = sum(1 for result in results if result['comparison_result'] == 'OK')
    incorrect_count = sum(1 for result in results if result['comparison_result'] == 'NG')
    return {
        'correct_count': correct_count,
        'incorrect_count': incorrect_count
    }

def lambda_handler(event, context):
    prompt_body = read_prompt_body()
    csv_path = os.path.join(os.path.dirname(__file__), CSV_FILE)

    results = evaluate_inquiries_from_csv(csv_path, prompt_body)
    summary = calculate_classification_accuracy(results)

    return {
        'summary': summary,
        'results': results
    }

コードに関するコメント

  • get_inquiry_type_from_bedrock関数では、お問い合わせ内容を受け取り、Bedrockを使用して種別をJSON形式で出力します。出力がJSON形式ではない場合、JSONのデコードに失敗し、error_decoding_jsonという値を返します。

また、assistantメッセージを{で始めることで、出力をJSON形式に制約しています。ただし、必ずJSON形式に出力されるとは限りません。

lambda_function.pyの一部
            {
                "role": "assistant",
                "content": "{"
            }

以上のLambda関数を実装することで、再掲となりますが、以下が実現できます。

  • 複数の質問セットをLambdaの1度の実行で評価できる
    • question.csvに質問セット(複数の質問と各質問に対する正しい種別)を読み取り、一度に評価します
  • プロンプトを修正した際、修正前と修正後で質問に対する回答精度の比較を簡単に行うことができる
    • prompt_body.txt内のプロンプトを修正することで、回答精度の比較ができます
  • 同じプロンプトに対して、異なるモデル間でのパフォーマンス比較を容易にできる
    • lambda_function.pyのMODEL_IDを変えて、1度実行するだけで正答率を比較できます

今回は利用しませんが、バッチ推論(プレビュー)を検討してもよいですね。

バッチ推論では、S3 バケットに保存されているデータに対して推論を実行することで、複数の推論リクエストを非同期で実行して大量のリクエストを効率的に処理できます。バッチ推論を使用すると、大規模なデータセットでのモデル推論のパフォーマンスを向上させることができます。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/batch-inference.html

テスト

Lambdaが起点になりますので、Lambdaに渡す値はありません。

Lambdaを実行すると、question.csvに記載されているお問い合わせ内容が1問ごとにClaudeに渡され種別判定されます。これを質問の数だけ繰り返します。今回は25個質問があるので、25回実行されます。

モデルごとに正答率や実行時間を比較したいと思います。

Claude 3.5 Sonnet

Claude 3.5 Sonnetを利用した場合のLambdaの返り値は、以下の通りです。

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

質問「カードを紛失してしまい、不安です。どのように対応すべきでしょうか?」の場合

お客様からのお問い合わせ内容(inquiryタグ)を元に、ルール内のリストからもっとも適切な種別を選択し、JSON形式で出力してください。\n<rule>\n - お問い合わせ内容が明確でない場合や、複数の種別に関連する可能性がある場合は、最も関連性が高いと思われる種別を選択してください。\n - 口座開設(account_opening)\n Q1. 口座開設に必要な本人確認書類を教えてください。 \n A1. 口座開設時には、運転免許証、パスポート、健康保険証などの本人確認書類が必要となります。詳しくは最寄りの支店までお問い合わせください。\n Q2. 未成年者が口座を開設する際の条件を教えてください。 \n A2. 未成年者が口座を開設する場合は、親権者の同意が必要です。親権者の方の本人確認書類と印鑑も必要となります。\n Q3. 非居住者でも口座を開設できますか? \n A3. はい、非居住者の方でも当行で口座を開設することが可能です。ただし、在留カードなど追加の書類が必要となる場合があります。\n Q4. 口座開設時に印鑑は必要ですか? \n A4. 口座開設時には、届出印として印鑑が必要となります。認印がある印鑑をご用意ください。\n - アプリケーション(application)\n Q1. モバイルバンキングアプリのダウンロード方法を教えてください。 \n A1. 各モバイル端末の公式ストア(App StoreまたはGoogle Play)から無料でダウンロードできます。ストア内で当行アプリ名を検索し、インストールしてください。\n Q2. アプリのセキュリティ対策について教えてください。\n A2. 当行アプリでは、生体認証、端末認証、VPN、アプリ起動時の認証コードの入力など、多層的なセキュリティ対策を講じております。お客様の大切な情報を万全に守ります。\n Q3. アプリで利用できる主な機能を教えてください。 \n A3. 残高照会、入出金明細の確認、振込・送金、投資信託の購入・解約、ローン申込など、様々な銀行取引がアプリ上で可能です。ATMや支店に行く手間が省けます。\n Q4. アプリのアップデートはどのように行えばよいですか? \n A4. アプリのアップデートの際は、公式ストアに新しいバージョンがリリースされますので、そちらから手動でアップデートをお願いします。アップデートには最新のセキュリティ対策が含まれますので、必ずアップデートを行ってください。\n - カードの紛失(card_loss)\n Q1. クレジットカードを紛失した場合の対処方法を教えてください。 \n A1. クレジットカードを紛失した場合は、速やかにカードロッサービスセンターに連絡し、カードの仮停止手続きを行ってください。警察への紛失届も必要となります。\n Q2. カードを置き引きされた場合、どうすればよいですか? \n A2. カードを置き引きされた場合も、すぐにカードロッサービスセンターに連絡し、カードの仮停止と再発行の手続きを行ってください。警察への被害届も忘れずに提出してください。\n Q3. 再発行の手続き方法と手数料を教えてください。 \n A3. 再発行は最寄りの支店で手続きできます。手数料は1,100円(税込)かかります。インターネットバンキングからの手続きも可能です。\n Q4. 暗証番号を忘れた場合、どうすればよいですか? \n A4. 暗証番号を忘れた場合は、最寄りの支店でカードの再発行手続きが必要です。その際、本人確認書類をご提示ください。\n - お客様情報の変更(customer_info_change)\n Q1. 住所変更の手続き方法を教えてください。 \n A1. 住所変更の手続きは、最寄りの支店に「住所変更届」と本人確認書類(運転免許証など)をご持参ください。また、インターネットバンキングからもお手続きが可能です。\n Q2. 氏名変更に必要な書類を教えてください。 \n A2. 氏名変更の際は、「氏名変更届」と新しい本人確認書類(運転免許証、パスポートなど)が必要になります。支店またはインターネットバンキングからお手続きください。\n Q3. 電話番号の変更方法を教えてください。 \n A3. 電話番号の変更は、最寄りの支店にお越しいただくか、インターネットバンキングからお手続きください。口座名義人ご本人の本人確認書類が必要となります。\n Q4. メールアドレスの変更はどのようにすればよいですか? \n A4. メールアドレスの変更は、インターネットバンキングからお手続きが可能です。ログイン後、「登録情報変更」からメールアドレスの変更手続きを行ってください。\n - その他(others)\n</rule>\n<example1>\n{\n "inquiry_type": "customer_info_change"\n}\n</example1>\n<example2>\n{\n "inquiry_type": "others"\n}\n<example2>\n<inquiry>\nカードを紛失してしまい、不安です。どのように対応すべきでしょうか?\n</inquiry>

25問中25問が正解になりました。

実行時間は、39秒でした。

以下のモデルも25問中25問正解になりました。

  • Claude 3 Haiku 24秒
  • Claude 3 Sonnet 3.5 41秒
  • Claude Instant 32秒

Claude 2.1

Claude 2.1を利用した場合のLambdaの返り値は、以下の通りです。

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

25問中正解は0でした。

実行時間は、174秒でした。

不正解であった質問「カードを紛失してしまい、不安です。どのように対応すべきでしょうか?」における返り値は、以下の通りです。

返り値
    {
      "question": "カードを紛失してしまい、不安です。どのように対応すべきでしょうか?",
      "csv_inquiry_type": "card_loss",
      "classified_inquiry_type": "error_decoding_json",
      "comparison_result": "NG"
    },

Claudeの回答は、以下の通りです。JSON形式ではないことが原因です。

回答
{\n  \"inquiry_type\": \"card_loss\"\n}\n\nこのお問い合わせは、カードの紛失に関するものと判断しました。\nルールにあるとおり、速やかにカードロッサービスセンターに連絡し、カードの仮停止手続きを行う必要があります。\nまた、警察への紛失届の提出も必要不可欠です。\nカードの再発行については、最寄りの支店で手続きができます(手数料1,100円)。\n以上、カードの紛失に関するお問い合わせと判断し、\"card_loss\"の種別を選択しました。

JSON形式で出力されるようプロンプトを修正するなどの対応が必要です。

モデル間の比較

モデル 正答率 実行時間
Claude 3.5 Sonnet 100%(25/25) 39秒
Claude 3 Sonnet 100%(25/25) 41秒
Claude 3 Haiku 100%(25/25) 24秒
Claude Instant 100%(25/25) 32秒
Claude 2.1 0%(0/25) 17秒

以上のように、複数の質問に対して、Lambdaの1度の実行で回答の精度検証が可能です。また、モデル別の評価も容易に行えます。

最後に

本記事では、Amazon Bedrockを使用して複数の問い合わせに対する回答精度を一括で評価する方法を紹介しました。この方法には、以下のメリットがあります。

  1. 効率的な精度評価:多数の質問に対する各回答を一度のLambda実行で評価できるため、時間と労力を削減できます。
  2. プロンプトエンジニアリングの効果測定:プロンプトの修正前後で回答精度を容易に比較できるため、プロンプトの改善効果を迅速に確認できます。
  3. モデル間のパフォーマンス比較:同一のプロンプトと質問セットを使用して異なるAIモデルのパフォーマンスを比較できます。
  4. 柔軟性:プロンプトや質問セットを容易に変更できます。

本記事が参考になれば幸いです。

参考

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.