

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

# 创建自定义工作人员任务模板
<a name="sms-custom-templates-step2"></a>

要创建自定义标注作业，您需要更新工作人员任务模板，将清单文件中的输入数据映射到模板中使用的变量，并将输出数据映射到 Amazon S3。要了解有关使用 Liquid 自动化的高级功能的更多信息，请参阅 [使用 Liquid 添加自动化](sms-custom-templates-step2-automate.md)。

以下各节将介绍每个必要步骤。

## 工作人员任务模板
<a name="sms-custom-templates-step2-template"></a>

*工作人员任务模板*是 Ground Truth 用来自定义工作人员用户界面 (UI) 的文件。你可以使用 HTML、CSS、、Li [quid 模板语言](https://shopify.github.io/liquid/)和 C [rowd HTML](https://docs.aws.amazon.com/sagemaker/latest/dg/sms-ui-template-reference.html) Elements 创建工作任务模板。 JavaScriptLiquid 用于自动化模板。Crowd HTML 元素用于包含常用注释工具，并提供向 Ground Truth 提交的逻辑。

使用以下主题了解如何创建工作人员任务模板。你可以在上看到一个包含示例 Ground Truth 工作人员任务模板的存储库[GitHub](https://github.com/aws-samples/amazon-sagemaker-ground-truth-task-uis)。

### 在 SageMaker AI 控制台中使用基础工作人员任务模板
<a name="sms-custom-templates-step2-base"></a>

您可以使用 Ground Truth 控制台中的模板编辑器开始创建模板。此编辑器包含大量预先设计好的基本模板。它支持自动填充 HTML 和 Crowd HTML 元素代码。

**要访问 Ground Truth 自定义模板编辑器，请执行以下操作：**

1. 按照 [创建标注作业（控制台）](sms-create-labeling-job-console.md) 中的说明进行操作。

1. 然后为标注作业的**任务类型**选择**自定义**。

1. 选择**下一步**后，然后您可以访问**自定义标注任务设置**部分的模板编辑器和基本模板。

1. （可选）从**模板**下的下拉菜单中选择一个基本模板。如果您想从头开始创建模板，请从下拉菜单中选择**自定义**，以获得最小的模板框架。

下面将介绍如何在本地可视化管理控制台中开发的模板。

#### 在本地可视化工作人员任务模板
<a name="sms-custom-template-step2-UI-local"></a>

您必须使用管理控制台测试模板如何处理传入数据。要测试模板 HTML 和自定义元素的外观，您可以使用浏览器。

**注意**  
不会解析变量。在本地查看内容时，您可能需要用样本内容替换它们。

下面的代码片段示例加载了呈现自定义 HTML 元素所需的代码。如果您希望在首选编辑器而非在控制台中开发您模板的外观，则使用此方法。

**Example**  

```
<script src="https://assets.crowd.aws/crowd-html-elements.js"></script>
```

### 创建简单的 HTML 任务示例
<a name="sms-custom-templates-step2-sample"></a>

现在您已经有了基本工作人员任务模板，您可以使用本主题创建一个简单的基于 HTML 的任务模板。

下面是输入清单文件中的一个条目示例。

```
{
  "source": "This train is really late.",
  "labels": [ "angry" , "sad", "happy" , "inconclusive" ],
  "header": "What emotion is the speaker feeling?"
}
```

在 HTML 任务模板中，我们需要将输入清单文件中的变量映射到模板中。示例输入清单中的变量将使用以下语法 **task.input.source**、**task.input.labels** 和 **task.input.header** 映射。

下面是一个用于推文分析的 HTML 工作人员任务模板简单示例。所有任务都以 `<crowd-form> </crowd-form>` 元素开始和结束。与标准 HTML `<form>` 元素类似，所有格式代码都应位于它们之间。Ground Truth 会根据模板中指定的上下文直接生成工作人员的任务，除非您实现了预注释 Lambda。Ground Truth 或 [注释前 Lambda](sms-custom-templates-step3-lambda-requirements.md#sms-custom-templates-step3-prelambda) 返回的 `taskInput` 对象就是模板中的 `task.input` 对象。

对于简单的推文分析任务，请使用 `<crowd-classifier>` 元素。它需要以下属性：
+ *名称* - 输出变量的名称。工作人员注释会保存到输出清单中的此变量名称中。
+ *类别* - JSON 格式的一系列可能的答案。
+ *标题* - 用于注释工具的标题

`<crowd-classifier>` 元素至少需要以下三个子元素。
+ *<classification-target>* - 工作人员将根据在上面 `categories` 属性中指定的选项进行分类的文本。
+ *<full-instructions>* - 工具中的“查看完整说明”链接中提供的说明。这可以留空，但建议您提供适当的说明来获得更好的结果。
+ *<short-instructions>* - 对于工具栏边栏中显示的任务的更简要说明。这可以留空，但建议您提供适当的说明来获得更好的结果。

此工具的简单版本如下。变量 **\$1\$1 task.input.source \$1\$1** 用于指定输入清单文件中的源数据。**\$1\$1 task.input.labels \$1 to\$1json \$1\$1** 是将数组转换为 JSON 表示法的变量筛选条件示例。`categories` 属性必须是 JSON。

**Example 在输入清单 json 样本中使用 `crowd-classifier`**  

```
<script src="https://assets.crowd.aws/crowd-html-elements.js"></script>
<crowd-form>
  <crowd-classifier
    name="tweetFeeling"
    categories="='{{ task.input.labels | to_json }}'"
    header="{{ task.input.header }}'"
  >
     <classification-target>
       {{ task.input.source }}
     </classification-target>

    <full-instructions header="Sentiment Analysis Instructions">
      Try to determine the sentiment the author
      of the tweet is trying to express.
      If none seem to match, choose "cannot determine."
    </full-instructions>

    <short-instructions>
      Pick the term that best describes the sentiment of the tweet.
    </short-instructions>

  </crowd-classifier>
</crowd-form>
```

您可以在 Ground Truth 标注作业创建工作流程中将代码复制并粘贴到编辑器中以预览该工具，或者试用[此代码的演示 CodePen。](https://codepen.io/MTGT/full/OqBvJw)

 [https://codepen.io/MTGT/full/OqBvJw](https://codepen.io/MTGT/full/OqBvJw) 

## 输入数据、外部资产和任务模板
<a name="sms-custom-templates-step2-template-input"></a>

以下各节将介绍外部资产的使用、输入数据格式要求以及何时考虑使用预注释 Lambda 函数。

### 输入数据格式要求
<a name="sms-custom-template-input-manifest"></a>

当您创建输入清单文件用于自定义 Ground Truth 标注作业时，必须将数据存储在 Amazon S3 中。输入清单文件还必须与运行自定义 Ground Truth 标签作业的位置相同 AWS 区域 。此外，它还可以存储在任何 Amazon S3 存储桶中，只要您在 Ground Truth 中运行自定义标注作业时使用的 IAM 服务角色可以访问这些存储桶。

输入清单文件必须使用换行符分隔的 JSON 或 JSON 行格式。每行都以标准换行符 **\$1n** 或 **\$1r\$1n** 分隔。每行也必须是有效的 JSON 对象。

此外，清单文件中的每个 JSON 对象都必须包含以下键之一：`source-ref` 或 `source`。键值的解释如下：
+ `source-ref` – 对象的来源是值中指定的 Amazon S3 对象。当对象是二进制对象（如图像）时，使用此值。
+ `source` – 对象的来源是值。当对象是文本值时，使用此值。

要了解有关格式化输入清单文件的更多信息，请参阅 [输入清单文件](sms-input-data-input-manifest.md)。

### 注释前 Lambda 函数
<a name="sms-custom-template-input-lambda"></a>

您可以选择指定一个*注释前 Lambda* 函数，以管理如何在标注前处理输入清单文件中的数据。如果您指定了 `isHumanAnnotationRequired` 键值对，则必须使用注释前 Lambda 函数。当 Ground Truth 向注释前 Lambda 函数发送一个 JSON 格式请求时，会使用以下架构。

**Example 以 `source-ref` 键值对标识的数据对象**  

```
{
  "version": "2018-10-16",
  "labelingJobArn": arn:aws:lambda:us-west-2:555555555555:function:my-function
  "dataObject" : {
    "source-ref": s3://input-data-bucket/data-object-file-name
  }
}
```

**Example 以 `source` 键值对标识的数据对象**  

```
{
      "version": "2018-10-16",
      "labelingJobArn" : arn:aws:lambda:us-west-2:555555555555:function:my-function
      "dataObject" : {
        "source": Sue purchased 10 shares of the stock on April 10th, 2020
      }
    }
```

下面是使用 `isHumanAnnotationRequired` 时 Lambda 函数的预期响应。

```
{
  "taskInput": {
    "source": "This train is really late.",
    "labels": [ "angry" , "sad" , "happy" , "inconclusive" ],
    "header": "What emotion is the speaker feeling?"
  },
  "isHumanAnnotationRequired": False
}
```

### 使用外部资产
<a name="sms-custom-template-step2-UI-external"></a>

Amazon G SageMaker round Truth 自定义模板允许嵌入外部脚本和样式表。例如，下面的代码块演示了如何将位于 `https://www.example.com/my-enhancement-styles.css` 的样式表添加到模板中。

**Example**  

```
<script src="https://www.example.com/my-enhancment-script.js"></script>
<link rel="stylesheet" type="text/css" href="https://www.example.com/my-enhancement-styles.css">
```

如果您遇到错误，请确保您的原始服务器随资产一起发送正确的 MIME 类型和编码标头。

例如，对于远程脚本，MIME 和编码类型为 `application/javascript;CHARSET=UTF-8`。

对于远程样式表，MIME 和编码类型为 `text/css;CHARSET=UTF-8`。

## 输出数据和任务模板
<a name="sms-custom-templates-step2-template-output"></a>

以下各节将介绍自定义标注作业的输出数据，以及何时考虑使用注释后 Lambda 函数。

### 输出数据
<a name="sms-custom-templates-data"></a>

自定义标注作业完成后，数据将保存在创建标注作业时指定的 Amazon S3 存储桶中。数据保存在 `output.manifest` 文件中。

**注意**  
*labelAttributeName*是一个占位符变量。在输出中，它要么是标注作业的名称，要么是您在创建标注作业时指定的标签属性名称。
+ `source` 或 `source-ref`：要求工作人员标注的字符串或 S3 URI。
+ `labelAttributeName`：包含[注释后 Lambda 函数](sms-custom-templates-step3-lambda-requirements.md#sms-custom-templates-step3-postlambda)中的合并标签内容的字典。如果未指定注释后 Lambda 函数，则此字典将为空。
+ `labelAttributeName-metadata`：由 Ground Truth 添加的自定义标注作业中的元数据。
+ `worker-response-ref`：保存数据的存储桶的 S3 URI。如果指定了注释后 Lambda 函数，则不会出现此键值对。

在此示例中，JSON 对象设置为便于阅读的格式；在实际输出文件中，JSON 对象位于单行上。

```
{
  "source" : "This train is really late.",
  "labelAttributeName" : {},
  "labelAttributeName-metadata": { # These key values pairs are added by Ground Truth
    "job_name": "test-labeling-job",
    "type": "groundTruth/custom",
    "human-annotated": "yes",
    "creation_date": "2021-03-08T23:06:49.111000",
    "worker-response-ref": "s3://amzn-s3-demo-bucket/test-labeling-job/annotations/worker-response/iteration-1/0/2021-03-08_23:06:49.json"
  }
}
```

### 使用注释后 Lambda 来整合工作人员的结果
<a name="sms-custom-templates-consolidation"></a>

默认情况下，Ground Truth 会将未处理的工作人员响应保存在 Amazon S3 中。要对响应的处理方式进行更精细的控制，您可以指定一个*注释后 Lambda 函数*。例如，如果多个工作人员对同一数据对象进行了标注，则可以使用注释后 Lambda 函数来合并注释。要了解有关创建注释后 Lambda 函数的更多信息，请参阅 [注释后 Lambda](sms-custom-templates-step3-lambda-requirements.md#sms-custom-templates-step3-postlambda)。

如果您要使用注释后 Lambda 函数，则必须在 `CreateLabelingJob` 请求中将其指定为 [https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AnnotationConsolidationConfig.html](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AnnotationConsolidationConfig.html) 的一部分。

要了解有注释合并工作原理的更多信息，请参阅 [注释整合](sms-annotation-consolidation.md)。