在Amazon Personalize中,根据用户上下文推荐和动态过滤物品
组织不断投资时间和精力开发智能推荐解决方案,为用户提供定制和相关的内容。目标可以有很多:改变用户体验,产生有意义的互动,推动内容消费。其中一些解决方案使用常见的机器学习(ML)模型,基于历史交互模式、用户人口属性、产品相似性和群体行为构建。除了这些属性,交互时的上下文(如天气、位置等)也可以影响用户在浏览内容时的决策。
在本文中,我们将展示如何使用用户当前的设备类型作为上下文,以增强您基于Amazon Personalize的推荐的有效性。此外,我们还将展示如何使用这样的上下文动态过滤推荐。尽管本文展示了Amazon Personalize如何用于视频点播(VOD)用例,但值得注意的是,Amazon Personalize可用于多个行业。
什么是Amazon Personalize?
Amazon Personalize使开发人员能够构建由Amazon.com使用的实时个性化推荐所使用的ML技术驱动的应用程序。Amazon Personalize能够提供各种个性化体验,包括特定产品推荐、个性化产品重新排序和定制直接营销。此外,作为一个完全托管的AI服务,Amazon Personalize通过ML加速客户的数字转型,使将个性化推荐集成到现有网站、应用程序、电子邮件营销系统等变得更加容易。
为什么上下文很重要?
使用用户的上下文元数据,如位置、时间、设备类型和天气,为现有用户提供个性化体验,帮助改善新用户或未识别用户的冷启动阶段。冷启动阶段指的是在该用户的历史信息缺失的情况下,推荐引擎提供非个性化推荐的时间段。在存在其他要求过滤和推广项目的情况下(比如新闻和天气),添加用户当前的上下文(季节或时间)有助于通过包含和排除推荐来提高准确性。
让我们以VOD平台向用户推荐节目、纪录片和电影为例。根据行为分析,我们知道VOD用户倾向于在移动设备上消费像情景喜剧这样的短片内容,而在电视或台式机上消费电影等长片内容。
解决方案概述
在考虑用户设备类型的示例基础上,我们展示了如何将此信息作为上下文提供,以便Amazon Personalize可以自动学习用户设备对其偏好内容的影响。
我们按照以下图示的架构模式进行展示,以说明上下文如何自动传递给Amazon Personalize。通过包含在请求中的Amazon CloudFront标头(例如在调用AWS Lambda函数检索推荐的Amazon API Gateway的REST API中),可以自动获取上下文。请参阅我们的GitHub存储库中提供的完整代码示例。我们提供了一个AWS CloudFormation模板来创建必要的资源。
在接下来的章节中,我们将逐步介绍如何设置样例架构模式的每个步骤。
选择一个配方
配方是为特定用例准备的Amazon Personalize算法。Amazon Personalize根据常见用例为训练模型提供配方。对于我们的用例,我们使用User-Personalization配方构建了一个简单的Amazon Personalize自定义推荐器。它根据交互数据集预测用户将与之互动的项目。此外,如果提供了项目和用户数据集,此配方还会使用这些数据集影响推荐结果。要了解有关此配方的工作原理的更多信息,请参阅User-Personalization配方。
创建并导入数据集
利用上下文需要在交互中指定上下文值,以便推荐器在训练模型时将上下文作为特征使用。我们还必须在推理时提供用户的当前上下文。交互模式(请参见下面的代码)定义了历史和实时用户对项目的交互数据的结构。USER_ID
、ITEM_ID
和TIMESTAMP
字段是Amazon Personalize对此数据集所必需的。DEVICE_TYPE
是一个我们为此示例添加的自定义分类字段,用于捕捉用户的当前上下文并将其包含在模型训练中。Amazon Personalize使用这个交互数据集来训练模型并创建推荐活动。
{
"type": "record",
"name": "互动",
"namespace": "com.amazonaws.personalize.schema",
"fields": [
{
"name": "用户ID",
"type": "字符串"
},
{
"name": "物品ID",
"type": "字符串"
},
{
"name": "设备类型",
"type": "字符串",
"categorical": true
},
{
"name": "时间戳",
"type": "长整型"
}
],
"version": "1.0"
}
同样地,物品模式(见下方代码)定义了产品和视频目录数据的结构。对于这个数据集,物品ID
是Amazon Personalize所必需的。 创建时间戳
是一个保留的列名,但不是必需的。 类型
和允许的国家
是我们为此示例添加的自定义字段,用于捕获视频的类型和允许播放视频的国家。Amazon Personalize使用这个物品数据集来训练模型并创建推荐活动。
{
"type": "record",
"name": "物品",
"namespace": "com.amazonaws.personalize.schema",
"fields": [
{
"name": "物品ID",
"type": "字符串"
},
{
"name": "类型",
"type": "字符串",
"categorical": true
},
{
"name": "允许的国家",
"type": "字符串",
"categorical": true
},
{
"name": "创建时间戳",
"type": "长整型"
}
],
"version": "1.0"
}
在我们的上下文中,历史数据指的是VOD平台上的视频和物品的终端用户交互历史。这些数据通常会被收集和存储在应用程序的数据库中。
为了演示目的,我们使用Python的Faker库生成一些测试数据,模拟与不同物品、用户和设备类型的交互数据,时间跨度为3个月。在定义了模式和输入交互文件位置之后,下一步是创建一个数据集组,将交互数据集包含在数据集组中,最后将训练数据导入数据集,如下面的代码片段所示:
create_dataset_group_response = personalize.create_dataset_group(
name = "personalize-auto-context-demo-dataset-group"
)
create_interactions_dataset_response = personalize.create_dataset(
name = "personalize-auto-context-demo-interactions-dataset",
datasetType = ‘INTERACTIONS’,
datasetGroupArn = interactions_dataset_group_arn,
schemaArn = interactions_schema_arn
)
create_interactions_dataset_import_job_response = personalize.create_dataset_import_job(
jobName = "personalize-auto-context-demo-dataset-import",
datasetArn = interactions_dataset_arn,
dataSource = {
"dataLocation": "s3://{}/{}".format(bucket, interactions_filename)
},
roleArn = role_arn
)
create_items_dataset_response = personalize.create_dataset(
name = "personalize-auto-context-demo-items-dataset",
datasetType = ‘ITEMS’,
datasetGroupArn = items_dataset_group_arn,
schemaArn = items_schema_arn
)
create_items_dataset_import_job_response = personalize.create_dataset_import_job(
jobName = "personalize-auto-context-demo-items-dataset-import",
datasetArn = items_dataset_arn,
dataSource = {
"dataLocation": "s3://{}/{}".format(bucket, items_filename)
},
roleArn = role_arn
)
收集历史数据并训练模型
在这一步中,我们定义了选择的配方(recipe),并创建了一个解决方案和解决方案版本,这些都是参考之前定义的数据集组。当您创建一个自定义解决方案时,您需要指定一个配方并配置训练参数。当您为解决方案创建一个解决方案版本时,Amazon Personalize会根据配方和训练配置来训练支持解决方案版本的模型。请参阅下面的代码:
recipe_arn = "arn:aws:personalize:::recipe/aws-user-personalization"
create_solution_response = personalize.create_solution(
name = "personalize-auto-context-demo-solution",
datasetGroupArn = dataset_group_arn,
recipeArn = recipe_arn
)
create_solution_version_response = personalize.create_solution_version(
solutionArn = solution_arn
)
创建一个活动终端点
在训练模型之后,您将其部署到一个活动中。活动会为您训练的模型创建和管理一个自动扩缩容的终端点,您可以使用该终端点通过GetRecommendations
API获取个性化推荐。在后续的步骤中,我们将使用此活动终端点自动将设备类型作为上下文参数传递,并接收个性化推荐。请参考以下代码:
create_campaign_response = personalize.create_campaign(
name = "personalize-auto-context-demo-campaign",
solutionVersionArn = solution_version_arn
)
创建一个动态过滤器
在从创建的活动中获取推荐时,您可以基于自定义条件对结果进行过滤。例如,为了满足仅推荐能够在用户当前所在国家播放的视频的要求,我们创建了一个过滤器。国家信息会从CloudFront的HTTP头动态传递。
create_filter_response = personalize.create_filter(
name = 'personalize-auto-context-demo-country-filter',
datasetGroupArn = dataset_group_arn,
filterExpression = 'INCLUDE ItemID WHERE Items.ALLOWED_COUNTRIES IN ($CONTEXT_COUNTRY)'
)
创建一个Lambda函数
我们架构中的下一步是创建一个Lambda函数,用于处理来自CloudFront分发的API请求,并通过调用Amazon Personalize活动终端点来响应。在此Lambda函数中,我们定义了分析以下CloudFront请求的HTTP头和查询字符串参数的逻辑,以确定用户的设备类型和用户ID:
CloudFront-Is-Desktop-Viewer
CloudFront-Is-Mobile-Viewer
CloudFront-Is-SmartTV-Viewer
CloudFront-Is-Tablet-Viewer
CloudFront-Viewer-Country
创建此函数的代码通过CloudFormation模板部署。
创建一个REST API
为了使Lambda函数和Amazon Personalize活动终端点对CloudFront分发可访问,我们创建了一个REST API终端点,并设置为Lambda代理。API Gateway提供了创建和文档化API的工具,用于将HTTP请求路由到Lambda函数。Lambda代理集成功能允许CloudFront调用一个Lambda函数,将请求抽象为对Amazon Personalize活动终端点的调用。创建此函数的代码通过CloudFormation模板部署。
创建一个CloudFront分发
在创建CloudFront分发时,由于这是一个演示设置,我们使用自定义缓存策略禁用缓存,确保每次请求都会发送到源。此外,我们使用一个源请求策略指定在源请求中所需的HTTP头和查询字符串参数。创建此函数的代码通过CloudFormation模板部署。
测试推荐
当从不同设备(如台式机、平板电脑、手机等)访问CloudFront分发的URL时,我们可以看到与其设备最相关的个性化视频推荐。此外,如果出现冷启动用户,将呈现针对用户设备定制的推荐。在以下示例输出中,视频的名称仅用于表示其类型和时长,以使其具有可关联性。
在以下代码中,一个已知的用户,根据过去的互动喜欢喜剧,从手机设备访问时会呈现较短的情景喜剧:
用户的推荐结果: 460
ITEM_ID 类型 允许的国家
380 喜剧 RU|GR|LT|NO|SZ|VN
540 情景喜剧 US|PK|NI|JM|IN|DK
860 喜剧 RU|GR|LT|NO|SZ|VN
600 喜剧 US|PK|NI|JM|IN|DK
580 喜剧 US|FI|CN|ES|HK|AE
900 讽刺 US|PK|NI|JM|IN|DK
720 情景喜剧 US|PK|NI|JM|IN|DK
以下是另一个已知用户,根据过去的互动,从智能电视设备访问时会呈现特色电影:
用户的推荐结果: 460
ITEM_ID 类型 允许的国家
780 浪漫 US|PK|NI|JM|IN|DK
100 恐怖 US|FI|CN|ES|HK|AE
400 动作 US|FI|CN|ES|HK|AE
660 恐怖 US|PK|NI|JM|IN|DK
720 恐怖 US|PK|NI|JM|IN|DK
820 悬疑 US|FI|CN|ES|HK|AE
520 悬疑 US|FI|CN|ES|HK|AE
一个从手机访问的冷(未知)用户将会看到更短但受欢迎的节目:
为用户推荐: 666
ITEM_ID 类型 允许的国家
940 讽刺 美国|芬兰|中国|西班牙|香港|阿联酋
760 讽刺 美国|芬兰|中国|西班牙|香港|阿联酋
160 情景喜剧 美国|芬兰|中国|西班牙|香港|阿联酋
880 喜剧 美国|芬兰|中国|西班牙|香港|阿联酋
360 讽刺 美国|巴基斯坦|尼加拉瓜|牙买加|印度|丹麦
840 讽刺 美国|巴基斯坦|尼加拉瓜|牙买加|印度|丹麦
420 讽刺 美国|巴基斯坦|尼加拉瓜|牙买加|印度|丹麦
一个从桌面访问的冷(未知)用户将会看到最佳科幻电影和纪录片:
为用户推荐: 666
ITEM_ID 类型 允许的国家
120 科幻 美国|巴基斯坦|尼加拉瓜|牙买加|印度|丹麦
160 科幻 美国|芬兰|中国|西班牙|香港|阿联酋
680 科幻 俄罗斯|希腊|立陶宛|挪威|瑞士|越南
640 科幻 美国|芬兰|中国|西班牙|香港|阿联酋
700 纪录片 美国|芬兰|中国|西班牙|香港|阿联酋
760 科幻 美国|芬兰|中国|西班牙|香港|阿联酋
360 纪录片 美国|巴基斯坦|尼加拉瓜|牙买加|印度|丹麦
以下从手机访问的已知用户根据位置(美国)返回筛选后的推荐:
为用户推荐: 460
ITEM_ID 类型 允许的国家
300 情景喜剧 美国|巴基斯坦|尼加拉瓜|牙买加|印度|丹麦
480 讽刺 美国|巴基斯坦|尼加拉瓜|牙买加|印度|丹麦
240 喜剧 美国|巴基斯坦|尼加拉瓜|牙买加|印度|丹麦
900 情景喜剧 美国|巴基斯坦|尼加拉瓜|牙买加|印度|丹麦
880 喜剧 美国|芬兰|中国|西班牙|香港|阿联酋
220 情景喜剧 美国|芬兰|中国|西班牙|香港|阿联酋
940 情景喜剧 美国|芬兰|中国|西班牙|香港|阿联酋
结论
在本文中,我们介绍了如何使用用户设备类型作为上下文数据,使您的推荐更加相关。使用上下文元数据来训练Amazon Personalize模型,将有助于向新用户和现有用户推荐相关产品,不仅仅是从配置文件数据中,还包括浏览设备平台的数据。不仅如此,像位置(国家、城市、地区、邮政编码)和时间(星期几、周末、工作日、季节)这样的上下文还为推荐相关性提供了机会。您可以使用我们在GitHub存储库中提供的CloudFormation模板运行完整的代码示例,并将笔记本克隆到Amazon SageMaker Studio中。