Amazon Bedrock モデルを評価してテキストの要約の精度を確認する - Amazon SageMaker

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Bedrock モデルを評価してテキストの要約の精度を確認する

高レベルModelRunnerラッパーを使用して、 の外部でホストされているモデルに基づいてカスタム評価を作成できます JumpStart。

このチュートリアルでは、Amazon Bedrock で利用可能な Anthropic Claude 2 モデル をロードし、このモデルにテキストプロンプトを要約させる方法について説明します。次に、このチュートリアルでは、 Rouge-L, Meteor、および BERTScore メトリクス。

チュートリアルでは、以下の方法を示します。

  • 環境をセットアップします。

  • モデル評価を実行します。

  • 分析結果を表示します。

環境をセットアップします。

前提条件
  • ベースを使用する Python このチュートリアルを開始する前に、3.10 カーネル環境と ml.m5.2xlarge Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを使用します。

    インスタンスタイプとその推奨ユースケースの詳細については、「」を参照してくださいStudio Classic で使用できるインスタンスタイプ

Amazon Bedrock をセットアップする

Amazon Bedrock モデルを使用する前に、そのモデルへのアクセスをリクエストする必要があります。

  1. にサインインします AWS アカウント。

    1. AWS アカウントをお持ちでない場合は、「Amazon Bedrock のセットアップ」のAWS 「アカウントのサインアップ」を参照してください。

  2. Amazon Bedrock コンソールを開きます。

  3. 開く「Amazon Bedrock! へようこそ」セクションで、モデルアクセスの管理「」を選択します。

  4. 表示されるモデルアクセスセクションで、モデルアクセスの管理 を選択します。

  5. 表示されるベースモデルセクションで、モデル の Anthropic サブセクションに記載されている Claude の横にあるチェックボックスをオンにします。

  6. モデルアクセスのリクエスト を選択します。

  7. リクエストが成功した場合、Access が付与されたチェックマークが、選択したモデルの横にある Access ステータスに表示されます。

  8. モデルにアクセスするには AWS アカウント 、 に再度ログインする必要がある場合があります。

必要なライブラリをインストールする
  1. コードで、次のように fmevalboto3ライブラリをインストールします。

    !pip install fmeval !pip3 install boto3==1.28.65
  2. ライブラリをインポートし、並列化係数を設定し、次のように Amazon Bedrock クライアントを呼び出します。

    import boto3 import json import os # Dependent on available hardware and memory os.environ["PARALLELIZATION_FACTOR"] = "1" # Bedrock clients for model inference bedrock = boto3.client(service_name='bedrock') bedrock_runtime = boto3.client(service_name='bedrock-runtime')

    前のコード例では、以下が適用されます。

    • PARALLELIZATION_FACTOR – コンピューティングインスタンスに送信された同時バッチの数の乗数。ハードウェアで並列化が許可されている場合は、この数を設定して、評価ジョブの呼び出し数を乗算できます。例えば、100呼び出しがあり、 PARALLELIZATION_FACTOR が に設定されている場合2、ジョブは200呼び出しを実行します。最大 PARALLELIZATION_FACTORまで増やすか10、変数を完全に削除できます。 AWS Lambda の使用方法に関するブログを読むには、「Kinesis および DynamoDB イベントソースの新しい Lambda スケーリングコントロールPARALLELIZATION_FACTOR」を参照してください。

  3. サンプルJSON Linesデータセット sample-dataset.jsonl を現在の作業ディレクトリにダウンロードします。

  4. 次のように、環境がサンプル入力ファイルを含んでいることを確認します。

    import glob # Check for the built-in dataset if not glob.glob("sample-dataset.jsonl"): print("ERROR - please make sure file exists: sample-dataset.jsonl")
サンプル推論リクエストをモデルに送信する
  1. モデルとプロンプトMIMEのタイプを定義します。Amazon Bedrock でホストされている Anthropic Claude 2 モデルの場合、プロンプトは次のように構成する必要があります。

    import json model_id = 'anthropic.claude-v2' accept = "application/json" contentType = "application/json" # Ensure that your prompt has the correct format prompt_data = """Human: Who is Barack Obama? Assistant: """

    リクエストの本文を構成する方法の詳細については、「モデル呼び出しリクエスト本文フィールド」を参照してください。他のモデルでは形式が異なる場合があります。

  2. サンプルリクエストをモデルに送信します。リクエストの本文には、プロンプトと、設定する追加のパラメータが含まれます。を500次のようにmax_tokens_to_sample設定したサンプルリクエスト:

    body = json.dumps({"prompt": prompt_data, "max_tokens_to_sample": 500}) response = bedrock_runtime.invoke_model( body=body, modelId=model_id, accept=accept, contentType=contentType ) response_body = json.loads(response.get("body").read()) print(response_body.get("completion"))

    前のコード例では、次のパラメータを設定できます。

    • temperature – 生成されたテキストのランダム性を制御し、正の値を受け入れます。の値が大きいほど、よりランダムで多様なレスポンスを生成するようにモデルtemperatureに指示します。値が低いと、予測可能なレスポンスが生成されます。の範囲temperatureは ~ 01、デフォルト値は 0.5 です。

    • topP – 次のトークンを生成するときに考慮すべきトークンのセットを制限することで、ランダム性を制御します。の値が大きいほど、より広い語彙を含むセットtopPが許可され、値が低いほど、トークンのセットはより可能性の高い単語に制限されます。の範囲topP0~ で1、デフォルト値は です1

    • topK – モデル予測をk、最も可能性の高いトークンの上位に制限します。の値が大きいほど、より独創的なレスポンスtopKが可能になります。値を小さくすると、より一貫性のあるレスポンスが生成されます。の範囲topK0~ で500、デフォルト値は です250

    • max_tokens_to_sample – モデルから返されるトークンの数を制限することで、レスポンスの長さを制限します。の範囲max_tokens_to_sample0から で4096、デフォルト値は です200

    • stop_sequences – モデルにレスポンスの生成を停止するように指示する文字シーケンスのリストを指定します。モデル出力は、リストされている文字列のいずれかが出力で初めて検出されたときに停止します。レスポンスには停止シーケンスが含まれていません。例えば、キャリッジリターンシーケンスを使用してモデルレスポンスを 1 行に制限できます。シーケンス4を停止するように を設定できます。

    リクエストで指定できるパラメータの詳細については、「Anthropic Claude モデル」を参照してください。

セットアップ FMEval
  1. 必要なライブラリをロードしてFMEval、次のように実行します。

    from fmeval.data_loaders.data_config import DataConfig from fmeval.model_runners.bedrock_model_runner import BedrockModelRunner from fmeval.constants import MIME_TYPE_JSONLINES from fmeval.eval_algorithms.summarization_accuracy import SummarizationAccuracy, SummarizationAccuracyConfig
  2. 入力データセットのデータ設定を設定します。

    次のサンプル入力は、 から 1 行ですsample-dataset.jsonl

    { "document": "23 October 2015 Last updated at 17:44 BST\nIt's the highest rating a tropical storm can get and is the first one of this magnitude to hit mainland Mexico since 1959.\nBut how are the categories decided and what do they mean? Newsround reporter Jenny Lawrence explains.", "summary": "Hurricane Patricia has been rated as a category 5 storm.", "id": "34615665", }

    前のサンプル入力には、documentキー内で要約するテキストが含まれています。モデルレスポンスを評価するリファレンスは summaryキーにあります。データ設定内でこれらのキーを使用して、モデルレスポンスを評価するFMEvalために必要な情報を含む列を指定する必要があります。

    データ設定では、モデルが に要約する必要があるテキストを特定する必要がありますmodel_input_location。リファレンス値は で識別する必要がありますtarget_output_location

    次のデータ設定例は、前の入力例を参照して、テキスト要約タスクに必要な列、名前、ユニフォームリソース識別子 (URI)、およびMIMEタイプを指定します。

    config = DataConfig( dataset_name="sample-dataset", dataset_uri="sample-dataset.jsonl", dataset_mime_type=MIME_TYPE_JSONLINES, model_input_location="document", target_output_location="summary" )

    他のタスクに必要な列情報の詳細については、「 のカスタム入力データセットの使用」セクションを参照してください自動モデル評価

  3. 次のコード例ModelRunnerに示すように、カスタムを設定します。

    bedrock_model_runner = BedrockModelRunner( model_id=model_id, output='completion', content_template='{"prompt": $prompt, "max_tokens_to_sample": 500}' )

    前のコード例では、以下を指定します。

    • model_id – モデルを指定するために使用する ID。

    • outputAnthropic Claude 2 モデルからの出力をキャプチャし、completionキーでレスポンスを返します。

    • content_template – モデルがリクエストとやり取りする方法を指定します。設定テンプレートの例は、前の例を説明するためだけに次のように詳しく説明されており、必須ではありません。

      • 前のcontent_template例では、以下が適用されます。

        • 変数は入力プロンプトpromptを指定し、ユーザーが行ったリクエストをキャプチャします。

        • 変数は、レスポンスの長さを制限するために500、トークンの最大数を にmax_tokens_to_sample指定します。

          リクエストで指定できるパラメータの詳細については、「Anthropic Claude モデル」を参照してください。

        content_template パラメータの形式は、 でサポートされている入力とパラメータによって異なりますLLM。このチュートリアルでは、Anthropic の Claude 2 モデルで次の を使用しますcontent_template

        "content_template": "{\"prompt\": $prompt, \"max_tokens_to_sample\": 500}"

        別の例として、Falcon 7b モデルは次の をサポートできますcontent_template

        "content_template": "{\"inputs\": $prompt, \"parameters\":{\"max_new_tokens\": \ 10, \"top_p\": 0.9, \"temperature\": 0.8}}"

モデル評価を実行する

評価アルゴリズムを定義して実行する
  1. 評価アルゴリズムを定義します。次の例は、テキスト要約タスクの精度を決定するために使用されるSummarizationAccuracyアルゴリズムを定義する方法を示しています。

    eval_algo = SummarizationAccuracy(SummarizationAccuracyConfig())

    他の評価タスクのメトリクスを計算するアルゴリズムの例については、「」の「モデルを評価する」を参照してくださいfmeval ライブラリを使用して自動評価を実行する

  2. 評価アルゴリズムを実行します。次のコード例では、以前に定義されたデータ設定と、 Human および Assistantキーprompt_templateを使用する を使用します。

    eval_output = eval_algo.evaluate(model=bedrock_model_runner, dataset_config=config, prompt_template="Human: $feature\n\nAssistant:\n", save=True)

    前のコード例では、 には Amazon Bedrock モデルが想定する形式のプロンプトfeatureが含まれています。

分析結果を表示する

  1. 次のように、評価アルゴリズムによって返されたeval_outputオブジェクトから評価レポートを解析します。

    # parse report print(json.dumps(eval_output, default=vars, indent=4))

    前のコマンドは、次の出力を返します。

    [ { "eval_name": "summarization_accuracy", "dataset_name": "sample-dataset", "dataset_scores": [ { "name": "meteor", "value": 0.2048823008681274 }, { "name": "rouge", "value": 0.03557697913367101 }, { "name": "bertscore", "value": 0.5406564395678671 } ], "prompt_template": "Human: $feature\n\nAssistant:\n", "category_scores": null, "output_path": "/tmp/eval_results/summarization_accuracy_sample_dataset.jsonl", "error": null } ]

    前の出力例では、3 つの精度スコアが表示されます。 Meteor, Rouge、および BERTScore、入力 prompt_template、リクエストcategory_scoreした場合は 、エラー、および output_path。次のステップPandas DataFrameではoutput_path、 を使用して を作成します。

  2. 結果をインポートして に読み、次のように精度スコアをモデル入力、モデル出力、ターゲット出力にDataFrameアタッチします。

    import pandas as pd data = [] with open("/tmp/eval_results/summarization_accuracy_sample_dataset.jsonl", "r") as file: for line in file: data.append(json.loads(line)) df = pd.DataFrame(data) df['meteor_score'] = df['scores'].apply(lambda x: x[0]['value']) df['rouge_score'] = df['scores'].apply(lambda x: x[1]['value']) df['bert_score'] = df['scores'].apply(lambda x: x[2]['value']) df

    この呼び出しでは、前のコード例では、次の出力を返します (簡潔に契約されています)。

    model_input model_output target_output prompt scores meteor_score rouge_score bert_score 0 John Edward Bates, formerly of Spalding, Linco... I cannot make any definitive judgments, as th... A former Lincolnshire Police officer carried o... Human: John Edward Bates, formerly of Spalding... [{'name': 'meteor', 'value': 0.112359550561797... 0.112360 0.000000 0.543234 ... 1 23 October 2015 Last updated at 17:44 BST\nIt'... Here are some key points about hurricane/trop... Hurricane Patricia has been rated as a categor... Human: 23 October 2015 Last updated at 17:44 B... [{'name': 'meteor', 'value': 0.139822692925566... 0.139823 0.017621 0.426529 ... 2 Ferrari appeared in a position to challenge un... Here are the key points from the article:\n\n... Lewis Hamilton stormed to pole position at the... Human: Ferrari appeared in a position to chall... [{'name': 'meteor', 'value': 0.283411142234671... 0.283411 0.064516 0.597001 ... 3 The Bath-born player, 28, has made 36 appearan... Okay, let me summarize the key points from th... Newport Gwent Dragons number eight Ed Jackson ... Human: The Bath-born player, 28, has made 36 a... [{'name': 'meteor', 'value': 0.089020771513353... 0.089021 0.000000 0.533514 ... ...

    モデル出力は、前のサンプル出力とは異なる場合があります。

    このセクションで示したコード例を含むノートブックについては、bedrock-claude-summarization-accuracy「.ipnyb」を参照してください。