使用 Amazon Personalize 個人化產生個人化和重新排名的建議 - AWS 方案指引

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

使用 Amazon Personalize 個人化產生個人化和重新排名的建議

由梅森·卡希爾(AWS),馬修·沙塞(AWS)和塔約奧拉吉德(AWS)創建

代碼存儲庫:personalize-pet-recommendations

環境:PoC 或試點

技術:機器學習和 AI;雲端原生;基礎架構 DevOps;無伺服器

工作負載:開源

AWS 服務:AWS CloudFormation;Amazon Kinesis Data Firehose;AWS Lambda;Amazon Personalize;AWS Step Functions 數

Summary

此模式說明如何使用 Amazon Personalize 根據從這些使用者擷取的即時使用者互動資料,為您的使用者產生個人化的建議 (包括重新排名的建議)。此模式中使用的示例場景基於寵物收養網站,該網站根據用戶的互動(例如,用戶訪問的寵物)為其用戶生成建議。透過遵循範例案例,您將學習如何使用 Amazon Kinesis Data Streams 擷取互動資料,AWS Lambda 產生建議並重新排名建議,以及使用 Amazon 資料 Firehose 將資料存放在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中。您也會學習如何使用 AWS Step Functions 建立可管理解決方案版本 (也就是訓練有素的模型) 的狀態機器,以產生您的建議。

先決條件和限制

先決條件

產品版本

  • Python 3.9

  • AWS CDK 2.23.0 或更新版本

  • AWS CLI 2.7.27 或更新版本

架構

技術堆疊

  • Amazon 數據 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 的資料擷取架構

該圖顯示以下工作流程:

  1. Kinesis Data Streams 會擷取即時使用者資料 (例如,造訪過的寵物等事件),以供 Lambda 和 Firehose 處理。

  2. Lambda 函數會處理 Kinesis Data Streams 中的記錄,並進行 API 呼叫,將記錄中的使用者互動新增至 Amazon Personalize 中的事件追蹤器。

  3. 以時間為基礎的規則會叫用 Step Functions 狀態機器,並使用 Amazon Personalize 中事件追蹤器中的事件,為建議和重新排名模型產生新的解決方案版本。

  4. 狀態機器會更新 Amazon Personalize 行銷活動,以使用新的解決方案版本

  5. Lambda 透過呼叫 Amazon Personalize 重新排名行銷活動,重新排名推薦項目清單。

  6. Lambda 會呼叫 Amazon Personalize 建議行銷活動,擷取建議項目的清單。

  7. Firehose 會將事件儲存到 S3 儲存貯體,在該儲存貯體中可做為歷史資料存取。

工具

AWS 工具

  • AWS Cloud Development Kit (AWS CDK) 是一種軟體開發架構,可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。

  • AWS Command Line Interface (AWS CLI) (AWS CLI) 是一種開放原始碼工具,可協助您透過命令列殼層中的命令與 AWS 服務互動。

  • Amazon 資料 Firehose 可協助您將即時串流資料交付到其他 AWS 服務、自訂 HTTP 端點和受支援的第三方服務供應商擁有的 HTTP 端點。

  • Amazon Kinesis Data Streams 可協助您即時收集和處理大型資料串流。

  • AWS Lambda 是一種運算服務,可協助您執行程式碼,而不需要佈建或管理伺服器。它只會在需要時執行程式碼並自動調整規模,因此您只需為使用的運算時間付費。

  • Amazon Personalize 是全受管的機器學習 (ML) 服務,可協助您根據資料為使用者產生項目建議。

  • AWS Step Functions 是一種無伺服器協調服務,可協助您結合 Lambda 函數和其他 AWS 服務,以建立關鍵業務應用程式。

其他工具

  • pytest 是一個用於編寫小型可讀測試的 Python 框架。

  • Python 是一種通用的計算機編程語言。

Code

此模式的代碼可在 GitHub 動物推薦程序存儲庫中找到。您可以使用此儲存庫中的 AWS CloudFormation 範本部署範例解決方案的資源。

注意:Amazon Personalize 解決方案版本、事件追蹤器和行銷活動由可擴充原生 CloudFormation 資源的自訂資源 (在基礎設施內) 提供支援。

史诗

任務描述所需技能

創建一個獨立的 Python 環境。

Mac 電腦設定

  1. 若要手動建立虛擬環境,請從終端機執行$ python3 -m venv .venv指令。

  2. 初始化過程完成後,運行$ source .venv/bin/activate命令以激活虛擬環境。

視窗設定

若要手動建立虛擬環境,請從終端機執行% .venv\Scripts\activate.bat指令。

DevOps 工程師

合成 CloudFormation 模板。

  1. 要安裝所需的依賴關係,請從終端運行$ pip install -r requirements.txt命令。

  2. 在 AWS CLI 中,設定下列環境變數:

    • export ACCOUNT_ID=123456789

    • export CDK_DEPLOY_REGION=us-east-1

    • export CDK_ENVIRONMENT=dev

  3. config/{env}.yml檔案中,更新vpcId以符合您的虛擬私有雲 (VPC) ID。

  4. 若要合成此程式碼的 CloudFormation 範本,請執行命$ cdk synth令。

注意:在步驟 2 中,CDK_ENVIRONMENT指的是config/{env}.yml文件。

DevOps 工程師

部署資源並建立基礎結構。

若要部署解決方案資源,請從終端機執行./deploy.sh命令。

這個命令會安裝所需的 Python 相依性。Python 指令碼會建立 S3 儲存貯體和 AWS Key Management Service (AWS KMS) 金鑰,然後新增初始模型建立的種子資料。最後,指令碼會執行cdk deploy以建立剩餘的基礎結構。

注意:初始模型訓練會在堆疊建立期間進行。堆疊最多可能需要兩個小時才能完成建立。

DevOps 工程師

相關資源

其他資訊

有效載荷和回應範例

推薦 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 函數提交請求。裝載包含要重新排名userId的所有項目 ID 及其中繼資料。下面的示例數據使用牛津寵物類animal_species_id(1 = 貓,2 = 狗)和整數 1-5 用於和:animal_age_idanimal_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 函數會重新排列這些項目,然後傳回包含項目 ID 和 Amazon Personalize 直接回應的訂購清單。這是物品所在的動物群體和分數的排名列表。Amazon Personalize 使用使用者個人化和個人化排名配方,在建議中包含每個項目的分數。這些分數代表 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欄位。