User特征预取

在某些场景中,系统在接收到推荐请求后,会预先获取User特征,再进入推荐流程中。本文为您介绍如何进行User特征预取。

场景介绍

获取User特征的方式有以下两种:

  • 阻塞获取User特征:因为User特征会在召回或过滤阶段用到, 必须先获取User特征,才能进行推荐流程。

  • 非阻塞获取User特征:为了提高性能,需要异步获取User特征, 之后才能在粗排或精排阶段使用。

同时, User特征的预取也需要AB实验参数的支持。User特征的获取,在配置上是与特征获取相同的。

阻塞获取User特征

您可以利用UserFeatureConfs进行配置,UserFeatureConfs支持多场景配置,home_feed是配置的场景名称,示例内容如下。从下述示例中可以看出当前配置和FeatureConfs配置是完全类似的。 UserFeatureConfs会在整个推荐流程之前执行,并且是阻塞式的,加载完User特征之后才进行推荐流程。

{
  "UserFeatureConfs": {
    "home_feed": {
      "AsynLoadFeature": true,
      "FeatureLoadConfs": [
        {
          "FeatureDaoConf": {
            "AdapterType": "hologres",
            "HologresName": "pairec-holo",
            "FeatureKey": "user:uid",
            "UserFeatureKeyName": "client_str",
            "HologresTableName": "dwd_ali_user_all_feature_v2_holo",
            "UserSelectFields": "*",
            "FeatureStore": "user"
          },
          "Features": [
            {
              "FeatureType": "new_feature",
              "FeatureName": "day_h",
              "Normalizer": "hour_in_day",
              "FeatureStore": "user"
            },
            {
              "FeatureType": "new_feature",
              "FeatureName": "week_day",
              "Normalizer": "weekday",
              "FeatureStore": "user"
            }
          ]
        }
      ]
    }
  }
}

其中AsynLoadFeature表示是否异步加载User特征。当有多个FeatureLoadConfs时,可以使用异步并发方式进行加载。其他参数配置说明,请参见配置字段说明

非阻塞获取User特征

如果您想获取User特征而不阻塞推荐流程,可以添加FeatureAsyncLoad并将其配置为true,示例内容如下:

{
  "UserFeatureConfs": {
    "home_feed": {
      "AsynLoadFeature": true,
      "FeatureLoadConfs": [
        {
          "FeatureDaoConf": {
            "AdapterType": "hologres",
            "HologresName": "pairec-holo",
            "FeatureKey": "user:uid",
            "UserFeatureKeyName": "client_str",
            "HologresTableName": "dwd_ali_user_all_feature_v2_holo",
            "UserSelectFields": "*",
            "FeatureStore": "user"
          },
          "Features": [
            {
              "FeatureType": "new_feature",
              "FeatureName": "day_h",
              "Normalizer": "hour_in_day",
              "FeatureStore": "user"
            },
            {
              "FeatureType": "new_feature",
              "FeatureName": "week_day",
              "Normalizer": "weekday",
              "FeatureStore": "user"
            }
          ]
        },
        {
          "FeatureDaoConf": {
              "AdapterType": "hologres",
            "FeatureAsyncLoad": true,
            "HologresName": "pairec-holo",
            "FeatureKey": "user:uid",
            "UserFeatureKeyName": "client_str",
            "HologresTableName": "dwd_ali_user_all_feature_v3_holo",
            "UserSelectFields": "*",
            "FeatureStore": "user"
          },
          "Features": []
        }
      ]
    }
  }
}

上述文件配置获取两类特征:

  • 从dwd_ali_user_all_feature_v2_holo中获取所有特征,该内容未配置FeatureAsyncLoad,表示这些特征是阻塞式获取的。

  • 从dwd_ali_user_all_feature_v3_holo获取所有特征。该内容配置了FeatureAsyncLoad=true,则表示这些特征使用异步方式获取。

其他参数配置说明,请参见配置字段说明

预取User特征并放入Cache

为提高系统性能,建议您在执行推荐流程之前,采用异步方式获取User特征,并将这些特征暂时存储。待实际需求时,再将缓存的特征放到用户特征集中,确保高效利用。示例内容如下:

{
  "UserFeatureConfs": {
    "home_feed": {
      "AsynLoadFeature": true,
      "FeatureLoadConfs": [
        {
          "FeatureDaoConf": {
            "AdapterType": "hologres",
            "HologresName": "pairec-holo",
            "FeatureKey": "user:uid",
            "UserFeatureKeyName": "client_str",
            "FeatureAsyncLoad": true,
            "HologresTableName": "dwd_ali_user_all_feature_v2_holo",
            "UserSelectFields": "*",
            "CacheFeaturesName" :"test",//cache map
            "FeatureStore": "user"
          },
          "Features": [
            
            {
              "FeatureType": "new_feature",
              "FeatureName": "day_h",
              "Normalizer": "hour_in_day",
              "FeatureStore": "user"
            },
            {
              "FeatureType": "new_feature",
              "FeatureName": "week_day",
              "Normalizer": "weekday",
              "FeatureStore": "user"
            }
          ]
        }
      ]
    }
    }
}

其中关键配置说明如下,其他参数配置说明,请参见配置字段说明

  • "FeatureAsyncLoad" = true:表示使用异步方式获取User特征。

  • "CacheFeaturesName": "test":表示获取到的特征会缓存到名称为test的Cache Map中,而不是真正放入到User特征中。后面用到特征时,才需要引用。每组特征都可以使用不同的CacheFeaturesName名称。

引用User的Cache特征

在粗排或者精排阶段引用预加载的User特征时,引用的特征需要在FeatureConfs里配置。示例内容如下:

{
    "FeatureConfs":{
        "home_feed_rebuild_v22":{
            "AsynLoadFeature":false,
            "FeatureLoadConfs":[
                {
                    "FeatureDaoConf":{
                        "LoadFromCacheFeaturesName":"test",
                        "FeatureStore":"user"
                    }
                },
                {
                    "FeatureDaoConf":{
                        "LoadFromCacheFeaturesName":"test1",
                        "FeatureStore":"user"
                    }
                }
            ]
        }
    }
}

其中关键配置说明如下,其他参数配置说明,请参见配置字段说明

  • 引用特征不需要并发的获取,设置"AsynLoadFeature"= false即可。

  • LoadFromCacheFeaturesName:表示从哪个Cache Map中获取User特征。名称与CacheFeaturesName保持一致。

配置字段说明

FeatureLoadConfs/FeatureDaoConf中的配置字段说明如下:

字段名

类型

是否必填

描述

AdapterType

string

数据源的类型,取值为hologres。

HologresName

string

在数据源配置(HologresConfs)中配置好的Hologres的自定义名称,例如数据源配置中的 holo_info。

FeatureKey

string

根据引擎中哪个特征,去特征表里进行查询。

FeatureKey表明查找的值来自于User或item的哪个字段。比如,user:uid 获取User的UID属性值;item:pair_id获取item的pair_id的属性值。

UserFeatureKeyName

string

User特征表的主键字段。

ItemFeatureKeyName

string

Item特征表的主键字段。

HologresTableName

string

Hologres中特征表的表名。

UserSelectFields

string

需要获取的User特征,支持"*",表明获取所有特征,也可以配置为"feature1,feature2",多个特征之间使用半角逗号(,)分隔。

CacheFeaturesName

string

缓存预取出的User特征的Cache Map名称。

FeatureStore

string

枚举值:user/item。表示获取特征之后,将其存储到哪里。

FeatureAsyncLoad

boolean

否·

设置"FeatureAsyncLoad" = true,即可异步的获取特征。

FeatureType

string

表示特征的类型。

LoadFromCacheFeaturesName

string

需要引用的已经预取到的User特征的Cache Map名称。