使用Google Cloud构建推荐系统

使用Google Cloud Recommendation AI实现高级推荐系统

source pixabay

想象一下,Google的机器学习工程师正在为您实现网站和应用程序上的推荐系统。使用Google Cloud Recommendation AI,您可以利用用于驱动YouTube、Google广告和其他Google产品的推荐系统,为我们提供个性化服务。

在本文中,我将指导您如何实现Google Cloud Recommendation AI,以便为您的客户提供个性化体验。

Noon、IKEA、KINGUIN等许多公司都使用Google建议AI在各个渠道提供性能卓越的推荐。

Initial Impact of Recommendation AI for one of the Businesses that, by Muffaddal

如何实现Google Cloud Recommendation AI?

推荐AI需要两个东西来驱动机器学习模型。一个是用户活动。第二个是用户对其执行活动的产品详细信息。

活动或操作被发送为事件,项目详细信息被存储为建议AI中的目录。一旦我们拥有所需数量的事件和目录详细信息,我们就可以训练我们的ML模型,根据用户的过去行为和属性为用户提供个性化列表。

让我们逐一详细介绍所有这些内容。

Data Pipeline to use Recommendation AI of Google Cloud, by Muffaddal

注意:实现需要强大的Google Cloud、SQL和技术知识。如果您需要帮助,请告诉我。

1- 导入产品详情

目录可以有许多字段和属性,但是,idnametitlecategories是必需的字段,必须提供。

阅读此处以获取有关目录的所有可用字段的更多详细信息。

假设我们的产品详细信息已经存在于BiqQuery中,我们将利用BigQuery和Recommendation AI集成来导入目录数据。

Product Catalog Process for Recommendation AI, by Muffaddal

Recommendation AI需要特定的BigQuery表方案。因此,我们必须创建具有所需格式的表并将目录数据插入其中。

假设我们在BigQuery中的目录表具有以下字段

  1. name: 产品名称
  2. id: 产品ID
  3. category: 产品的分配类别。
  4. description: 产品的描述
  5. url: 产品在网站上的URL
  6. image_link: 产品的公共可访问图像链接。
  7. city: 产品所在

    我们可以设置许多字段来为我们的目录进行配置。生成的数据越多越好。为了演示目的,我将坚持使用最常见的字段。注意,可空字段是可选的。

    这里的type字段是我们决定产品是变体还是主要产品的位置。在本文中,我将选择PRIMARY。详细信息请阅读此处 。

    一旦我们的表准备好了,我们可以使用以下查询将主表中的目录数据插入到此表中。

    insert into `recommendersystem.product_data` (  name,id,type,primaryProductId,collectionMemberIds,gtin,categories,title,brands,description,languageCode,attributes,  tags,      priceInfo,rating,expireTime,ttl,availableTime,availability,availableQuantity,fulfillmentInfo, uri, images,audience,colorInfo,sizes,materials,patterns,conditions,retrievableFields,publishTime,promotions)SELECT    name,   cast(id as string) as id,   "PRIMARY" as type,    cast(id as string) as primaryProductId,    null as collectionMemberIds,    null as gtin,   array [categories] as categories,   name as title,   array[title] as brands,   ifnull(description,name) as description,    null as languageCode,   [      struct(      'product_location' as key,  STRUCT(array[ifnull(city,"empty")] as text,  cast(null as ARRAY<FLOAT64>) as numbers, true as searchable, true as indexable ) as value      )]   as attributes,   ARRAY_CONCAT(      [ifnull(location,"empty")],      [ifnull(categories,"empty")]          ) as tags,    null as  priceInfo,    null as  rating,    null as  expireTime,    null as  ttl,    null as  availableTime,    null as  availability,    null as  availableQuantity,    null as  fulfillmentInfo,   url,   array[struct(image_url) as uri, null as height, null as width)] as images,   null as audience,   null as colorInfo,   null as sizes,   null as materials,   null as patterns,   null as conditions,   null as retrievableFields,   null as publishTime,   null as promotionsFROM `product.product_details`

    一旦我们的新表中有了数据,我们就可以将它们导入到推荐 AI 中。

    在 Google Cloud 的零售 AI 的数据选项卡中,点击左上角的导入按钮导入数据。

    Import catalog details to Recommendation AI, by Muffaddal

    一个面板将出现如下图所示。在导入类型中选择“产品目录”,在数据源中选择“BigQuery”。提供 BigQuery 表路径并选择一个分支,然后点击导入。

    Import catalog panel of Recommendation AI, by Muffaddal

    等待几分钟,即可在零售 AI 的数据表中查看目录详细信息。

    2-导入历史事件

    接下来,我们需要将用户历史数据导入到推荐 AI 中。这一步是可选的,但这样做有助于构建更好的机器学习模型。

    与目录类似,我们需要在 BigQuery 表格中拥有具有所需格式的事件。

    以下是推荐 AI 接受的事件

    Events that can be sent to Recommendation AI

    在所有这些事件中,home-page-viewdetail-page-viewedadd-to-cartpurchase-complete是完全启动 AI 模型所必需的。

    每个事件都有特定的表结构需要用于数据导入,您可以在此处详细了解。

    1- home-page-viewdetail-page-viewedadd-to-cart的表结构如下:

    [    {        "name": "eventType",        "type": "STRING",        "mode": "REQUIRED"    },    {        "name": "visitorId",        "type": "STRING",        "mode": "REQUIRED"    },    {        "name": "eventTime",        "type": "STRING",        "mode": "REQUIRED"    }, {   "name": "productDetails",   "type": "RECORD",   "mode": "REPEATED",   "fields": [     {       "name": "product",       "type": "RECORD",       "mode": "REQUIRED",       "fields": [         {           "name": "id",           "type": "STRING",           "mode": "REQUIRED"         }       ]     },     {       "name": "quantity",       "type": "INTEGER",       "mode": "REQUIRED"     }   ] },    {        "name": "attributes",        "type": "RECORD",        "mode": "NULLABLE",        "fields": [            {                "name": "deviceType",                "type": "RECORD",                "mode": "NULLABLE",                "fields": [                    {                        "name": "text",                        "type": "STRING",                        "mode": "REPEATED"                    }                ]            }        ]    }]

    2- purchase-complete的表结构如下:

    [ {   "name": "eventType",   "type": "STRING",   "mode": "REQUIRED" }, {   "name": "visitorId",   "type": "STRING",   "mode": "REQUIRED" }, {   "name": "eventTime",   "type": "STRING",   "mode": "REQUIRED" }, {   "name": "productDetails",   "type": "RECORD",   "mode": "REPEATED",   "fields": [     {       "name": "product",       "type": "RECORD",       "mode": "REQUIRED",       "fields": [         {           "name": "id",           "type": "STRING",           "mode": "REQUIRED"         }       ]     },     {       "name": "quantity",       "type": "INTEGER",       "mode": "REQUIRED"     }   ] }, {   "name": "purchaseTransaction",   "type": "RECORD",   "mode": "REQUIRED",   "fields": [     {       "name": "revenue",       "type": "FLOAT",       "mode": "REQUIRED"     },     {       "name": "currencyCode",       "type": "STRING",       "mode": "REQUIRED"     }   ] }, {    "name": "attributes",    "type": "RECORD",    "mode": "NULLABLE",    "fields": [        {            "name": "deviceType",            "type": "RECORD",            "mode": "NULLABLE",            "fields": [                {                    "name": "text",                    "type": "STRING",                    "mode": "REPEATED"                }            ]        },        {            "name": "cityName",            "type": "RECORD",            "mode": "NULLABLE",            "fields": [                {                    "name": "text",                    "type": "STRING",                    "mode": "REPEATED"                }            ]        }    ]}]

    一旦创建了表格,您可以使用以下查询将数据插入新表格中。

    1- home-page-viewed的SQL插入查询如下:

    insert into `recommendersystem.user_event_home_page_view` (eventType, visitorId,eventTime,attributes)  SELECT   'home-page-view' as eventType,  visitorId,  eventTime,  struct(      struct([deviceType] as text)as deviceType,      struct([city] as text)as cityName   )    as attributes,  from (    select *,  deviceType from  `recommendersystem.user_event_history` 

    2- detail-page-viewedadd-to-cart的SQL插入查询为:

    插入到`recommendersystem.user_event_add_to_cart`的SQL插入查询语句中,包括eventType、visitorId、eventTime、productDetails和attributes,选择以下内容:
    SELECT 'add-to-cart' as eventType,visitorId,eventTime,[ struct( struct(product_id as id) as product , 1 as quantity) ] as productDetails, struct( struct([deviceType] as text)as deviceType, struct([city] as text)as cityName ) as attributes,from ( select *, deviceType from `recommendersystem.user_event_history` -- limit 100)

    3- SQL插入查询语句用于purchase-complete事件:

    插入到`recommendersystem.user_event_purchase_complete`的SQL插入查询语句中,包括eventType、visitorId、eventTime、productDetails、purchaseTransaction和attributes,选择以下内容:
    SELECT 'purchase-complete' as eventType,cast( visitorId as string) as visitorId,eventTime,[ struct( struct(product_id as id) as product , 1 as quantity) ] as productDetails,struct(safe_cast(revenue as float64) as revenue, 'USD' as currencyCode) as purchaseTransaction, struct( struct([deviceType] as text)as deviceType, struct([city] as text)as cityName ) as attributesfrom ( select *, deviceType from `recommendersystem.user_purchase_event` )

    注意:访客ID和用户ID可以相同,也可以不同。这取决于用户在使用产品之前是否需要登录。
    注意:Recommendation AI还支持Google Analytics 4原始数据。因此,如果您已经拥有它,就不需要执行转换,可以直接导入。

    要导入历史数据,请转到零售AI的数据选项卡,然后在顶部单击导入。
    在导入面板中,将导入类型选择为用户事件,并选择以下选项,然后单击导入:



    我们已经成功导入了用户事件到Recommendation AI中。

    3- 发送实时事件


    接下来,我们需要发送实时事件给用户,以便AI模型可以随着用户随着时间推移与平台进行互动而重新训练和改进推荐。
    有三种方法可以将用户事件发送到Recommendation AI。使用javascript像素、使用API和使用GTM。
    本文将使用API,因为它可以覆盖所有情况,无论网站或应用程序的性质如何。

    以下是发送home-page-viewed事件的curl调用:

    curl -X POST \ -H "Authorization: Bearer ya29.a0AasRrdaM8jq4J0FBtJpsdhu87ZJcPlr4-8NqkDdGmLYtQ7P-riTx5man4k2maqWGNIsL1007a4BClSsfVbgHyjycaKn_5bviofo5XCbvCeO5-kkepnb_RUgy6prxRX7X8pi2PFHxX-kbmSmQgeEoILQQnK_aYMtTagSFzkUXC12Q2A5VmlfXR5cvSW-a80XxGOikpEf1jHuwusQx2EftBITnhPaYvg6Xi08qzvAEnmKgYicqCqY5o9d9ixav1jm6bd0r7A" \ -H "Content-Type: application/json; charset=utf-8" \ -H "X-Goog-User-Project: test-prod " --data "{ 'eventType': 'home-page-view', 'visitorId': '12', 'eventTime': '2021-09-28T03:33:33.000001Z', 'attributionToken': 'ABC', 'attributes': { 'city_name': { 'text': ['karachi'] }, 'device_type': { 'text': ['iOS'] }, }, 'userInfo': { 'userId': '123', }}"\"https://retail.googleapis.com/v2/projects/test-prod/locations/global/catalogs/default_catalog/userEvents:write"

    对于detail-page-view,curl调用如下:

    curl -X POST \     -H "Authorization: Bearer ya29.a0ARrdaMsd84J0FBtZdJp2jhu87ZJcPlr4-8NqkDdGmLYtQ7P-riTx5man4k2maqWGNIsL1007a4BClSsfVbgHyjycaKn_5bviofo5XCbvCeO5-kkepnb_RUgy6prxRX7X8pi2PFHxX-kbmSmQgeEoILQQnK_aYMtTagSFzkUXC12Q2A5VmlfXR5cvSW-a80XxGOikpEf1jHuwusQx2EftBITnhPaYvg6Xi08qzvAEnmKgYicqCqY5o9d9ixav1jm6bd0r7A" \     -H "Content-Type: application/json; charset=utf-8" \     -H "X-Goog-User-Project: test-prod "     --data "{         'eventType': 'detail-page-view',         'visitorId': '123',         'eventTime': '2021-09-28T03:33:33.000001Z',         'attributionToken': 'ABC',         'attributes': {            'city_name': {              'text': ['卡拉奇']            },            'device_type': {              'text': ['iOS']            },         },         'productDetails': [{           'product': {             'id': '2806'           }          }],         'userInfo': {           'userId': '123',         }}"\"https://retail.googleapis.com/v2/projects/test-prod/locations/global/catalogs/default_catalog/userEvents:write"

    添加到购物车的 Curl 请求

    curl -X POST \     -H "Authorization: Bearer ya29.sdrdaM8jq4J0FBtZdJp2jsdshu87ZJcPlr4-8NqkDdGmLYtQ7P-riTx5man4k2maqWGNIsL1007a4BClSsfVbgHyjycaKn_5bviofo5XCbvCeO5-kkepnb_RUgy6prxRX7X8pi2PFHxX-kbmSmQgeEoILQQnK_aYMtTagSFzkUXC12Q2A5VmlfXR5cvSW-a80XxGOikpEf1jHuwusQx2EftBITnhPaYvg6Xi08qzvAEnmKgYicqCqY5o9d9ixav1jm6bd0r7A" \     -H "Content-Type: application/json; charset=utf-8" \     -H "X-Goog-User-Project: test-prod"     --data "{         'eventType': 'add-to-cart',         'visitorId': '123',         'eventTime': '2021-09-28T03:33:33.000001Z',         'attributionToken': 'ABC',         'attributes': {            'city_name': {              'text': ['卡拉奇']            },            'device_type': {              'text': ['iOS']            },         },         'productDetails': [{           'product': {             'id': '2806'           },     'quantity':1          }],         'userInfo': {           'userId': '123',         }}"\"https://retail.googleapis.com/v2/projects/test-prod/locations/global/catalogs/default_catalog/userEvents:write"

    购买成功的 Curl 请求

    curl -X POST \     -H "Authorization: Bearer ya29.a0ARrsddaM8jJ0FBtZdJsdjhu87ZJcPlr4-8NqkDdGmLYtQ7P-riTx5man4k2maqWGNIsL1007a4BClSsfVbgHyjycaKn_5bviofo5XCbvCeO5-kkepnb_RUgy6prxRX7X8pi2PFHxX-kbmSmQgeEoILQQnK_aYMtTagSFzkUXC12Q2A5VmlfXR5cvSW-a80XxGOikpEf1jHuwusQx2EftBITnhPaYvg6Xi08qzvAEnmKgYicqCqY5o9d9ixav1jm6bd0r7A" \     -H "Content-Type: application/json; charset=utf-8" \     -H "X-Goog-User-Project: test-prod "     --data "{         'eventType': 'purchase-complete',         'visitorId': '123',         'eventTime': '2021-09-28T03:33:33.000001Z',         'attributionToken': 'ABC',         'attributes': {            'city_name': {              'text': ['卡拉奇']            },            'device_type': {              'text': ['iOS']            },         },         'productDetails': [{           'product': {             'id': '2806'           },     'quantity':'1'          }],          'purchaseTransaction':{              "id": 'transacion-id-here',              "revenue": 'orderPrice-here',              "currencyCode": 'USD',               "quantity":'1'            }         'userInfo': {           'userId': '123',         }}"\"https://retail.googleapis.com/v2/projects/test-prod/locations/global/catalogs/default_catalog/userEvents:write"

    您需要使用Google Cloud生成授权令牌以发送事件。

    您可以在Retail AI的事件选项卡中查看实时事件。

    Muffaddal发布的Retail AI用户事件

    注意:如果在导入目录之前或期间记录了用户事件,请重新加入在目录导入完成之前记录的任何事件。

    最后,我们距离创建第一个推荐模型只有一个步骤之遥。

    构建推荐模型

    以下机器学习模型均受Recommendation AI支持。

    Muffaddal发布的Recommendation AI支持的人工智能模型

    在本文中,我们将使用”Recommended For You”模型。您可以在此处阅读有关可用模型的更多详细信息。

    进入模型选项卡,然后单击创建模型以开始配置您的ML模型。

    Muffaddal发布的Recommendation AI中的模型创建

    接下来,在模型类型中选择”Recommended For You”模型。

    Muffaddal发布的Recommendation AI中的AI模型选择

    我们旨在提高购买率,因此希望我们的ML模型优化转化率。将”conversion rate (CVR)”作为模型目标。

    Muffaddal发布的Recommendation AI中的模型目标

    将调整频率设置为”每三个月”,将属性值过滤器设置为”auto”

    Muffaddal发布的Recommendation AI模型的调整和选项卡设置

    然后单击”创建”按钮。这将开始模型训练。等待一两天,直到AI模型准备就绪。时间根据所需训练的数据量而定。

    服务

    一旦创建了AI模型,就是时候配置服务,以便我们可以调用我们的AI模型并获得个性化列表。

    进入服务配置,然后在顶部单击创建服务按钮。按下图所示选择推荐。

    Muffaddal在Recommendation AI中的模型服务配置

    命名您的服务并单击”继续”。

    选择我们创建的”Recommended For You”模型。这将将我们的模型附加到此服务配置。

    首选项选项卡是您决定模型行为的地方。我们可以使用自动设置。

    推荐 AI 的偏好设置,作者 Muffaddal

    点击创建按钮。请注意配置的 ID,因为它将用于调用模型 API。

    获取推荐

    以下是从我们创建的模型获取推荐的 curl 调用。

    curl -X POST \    -H "Authorization: Bearer ya29.aARrdaM9Bm57OTsdsIQAzGT15GwYzZpVfssffknWPNJ8gpKRk6IHSFmGqs1nBpAlaRRg2fQvtJgtUDGsuIc-h-j0RMLkAPy7FjxQ4tQbYZl62ba-4q4oRx-oY2KwYDA-pEQW77SACo2a8hS1zEUZHyyHCO3V-PycSBetJeldjib5VYo969D1PFVF33WSSRLPIP9uBcTW9ABoYthSOioTePlaICbwV1p8dlXesnCH8PdPNuKPxJJI3rzrnIghKXUKSQb4E-mc" \    -H "Content-Type: application/json; charset=utf-8" \    -H "X-Goog-User-Project: test-prod"\    --data  '{             "pageSize":100,             "userEvent": {              "eventType": "home-page-view",              "visitorId": "123",              "userInfo": {                  "userId": "123"              },              "experimentIds": "123"            }          }' \https://retail.googleapis.com/v2/projects/test-prod/locations/global/catalogs/default_catalog/placements/<your serving id here>:predict

    传递准确的用户 ID、服务 ID、项目 ID 和授权令牌,您将获得为您提供的用户 ID 的个性化列表。

    将上述代码与您的开发人员分享,他应该能够在您的网站和应用程序上提供个性化的部分。

    实验

    我强烈建议在首次启动推荐系统时进行 A/B 测试。它将帮助您了解向用户提供个性化体验带来了多少价值。

    最后想法

    本文应该足以帮助您轻松构建可完全扩展的推荐系统,但请记住,要充分利用推荐 AI 还有更多细节需要注意。

    例如,当设置多个模型时,属性令牌至关重要,保持商品目录也很重要,以向用户提供最新产品,还应考虑 Google Cloud 定价。还有更多。

    如果您需要我的 Google 推荐 AI 帮助,请随时联系我。

    使用 Google Cloud 推荐 AI 不仅可以让您使用 Google 自己的 ML 模型,还可以让您跨越整个架构推荐系统的过程。它可以快速为您提供推荐的价值。立即实施,为您的业务增加用户参与度、留存率和收入。