本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Amazon Personalize 產生個人化和重新排名的建議
Mason Cahill、Matthew Chasse 和 Tayo Olajide,Amazon Web Services
Summary
此模式說明如何使用 Amazon Personalize,根據從這些使用者擷取的即時使用者互動資料,為您的使用者產生個人化建議,包括重新排名的建議。此模式中使用的範例案例是以寵物採用網站為基礎,該網站會根據其互動為其使用者產生建議 (例如,使用者造訪哪些寵物)。透過遵循範例案例,您將學習如何使用 Amazon Kinesis Data Streams 擷取互動資料、AWS Lambda 產生建議並重新排名建議,以及 Amazon Data Firehose 將資料存放在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中。您也會學習使用 AWS Step Functions 來建置狀態機器,以管理產生建議的解決方案版本 (即經過訓練的模型)。
先決條件和限制
先決條件
產品版本
- Python 3.9 
- AWS CDK 2.23.0 或更新版本 
- AWS CLI 2.7.27 或更新版本 
架構
技術堆疊
- 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 的管道。然後,管道會使用該資料為使用者產生個人化和重新排名的建議。

該圖顯示以下工作流程:
- Kinesis Data Streams 會擷取即時使用者資料 (例如,造訪寵物等事件),以供 Lambda 和 Firehose 處理。 
- Lambda 函數會處理來自 Kinesis Data Streams 的記錄,並發出 API 呼叫,將記錄中的使用者互動新增至 Amazon Personalize 中的事件追蹤器。 
- 以時間為基礎的規則會叫用 Step Functions 狀態機器,並使用 Amazon Personalize 中事件追蹤器的事件,為建議產生新的解決方案版本,並重新排序模型。 
- Lambda 透過呼叫 Amazon Personalize 重新排名行銷活動來重新排名建議項目清單。 
- Lambda 會透過呼叫 Amazon Personalize 建議行銷活動來擷取建議項目的清單。 
- Firehose 會將事件儲存到 S3 儲存貯體,以做為歷史資料存取。 
工具
AWS 工具
- AWS 雲端開發套件 (AWS CDK) 是一種軟體開發架構,可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。 
- AWS Command Line Interface (AWS CLI) 是一種開放原始碼工具,可協助您透過命令列 shell 中的命令與 AWS 服務互動。 
- Amazon Data Firehose 可協助您將即時串流資料 - 交付至其他 AWS 服務、自訂 HTTP 端點,以及受支援的第三方服務供應商所擁有的 HTTP 端點。 
- Amazon Kinesis Data Streams 可協助您即時收集和處理大型資料記錄串流。 
- AWS Lambda 是一種運算服務,可協助您執行程式碼,而無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需按使用的運算時間付費。 
- Amazon Personalize 是一項全受管機器學習 (ML) 服務,可協助您根據您的資料為使用者產生項目建議。 
- AWS Step Functions 是一種無伺服器協同運作服務,可協助您結合 Lambda 函數和其他 AWS 服務來建置業務關鍵應用程式。 
其他工具
Code
此模式的程式碼可在 GitHub Animal Recommender
注意
Amazon Personalize 解決方案版本、事件追蹤器和行銷活動由在原生 CloudFormation 資源上擴展的自訂資源 (基礎設施內) 提供支援。
史詩
| 任務 | 描述 | 所需的技能 | 
|---|---|---|
| 建立隔離的 Python 環境。 | Mac/Linux 設定 
 Windows 設定 若要手動建立虛擬環境,請從終端機執行  | DevOps 工程師 | 
| 合成 CloudFormation 範本。 | 
 注意在步驟 2 中,  | DevOps 工程師 | 
| 部署資源並建立基礎設施。 | 若要部署解決方案資源,請從終端機執行  此命令會安裝所需的 Python 相依性。Python 指令碼會建立 S3 儲存貯體和 AWS Key Management Service (AWS KMS) 金鑰,然後新增初始模型建立的種子資料。最後,指令碼會執行  注意初始模型訓練會在堆疊建立期間進行。堆疊最多可能需要兩個小時才能完成建立。 | DevOps 工程師 | 
相關資源
- Animal Recommender - (GitHub) 
- 使用 Amazon Personalize 最佳化您選擇的業務指標的個人化建議 - (AWS Machine Learning 部落格) 
其他資訊
範例承載和回應
建議 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 函數。承載包含要重新排名的所有項目 IDsuserId的 及其中繼資料。下列範例資料使用 animal_species_id(1=cat, 2=dog) 的 Oxford Pets 類別,以及 animal_age_id和 的整數 1-5animal_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 使用使用者個人化和個人化排名配方,在建議中包含每個項目的分數。這些分數代表 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 欄位。