

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

# 使用 `fmeval` 库运行自动评估
<a name="clarify-foundation-model-evaluate-auto-lib"></a>

在自己的代码中使用 `fmeval` 库，可以最灵活地定制工作流程。您可以使用 `fmeval` 库来评估任何 LLM，也可以更灵活地使用自定义输入数据集。以下步骤将向您展示如何设置环境，以及如何使用 `fmeval` 库运行起始工作流和自定义工作流。

## 开始使用 `fmeval` 库
<a name="clarify-foundation-model-evaluate-auto-lib-get-started"></a>

您可以在 Studio 笔记本中配置基础模型评测，并根据使用场景进行定制。您的配置既取决于构建基础模型所要预测的任务类型，也取决于您想要如何对其进行评估。 FMEval 支持开放式生成、文本摘要、问答和分类任务。本节的步骤将向您展示如何设置起始工作流程。此起始工作流程包括设置您的环境并使用带有内置数据集的 Amazon Bedrock 基础模型运行评估算法。 JumpStart 如果您必须使用自定义输入数据集和工作流程来处理更特殊的使用场景，请参阅 [使用 `fmeval` 库定制工作流程](clarify-foundation-model-evaluate-auto-lib-custom.md)。

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

如果不想在 Studio 笔记本中运行模型评测，请跳到下面**开始使用 Studio** 部分的步骤 11。

**先决条件**
+ 要在 Studio UI 中运行模型评测，您的 AWS Identity and Access Management (IAM) 角色和任何输入数据集都必须具有正确的权限。如果您没有 A SageMaker I 域或 IAM 角色，请按照中的步骤操作[亚马逊 A SageMaker I 入门指南](gs.md)。

**为 Amazon S3 存储桶设置权限**

创建域和角色后，使用以下步骤添加评估模型所需的权限。

1. 打开 Amazon A SageMaker I 控制台，网址为[https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)。

1. 在导航窗格中，在页面顶部的搜索栏中输入 **S3**。

1. 在**服务**下选择 **S3**。

1. 在导航窗格中选择**存储桶**。

1. 在**一般用途存储桶**部分的**名称**下，选择要用于在管理控制台中存储模型输入和输出的 S3 存储桶的名称。如果没有 S3 存储桶，请执行以下操作：

   1. 选择**创建存储桶**打开一个新的**创建存储桶**页面。

   1. 在**常规配置**部分的 **AWS 区域**下，选择基础模型所在的 AWS 区域。

   1. 在**存储桶名称**下的输入框中为 S3 存储桶命名。

   1. 接受所有默认选项。

   1. 选择**创建存储桶**。

   1. 在**一般用途存储桶**部分的**名称**下，选择创建的 S3 存储桶的名称。

1. 选择**权限**选项卡。

1. 滚动到窗口底部的**跨源资源共享 (CORS)** 部分。选择**编辑**。

1. 要为基础评估存储桶添加权限，请确保输入框中出现以下代码。您也可以将以下内容复制并粘贴到输入框中。

   ```
   [
   {
       "AllowedHeaders": [
           "*"
       ],
       "AllowedMethods": [
           "GET",
           "PUT",
           "POST",
           "DELETE"
       ],
       "AllowedOrigins": [
           "*"
       ],
       "ExposeHeaders": [
           "Access-Control-Allow-Origin"
       ]
   }
   ]
   ```

1. 选择**保存更改**。

**要在 IAM 策略中添加权限**

1. 在页面顶部的搜索栏中输入 **IAM**。

1. 在**服务**下，选择**身份和访问权限管理 (IAM)**。

1. 从导航窗格中选择**策略**。

1. 在搜索栏中输[AmazonSageMakerFullAccess](https://docs.aws.amazon.com/sagemaker/latest/dg/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonSageMakerFullAccess)入。选择出现的策略旁边的单选按钮。现在可以选择**操作**按钮。

1. 选择**操作**旁边的向下箭头。出现两个选项。

1. 选择 **附加**。

1. 在出现的 IAM 列表中，搜索您创建的角色名称。选择名称旁边的复选框。

1. 选择**附加策略**。

**开始使用 Studio**

1. 在页面顶部的搜索栏中输入 **SageMaker AI**。

1. 在 “**服务**” 下，选择 “**亚马逊 SageMaker AI**”。

1. 从导航窗格中选择 **Studio**。

1. 展开**选择域**下的向下箭头后，从**开始使用**部分选择域。

1. 展开**选择用户配置文件**下的向下箭头后，从**开始使用**部分选择用户配置文件。

1. 选择**打开 Studio** 打开 Studio 的登录页面。

1. 从导航窗格中选择文件浏览器，然后导航到根目录。

1. 选择**创建笔记本**。

1. 在打开的笔记本环境对话框中，选择 **Data Science 3.0** 映像。

1. 选定**选择**。

1. 如以下代码示例所示，在开发环境中安装 `fmeval` 软件包：

   ```
   !pip install fmeval
   ```
**注意**  
将 `fmeval` 库安装到使用 Python 3.10 的环境中。有关运行 `fmeval` 所需的更多信息，请参阅 [`fmeval` 依赖项](https://github.com/aws/fmeval/blob/main/pyproject.toml)。

## 配置 `ModelRunner`
<a name="clarify-foundation-model-evaluate-auto-lib-modelrunner"></a>

FMEval 使用名为的高级包装器`ModelRunner`来撰写输入、调用和提取模型中的输出。`fmeval` 软件包可以评估任何 LLM，但配置 `ModelRunner` 的步骤取决于您想要评估的模型类型。本节介绍如何`ModelRunner`为 JumpStart 或 Amazon Bedrock 模型进行配置。如果要使用自定义输入数据集和自定义 `ModelRunner`，请参阅 [使用 `fmeval` 库定制工作流程](clarify-foundation-model-evaluate-auto-lib-custom.md)。

### 使用 JumpStart 模型
<a name="clarify-foundation-model-evaluate-auto-lib-modelrunner-js"></a>

`ModelRunner`要使用评估 JumpStart 模型，请创建或提供端点、定义模型和内置数据集、配置和测试`ModelRunner`。

**定义 JumpStart 模型并配置 ModelRunner**

1. 通过以下任一操作提供一个端点：
   + [EndpointName](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html#API_runtime_InvokeEndpoint_RequestSyntax)为现有 JumpStart端点指定`model_id`、和`model_version`。
   + `model_version`为模型指定`model_id`和，然后创建 JumpStart 端点。

   以下代码示例显示了如何为可用的端点创建端点 JumpStart。[https://aws.amazon.com/blogs/machine-learning/llama-2-foundation-models-from-meta-are-now-available-in-amazon-sagemaker-jumpstart/](https://aws.amazon.com/blogs/machine-learning/llama-2-foundation-models-from-meta-are-now-available-in-amazon-sagemaker-jumpstart/)

   ```
   import sagemaker
   from sagemaker.jumpstart.model import JumpStartModel
   
   #JumpStart model and version
   model_id, model_version = "meta-textgeneration-llama-2-7b-f", "*"
   
   my_model = JumpStartModel(model_id=model_id)
   predictor = my_model.deploy()
   endpoint_name = predictor.endpoint_name
   
   # Accept the EULA, and test the endpoint to make sure it can predict.
   predictor.predict({"inputs": [[{"role":"user", "content": "Hello how are you?"}]]}, custom_attributes='accept_eula=true')
   ```

   前面的代码示例指的是 EULA，它代表 end-use-license-agreement (EULA)。EULA 可在所使用模型的模型卡说明中找到。要使用某些 JumpStart 模型，必须指定`accept_eula=true`，如上次调用中所示`predict`。有关 EULA 的更多信息，请参阅 [示范源和许可协议](jumpstart-foundation-models-choose.md) 中的**许可和模型来源**部分。

   您可以在[带有预训练 JumpStart 模型表的内置算法中找到可用模型](https://sagemaker.readthedocs.io/en/stable/doc_utils/pretrainedmodels.html#built-in-algorithms-with-pre-trained-model-table)的列表。

1. 使用 `JumpStartModelRunner` 配置 `ModelRunner`，如下面的配置示例所示：

   ```
   from fmeval.model_runners.sm_jumpstart_model_runner import JumpStartModelRunner
   
   js_model_runner = JumpStartModelRunner(
   endpoint_name=endpoint_name,
   model_id=model_id,
   model_version=model_version
   )
   ```

   在上一个配置示例中，使用与创建端点时相同的 `endpoint_name`、`model_id` 和 `model_version` 值。

1. 测试您的 `ModelRunner`。如以下代码示例所示，向您的模型发送一个请求示例：

   ```
   js_model_runner.predict("What is the capital of London")
   ```

### 使用 Amazon Bedrock 模型
<a name="clarify-foundation-model-evaluate-auto-lib-modelrunner-br"></a>

要评估 Amazon Bedrock 模型，必须定义模型和内置数据集，并配置 `ModelRunner`。

**定义 Amazon Bedrock 模型并配置 ModelRunner**

1. 要定义并打印模型详细信息，请使用以下代码示例，说明通过 Amazon Bedrock 提供的泰坦模型：

   ```
   import boto3
   import json
   bedrock = boto3.client(service_name='bedrock')
   bedrock_runtime = boto3.client(service_name='bedrock-runtime')
   
   model_id = "amazon.titan-tg1-large"
   accept = "application/json"
   content_type = "application/json"
   
   print(bedrock.get_foundation_model(modelIdentifier=modelId).get('modelDetails'))
   ```

   在前面的代码示例中，`accept` 参数指定了用于评估 LLM 的数据格式。`contentType` 指定请求中输入数据的格式。Amazon Bedrock 模型仅 `MIME_TYPE_JSON` 支持 `accept` 和 `contentType`。有关这些参数的更多信息，请参阅 [InvokeModelWithResponseStream](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModelWithResponseStream.html#API_runtime_InvokeModelWithResponseStream_RequestSyntax)。

1. 要配置 `ModelRunner`，请使用 `BedrockModelRunner`，如以下配置示例所示：

   ```
   from fmeval.model_runners.bedrock_model_runner import BedrockModelRunner
   
   bedrock_model_runner = BedrockModelRunner(
   model_id=model_id,
   output='results[0].outputText',
   content_template='{"inputText": $prompt, "textGenerationConfig": \
   {"maxTokenCount": 4096, "stopSequences": [], "temperature": 1.0, "topP": 1.0}}',
   )
   ```

   将 `ModelRunner` 配置参数化如下。
   + 使用与部署模型时相同的 `model_id` 值。
   + 使用 `output` 指定生成的 `json` 响应格式。例如，如果您的 LLM 提供了 `[{"results": "this is the output"}]` 响应，那么 `output='results[0].outputText'` 将返回 `this is the output`。
   + 使用 `content_template` 指定 LLM 与请求的交互方式。以下配置模板的详细说明只是为了解释前面的配置示例，并非必需。
     + 在前面的配置示例中，变量 `inputText` 指定了提示符，它捕捉了用户提出的请求。
     + 变量 `textGenerationConfig` 用于指定 LLM 生成响应的方式，如下所示：
       + 参数 `maxTokenCount` 用于通过限制 LLM 返回的标记数来限制响应的长度。
       + 参数 `stopSequences` 用于指定一系列字符序列，告诉 LLM 停止生成响应。当输出中首次出现所列字符串时，将停止模型输出。例如，您可以使用回车序列将模型响应限制为一行。
       + 参数 `topP` 通过限制生成下一个标记时要考虑的标记集来控制随机性。该参数的取值范围在 `0.0` 和 `1.0` 之间。`topP` 值越高，词组的词汇量就越大，而越小的值则会将词组限制在更有可能出现的词上。
       + 参数 `temperature` 控制生成文本的随机性，接受正值。较高的 `temperature` 值会指示模型产生更随机、更多样的响应。较低的数值会产生更可预测的响应。`temperature` 的典型范围介于 `0.2` 和 `2.0` 之间。

       有关特定 Amazon Bedrock 基础模型参数的更多信息，请参阅[基础模型推论参数](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html#model-parameters-titan)。

     content\_template 参数的格式取决于 LLM 支持的输入和参数。例如，[Anthropic’s 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}}"
     ```

     最后，测试您的 `ModelRunner`。如以下代码示例所示，向您的模型发送一个请求示例：

     ```
     bedrock_model_runner.predict("What is the capital of London?")
     ```

## 评估模型
<a name="clarify-foundation-model-evaluate-auto-lib-eval"></a>

配置好数据和 `ModelRunner` 后，就可以对 LLM 生成的响应运行评估算法了。要查看所有可用评估算法的列表，请运行以下代码：

```
from fmeval.eval_algo_mapping import EVAL_ALGORITHMS
print(EVAL_ALGORITHMS.keys())
```

每种算法都有一个评估方法和一个 `evaluate_sample` 方法。`evaluate` 方法计算整个数据集的得分。`evaluate_sample` 方法会评估单个实例的得分。

`evaluate_sample` 方法会返回 `EvalScore` 对象。`EvalScore` 对象包含模型在评估过程中表现的综合得分。`evaluate_sample` 方法有以下可选参数：
+ `model_output`：单个请求的模型响应。
+ `model_input`：一个提示，其中包含对模型的请求。
+ `target_output`：`model_input` 中包含的提示的预期响应。

下面的代码示例展示了如何使用 `evaluate_sample`：

```
#Evaluate your custom sample
model_output = model_runner.predict("London is the capital of?")[0]
eval_algo.evaluate_sample(target_output="UK<OR>England<OR>United Kingdom", model_output=model_output)
```

`evaluate` 方法有以下可选参数：
+ `model`：使用要评估的模型的 `ModelRunner` 实例。
+ `dataset_config`：数据集配置。如果没有提供 `dataset_config`，则会使用为该任务配置的所有内置数据集对该模型进行评估。
+ `prompt_template`：用于生成提示的模板。如果没有提供 `prompt_template`，将使用默认提示模板对模型进行评估。
+ `save`：如果设置为 `True`，按记录排列的提示回答和得分将保存到文件 `EvalAlgorithmInterface.EVAL_RESULTS_PATH` 中。默认值为 `False`。
+ `num_records`：从输入数据集中随机抽取的用于评估的记录数。默认值为 `300`。

`evaluate` 算法会返回一个 `EvalOutput` 对象列表，其中可能包括以下内容：
+ `eval_name`：评估算法的名称。

  `dataset_name`：评估算法使用的数据集名称。

  `prompt_template`：用于编写提示信息的模板，如果数据集中未提供参数 `model_output`，则使用该模板。有关更多信息，请参阅 `prompt_template` “**配置 JumpStart `ModelRunner`” 一节中的**。

  `dataset_scores`：整个数据集的综合得分。

  `category_scores`：包含数据集中每个类别得分的 `CategoryScore` 对象列表。

  `output_path`：评估输出的本地路径。该输出包含提示回答和记录评估得分。

  `error`：评估作业失败时的字符串错误信息。

以下尺寸可用于模型评测：
+ 准确性
+ 事实知识
+ 提示定型
+ 语义鲁棒性
+ 毒性

### 准确性
<a name="clarify-foundation-model-evaluate-auto-lib-eval-acc"></a>

您可以为问题解答、文本摘要或分类任务运行准确率算法。为了适应不同的数据输入类型和问题，每项任务的算法都有所不同，具体如下：
+ 对于问题解答任务，使用 `QAAccuracyConfig` 文件运行 `QAAccuracy` 算法。
+ 对于文本摘要任务，使用 `SummarizationAccuracyConfig` 运行 `SummarizationAccuracy` 算法。
+ 对于分类任务，使用 `ClassificationAccuracyConfig` 运行 `ClassificationAccuracy` 算法。

`QAAccuracy` 算法会返回一个 `EvalOutput` 对象列表，其中包含每个样本的一个准确度得分。要运行问题答案准确性算法，请实例化一个 `QAAccuracygeConfig`，并输入 `<OR>` 或 `None` 作为 `target_output_delimiter`。问题答案准确性算法会将您的模型生成的答案与已知答案进行比较。如果输入 `<OR>` 作为目标分隔符，那么如果算法在答案中生成了任何由 `<OR>` 分隔的内容，就会将该答案评为正确答案。如果传递 `None` 或空字符串作为 `target_output_delimiter`，代码会出错。

如以下代码示例所示，调用 `evaluate` 方法并输入所需参数：

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.qa_accuracy import QAAccuracy, QAAccuracyConfig

eval_algo = QAAccuracy(QAAccuracyConfig(target_output_delimiter="<OR>")))
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

`SummarizationAccuracy` 算法返回一个 `EvalOutput` 对象列表，其中包含 [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) 的得分。有关这些得分的更多信息，请参阅 [在模型评测作业中使用提示数据集和可用评估维度](clarify-foundation-model-evaluate-overview.md) 中的文本摘要部分。要运行文本摘要准确性算法，请实例化一个 `SummarizationAccuracyConfig`，并输入以下内容：
+ 在对 `rouge_type` 进行评估时，指定要使用的 [https://en.wikipedia.org/wiki/ROUGE_(metric)](https://en.wikipedia.org/wiki/ROUGE_(metric)) 指标类型。您可以选择 `rouge1`、`rouge2` 或 `rougeL`。这些指标将生成的摘要与参考摘要进行比较。ROUGE-1 使用重叠单字词（一个项目的序列，如“the”、“is”）比较生成摘要和参考摘要。ROUGE-2 使用大词组（由两个序列组成的词组，如“the large”、“is home”）比较生成摘要和参考摘要。ROUGE-L 比较最长的匹配词序列。有关 ROUGE 的更多信息，请参阅 [ROUGE：摘要自动评估软件包](https://aclanthology.org/W04-1013.pdf)。
+ 将 `use_stemmer_for_rouge` 设置为 `True` 或 `False`。词干识别器在对词语进行比较之前会去掉词语中的词缀。例如，词干识别器会去掉“swimming”和“swam”中的词缀，这样它们在词干识别后都是“swim”。
+ 将 model\_type\_for\_bertscore 设为用于计算 [https://huggingface.co/spaces/evaluate-metric/bertscore](https://huggingface.co/spaces/evaluate-metric/bertscore) 的模型。您可以选择 [ROBERTA\_MODEL](https://huggingface.co/docs/transformers/model_doc/roberta) 或更高级的 [MICROSOFT\_DEBERTA\_MODEL](https://github.com/microsoft/DeBERTa)。

最后，如以下代码示例所示，调用 `evaluate` 方法并输入所需的参数：

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.summarization_accuracy import SummarizationAccuracy, SummarizationAccuracyConfig

eval_algo = SummarizationAccuracy(SummarizationAccuracyConfig(rouge_type="rouge1",model_type_for_bertscore="MICROSOFT_DEBERTA_MODEL"))
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

`ClassificationAccuracy` 算法会返回一个 `EvalOutput` 对象列表，其中包含每个样本的分类准确率、精确率、召回率和平衡准确率得分。有关这些得分的更多信息，请参阅 [在模型评测作业中使用提示数据集和可用评估维度](clarify-foundation-model-evaluate-overview.md) 中的**分类**部分。要运行分类准确率算法，需要实例化 `ClassificationAccuracyConfig`，并向 `multiclass_average_strategy` 传递平均策略。您可以选择 `micro`、`macro`、`samples`、`weighted` 或 `binary`。默认值为 `micro`。然后，将包含分类类别真实标签的列名的列表传入 valid\_labels。最后，如以下代码示例所示，调用 `evaluate` 方法并输入所需的参数：

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.classification_accuracy import ClassificationAccuracy, ClassificationAccuracyConfig

eval_algo = ClassificationAccuracy(ClassificationAccuracyConfig(multiclass_average_strategy="samples",valid_labels=["animal_type","plant_type","fungi_type"]))
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

### 事实知识
<a name="clarify-foundation-model-evaluate-auto-lib-eval-fk"></a>

您可以运行事实知识算法进行开放式生成。要运行事实知识算法，请实例化一个 `FactualKnowledgeConfig`，并选择性地传递一个分隔符字符串（默认为 `<OR>`）。事实知识算法会将模型生成的响应与已知响应进行比较。如果在答案中生成了分隔符分隔的任何内容，算法就会将该答案评为正确答案。如果将 `None` 作为 `target_output_delimiter` 传递，那么模型必须生成与答案相同的响应，才能被评为正确。最后，调用 `evaluate` 方法并输入所需的参数。

事实知识返回一个 `EvalScore` 对象列表。其中包含模型编码事实知识能力的综合得分，如**基础模型评测概述**部分所述。得分在 `0` 和 `1` 之间，最低分代表对现实世界事实的了解较少。

下面的代码示例展示了如何使用事实知识算法评估 LLM：

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.factual_knowledge import FactualKnowledge, FactualKnowledgeConfig

eval_algo = FactualKnowledge(FactualKnowledgeConfig())
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

### 提示定型
<a name="clarify-foundation-model-evaluate-auto-lib-eval-ps"></a>

您可以运行提示定型算法进行开放式生成。要运行提示定型算法，您的 `DataConfig` 必须识别输入数据集中包含 `sent_less_input_location` 中定型程度较低的句子和 `sent_more_output_location` 中定型程度较高的句子的列。有关 `DataConfig` 的更多信息，请参阅第 **2 节。配置`ModelRunner`**。接下来，调用 `evaluate` 方法并传入所需的参数。

提示定型会返回一个 `EvalOutput` 对象列表，其中包含每条输入记录的得分和每类偏差的总分。得分是通过比较定型化程度较高和较低的句子的概率计算出来的。总分报告了模型偏好刻板句子的频率，即与不太刻板的句子相比，模型赋予更刻板的句子更高的概率。得分 `0.5` 表示您的模型不带偏见，或者说它以相同的比率偏好较多和较少刻板印象的句子。如果得分大于 `0.5`，则表明您的模型可能会产生较为刻板的反应。得分小于 `0.5` 表示您的模型可能产生的反应不那么刻板。

下面的代码示例展示了如何使用提示定型算法评估 LLM：

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.prompt_stereotyping import PromptStereotyping

eval_algo = PromptStereotyping()
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

### 语义鲁棒性
<a name="clarify-foundation-model-evaluate-auto-lib-eval-sr"></a>

你可以为任何 FMEval 任务运行语义稳健性算法，但是你的模型应该是确定性的。确定性模型是指相同的输入总是产生相同的输出。在解码过程中，通常可以通过设置随机种子来实现确定性。为了适应不同的数据输入类型和问题，每项任务的算法都有所不同，具体如下：
+ 对于开放式生成、问题解答或任务分类，使用 `GeneralSemanticRobustnessConfig` 文件运行 `GeneralSemanticRobustness` 算法。
+ 对于文本摘要，可使用 `SummarizationAccuracySemanticRobustnessConfig` 文件运行 `SummarizationAccuracySemanticRobustness` 算法。

`GeneralSemanticRobustness` 算法会返回一个 `EvalScore` 对象列表，该列表包含精度值在 `0` 和 `1` 之间的对象，量化了扰动模型输出和未扰动模型输出之间的差异。要运行一般语义鲁棒性算法，需要实例化一个 `GeneralSemanticRobustnessConfig`，并传入一个 `perturbation_type`。您可以为 `perturbation_type` 选择以下选项之一：
+ `Butterfinger`：根据键盘距离交换字符，模拟拼写错误的扰动。输入特定字符受到扰动的概率。Butterfinger 是 `perturbation_type` 的默认值。
+ `RandomUpperCase`：将部分字符改为大写的扰动。输入从 `0` 到 `1` 的小数。
+ `WhitespaceAddRemove`：在非空白字符前添加空白字符变为白色的概率。

您还可以指定以下参数：
+ `num_perturbations`：生成文本时每个样本的扰动次数。默认值为 `5`。
+ `butter_finger_perturbation_prob`：字符被扰动的概率。仅当 `perturbation_type` 为 `Butterfinger` 时使用。默认值为 `0.1`。
+ `random_uppercase_corrupt_proportion`：改为大写的字符数。仅当 `perturbation_type` 为 `RandomUpperCase` 时使用。默认值为 `0.1`。
+ `whitespace_add_prob`：给定空白区域，从样本中删除该区域的概率。仅当 `perturbation_type` 为 `WhitespaceAddRemove` 时使用。默认值为 `0.05`。
+ `whitespace_remove_prob`：给定一个非留白空格，在其前面添加一个留白空格的概率。仅当 `perturbation_type` 为 `WhitespaceAddRemove` 时使用。默认值为 `0.1`。

最后，如以下代码示例所示，调用 `evaluate` 方法并输入所需的参数：

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.general_semantic_robustness import GeneralSemanticRobustness, GeneralSemanticRobustnessConfig

eval_algo = GeneralSemanticRobustness(GeneralSemanticRobustnessConfig(perturbation_type="RandomUpperCase",num_perturbations=2,random_uppercase_corrupt_proportion=0.3)))
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```

`SummarizationAccuracySemanticRobustness` 算法会返回一个 `EvalScore` 对象列表，其中包含生成摘要与参考摘要之间的 [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) 值之差（或 delta）。有关这些得分的更多信息，请参阅 [在模型评测作业中使用提示数据集和可用评估维度](clarify-foundation-model-evaluate-overview.md) 中的**文本摘要**部分。要运行文本摘要语义鲁棒性算法，请实例化一个 `SummarizationAccuracySemanticRobustnessConfig`，并传入一个 `perturbation_type`。

您可以为 `perturbation_type` 选择以下选项之一：
+ `Butterfinger`：根据键盘距离交换字符，模拟拼写错误的扰动。输入指定字符受到扰动的概率。`Butterfinger` 是 `perturbation_type` 的默认值。
+ `RandomUpperCase`：将部分字符改为大写的扰动。输入从 `0` 到 `1` 的小数。
+ `WhitespaceAddRemove`：输入在非空格字符前添加空格字符的概率。

您还可以指定以下参数：
+ `num_perturbations`：生成文本时每个样本的扰动次数。默认值为 `5`。
+ `butter_finger_perturbation_prob`：字符被扰动的概率。仅当 `perturbation_type` 为 `Butterfinger` 时使用。默认值为 `0.1`。
+ `random_uppercase_corrupt_proportion`：改为大写的字符数。仅当 `perturbation_type` 为 `RandomUpperCase` 时使用。默认值为 `0.1`。
+ `whitespace_add_prob`：给定空白区域，从样本中删除该区域的概率。仅当 `perturbation_type` 为 `WhitespaceAddRemove` 时使用。默认值为 `0.05`。
+ `whitespace_remove_prob`：给定一个非留白空格，在其前面添加一个留白空格的概率。仅当 `perturbation_type` 为 `WhitespaceAddRemove` 时使用，默认为 `0.1`。
+ `rouge_type`：将生成的摘要与参考摘要进行比较的指标。在对 `rouge_type` 进行评估时，指定要使用的 [https://en.wikipedia.org/wiki/ROUGE_(metric)](https://en.wikipedia.org/wiki/ROUGE_(metric)) 指标类型。您可以选择 `rouge1`、`rouge2` 或 `rougeL`。ROUGE-1 使用重叠单字词组（一个项目的序列，如“the”、“is”）比较生成的摘要和参考摘要。ROUGE-2 使用大词组（两个序列的组，如“the large”、“is home”）比较生成的摘要和参考摘要。ROUGE-L 比较最长的匹配词序列。有关 ROUGE 的更多信息，请参阅 [ROUGE：摘要自动评估软件包](https://aclanthology.org/W04-1013.pdf)。
+ 将 `user_stemmer_for_rouge` 设置为 `True` 或 `False`。词干识别器在对词语进行比较之前会去掉词语中的词缀。例如，词干识别器会去掉“swimming”和“swam”中的词缀，这样它们在词干识别后都是“swim”。
+ 将 `model_type_for_bertscore` 设为用于计算 [https://huggingface.co/spaces/evaluate-metric/bertscore](https://huggingface.co/spaces/evaluate-metric/bertscore) 的模型。您可以选择 [ROBERTA\_MODEL](https://huggingface.co/docs/transformers/model_doc/roberta) 或更高级的 [MICROSOFT\_DEBERTA\_MODEL](https://github.com/microsoft/DeBERTa)。

  如以下代码示例所示，调用 `evaluate` 方法并输入所需参数：

  ```
  from fmeval.eval import get_eval_algorithm
  from fmeval.eval_algorithms.summarization_accuracy_semantic_robustness import SummarizationAccuracySemanticRobustness, SummarizationAccuracySemanticRobustnessConfig
  
  eval_algo = SummarizationAccuracySemanticRobustness(SummarizationAccuracySemanticRobustnessConfig(perturbation_type="Butterfinger",num_perturbations=3,butter_finger_perturbation_prob=0.2)))
  eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
  ```

### 毒性
<a name="clarify-foundation-model-evaluate-auto-lib-eval-tox"></a>

您可以运行毒性算法进行开放式生成、文本摘要或问题解答。根据任务的不同，可分为三个不同的等级。
+ 对于开放式生成，可使用 `ToxicityConfig` 文件运行 Toxicity 算法。
+ 总结时使用 `Summarization_Toxicity` 类。
+ 对于问题解答，请使用 `QAToxicity` 类。

毒性算法会返回一个或多个 `EvalScore` 对象列表（取决于毒性检测器），其中包含 `0` 和 `1` 之间的得分。要运行毒性算法，请实例化一个 `ToxicityConfig`，并在 `model_type` 中传入一个毒性模型，用于评估您的模型。您可以为 `model_type` 选择以下选项：
+ [“detoxify” for UnitaryAI Detoxify-unbiased](https://github.com/unitaryai/detoxify)，是在 [Toxic Comment Classification Challenge](https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge) 和 [Jigsaw Unintended Bias in Toxicity Classification](https://www.kaggle.com/c/jigsaw-unintended-bias-in-toxicity-classification) 中训练的多标签文本分类器。该模型为以下类别提供 `7` 得分：毒性、严重毒性、淫秽、威胁、侮辱、性暴露和身份攻击。

  以下是排毒模型的输出示例：

  ```
  EvalScore(name='toxicity', value=0.01936926692724228),
  
  EvalScore(name='severe_toxicity', value=3.3755677577573806e-06),
  
  EvalScore(name='obscene', value=0.00022437423467636108),
  
  EvalScore(name='identity_attack', value=0.0006707844440825284),
  
  EvalScore(name='insult', value=0.005559926386922598),
  
  EvalScore(name='threat', value=0.00016682750720065087),
  
  EvalScore(name='sexual_explicit', value=4.828436431125738e-05)
  ```
+ [toxigen-Roberta 的 “toxigen”](https://github.com/microsoft/TOXIGEN)，这是一种BERTa基于二进制 Ro 的文本分类器，对 ToxiGen 数据集进行了微调，其中包含与少数群体有关的具有微妙和隐含毒性的句子。`13`

最后，如以下代码示例所示，调用 `evaluate` 方法并输入所需的参数。

```
from fmeval.eval import get_eval_algorithm
from fmeval.eval_algorithms.toxicity import Toxicity, ToxicityConfig

eval_algo = Toxicity(ToxicityConfig(model_type="detoxify"))
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$feature", save=True)
```