

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

# 使用 Amazon Personalize 生成个性化和重新排名的推荐
<a name="generate-personalized-and-re-ranked-recommendations-using-amazon-personalize"></a>

*Mason Cahill、Matthew Chasse 和 Tayo Olajide，Amazon Web Services*

## Summary
<a name="generate-personalized-and-re-ranked-recommendations-using-amazon-personalize-summary"></a>

此模式向您展示如何使用 Amazon Personalize 根据从这些用户那里摄取的实时用户互动数据，为用户生成个性化推荐（包括重新排名的推荐）。此模式中使用的示例场景基于宠物收养网站，该网站根据用户的互动（例如，用户访问的宠物）为其用户生成推荐。通过遵循示例场景，您将学习使用 Amazon Kinesis Data Streams 摄取互动数据，使用 AWS Lambda 生成建议并对建议进行重新排名，以及使用 Amazon Data Firehose 将数据存储在 Amazon Simple Storage Service（Amazon S3）存储桶中。您还将学习使用 AWS Step Functions 来构建状态机以管理生成推荐的解决方案版本（即经过训练的模型）。

## 先决条件和限制
<a name="generate-personalized-and-re-ranked-recommendations-using-amazon-personalize-prereqs"></a>

**先决条件**
+ 一个有效的 [Amazon Web Services account](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/)，其中包含已[引导的](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html) AWS Cloud Development Kit（AWS CDK）
+ [AWS 命令行界面（AWS CLI）](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)，带有配置的凭证
+ [Python 3.9](https://www.python.org/downloads/release/python-390/)

**产品版本**
+ Python 3.9
+ AWS CDK 2.23.0 或更高版本
+ AWS CLI 2.7.27 或更高版本

## 架构
<a name="generate-personalized-and-re-ranked-recommendations-using-amazon-personalize-architecture"></a>

**技术堆栈**
+ Amazon Data Firehose
+ Amazon Kinesis Data Streams
+ Amazon Personalize
+ Amazon Simple Storage Service（Amazon S3）
+ AWS Cloud Development Kit (AWS CDK)
+ AWS 命令行界面（AWS CLI）
+ AWS Lambda
+ AWS Step Functions

**目标架构**

下图说明了将实时数据摄取到 Amazon Personalize 的管线。然后，该管线使用这些数据为用户生成个性化和重新排名的推荐。

![Amazon Personalize 的数据摄取架构](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/42eb193b-2347-408a-8b25-46beeb3b29ca/images/786dbd56-7d7f-41bb-90f6-d4485d73fe15.png)


下图显示了如下工作流：

1. Kinesis Data Streams 摄取实时用户数据（例如，访问过的宠物等事件），由 Lambda 和 Firehose 处理。

1. Lambda 函数处理来自 Kinesis Data Streams 的记录，并发出 API 调用，将记录中的用户互动添加到 Amazon Personalize 中的事件跟踪器中。

1. 基于时间的规则调用 Step Functions 状态机，并使用 Amazon Personalize 中事件跟踪器中的事件为推荐和重新排名模型生成新的解决方案版本。

1. Amazon Personalize [活动](https://docs.aws.amazon.com/personalize/latest/dg/campaigns.html)由状态机更新，以使用新的[解决方案版本](https://docs.aws.amazon.com/personalize/latest/dg/creating-a-solution-version.html)。

1. Lambda 通过调用 Amazon Personalize 重新排名活动对推荐项目列表进行重新排名。

1. Lambda 通过调用 Amazon Personalize 推荐活动对推荐项目列表进行检索。

1. Firehose 将事件保存到 S3 存储桶中，在存储桶中将其作为历史数据进行访问。

## 工具
<a name="generate-personalized-and-re-ranked-recommendations-using-amazon-personalize-tools"></a>

**AWS 工具**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一个软件开发框架，可帮助您在代码中定义并预置 Amazon Web Services Cloud 基础设施。
+ [AWS 命令行界面（AWS CLI）](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)是一种开源工具，它可帮助您通过命令行 Shell 中的命令与 Amazon Web Services 交互。
+ [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html) 可帮助您将实时[流数据](https://aws.amazon.com/streaming-data/)传输到其他 AWS 服务、自定义 HTTP 端点以及受支持的第三方服务提供商拥有的 HTTP 端点。
+ [Amazon Kinesis Data Streams](https://docs.aws.amazon.com/streams/latest/dev/introduction.html) 可帮助您实时收集和处理大型数据记录流。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，而无需预置或管理服务器。它仅在需要时运行您的代码，并且能自动扩缩，因此您只需为使用的计算时间付费。
+ [Amazon Personalize](https://docs.aws.amazon.com/personalize/latest/dg/what-is-personalize.html) 是一项完全托管的机器学习（ML）服务，可帮助您根据数据为用户生成项目推荐。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 是一项无服务器编排服务，可帮助您搭配使用 Lambda 函数和其他 Amazon Web Services 来构建业务关键型应用程序。

**其他工具**
+ [pytest](https://docs.pytest.org/en/7.2.x/index.html) 是一个 Python 框架，用于编写可读的小型测试。
+ [Python](https://www.python.org/) 是通用的计算机编程语言。

**代码**

此模式的代码可在 GitHub [Animal Recormerder](https://github.com/aws-samples/personalize-pet-recommendations) 存储库中找到。您可以使用此存储库 CloudFormation 中的 AWS 模板来部署示例解决方案的资源。

**注意**  
Amazon Personalize 解决方案版本、事件跟踪器和活动由基于原生[资源的自定义资源](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html)（在基础设施内） CloudFormation 提供支持。

## 操作说明
<a name="generate-personalized-and-re-ranked-recommendations-using-amazon-personalize-epics"></a>

### 创建基础设施
<a name="create-the-infrastructure"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个隔离的 Python 环境。 | **Mac/Linux 安装程序**[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/generate-personalized-and-re-ranked-recommendations-using-amazon-personalize.html)<br />**Windows 设置**<br />要手动创建虚拟环境，请从终端运行该 `% .venv\Scripts\activate.bat` 命令。 | DevOps 工程师 | 
| 合成 CloudFormation 模板。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/generate-personalized-and-re-ranked-recommendations-using-amazon-personalize.html)在步骤 2 中，`CDK_ENVIRONMENT` 引用 `config/{env}.yml` 文件。 | DevOps 工程师 | 
| 部署资源并创建基础设施。 | 要部署解决方案资源，请从终端运行该 `./deploy.sh` 命令。<br />此命令安装所有必需的 Python 依赖项。Python 脚本创建 S3 存储桶和 AWS Key Management Service（AWS KMS）密钥，然后添加用于创建初始模型的种子数据。最后，该脚本运行 `cdk deploy` 以创建剩余的基础设施。初始模型训练发生在堆栈创建期间。堆栈最长可能需要两个小时才能完成创建。 | DevOps 工程师 | 

## 相关资源
<a name="generate-personalized-and-re-ranked-recommendations-using-amazon-personalize-resources"></a>
+ [动物推荐者](https://github.com/aws-samples/personalize-pet-recommendations) () GitHub
+ [AWS CDK 参考文档](https://docs.aws.amazon.com/cdk/api/v2/)
+ [Boto3 文档](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)
+ [使用 Amazon Personalize 针对您选择的业务指标优化个性化推荐](https://aws.amazon.com/blogs/machine-learning/optimize-personalized-recommendations-for-a-business-metric-of-your-choice-with-amazon-personalize/)（AWS 机器学习博客）

## 附加信息
<a name="generate-personalized-and-re-ranked-recommendations-using-amazon-personalize-additional"></a>

**有效负载和响应示例**

*推荐 Lambda 函数*

要检索推荐，请使用以下格式的有效负载向推荐 Lambda 函数提交请求：

```
{
  "userId": "3578196281679609099",
  "limit": 6
}
```

以下示例响应包含动物组列表：

```
[{"id": "1-domestic short hair-1-1"},
{"id": "1-domestic short hair-3-3"},
{"id": "1-domestic short hair-3-2"},
{"id": "1-domestic short hair-1-2"},
{"id": "1-domestic short hair-3-1"},
{"id": "2-beagle-3-3"},
```

如果省略该 `userId` 字段，则该函数将返回一般建议。

*重新排名 Lambda 函数*

要使用重新排名，请向重新排名 Lambda 函数提交请求。有效载荷包含所有 IDs 要重新排名的项目及其元数据。`userId`以下示例数据使用 Oxford Pets 类表示 `animal_species_id`（1=猫，2=狗），使用整数 1-5 表示 `animal_age_id` 和 `animal_size_id`：

```
{
   "userId":"12345",
   "itemMetadataList":[
      {
         "itemId":"1",
         "animalMetadata":{
            "animal_species_id":"2",
            "animal_primary_breed_id":"Saint_Bernard",
            "animal_size_id":"3",
            "animal_age_id":"2"
         }
      },
      {
         "itemId":"2",
         "animalMetadata":{
            "animal_species_id":"1",
            "animal_primary_breed_id":"Egyptian_Mau",
            "animal_size_id":"1",
            "animal_age_id":"1"
         }
      },
      {
         "itemId":"3",
         "animalMetadata":{
            "animal_species_id":"2",
            "animal_primary_breed_id":"Saint_Bernard",
            "animal_size_id":"3",
            "animal_age_id":"2"
         }
      }
   ]
}
```

Lambda 函数对这些商品进行重新排名，然后返回包含该商品和来自 Amazon Personalize 的直接回复的排序列表。 IDs 这是项目所属动物群及其分数的排名列表。Amazon Personalize 使用 [User-Personalization](https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html) 和 [Personalized-Ranking](https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-search.html) 食谱，在推荐中包含每件项目的分数。这些分数表示 Amazon Personalize 对于用户接下来将选择哪个项目的相对确定性。分数越高，意味着确定性越大。

```
{
   "ranking":[
      "1",
      "3",
      "2"
   ],
   "personalizeResponse":{
      "ResponseMetadata":{
         "RequestId":"a2ec0417-9dcd-4986-8341-a3b3d26cd694",
         "HTTPStatusCode":200,
         "HTTPHeaders":{
            "date":"Thu, 16 Jun 2022 22:23:33 GMT",
            "content-type":"application/json",
            "content-length":"243",
            "connection":"keep-alive",
            "x-amzn-requestid":"a2ec0417-9dcd-4986-8341-a3b3d26cd694"
         },
         "RetryAttempts":0
      },
      "personalizedRanking":[
         {
            "itemId":"2-Saint_Bernard-3-2",
            "score":0.8947961
         },
         {
            "itemId":"1-Siamese-1-1",
            "score":0.105204
         }
      ],
      "recommendationId":"RID-d97c7a87-bd4e-47b5-a89b-ac1d19386aec"
   }
}
```

*Amazon Kinesis 有效负载*

发送到 Amazon Kinesis 的有效负载采用以下格式：

```
{
    "Partitionkey": "randomstring",
    "Data": {
        "userId": "12345",
        "sessionId": "sessionId4545454",
        "eventType": "DetailView",
        "animalMetadata": {
            "animal_species_id": "1",
            "animal_primary_breed_id": "Russian_Blue",
            "animal_size_id": "1",
            "animal_age_id": "2"
        },
        "animal_id": "98765"
        
    }
}
```

**注意**  
对于未经身份验证的用户，将删除 `userId` 字段。