

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 Cloud Development Kit (AWS CDK) を使用したアクティブな「[AWS アカウント](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/)」
+ 認証情報が設定された「[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/ja_jp/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 データストリームからのレコードを処理し、レコード内のユーザーインタラクションを Amazon Personalize のイベントトラッカーに追加するための API コールを行います。

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) は、AWS クラウドインフラストラクチャをコードで定義してプロビジョニングするのに役立つソフトウェア開発フレームワークです。
+ 「[AWS コマンドラインインターフェイス (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して 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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 隔離された Python 環境を作成します。 | Mac/Linux セットアップ[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/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/ja_jp/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` を実行し、残りのインフラストラクチャを作成します。最初のモデルトレーニングはスタックの作成中に行われます。スタックの作成が完了するまでに、最大 2 時間かかることがあります。 | 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 関数にリクエストを送信します。ペイロードには、再ランク付けの対象となるすべてのアイテム ID の `userId` とそのメタデータが含まれます。以下のデータ例では、`animal_species_id` (1=猫、2=犬) には Oxford Pets クラスを使用し、`animal_age_id` および `animal_size_id` には 1 ～ 5 の整数を使用しています。

```
{
   "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 は、「[ユーザーパーソナライズ](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` フィールドは削除されます。