

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Amazon Personalize 產生個人化和重新排名的建議
<a name="generate-personalized-and-re-ranked-recommendations-using-amazon-personalize"></a>

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

## 總結
<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>

**先決條件**
+ 具有[引導式](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html) [AWS 雲端開發套件 (AWS CDK) 的作用中 AWS 帳戶](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/) 
+ 具有已設定登入資料的 [AWS Command Line Interface (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 或更新版本

## Architecture
<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 雲端開發套件 (AWS CDK)
+ AWS 命令列界面 (AWS CLI)
+ AWS Lambda
+ AWS Step Functions

**目標架構**

下圖說明將即時資料擷取至 Amazon Personalize 的管道。然後，管道會使用該資料為使用者產生個人化和重新排名的建議。

![\[Amazon Personalize 的資料擷取架構\]](http://docs.aws.amazon.com/zh_tw/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 雲端開發套件 (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您透過命令列 shell 中的命令與 AWS 服務互動。
+ [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 函數和其他 AWS 服務來建置業務關鍵應用程式。

**其他工具**
+ [pytest ](https://docs.pytest.org/en/7.2.x/index.html)是一種 Python 架構，用於撰寫小型且可讀取的測試。
+ [Python](https://www.python.org/) 是一種一般用途的電腦程式設計語言。

**Code**

此模式的程式碼可在 GitHub [Animal Recommender](https://github.com/aws-samples/personalize-pet-recommendations) 儲存庫中使用。您可以從此儲存庫使用 AWS CloudFormation 範本來部署範例解決方案的資源。

**注意**  
Amazon Personalize 解決方案版本、事件追蹤器和行銷活動由在原生 CloudFormation 資源上擴展的[自訂資源](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html) （基礎設施內） 提供支援。

## 史詩
<a name="generate-personalized-and-re-ranked-recommendations-using-amazon-personalize-epics"></a>

### 建立基礎設施
<a name="create-the-infrastructure"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立隔離的 Python 環境。 | **Mac/Linux 設定**[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-personalized-and-re-ranked-recommendations-using-amazon-personalize.html)**Windows 設定**若要手動建立虛擬環境，請從終端機執行 `% .venv\Scripts\activate.bat`命令。 | DevOps 工程師 | 
| 合成 CloudFormation 範本。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-personalized-and-re-ranked-recommendations-using-amazon-personalize.html)在步驟 2 中， `CDK_ENVIRONMENT` 是指 `config/{env}.yml` 檔案。 | DevOps 工程師 | 
| 部署資源並建立基礎設施。 | 若要部署解決方案資源，請從終端機執行 `./deploy.sh`命令。此命令會安裝所需的 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>
+ [Animal Recommender](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 Machine Learning 部落格）

## 其他資訊
<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`的 及其中繼資料。下列範例資料使用適用於 `animal_species_id`(1=貓，2=狗） 的 Oxford Pets 類別，以及適用於 `animal_age_id`和 的整數 1-5`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 函數會重新排序這些項目，然後傳回排序清單，其中包含項目 IDs 和來自 Amazon Personalize 的直接回應。這是項目所在的動物群組及其分數的排名清單。Amazon Personalize [使用使用者個人化](https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html)和[個人化排名](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` 欄位。