评估 Amazon Bedrock 模型的文本摘要准确性 - Amazon SageMaker

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

评估 Amazon Bedrock 模型的文本摘要准确性

您可以使用高级ModelRunner封装器基于外部托管的模型创建自定义评估。 JumpStart

本教程展示了如何加载 Amazon Bed rock 中提供的 Anthropic Claude 2 模型,并要求该模型总结文本提示。然后,本教程演示如何使用以下方法评估模型响应的准确性 Rouge-L, MeteorBERTScore 指标。

这些教程展示了如何执行以下操作:

  • 设置 环境。

  • 运行模型评估。

  • 查看您的分析结果。

设置您的环境

先决条件
  • 使用底座 Python 开始本教程之前,请使用 3.10 内核环境和ml.m5.2xlarge亚马逊弹性计算云 (AmazonEC2) 实例。

    有关实例类型及其推荐用例的更多信息,请参阅可用于 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. 如果您的请求成功,则在所选型号旁边的访问状态下方会出现一个标有 “已授予访问权限” 的复选标记。

  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_FACTOR2,则您的作业将运行200调用。您PARALLELIZATION_FACTOR最多可以增加变量10,也可以完全移除该变量。要阅读有关 AWS Lambda 如何使用的博客,PARALLELIZATION_FACTOR请参阅适用于 Kinesis 和 DynamoDB 事件源的新 Lambda 扩展控件

  3. 将示例JSON Lines数据集 s ample-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 Bed rock 上托管的 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. 向您的模特发送样品请求。您的请求正文包含提示以及您要设置的任何其他参数。max_tokens_to_sample设置为500以下的示例请求:

    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指示模型生成更多随机和多样化的响应。较低的值生成的响应更具可预测性。范围介temperature0和之间1,默认值为 0.5。

    • topP— 通过限制生成下一个令牌时要考虑的令牌集来控制随机性。较高的值topP允许包含更广泛词汇的集合,而较低的值会将标记集限制为更可能的单词。的范围topP0 to1,默认值为1

    • topK— 将模型预测限制在k最有可能的代币上。值越高,topK可以做出更具创造性的回应。较低的值会生成更一致的响应。的范围topK0 to500,默认值为250

    • max_tokens_to_sample— 通过限制模型返回的令牌数量来限制响应的长度。的范围max_tokens_to_sample0 to4096,默认值为200

    • stop_sequences— 指定告诉模型停止生成响应的字符序列列表。第一次在输出中遇到任何列出的字符串时,模型输出就会停止。响应不包含停止序列。例如,您可以使用回车序列将模型响应限制为一行。您最多可以配置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. 为输入数据集设置数据配置。

    以下示例输入来自以下一行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。

    • output— 捕获 Anthropic Claude 2 模型的输出,该模型在按键中返回其响应。completion

    • content_template— 指定模型如何与请求交互。以下示例配置模板的详细说明仅用于解释前面的示例,这不是必需的。

      • 在前面的content_template示例中,以下内容适用:

        • 该变量prompt指定输入提示,它会捕获用户发出的请求。

        • 该变量max_tokens_to_sample指定标记的最大数量500,以限制响应的长度。

          有关可在请求中指定的参数的更多信息,请参阅 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. 运行您的评估算法。以下代码示例使用先前定义的数据配置,以及使用HumanAssistant键的配置:prompt_template

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

    在前面的代码示例中,feature包含 Amazon Bedrock 模型所期望的格式的提示。

查看您的分析结果

  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 } ]

    前面的示例输出显示了三个精度分数:Meteor, RougeBERTScore、输入prompt_template、a(category_score如果你请求的话)、任何错误,以及output_path。在接下来的步骤Pandas DataFrame中,您将使用output_path来创建。

  2. 导入结果并将其读入到 a 中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。