

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

# 评估 Amazon Bedrock 模型的文本摘要准确性
<a name="clarify-foundation-model-evaluate-auto-tutorial-two"></a>

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

本教程展示了如何加载 Amazon Bedrock 中的 [Anthropic Claude 2 模型](https://www.anthropic.com/index/claude-2)，并要求该模型总结文本提示。然后，本教程将介绍如何使用 [https://huggingface.co/spaces/evaluate-metric/rouge](https://huggingface.co/spaces/evaluate-metric/rouge)、[https://huggingface.co/spaces/evaluate-metric/meteor](https://huggingface.co/spaces/evaluate-metric/meteor) 和 [https://huggingface.co/spaces/evaluate-metric/bertscore](https://huggingface.co/spaces/evaluate-metric/bertscore) 指标来评估模型响应的准确性。

教程展示了如何进行以下操作：
+ 设置环境。
+ 运行模型评测。
+ 查看分析结果。

## 设置环境
<a name="clarify-foundation-model-evaluate-auto-tutorial-two-setup"></a>

**先决条件**
+ 使用基础 Python 3.10 内核环境和 `ml.m5.2xlarge` Amazon Elastic Compute Cloud（Amazon EC2) 实例。

  有关实例类型及其推荐使用场景的更多信息，请参阅 [可用于 Amazon SageMaker Studio 经典笔记本的实例类型](notebooks-available-instance-types.md)。

**设置 Amazon Bedrock**

在使用 Amazon Bedrock 模型之前，您必须先申请访问该模型。

1. 登录你的 Amazon Web Services 账户.

   1. 如果您没有 Amazon 账户，请参阅 “**设置 Amazon Bedrock”** 中的[注册 Amazon 账户](https://docs.amazonaws.cn/bedrock/latest/userguide/setting-up.html#sign-up-for-aws)。

1. 打开 [Amazon Bedrock 控制台](https://console.amazonaws.cn/bedrock)。

1. 在打开的**欢迎访问 Amazon Bedrock！**部分，选择**管理模型访问**。

1. 在出现的**模型访问**部分，选择**管理模型访问**。

1. 在出现的**基础模型**部分，选中**模型**的 **Anthropic** 分节下列出的 **Claude** 旁边的复选框。

1. 选择**请求模型访问**。

1. 如果请求成功，在所选模型旁边的**访问状态**下应出现一个带有**访问已获准**的复选标记。

1. 您可能需要重新登录 Amazon Web Services 账户 才能访问模型。

**安装所需程序库**

1. 在代码中安装 `fmeval` 和 `boto3` 库，如下所示：

   ```
   !pip install fmeval
   !pip3 install boto3==1.28.65
   ```

1. 导入库、设置并行化系数并调用 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`，也可以完全删除变量。要阅读有关 Amazon Lambda 如何使用的博客，`PARALLELIZATION_FACTOR`请参阅[适用于 Kinesis 和 DynamoDB 事件源的新 Lambda 扩展控件](https://www.amazonaws.cn/blogs/compute/new-aws-lambda-scaling-controls-for-kinesis-and-dynamodb-event-sources/)。

1. 将 `JSON Lines` 数据集样本 [sample-dataset.jsonl](https://github.com/aws/fmeval/blob/8da27af2f20369fd419c03d5bb0707ab24010b14/examples/xsum_sample.jsonl) 下载到当前作业目录。

1. 检查环境中是否包含示例输入文件，如下所示：

   ```
   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 模型](https://www.anthropic.com/index/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:
   """
   ```

   有关如何构建请求正文的更多信息，请参阅[模型调用请求正文字段](https://docs.amazonaws.cn/bedrock/latest/userguide/model-parameters-claude.html#model-parameters-claude-request-body)。其他模型可能有不同的格式。

1. 向您的模型发送样品申请。请求正文包含提示和任何其他需要设置的参数。下面是一个将 `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` 值会指示模型产生更随机、更多样的响应。较低的数值会产生更可预测的响应。`temperature` 的范围介于 `0` 和 `1` 之间，默认为 0.5。
   + `topP`：通过限制生成下一个标记时要考虑的标记集来控制随机性。`topP` 值越高，词组的词汇量就越大，而越小的值则会将词组限制在更有可能出现的词上。`topP` 的范围为 `0` 至 `1`，默认为 `1`。
   + `topK`：将模型预测限制在最有可能出现的前 `k` 个标记上。`topK` 值越高，反应越有创意。较低的数值会产生更一致的响应。`topK` 的范围为 `0` 至 `500`，默认为 `250`。
   + `max_tokens_to_sample`：通过限制模型返回的标记数来限制响应的长度。`max_tokens_to_sample` 的范围为 `0` 至 `4096`，默认为 `200`。
   + `stop_sequences`：指定告诉您的模型停止生成响应的字符序列列表。当输出中首次出现所列字符串时，将停止模型输出。响应不包含停止序列。例如，您可以使用回车序列将模型响应限制为一行。您最多可以配置 `4` 停止序列。

   有关您可以在请求中指定参数的更多信息，请参阅 [Anthropic Claude 模型](https://docs.amazonaws.cn/bedrock/latest/userguide/model-parameters-claude.html)。

**设置 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
   ```

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"
   )
   ```

   有关其他任务所需列信息的更多信息，请参阅 [自动模型评测](clarify-foundation-model-evaluate-auto.md) 中的**使用自定义输入数据集**部分。

1. 如以下代码示例所示，设置自定义 `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](https://www.anthropic.com/index/claude-2) 模型的输出，该模型会以 `completion` 键返回响应。
   + `content_template`：指定模型与请求的交互方式。下面详细介绍的配置模板示例只是为了解释前面的示例，并不是必需的。
     +  在前面的 `content_template` 例子中，以下情况适用：
       + 变量 `prompt` 指定了输入提示，它捕捉了用户提出的请求。
       + 变量 `max_tokens_to_sample` 指定了 `500` 的最大标记数，以限制响应的长度。

         有关在请求中指定参数的更多信息，请参阅 [Anthropic Claude 模型](https://docs.amazonaws.cn/bedrock/latest/userguide/model-parameters-claude.html)。

       `content_template` 参数的格式取决于 LLM 支持的输入和参数。在本教程中，[Anthropic 的 Claude 2 模型](https://www.anthropic.com/index/claude-2)使用了以下 `content_template`：

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

       再比如，[Falcon 7b 模型](https://huggingface.co/tiiuae/falcon-7b)可支持以下 `content_template`：

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

## 运行模型评测
<a name="clarify-foundation-model-evaluate-auto-tutorial-two-run"></a>

**定义并运行评估算法**

1. 确定评估算法。下面的示例展示了如何定义用于确定文本摘要任务准确性的 `SummarizationAccuracy` 算法：

   ```
   eval_algo = SummarizationAccuracy(SummarizationAccuracyConfig())
   ```

   有关为其他评估任务计算指标的算法示例，请参阅 [使用 `fmeval` 库运行自动评估](clarify-foundation-model-evaluate-auto-lib.md) 中的**评估您的模型**。

1. 运行评估算法。下面的代码示例使用了之前定义的数据配置，以及使用 `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)
   ```

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

## 查看分析结果
<a name="clarify-foundation-model-evaluate-auto-tutorial-two-view"></a>

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

   前面的示例输出显示了三个准确度得分：[https://huggingface.co/spaces/evaluate-metric/meteor](https://huggingface.co/spaces/evaluate-metric/meteor)、[https://huggingface.co/spaces/evaluate-metric/rouge](https://huggingface.co/spaces/evaluate-metric/rouge) 和 [https://huggingface.co/spaces/evaluate-metric/bertscore](https://huggingface.co/spaces/evaluate-metric/bertscore)、输入的 `prompt_template`、请求的 `category_score`、任何错误和 `output_path`。在下一步中，您将使用 `output_path` 创建一个 `Pandas DataFrame`。

1. 将结果导入并读取到 `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。](https://github.com/aws/fmeval/blob/main/examples/bedrock-claude-summarization-accuracy.ipynb)